diff --git a/.binstar.yml b/.binstar.yml index 6f7c2c5ba4c7a..c70add11c55b0 100644 --- a/.binstar.yml +++ b/.binstar.yml @@ -1,22 +1,21 @@ package: pandas user: jreback -platform: - #- osx-64 - #- linux-32 - - linux-64 - - win-64 - #- win-32 - -engine: - #- python=2.6 - - python=2.7 - #- python=3.3 - #- python=3.4 +install: + - conda config --add channels pandas before_script: - python -V +platform: + - linux-64 + #- linux-32 + - osx-64 + #- win-32 + - win-64 +engine: + - python=2.7 + #- python=3.4 script: - conda build conda.recipe --quiet @@ -27,12 +26,3 @@ build_targets: conda notifications: email: recipients: ['jeff@reback.net'] - ---- -platform: win-32 -engine: python=2.6 -exclude: true ---- -platform: win-64 -engine: python=2.6 -exclude: true diff --git a/.gitattributes b/.gitattributes index 0ef16e42a0660..736fa09d070fe 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,3 +13,4 @@ *.dta binary *.xls binary *.xlsx binary +pandas/_version.py export-subst diff --git a/.gitignore b/.gitignore index e8b557d68ac39..d33df2df6e548 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ .idea .vagrant .noseids +.ipynb_checkpoints # Compiled source # ################### @@ -41,6 +42,8 @@ doc/_build dist # Egg metadata *.egg-info +.eggs + # tox testing tool .tox # rope @@ -76,9 +79,9 @@ scikits *.c *.cpp -# Things specific to this project # -################################### -pandas/version.py +# Performance Testing # +####################### +asv_bench/ # Documentation generated files # ################################# diff --git a/.travis.yml b/.travis.yml index 246154310a50f..b867601ba0b96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,13 +86,6 @@ matrix: - CLIPBOARD=xsel - BUILD_TYPE=conda - JOB_NAME: "34_slow" - - python: 3.2 - env: - - NOSE_ARGS="not slow and not network and not disabled" - - FULL_DEPS=true - - CLIPBOARD_GUI=qt4 - - BUILD_TYPE=pydata - - JOB_NAME: "32_nslow" - python: 2.7 env: - EXPERIMENTAL=true @@ -103,13 +96,6 @@ matrix: - BUILD_TYPE=pydata - PANDAS_TESTING_MODE="deprecate" allow_failures: - - python: 3.2 - env: - - NOSE_ARGS="not slow and not network and not disabled" - - FULL_DEPS=true - - CLIPBOARD_GUI=qt4 - - BUILD_TYPE=pydata - - JOB_NAME: "32_nslow" - python: 2.7 env: - NOSE_ARGS="slow and not network and not disabled" diff --git a/MANIFEST.in b/MANIFEST.in index 69174f7f05b98..2d26fbfd6adaf 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -24,3 +24,5 @@ global-exclude *.png # recursive-include doc/source * # recursive-include doc/sphinxext * # recursive-include LICENSES * +include versioneer.py +include pandas/_version.py diff --git a/README.md b/README.md index bba31fef7a939..947dfc5928249 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,45 @@ # pandas: powerful Python data analysis toolkit -[![Build Status](https://travis-ci.org/pydata/pandas.svg?branch=master)](https://travis-ci.org/pydata/pandas) -[![Join the chat at -https://gitter.im/pydata/pandas](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/pydata/pandas?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + + + + + + + + + + + + + + + + + + + + + + + + + +
Latest Releaselatest release
Package Statusstatus
Licenselicense
Build Status + + build status + +
Conda + + conda downloads + +
PyPI + + pypi downloads + +
+ +[![https://gitter.im/pydata/pandas](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/pydata/pandas?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) ## What is it diff --git a/asv_bench/asv.conf.json b/asv_bench/asv.conf.json new file mode 100644 index 0000000000000..760db2086b125 --- /dev/null +++ b/asv_bench/asv.conf.json @@ -0,0 +1,66 @@ +{ + // The version of the config file format. Do not change, unless + // you know what you are doing. + "version": 1, + + // The name of the project being benchmarked + "project": "pandas", + + // The project's homepage + "project_url": "http://pandas.pydata.org/", + + // The URL of the source code repository for the project being + // benchmarked + "repo": "..", + + // The tool to use to create environments. May be "conda", + // "virtualenv" or other value depending on the plugins in use. + // If missing or the empty string, the tool will be automatically + // determined by looking for tools on the PATH environment + // variable. + "environment_type": "conda", + + // the base URL to show a commit for the project. + "show_commit_url": "https://github.com/pydata/pandas/commit/", + + // The Pythons you'd like to test against. If not provided, defaults + // to the current version of Python used to run `asv`. + // "pythons": ["2.7", "3.4"], + "pythons": ["2.7"], + + // The matrix of dependencies to test. Each key is the name of a + // package (in PyPI) and the values are version numbers. An empty + // list indicates to just test against the default (latest) + // version. + "matrix": { + // To run against multiple versions, replace with + // "numpy": ["1.7", "1.9"], + "numpy": [], + "Cython": [], + "matplotlib": [], + "sqlalchemy": [], + "scipy": [], + "numexpr": [], + "pytables": [], + }, + + // The directory (relative to the current directory) that benchmarks are + // stored in. If not provided, defaults to "benchmarks" + // "benchmark_dir": "benchmarks", + + // The directory (relative to the current directory) to cache the Python + // environments in. If not provided, defaults to "env" + // "env_dir": "env", + + + // The directory (relative to the current directory) that raw benchmark + // results are stored in. If not provided, defaults to "results". + // "results_dir": "results", + + // The directory (relative to the current directory) that the html tree + // should be written to. If not provided, defaults to "html". + // "html_dir": "html", + + // The number of characters to retain in the commit hashes. + // "hash_length": 8 +} diff --git a/asv_bench/benchmarks/__init__.py b/asv_bench/benchmarks/__init__.py new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/asv_bench/benchmarks/attrs_caching.py b/asv_bench/benchmarks/attrs_caching.py new file mode 100644 index 0000000000000..ecb91923dc663 --- /dev/null +++ b/asv_bench/benchmarks/attrs_caching.py @@ -0,0 +1,23 @@ +from pandas_vb_common import * + + +class getattr_dataframe_index(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10, 6)) + self.cur_index = self.df.index + + def time_getattr_dataframe_index(self): + self.foo = self.df.index + + +class setattr_dataframe_index(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10, 6)) + self.cur_index = self.df.index + + def time_setattr_dataframe_index(self): + self.df.index = self.cur_index \ No newline at end of file diff --git a/asv_bench/benchmarks/binary_ops.py b/asv_bench/benchmarks/binary_ops.py new file mode 100644 index 0000000000000..13976014ec6f1 --- /dev/null +++ b/asv_bench/benchmarks/binary_ops.py @@ -0,0 +1,236 @@ +from pandas_vb_common import * +import pandas.computation.expressions as expr + + +class frame_add(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + + def time_frame_add(self): + (self.df + self.df2) + + +class frame_add_no_ne(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_use_numexpr(False) + + def time_frame_add_no_ne(self): + (self.df + self.df2) + + def teardown(self): + expr.set_use_numexpr(True) + + +class frame_add_st(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_frame_add_st(self): + (self.df + self.df2) + + def teardown(self): + expr.set_numexpr_threads() + + +class frame_float_div(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 1000)) + self.df2 = DataFrame(np.random.randn(1000, 1000)) + + def time_frame_float_div(self): + (self.df // self.df2) + + +class frame_float_div_by_zero(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 1000)) + + def time_frame_float_div_by_zero(self): + (self.df / 0) + + +class frame_float_floor_by_zero(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 1000)) + + def time_frame_float_floor_by_zero(self): + (self.df // 0) + + +class frame_float_mod(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 1000)) + self.df2 = DataFrame(np.random.randn(1000, 1000)) + + def time_frame_float_mod(self): + (self.df / self.df2) + + +class frame_int_div_by_zero(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.random_integers(np.iinfo(np.int16).min, np.iinfo(np.int16).max, size=(1000, 1000))) + + def time_frame_int_div_by_zero(self): + (self.df / 0) + + +class frame_int_mod(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.random_integers(np.iinfo(np.int16).min, np.iinfo(np.int16).max, size=(1000, 1000))) + self.df2 = DataFrame(np.random.random_integers(np.iinfo(np.int16).min, np.iinfo(np.int16).max, size=(1000, 1000))) + + def time_frame_int_mod(self): + (self.df / self.df2) + + +class frame_mult(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + + def time_frame_mult(self): + (self.df * self.df2) + + +class frame_mult_no_ne(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_use_numexpr(False) + + def time_frame_mult_no_ne(self): + (self.df * self.df2) + + def teardown(self): + expr.set_use_numexpr(True) + + +class frame_mult_st(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_frame_mult_st(self): + (self.df * self.df2) + + def teardown(self): + expr.set_numexpr_threads() + + +class frame_multi_and(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + + def time_frame_multi_and(self): + self.df[((self.df > 0) & (self.df2 > 0))] + + +class frame_multi_and_no_ne(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_use_numexpr(False) + + def time_frame_multi_and_no_ne(self): + self.df[((self.df > 0) & (self.df2 > 0))] + + def teardown(self): + expr.set_use_numexpr(True) + + +class frame_multi_and_st(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_frame_multi_and_st(self): + self.df[((self.df > 0) & (self.df2 > 0))] + + def teardown(self): + expr.set_numexpr_threads() + + +class series_timestamp_compare(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.halfway = ((self.N // 2) - 1) + self.s = Series(date_range('20010101', periods=self.N, freq='T')) + self.ts = self.s[self.halfway] + + def time_series_timestamp_compare(self): + (self.s <= self.ts) + + +class timestamp_ops_diff1(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.s = Series(date_range('20010101', periods=self.N, freq='s')) + + def time_timestamp_ops_diff1(self): + self.s.diff() + + +class timestamp_ops_diff2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.s = Series(date_range('20010101', periods=self.N, freq='s')) + + def time_timestamp_ops_diff2(self): + (self.s - self.s.shift()) + + +class timestamp_series_compare(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.halfway = ((self.N // 2) - 1) + self.s = Series(date_range('20010101', periods=self.N, freq='T')) + self.ts = self.s[self.halfway] + + def time_timestamp_series_compare(self): + (self.ts >= self.s) \ No newline at end of file diff --git a/asv_bench/benchmarks/categoricals.py b/asv_bench/benchmarks/categoricals.py new file mode 100644 index 0000000000000..34caef221a340 --- /dev/null +++ b/asv_bench/benchmarks/categoricals.py @@ -0,0 +1,11 @@ +from pandas_vb_common import * + + +class concat_categorical(object): + goal_time = 0.2 + + def setup(self): + self.s = pd.Series((list('aabbcd') * 1000000)).astype('category') + + def time_concat_categorical(self): + concat([self.s, self.s]) \ No newline at end of file diff --git a/asv_bench/benchmarks/ctors.py b/asv_bench/benchmarks/ctors.py new file mode 100644 index 0000000000000..b48211b3db83e --- /dev/null +++ b/asv_bench/benchmarks/ctors.py @@ -0,0 +1,52 @@ +from pandas_vb_common import * + + +class frame_constructor_ndarray(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randn(100, 100) + + def time_frame_constructor_ndarray(self): + DataFrame(self.arr) + + +class ctor_index_array_string(object): + goal_time = 0.2 + + def setup(self): + self.data = np.array(['foo', 'bar', 'baz'], dtype=object) + + def time_ctor_index_array_string(self): + Index(self.data) + + +class series_constructor_ndarray(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(100) + self.index = Index(np.arange(100)) + + def time_series_constructor_ndarray(self): + Series(self.data, index=self.index) + + +class dtindex_from_series_ctor(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(([Timestamp('20110101'), Timestamp('20120101'), Timestamp('20130101')] * 1000)) + + def time_dtindex_from_series_ctor(self): + DatetimeIndex(self.s) + + +class index_from_series_ctor(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(([Timestamp('20110101'), Timestamp('20120101'), Timestamp('20130101')] * 1000)) + + def time_index_from_series_ctor(self): + Index(self.s) \ No newline at end of file diff --git a/asv_bench/benchmarks/eval.py b/asv_bench/benchmarks/eval.py new file mode 100644 index 0000000000000..397312355aa47 --- /dev/null +++ b/asv_bench/benchmarks/eval.py @@ -0,0 +1,239 @@ +from pandas_vb_common import * +import pandas.computation.expressions as expr +import pandas as pd + + +class eval_frame_add_all_threads(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_add_all_threads(self): + pd.eval('df + df2 + df3 + df4') + + +class eval_frame_add_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_add_one_thread(self): + pd.eval('df + df2 + df3 + df4') + + +class eval_frame_add_python(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_add_python(self): + pd.eval('df + df2 + df3 + df4', engine='python') + + +class eval_frame_add_python_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_add_python_one_thread(self): + pd.eval('df + df2 + df3 + df4', engine='python') + + +class eval_frame_and_all_threads(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_and_all_threads(self): + pd.eval('(df > 0) & (df2 > 0) & (df3 > 0) & (df4 > 0)') + + +class eval_frame_and_python_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_and_python_one_thread(self): + pd.eval('(df > 0) & (df2 > 0) & (df3 > 0) & (df4 > 0)', engine='python') + + +class eval_frame_and_python(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_and_python(self): + pd.eval('(df > 0) & (df2 > 0) & (df3 > 0) & (df4 > 0)', engine='python') + + +class eval_frame_chained_cmp_all_threads(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_chained_cmp_all_threads(self): + pd.eval('df < df2 < df3 < df4') + + +class eval_frame_chained_cmp_python_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_chained_cmp_python_one_thread(self): + pd.eval('df < df2 < df3 < df4', engine='python') + + +class eval_frame_chained_cmp_python(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_chained_cmp_python(self): + pd.eval('df < df2 < df3 < df4', engine='python') + + +class eval_frame_mult_all_threads(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_mult_all_threads(self): + pd.eval('df * df2 * df3 * df4') + + +class eval_frame_mult_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_mult_one_thread(self): + pd.eval('df * df2 * df3 * df4') + + +class eval_frame_mult_python(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + + def time_eval_frame_mult_python(self): + pd.eval('df * df2 * df3 * df4', engine='python') + + +class eval_frame_mult_python_one_thread(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(20000, 100)) + self.df2 = DataFrame(np.random.randn(20000, 100)) + self.df3 = DataFrame(np.random.randn(20000, 100)) + self.df4 = DataFrame(np.random.randn(20000, 100)) + expr.set_numexpr_threads(1) + + def time_eval_frame_mult_python_one_thread(self): + pd.eval('df * df2 * df3 * df4', engine='python') + + +class query_datetime_index(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.halfway = ((self.N // 2) - 1) + self.index = date_range('20010101', periods=self.N, freq='T') + self.s = Series(self.index) + self.ts = self.s.iloc[self.halfway] + self.df = DataFrame({'a': np.random.randn(self.N), }, index=self.index) + + def time_query_datetime_index(self): + self.df.query('index < @ts') + + +class query_datetime_series(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.halfway = ((self.N // 2) - 1) + self.index = date_range('20010101', periods=self.N, freq='T') + self.s = Series(self.index) + self.ts = self.s.iloc[self.halfway] + self.df = DataFrame({'dates': self.s.values, }) + + def time_query_datetime_series(self): + self.df.query('dates < @ts') + + +class query_with_boolean_selection(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.halfway = ((self.N // 2) - 1) + self.index = date_range('20010101', periods=self.N, freq='T') + self.s = Series(self.index) + self.ts = self.s.iloc[self.halfway] + self.N = 1000000 + self.df = DataFrame({'a': np.random.randn(self.N), }) + self.min_val = self.df['a'].min() + self.max_val = self.df['a'].max() + + def time_query_with_boolean_selection(self): + self.df.query('(a >= @min_val) & (a <= @max_val)') \ No newline at end of file diff --git a/asv_bench/benchmarks/frame_ctor.py b/asv_bench/benchmarks/frame_ctor.py new file mode 100644 index 0000000000000..2cb337e0e6b9d --- /dev/null +++ b/asv_bench/benchmarks/frame_ctor.py @@ -0,0 +1,1706 @@ +from pandas_vb_common import * +try: + from pandas.tseries.offsets import * +except: + from pandas.core.datetools import * + + +class frame_ctor_dtindex_BDayx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BDay(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BDayx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BDayx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BDay(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BDayx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BMonthBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BMonthBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BMonthBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BMonthBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BMonthBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BMonthBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BMonthEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BMonthEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BMonthEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BMonthEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BMonthEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BMonthEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BQuarterBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BQuarterBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BQuarterBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BQuarterBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BQuarterBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BQuarterBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BQuarterEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BQuarterEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BQuarterEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BQuarterEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BQuarterEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BQuarterEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BYearBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BYearBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BYearBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BYearBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BYearBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BYearBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BYearEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BYearEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BYearEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BYearEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BYearEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BYearEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BusinessDayx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BusinessDay(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BusinessDayx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BusinessDayx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BusinessDay(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BusinessDayx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BusinessHourx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BusinessHour(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BusinessHourx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_BusinessHourx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(BusinessHour(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_BusinessHourx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CBMonthBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CBMonthBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CBMonthBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CBMonthBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CBMonthBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CBMonthBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CBMonthEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CBMonthEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CBMonthEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CBMonthEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CBMonthEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CBMonthEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CDayx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CDay(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CDayx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CDayx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CDay(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CDayx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CustomBusinessDayx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CustomBusinessDay(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CustomBusinessDayx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_CustomBusinessDayx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(CustomBusinessDay(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_CustomBusinessDayx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_DateOffsetx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(DateOffset(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_DateOffsetx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_DateOffsetx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(DateOffset(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_DateOffsetx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Dayx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Day(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Dayx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Dayx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Day(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Dayx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Easterx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Easter(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Easterx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Easterx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Easter(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Easterx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253Quarterx1__variation_last(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253Quarter(1, **{'startingMonth': 1, 'qtr_with_extra_week': 1, 'weekday': 1, 'variation': 'last', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253Quarterx1__variation_last(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253Quarterx1__variation_nearest(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253Quarter(1, **{'startingMonth': 1, 'qtr_with_extra_week': 1, 'weekday': 1, 'variation': 'nearest', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253Quarterx1__variation_nearest(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253Quarterx2__variation_last(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253Quarter(2, **{'startingMonth': 1, 'qtr_with_extra_week': 1, 'weekday': 1, 'variation': 'last', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253Quarterx2__variation_last(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253Quarterx2__variation_nearest(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253Quarter(2, **{'startingMonth': 1, 'qtr_with_extra_week': 1, 'weekday': 1, 'variation': 'nearest', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253Quarterx2__variation_nearest(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253x1__variation_last(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253(1, **{'startingMonth': 1, 'weekday': 1, 'variation': 'last', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253x1__variation_last(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253x1__variation_nearest(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253(1, **{'startingMonth': 1, 'weekday': 1, 'variation': 'nearest', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253x1__variation_nearest(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253x2__variation_last(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253(2, **{'startingMonth': 1, 'weekday': 1, 'variation': 'last', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253x2__variation_last(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_FY5253x2__variation_nearest(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(FY5253(2, **{'startingMonth': 1, 'weekday': 1, 'variation': 'nearest', })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_FY5253x2__variation_nearest(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Hourx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Hour(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Hourx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Hourx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Hour(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Hourx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_LastWeekOfMonthx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(LastWeekOfMonth(1, **{'week': 1, 'weekday': 1, })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_LastWeekOfMonthx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_LastWeekOfMonthx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(LastWeekOfMonth(2, **{'week': 1, 'weekday': 1, })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_LastWeekOfMonthx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Microx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Micro(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Microx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Microx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Micro(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Microx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Millix1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Milli(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Millix1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Millix2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Milli(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Millix2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Minutex1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Minute(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Minutex1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Minutex2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Minute(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Minutex2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_MonthBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(MonthBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_MonthBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_MonthBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(MonthBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_MonthBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_MonthEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(MonthEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_MonthEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_MonthEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(MonthEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_MonthEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Nanox1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Nano(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Nanox1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Nanox2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Nano(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Nanox2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_QuarterBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(QuarterBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_QuarterBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_QuarterBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(QuarterBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_QuarterBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_QuarterEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(QuarterEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_QuarterEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_QuarterEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(QuarterEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_QuarterEndx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Secondx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Second(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Secondx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Secondx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Second(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Secondx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_WeekOfMonthx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(WeekOfMonth(1, **{'week': 1, 'weekday': 1, })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_WeekOfMonthx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_WeekOfMonthx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(WeekOfMonth(2, **{'week': 1, 'weekday': 1, })) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_WeekOfMonthx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Weekx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Week(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Weekx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_Weekx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(Week(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_Weekx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_YearBeginx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(YearBegin(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_YearBeginx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_YearBeginx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(YearBegin(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_YearBeginx2(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_YearEndx1(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(YearEnd(1, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_YearEndx1(self): + DataFrame(self.d) + + +class frame_ctor_dtindex_YearEndx2(object): + goal_time = 0.2 + + def setup(self): + + def get_period_count(start_date, off): + self.ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days + if (self.ten_offsets_in_days == 0): + return 1000 + else: + return min((9 * ((Timestamp.max - start_date).days // self.ten_offsets_in_days)), 1000) + + def get_index_for_offset(off): + self.start_date = Timestamp('1/1/1900') + return date_range(self.start_date, periods=min(1000, get_period_count(self.start_date, off)), freq=off) + self.idx = get_index_for_offset(YearEnd(2, **{})) + self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) + self.d = dict([(col, self.df[col]) for col in self.df.columns]) + + def time_frame_ctor_dtindex_YearEndx2(self): + DataFrame(self.d) + + +class frame_ctor_list_of_dict(object): + goal_time = 0.2 + + def setup(self): + (N, K) = (5000, 50) + self.index = tm.makeStringIndex(N) + self.columns = tm.makeStringIndex(K) + self.frame = DataFrame(np.random.randn(N, K), index=self.index, columns=self.columns) + try: + self.data = self.frame.to_dict() + except: + self.data = self.frame.toDict() + self.some_dict = self.data.values()[0] + self.dict_list = [dict(zip(self.columns, row)) for row in self.frame.values] + + def time_frame_ctor_list_of_dict(self): + DataFrame(self.dict_list) + + +class frame_ctor_nested_dict(object): + goal_time = 0.2 + + def setup(self): + (N, K) = (5000, 50) + self.index = tm.makeStringIndex(N) + self.columns = tm.makeStringIndex(K) + self.frame = DataFrame(np.random.randn(N, K), index=self.index, columns=self.columns) + try: + self.data = self.frame.to_dict() + except: + self.data = self.frame.toDict() + self.some_dict = self.data.values()[0] + self.dict_list = [dict(zip(self.columns, row)) for row in self.frame.values] + + def time_frame_ctor_nested_dict(self): + DataFrame(self.data) + + +class frame_ctor_nested_dict_int64(object): + goal_time = 0.2 + + def setup(self): + self.data = dict(((i, dict(((j, float(j)) for j in xrange(100)))) for i in xrange(2000))) + + def time_frame_ctor_nested_dict_int64(self): + DataFrame(self.data) + + +class frame_from_series(object): + goal_time = 0.2 + + def setup(self): + self.mi = MultiIndex.from_tuples([(x, y) for x in range(100) for y in range(100)]) + self.s = Series(randn(10000), index=self.mi) + + def time_frame_from_series(self): + DataFrame(self.s) + + +class frame_get_numeric_data(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 25)) + self.df['foo'] = 'bar' + self.df['bar'] = 'baz' + self.df = self.df.consolidate() + + def time_frame_get_numeric_data(self): + self.df._get_numeric_data() + + +class series_ctor_from_dict(object): + goal_time = 0.2 + + def setup(self): + (N, K) = (5000, 50) + self.index = tm.makeStringIndex(N) + self.columns = tm.makeStringIndex(K) + self.frame = DataFrame(np.random.randn(N, K), index=self.index, columns=self.columns) + try: + self.data = self.frame.to_dict() + except: + self.data = self.frame.toDict() + self.some_dict = self.data.values()[0] + self.dict_list = [dict(zip(self.columns, row)) for row in self.frame.values] + + def time_series_ctor_from_dict(self): + Series(self.some_dict) \ No newline at end of file diff --git a/asv_bench/benchmarks/frame_methods.py b/asv_bench/benchmarks/frame_methods.py new file mode 100644 index 0000000000000..2bd51201b45ca --- /dev/null +++ b/asv_bench/benchmarks/frame_methods.py @@ -0,0 +1,936 @@ +from pandas_vb_common import * + + +class frame_apply_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 100)) + + def time_frame_apply_axis_1(self): + self.df.apply((lambda x: (x + 1)), axis=1) + + +class frame_apply_lambda_mean(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 100)) + + def time_frame_apply_lambda_mean(self): + self.df.apply((lambda x: x.sum())) + + +class frame_apply_np_mean(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 100)) + + def time_frame_apply_np_mean(self): + self.df.apply(np.mean) + + +class frame_apply_pass_thru(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 100)) + + def time_frame_apply_pass_thru(self): + self.df.apply((lambda x: x)) + + +class frame_apply_ref_by_name(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 3), columns=list('ABC')) + + def time_frame_apply_ref_by_name(self): + self.df.apply((lambda x: (x['A'] + x['B'])), axis=1) + + +class frame_apply_user_func(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.arange(1028.0)) + self.df = DataFrame({i: self.s for i in range(1028)}) + + def time_frame_apply_user_func(self): + self.df.apply((lambda x: np.corrcoef(x, self.s)[(0, 1)])) + + +class frame_assign_timeseries_index(object): + goal_time = 0.2 + + def setup(self): + self.idx = date_range('1/1/2000', periods=100000, freq='D') + self.df = DataFrame(randn(100000, 1), columns=['A'], index=self.idx) + + def f(x): + self.x = self.x.copy() + self.x['date'] = self.x.index + + def time_frame_assign_timeseries_index(self): + f(self.df) + + +class frame_boolean_row_select(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 100)) + self.bool_arr = np.zeros(10000, dtype=bool) + self.bool_arr[:1000] = True + + def time_frame_boolean_row_select(self): + self.df[self.bool_arr] + + +class frame_count_level_axis0_mixed_dtypes_multi(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + self.df.index = MultiIndex.from_tuples(self.df.index.map((lambda x: (x, x)))) + self.df.columns = MultiIndex.from_tuples(self.df.columns.map((lambda x: (x, x)))) + + def time_frame_count_level_axis0_mixed_dtypes_multi(self): + self.df.count(axis=0, level=1) + + +class frame_count_level_axis0_multi(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df.index = MultiIndex.from_tuples(self.df.index.map((lambda x: (x, x)))) + self.df.columns = MultiIndex.from_tuples(self.df.columns.map((lambda x: (x, x)))) + + def time_frame_count_level_axis0_multi(self): + self.df.count(axis=0, level=1) + + +class frame_count_level_axis1_mixed_dtypes_multi(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + self.df.index = MultiIndex.from_tuples(self.df.index.map((lambda x: (x, x)))) + self.df.columns = MultiIndex.from_tuples(self.df.columns.map((lambda x: (x, x)))) + + def time_frame_count_level_axis1_mixed_dtypes_multi(self): + self.df.count(axis=1, level=1) + + +class frame_count_level_axis1_multi(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df.index = MultiIndex.from_tuples(self.df.index.map((lambda x: (x, x)))) + self.df.columns = MultiIndex.from_tuples(self.df.columns.map((lambda x: (x, x)))) + + def time_frame_count_level_axis1_multi(self): + self.df.count(axis=1, level=1) + + +class frame_dropna_axis0_all(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + + def time_frame_dropna_axis0_all(self): + self.df.dropna(how='all', axis=0) + + +class frame_dropna_axis0_all_mixed_dtypes(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + + def time_frame_dropna_axis0_all_mixed_dtypes(self): + self.df.dropna(how='all', axis=0) + + +class frame_dropna_axis0_any(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + + def time_frame_dropna_axis0_any(self): + self.df.dropna(how='any', axis=0) + + +class frame_dropna_axis0_any_mixed_dtypes(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + + def time_frame_dropna_axis0_any_mixed_dtypes(self): + self.df.dropna(how='any', axis=0) + + +class frame_dropna_axis1_all(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + + def time_frame_dropna_axis1_all(self): + self.df.dropna(how='all', axis=1) + + +class frame_dropna_axis1_all_mixed_dtypes(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + + def time_frame_dropna_axis1_all_mixed_dtypes(self): + self.df.dropna(how='all', axis=1) + + +class frame_dropna_axis1_any(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + + def time_frame_dropna_axis1_any(self): + self.df.dropna(how='any', axis=1) + + +class frame_dropna_axis1_any_mixed_dtypes(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(10000, 1000) + self.df = DataFrame(self.data) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df['foo'] = 'bar' + + def time_frame_dropna_axis1_any_mixed_dtypes(self): + self.df.dropna(how='any', axis=1) + + +class frame_dtypes(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 1000)) + + def time_frame_dtypes(self): + self.df.dtypes + + +class frame_duplicated(object): + goal_time = 0.2 + + def setup(self): + self.n = (1 << 20) + self.t = date_range('2015-01-01', freq='S', periods=(self.n // 64)) + self.xs = np.random.randn((self.n // 64)).round(2) + self.df = DataFrame({'a': np.random.randint(((-1) << 8), (1 << 8), self.n), 'b': np.random.choice(self.t, self.n), 'c': np.random.choice(self.xs, self.n), }) + + def time_frame_duplicated(self): + self.df.duplicated() + + +class frame_fancy_lookup(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10000, 8), columns=list('abcdefgh')) + self.df['foo'] = 'bar' + self.row_labels = list(self.df.index[::10])[:900] + self.col_labels = (list(self.df.columns) * 100) + self.row_labels_all = np.array((list(self.df.index) * len(self.df.columns)), dtype='object') + self.col_labels_all = np.array((list(self.df.columns) * len(self.df.index)), dtype='object') + + def time_frame_fancy_lookup(self): + self.df.lookup(self.row_labels, self.col_labels) + + +class frame_fancy_lookup_all(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10000, 8), columns=list('abcdefgh')) + self.df['foo'] = 'bar' + self.row_labels = list(self.df.index[::10])[:900] + self.col_labels = (list(self.df.columns) * 100) + self.row_labels_all = np.array((list(self.df.index) * len(self.df.columns)), dtype='object') + self.col_labels_all = np.array((list(self.df.columns) * len(self.df.index)), dtype='object') + + def time_frame_fancy_lookup_all(self): + self.df.lookup(self.row_labels_all, self.col_labels_all) + + +class frame_fillna_inplace(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 100)) + self.df.values[::2] = np.nan + + def time_frame_fillna_inplace(self): + self.df.fillna(0, inplace=True) + + +class frame_float_equal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_float_equal(self): + test_equal('float_df') + + +class frame_float_unequal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_float_unequal(self): + test_unequal('float_df') + + +class frame_from_records_generator(object): + goal_time = 0.2 + + def setup(self): + + def get_data(n=100000): + return ((x, (x * 20), (x * 100)) for x in xrange(n)) + + def time_frame_from_records_generator(self): + self.df = DataFrame.from_records(get_data()) + + +class frame_from_records_generator_nrows(object): + goal_time = 0.2 + + def setup(self): + + def get_data(n=100000): + return ((x, (x * 20), (x * 100)) for x in xrange(n)) + + def time_frame_from_records_generator_nrows(self): + self.df = DataFrame.from_records(get_data(), nrows=1000) + + +class frame_get_dtype_counts(object): + goal_time = 0.2 + + def setup(self): + self.df = pandas.DataFrame(np.random.randn(10, 10000)) + + def time_frame_get_dtype_counts(self): + self.df.get_dtype_counts() + + +class frame_getitem_single_column(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 1000)) + self.df2 = DataFrame(randn(3000, 1), columns=['A']) + self.df3 = DataFrame(randn(3000, 1)) + + def f(): + if hasattr(self.df, '_item_cache'): + self.df._item_cache.clear() + for (name, col) in self.df.iteritems(): + pass + + def g(): + for (name, col) in self.df.iteritems(): + pass + + def h(): + for i in xrange(10000): + self.df2['A'] + + def j(): + for i in xrange(10000): + self.df3[0] + + def time_frame_getitem_single_column(self): + h() + + +class frame_getitem_single_column2(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 1000)) + self.df2 = DataFrame(randn(3000, 1), columns=['A']) + self.df3 = DataFrame(randn(3000, 1)) + + def f(): + if hasattr(self.df, '_item_cache'): + self.df._item_cache.clear() + for (name, col) in self.df.iteritems(): + pass + + def g(): + for (name, col) in self.df.iteritems(): + pass + + def h(): + for i in xrange(10000): + self.df2['A'] + + def j(): + for i in xrange(10000): + self.df3[0] + + def time_frame_getitem_single_column2(self): + j() + + +class frame_html_repr_trunc_mi(object): + goal_time = 0.2 + + def setup(self): + self.nrows = 10000 + self.data = randn(self.nrows, 10) + self.idx = MultiIndex.from_arrays(np.tile(randn(3, (self.nrows / 100)), 100)) + self.df = DataFrame(self.data, index=self.idx) + + def time_frame_html_repr_trunc_mi(self): + self.df._repr_html_() + + +class frame_html_repr_trunc_si(object): + goal_time = 0.2 + + def setup(self): + self.nrows = 10000 + self.data = randn(self.nrows, 10) + self.idx = randn(self.nrows) + self.df = DataFrame(self.data, index=self.idx) + + def time_frame_html_repr_trunc_si(self): + self.df._repr_html_() + + +class frame_insert_100_columns_begin(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000 + + def f(K=100): + self.df = DataFrame(index=range(self.N)) + self.new_col = np.random.randn(self.N) + for i in range(K): + self.df.insert(0, i, self.new_col) + + def time_frame_insert_100_columns_begin(self): + f() + + +class frame_insert_500_columns_end(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000 + + def f(K=500): + self.df = DataFrame(index=range(self.N)) + self.new_col = np.random.randn(self.N) + for i in range(K): + self.df[i] = self.new_col + + def time_frame_insert_500_columns_end(self): + f() + + +class frame_interpolate(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 100)) + self.df.values[::2] = np.nan + + def time_frame_interpolate(self): + self.df.interpolate() + + +class frame_interpolate_some_good(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'A': np.arange(0, 10000), 'B': np.random.randint(0, 100, 10000), 'C': randn(10000), 'D': randn(10000), }) + self.df.loc[1::5, 'A'] = np.nan + self.df.loc[1::5, 'C'] = np.nan + + def time_frame_interpolate_some_good(self): + self.df.interpolate() + + +class frame_interpolate_some_good_infer(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'A': np.arange(0, 10000), 'B': np.random.randint(0, 100, 10000), 'C': randn(10000), 'D': randn(10000), }) + self.df.loc[1::5, 'A'] = np.nan + self.df.loc[1::5, 'C'] = np.nan + + def time_frame_interpolate_some_good_infer(self): + self.df.interpolate(downcast='infer') + + +class frame_isnull(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(1000, 1000) + self.df = DataFrame(self.data) + + def time_frame_isnull(self): + isnull(self.df) + + +class frame_iteritems(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 1000)) + self.df2 = DataFrame(randn(3000, 1), columns=['A']) + self.df3 = DataFrame(randn(3000, 1)) + + def f(): + if hasattr(self.df, '_item_cache'): + self.df._item_cache.clear() + for (name, col) in self.df.iteritems(): + pass + + def g(): + for (name, col) in self.df.iteritems(): + pass + + def h(): + for i in xrange(10000): + self.df2['A'] + + def j(): + for i in xrange(10000): + self.df3[0] + + def time_frame_iteritems(self): + f() + + +class frame_iteritems_cached(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 1000)) + self.df2 = DataFrame(randn(3000, 1), columns=['A']) + self.df3 = DataFrame(randn(3000, 1)) + + def f(): + if hasattr(self.df, '_item_cache'): + self.df._item_cache.clear() + for (name, col) in self.df.iteritems(): + pass + + def g(): + for (name, col) in self.df.iteritems(): + pass + + def h(): + for i in xrange(10000): + self.df2['A'] + + def j(): + for i in xrange(10000): + self.df3[0] + + def time_frame_iteritems_cached(self): + g() + + +class frame_mask_bools(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(1000, 500) + self.df = DataFrame(self.data) + self.df = self.df.where((self.df > 0)) + self.bools = (self.df > 0) + self.mask = isnull(self.df) + + def time_frame_mask_bools(self): + self.bools.mask(self.mask) + + +class frame_mask_floats(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(1000, 500) + self.df = DataFrame(self.data) + self.df = self.df.where((self.df > 0)) + self.bools = (self.df > 0) + self.mask = isnull(self.df) + + def time_frame_mask_floats(self): + self.bools.astype(float).mask(self.mask) + + +class frame_nonunique_equal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_nonunique_equal(self): + test_equal('nonunique_cols') + + +class frame_nonunique_unequal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_nonunique_unequal(self): + test_unequal('nonunique_cols') + + +class frame_object_equal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_object_equal(self): + test_equal('object_df') + + +class frame_object_unequal(object): + goal_time = 0.2 + + def setup(self): + + def make_pair(frame): + self.df = frame + self.df2 = self.df.copy() + self.df2.ix[((-1), (-1))] = np.nan + return (self.df, self.df2) + + def test_equal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df) + + def test_unequal(name): + (self.df, self.df2) = pairs[name] + return self.df.equals(self.df2) + self.float_df = DataFrame(np.random.randn(1000, 1000)) + self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) + self.pairs = dict([(name, make_pair(frame)) for (name, frame) in (('float_df', self.float_df), ('object_df', self.object_df), ('nonunique_cols', self.nonunique_cols))]) + + def time_frame_object_unequal(self): + test_unequal('object_df') + + +class frame_reindex_axis0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 10000)) + self.idx = np.arange(4000, 7000) + + def time_frame_reindex_axis0(self): + self.df.reindex(self.idx) + + +class frame_reindex_axis1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 10000)) + self.idx = np.arange(4000, 7000) + + def time_frame_reindex_axis1(self): + self.df.reindex(columns=self.idx) + + +class frame_reindex_both_axes(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 10000)) + self.idx = np.arange(4000, 7000) + + def time_frame_reindex_both_axes(self): + self.df.reindex(index=self.idx, columns=self.idx) + + +class frame_reindex_both_axes_ix(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(10000, 10000)) + self.idx = np.arange(4000, 7000) + + def time_frame_reindex_both_axes_ix(self): + self.df.ix[(self.idx, self.idx)] + + +class frame_reindex_upcast(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(dict([(c, {0: randint(0, 2, 1000).astype(np.bool_), 1: randint(0, 1000, 1000).astype(np.int16), 2: randint(0, 1000, 1000).astype(np.int32), 3: randint(0, 1000, 1000).astype(np.int64), }[randint(0, 4)]) for c in range(1000)])) + + def time_frame_reindex_upcast(self): + self.df.reindex(permutation(range(1200))) + + +class frame_repr_tall(object): + goal_time = 0.2 + + def setup(self): + self.df = pandas.DataFrame(np.random.randn(10000, 10)) + + def time_frame_repr_tall(self): + repr(self.df) + + +class frame_repr_wide(object): + goal_time = 0.2 + + def setup(self): + self.df = pandas.DataFrame(np.random.randn(10, 10000)) + + def time_frame_repr_wide(self): + repr(self.df) + + +class frame_shift_axis0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.rand(10000, 500)) + + def time_frame_shift_axis0(self): + self.df.shift(1, axis=0) + + +class frame_shift_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.rand(10000, 500)) + + def time_frame_shift_axis_1(self): + self.df.shift(1, axis=1) + + +class frame_to_html_mixed(object): + goal_time = 0.2 + + def setup(self): + self.nrows = 500 + self.df = DataFrame(randn(self.nrows, 10)) + self.df[0] = period_range('2000', '2010', self.nrows) + self.df[1] = range(self.nrows) + + def time_frame_to_html_mixed(self): + self.df.to_html() + + +class frame_to_string_floats(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(100, 10)) + + def time_frame_to_string_floats(self): + self.df.to_string() + + +class frame_xs_col(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(1, 100000)) + + def time_frame_xs_col(self): + self.df.xs(50000, axis=1) + + +class frame_xs_row(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(randn(100000, 1)) + + def time_frame_xs_row(self): + self.df.xs(50000) + + +class series_string_vector_slice(object): + goal_time = 0.2 + + def setup(self): + self.s = Series((['abcdefg', np.nan] * 500000)) + + def time_series_string_vector_slice(self): + self.s.str[:5] \ No newline at end of file diff --git a/asv_bench/benchmarks/gil.py b/asv_bench/benchmarks/gil.py new file mode 100644 index 0000000000000..b0486617a52af --- /dev/null +++ b/asv_bench/benchmarks/gil.py @@ -0,0 +1,267 @@ +from pandas_vb_common import * +from pandas.core import common as com +from pandas.util.testing import test_parallel + + +class nogil_groupby_count_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].count() + + def time_nogil_groupby_count_2(self): + pg2() + + +class nogil_groupby_last_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].last() + + def time_nogil_groupby_last_2(self): + pg2() + + +class nogil_groupby_max_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].max() + + def time_nogil_groupby_max_2(self): + pg2() + + +class nogil_groupby_mean_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].mean() + + def time_nogil_groupby_mean_2(self): + pg2() + + +class nogil_groupby_min_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].min() + + def time_nogil_groupby_min_2(self): + pg2() + + +class nogil_groupby_prod_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].prod() + + def time_nogil_groupby_prod_2(self): + pg2() + + +class nogil_groupby_sum_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].sum() + + def time_nogil_groupby_sum_2(self): + pg2() + + +class nogil_groupby_sum_4(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + def f(): + self.df.groupby('key')['data'].sum() + + def g2(): + for i in range(2): + f() + + def g4(): + for i in range(4): + f() + + def g8(): + for i in range(8): + f() + + @test_parallel(num_threads=2) + def pg2(): + f() + + @test_parallel(num_threads=4) + def pg4(): + f() + + @test_parallel(num_threads=8) + def pg8(): + f() + + def time_nogil_groupby_sum_4(self): + pg4() + + +class nogil_groupby_sum_8(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + def f(): + self.df.groupby('key')['data'].sum() + + def g2(): + for i in range(2): + f() + + def g4(): + for i in range(4): + f() + + def g8(): + for i in range(8): + f() + + @test_parallel(num_threads=2) + def pg2(): + f() + + @test_parallel(num_threads=4) + def pg4(): + f() + + @test_parallel(num_threads=8) + def pg8(): + f() + + def time_nogil_groupby_sum_8(self): + pg8() + + +class nogil_groupby_var_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + + @test_parallel(num_threads=2) + def pg2(): + self.df.groupby('key')['data'].var() + + def time_nogil_groupby_var_2(self): + pg2() + + +class nogil_take1d_float64(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + self.N = 10000000.0 + self.df = DataFrame({'int64': np.arange(self.N, dtype='int64'), 'float64': np.arange(self.N, dtype='float64'), }) + self.indexer = np.arange(100, (len(self.df) - 100)) + + @test_parallel(num_threads=2) + def take_1d_pg2_int64(): + com.take_1d(self.df.int64.values, self.indexer) + + @test_parallel(num_threads=2) + def take_1d_pg2_float64(): + com.take_1d(self.df.float64.values, self.indexer) + + def time_nogil_take1d_float64(self): + take_1d_pg2_int64() + + +class nogil_take1d_int64(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.ngroups = 1000 + np.random.seed(1234) + self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) + self.N = 10000000.0 + self.df = DataFrame({'int64': np.arange(self.N, dtype='int64'), 'float64': np.arange(self.N, dtype='float64'), }) + self.indexer = np.arange(100, (len(self.df) - 100)) + + @test_parallel(num_threads=2) + def take_1d_pg2_int64(): + com.take_1d(self.df.int64.values, self.indexer) + + @test_parallel(num_threads=2) + def take_1d_pg2_float64(): + com.take_1d(self.df.float64.values, self.indexer) + + def time_nogil_take1d_int64(self): + take_1d_pg2_float64() \ No newline at end of file diff --git a/asv_bench/benchmarks/groupby.py b/asv_bench/benchmarks/groupby.py new file mode 100644 index 0000000000000..4f1f4e46b4a31 --- /dev/null +++ b/asv_bench/benchmarks/groupby.py @@ -0,0 +1,1683 @@ +from pandas_vb_common import * +from itertools import product +from string import ascii_letters, digits + + +class groupby_agg_builtins1(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(27182) + self.n = 100000 + self.df = DataFrame(np.random.randint(1, (self.n / 100), (self.n, 3)), columns=['jim', 'joe', 'jolie']) + + def time_groupby_agg_builtins1(self): + self.df.groupby('jim').agg([sum, min, max]) + + +class groupby_agg_builtins2(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(27182) + self.n = 100000 + self.df = DataFrame(np.random.randint(1, (self.n / 100), (self.n, 3)), columns=['jim', 'joe', 'jolie']) + + def time_groupby_agg_builtins2(self): + self.df.groupby(['jim', 'joe']).agg([sum, min, max]) + + +class groupby_apply_dict_return(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(1000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.f = (lambda x: {'first': x.values[0], 'last': x.values[(-1)], }) + + def time_groupby_apply_dict_return(self): + self.data.groupby(self.labels).apply(self.f) + + +class groupby_dt_size(object): + goal_time = 0.2 + + def setup(self): + self.n = 100000 + self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') + self.dates = (np.datetime64('now') + self.offsets) + self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), 'key2': np.random.randint(0, 100, size=self.n), 'value1': np.random.randn(self.n), 'value2': np.random.randn(self.n), 'value3': np.random.randn(self.n), 'dates': self.dates, }) + + def time_groupby_dt_size(self): + self.df.groupby(['dates']).size() + + +class groupby_dt_timegrouper_size(object): + goal_time = 0.2 + + def setup(self): + self.n = 100000 + self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') + self.dates = (np.datetime64('now') + self.offsets) + self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), 'key2': np.random.randint(0, 100, size=self.n), 'value1': np.random.randn(self.n), 'value2': np.random.randn(self.n), 'value3': np.random.randn(self.n), 'dates': self.dates, }) + + def time_groupby_dt_timegrouper_size(self): + self.df.groupby(TimeGrouper(key='dates', freq='M')).size() + + +class groupby_first_datetimes(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': date_range('1/1/2011', periods=100000, freq='s'), 'b': range(100000), }) + + def time_groupby_first_datetimes(self): + self.df.groupby('b').first() + + +class groupby_first_float32(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_first_float32(self): + self.data2.groupby(self.labels).first() + + +class groupby_first_float64(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_first_float64(self): + self.data.groupby(self.labels).first() + + +class groupby_first_object(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': (['foo'] * 100000), 'b': range(100000), }) + + def time_groupby_first_object(self): + self.df.groupby('b').first() + + +class groupby_frame_apply(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.labels = np.random.randint(0, 2000, size=self.N) + self.labels2 = np.random.randint(0, 3, size=self.N) + self.df = DataFrame({'key': self.labels, 'key2': self.labels2, 'value1': randn(self.N), 'value2': (['foo', 'bar', 'baz', 'qux'] * (self.N / 4)), }) + + def f(g): + return 1 + + def time_groupby_frame_apply(self): + self.df.groupby(['key', 'key2']).apply(f) + + +class groupby_frame_apply_overhead(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.labels = np.random.randint(0, 2000, size=self.N) + self.labels2 = np.random.randint(0, 3, size=self.N) + self.df = DataFrame({'key': self.labels, 'key2': self.labels2, 'value1': randn(self.N), 'value2': (['foo', 'bar', 'baz', 'qux'] * (self.N / 4)), }) + + def f(g): + return 1 + + def time_groupby_frame_apply_overhead(self): + self.df.groupby('key').apply(f) + + +class groupby_frame_cython_many_columns(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.random.randint(0, 100, size=1000) + self.df = DataFrame(randn(1000, 1000)) + + def time_groupby_frame_cython_many_columns(self): + self.df.groupby(self.labels).sum() + + +class groupby_frame_median(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(100000, 2) + self.labels = np.random.randint(0, 1000, size=100000) + self.df = DataFrame(self.data) + + def time_groupby_frame_median(self): + self.df.groupby(self.labels).median() + + +class groupby_frame_nth_any(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randint(1, 100, (10000, 2))) + + def time_groupby_frame_nth_any(self): + self.df.groupby(0).nth(0, dropna='any') + + +class groupby_frame_nth_none(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randint(1, 100, (10000, 2))) + + def time_groupby_frame_nth_none(self): + self.df.groupby(0).nth(0) + + +class groupby_frame_singlekey_integer(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(100000, 1) + self.labels = np.random.randint(0, 1000, size=100000) + self.df = DataFrame(self.data) + + def time_groupby_frame_singlekey_integer(self): + self.df.groupby(self.labels).sum() + + +class groupby_indices(object): + goal_time = 0.2 + + def setup(self): + try: + self.rng = date_range('1/1/2000', '12/31/2005', freq='H') + (year, month, day) = (self.rng.year, self.rng.month, self.rng.day) + except: + self.rng = date_range('1/1/2000', '12/31/2000', offset=datetools.Hour()) + self.year = self.rng.map((lambda x: x.year)) + self.month = self.rng.map((lambda x: x.month)) + self.day = self.rng.map((lambda x: x.day)) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + + def time_groupby_indices(self): + len(self.ts.groupby([self.year, self.month, self.day])) + + +class groupby_int64_overflow(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randint(((-1) << 12), (1 << 12), ((1 << 17), 5)) + self.i = np.random.choice(len(self.arr), (len(self.arr) * 5)) + self.arr = np.vstack((self.arr, self.arr[self.i])) + self.i = np.random.permutation(len(self.arr)) + self.arr = self.arr[self.i] + self.df = DataFrame(self.arr, columns=list('abcde')) + (self.df['jim'], self.df['joe']) = (np.random.randn(2, len(self.df)) * 10) + + def time_groupby_int64_overflow(self): + self.df.groupby(list('abcde')).max() + + +class groupby_int_count(object): + goal_time = 0.2 + + def setup(self): + self.n = 10000 + self.df = DataFrame({'key1': randint(0, 500, size=self.n), 'key2': randint(0, 100, size=self.n), 'ints': randint(0, 1000, size=self.n), 'ints2': randint(0, 1000, size=self.n), }) + + def time_groupby_int_count(self): + self.df.groupby(['key1', 'key2']).count() + + +class groupby_last_datetimes(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': date_range('1/1/2011', periods=100000, freq='s'), 'b': range(100000), }) + + def time_groupby_last_datetimes(self): + self.df.groupby('b').last() + + +class groupby_last_float32(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_last_float32(self): + self.data2.groupby(self.labels).last() + + +class groupby_last_float64(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_last_float64(self): + self.data.groupby(self.labels).last() + + +class groupby_last_object(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': (['foo'] * 100000), 'b': range(100000), }) + + def time_groupby_last_object(self): + self.df.groupby('b').last() + + +class groupby_multi_count(object): + goal_time = 0.2 + + def setup(self): + self.n = 10000 + self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') + self.dates = (np.datetime64('now') + self.offsets) + self.dates[(np.random.rand(self.n) > 0.5)] = np.datetime64('nat') + self.offsets[(np.random.rand(self.n) > 0.5)] = np.timedelta64('nat') + self.value2 = np.random.randn(self.n) + self.value2[(np.random.rand(self.n) > 0.5)] = np.nan + self.obj = tm.choice(list('ab'), size=self.n).astype(object) + self.obj[(np.random.randn(self.n) > 0.5)] = np.nan + self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), 'key2': np.random.randint(0, 100, size=self.n), 'dates': self.dates, 'value2': self.value2, 'value3': np.random.randn(self.n), 'ints': np.random.randint(0, 1000, size=self.n), 'obj': self.obj, 'offsets': self.offsets, }) + + def time_groupby_multi_count(self): + self.df.groupby(['key1', 'key2']).count() + + +class groupby_multi_cython(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.ngroups = 100 + + def get_test_data(ngroups=100, n=self.N): + self.unique_groups = range(self.ngroups) + self.arr = np.asarray(np.tile(self.unique_groups, (n / self.ngroups)), dtype=object) + if (len(self.arr) < n): + self.arr = np.asarray((list(self.arr) + self.unique_groups[:(n - len(self.arr))]), dtype=object) + random.shuffle(self.arr) + return self.arr + self.df = DataFrame({'key1': get_test_data(ngroups=self.ngroups), 'key2': get_test_data(ngroups=self.ngroups), 'data1': np.random.randn(self.N), 'data2': np.random.randn(self.N), }) + + def f(): + self.df.groupby(['key1', 'key2']).agg((lambda x: x.values.sum())) + self.simple_series = Series(np.random.randn(self.N)) + self.key1 = self.df['key1'] + + def time_groupby_multi_cython(self): + self.df.groupby(['key1', 'key2']).sum() + + +class groupby_multi_different_functions(object): + goal_time = 0.2 + + def setup(self): + self.fac1 = np.array(['A', 'B', 'C'], dtype='O') + self.fac2 = np.array(['one', 'two'], dtype='O') + self.df = DataFrame({'key1': self.fac1.take(np.random.randint(0, 3, size=100000)), 'key2': self.fac2.take(np.random.randint(0, 2, size=100000)), 'value1': np.random.randn(100000), 'value2': np.random.randn(100000), 'value3': np.random.randn(100000), }) + + def time_groupby_multi_different_functions(self): + self.df.groupby(['key1', 'key2']).agg({'value1': 'mean', 'value2': 'var', 'value3': 'sum', }) + + +class groupby_multi_different_numpy_functions(object): + goal_time = 0.2 + + def setup(self): + self.fac1 = np.array(['A', 'B', 'C'], dtype='O') + self.fac2 = np.array(['one', 'two'], dtype='O') + self.df = DataFrame({'key1': self.fac1.take(np.random.randint(0, 3, size=100000)), 'key2': self.fac2.take(np.random.randint(0, 2, size=100000)), 'value1': np.random.randn(100000), 'value2': np.random.randn(100000), 'value3': np.random.randn(100000), }) + + def time_groupby_multi_different_numpy_functions(self): + self.df.groupby(['key1', 'key2']).agg({'value1': np.mean, 'value2': np.var, 'value3': np.sum, }) + + +class groupby_multi_index(object): + goal_time = 0.2 + + def setup(self): + self.n = (((5 * 7) * 11) * (1 << 9)) + self.alpha = list(map(''.join, product((ascii_letters + digits), repeat=4))) + self.f = (lambda k: np.repeat(np.random.choice(self.alpha, (self.n // k)), k)) + self.df = DataFrame({'a': self.f(11), 'b': self.f(7), 'c': self.f(5), 'd': self.f(1), }) + self.df['joe'] = (np.random.randn(len(self.df)) * 10).round(3) + self.i = np.random.permutation(len(self.df)) + self.df = self.df.iloc[self.i].reset_index(drop=True).copy() + + def time_groupby_multi_index(self): + self.df.groupby(list('abcd')).max() + + +class groupby_multi_python(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.ngroups = 100 + + def get_test_data(ngroups=100, n=self.N): + self.unique_groups = range(self.ngroups) + self.arr = np.asarray(np.tile(self.unique_groups, (n / self.ngroups)), dtype=object) + if (len(self.arr) < n): + self.arr = np.asarray((list(self.arr) + self.unique_groups[:(n - len(self.arr))]), dtype=object) + random.shuffle(self.arr) + return self.arr + self.df = DataFrame({'key1': get_test_data(ngroups=self.ngroups), 'key2': get_test_data(ngroups=self.ngroups), 'data1': np.random.randn(self.N), 'data2': np.random.randn(self.N), }) + + def f(): + self.df.groupby(['key1', 'key2']).agg((lambda x: x.values.sum())) + self.simple_series = Series(np.random.randn(self.N)) + self.key1 = self.df['key1'] + + def time_groupby_multi_python(self): + self.df.groupby(['key1', 'key2'])['data1'].agg((lambda x: x.values.sum())) + + +class groupby_multi_series_op(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.ngroups = 100 + + def get_test_data(ngroups=100, n=self.N): + self.unique_groups = range(self.ngroups) + self.arr = np.asarray(np.tile(self.unique_groups, (n / self.ngroups)), dtype=object) + if (len(self.arr) < n): + self.arr = np.asarray((list(self.arr) + self.unique_groups[:(n - len(self.arr))]), dtype=object) + random.shuffle(self.arr) + return self.arr + self.df = DataFrame({'key1': get_test_data(ngroups=self.ngroups), 'key2': get_test_data(ngroups=self.ngroups), 'data1': np.random.randn(self.N), 'data2': np.random.randn(self.N), }) + + def f(): + self.df.groupby(['key1', 'key2']).agg((lambda x: x.values.sum())) + self.simple_series = Series(np.random.randn(self.N)) + self.key1 = self.df['key1'] + + def time_groupby_multi_series_op(self): + self.df.groupby(['key1', 'key2'])['data1'].agg(np.std) + + +class groupby_multi_size(object): + goal_time = 0.2 + + def setup(self): + self.n = 100000 + self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') + self.dates = (np.datetime64('now') + self.offsets) + self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), 'key2': np.random.randint(0, 100, size=self.n), 'value1': np.random.randn(self.n), 'value2': np.random.randn(self.n), 'value3': np.random.randn(self.n), 'dates': self.dates, }) + + def time_groupby_multi_size(self): + self.df.groupby(['key1', 'key2']).size() + + +class groupby_ngroups_10000_all(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_all(self): + self.df.groupby('value')['timestamp'].all() + + +class groupby_ngroups_10000_any(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_any(self): + self.df.groupby('value')['timestamp'].any() + + +class groupby_ngroups_10000_count(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_count(self): + self.df.groupby('value')['timestamp'].count() + + +class groupby_ngroups_10000_cumcount(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_cumcount(self): + self.df.groupby('value')['timestamp'].cumcount() + + +class groupby_ngroups_10000_cummax(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_cummax(self): + self.df.groupby('value')['timestamp'].cummax() + + +class groupby_ngroups_10000_cummin(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_cummin(self): + self.df.groupby('value')['timestamp'].cummin() + + +class groupby_ngroups_10000_cumprod(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_cumprod(self): + self.df.groupby('value')['timestamp'].cumprod() + + +class groupby_ngroups_10000_cumsum(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_cumsum(self): + self.df.groupby('value')['timestamp'].cumsum() + + +class groupby_ngroups_10000_describe(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_describe(self): + self.df.groupby('value')['timestamp'].describe() + + +class groupby_ngroups_10000_diff(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_diff(self): + self.df.groupby('value')['timestamp'].diff() + + +class groupby_ngroups_10000_first(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_first(self): + self.df.groupby('value')['timestamp'].first() + + +class groupby_ngroups_10000_head(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_head(self): + self.df.groupby('value')['timestamp'].head() + + +class groupby_ngroups_10000_last(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_last(self): + self.df.groupby('value')['timestamp'].last() + + +class groupby_ngroups_10000_mad(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_mad(self): + self.df.groupby('value')['timestamp'].mad() + + +class groupby_ngroups_10000_max(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_max(self): + self.df.groupby('value')['timestamp'].max() + + +class groupby_ngroups_10000_mean(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_mean(self): + self.df.groupby('value')['timestamp'].mean() + + +class groupby_ngroups_10000_median(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_median(self): + self.df.groupby('value')['timestamp'].median() + + +class groupby_ngroups_10000_min(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_min(self): + self.df.groupby('value')['timestamp'].min() + + +class groupby_ngroups_10000_nunique(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_nunique(self): + self.df.groupby('value')['timestamp'].nunique() + + +class groupby_ngroups_10000_pct_change(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_pct_change(self): + self.df.groupby('value')['timestamp'].pct_change() + + +class groupby_ngroups_10000_prod(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_prod(self): + self.df.groupby('value')['timestamp'].prod() + + +class groupby_ngroups_10000_rank(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_rank(self): + self.df.groupby('value')['timestamp'].rank() + + +class groupby_ngroups_10000_sem(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_sem(self): + self.df.groupby('value')['timestamp'].sem() + + +class groupby_ngroups_10000_size(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_size(self): + self.df.groupby('value')['timestamp'].size() + + +class groupby_ngroups_10000_skew(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_skew(self): + self.df.groupby('value')['timestamp'].skew() + + +class groupby_ngroups_10000_std(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_std(self): + self.df.groupby('value')['timestamp'].std() + + +class groupby_ngroups_10000_sum(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_sum(self): + self.df.groupby('value')['timestamp'].sum() + + +class groupby_ngroups_10000_tail(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_tail(self): + self.df.groupby('value')['timestamp'].tail() + + +class groupby_ngroups_10000_unique(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_unique(self): + self.df.groupby('value')['timestamp'].unique() + + +class groupby_ngroups_10000_value_counts(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_value_counts(self): + self.df.groupby('value')['timestamp'].value_counts() + + +class groupby_ngroups_10000_var(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 10000 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_10000_var(self): + self.df.groupby('value')['timestamp'].var() + + +class groupby_ngroups_100_all(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_all(self): + self.df.groupby('value')['timestamp'].all() + + +class groupby_ngroups_100_any(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_any(self): + self.df.groupby('value')['timestamp'].any() + + +class groupby_ngroups_100_count(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_count(self): + self.df.groupby('value')['timestamp'].count() + + +class groupby_ngroups_100_cumcount(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_cumcount(self): + self.df.groupby('value')['timestamp'].cumcount() + + +class groupby_ngroups_100_cummax(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_cummax(self): + self.df.groupby('value')['timestamp'].cummax() + + +class groupby_ngroups_100_cummin(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_cummin(self): + self.df.groupby('value')['timestamp'].cummin() + + +class groupby_ngroups_100_cumprod(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_cumprod(self): + self.df.groupby('value')['timestamp'].cumprod() + + +class groupby_ngroups_100_cumsum(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_cumsum(self): + self.df.groupby('value')['timestamp'].cumsum() + + +class groupby_ngroups_100_describe(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_describe(self): + self.df.groupby('value')['timestamp'].describe() + + +class groupby_ngroups_100_diff(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_diff(self): + self.df.groupby('value')['timestamp'].diff() + + +class groupby_ngroups_100_first(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_first(self): + self.df.groupby('value')['timestamp'].first() + + +class groupby_ngroups_100_head(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_head(self): + self.df.groupby('value')['timestamp'].head() + + +class groupby_ngroups_100_last(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_last(self): + self.df.groupby('value')['timestamp'].last() + + +class groupby_ngroups_100_mad(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_mad(self): + self.df.groupby('value')['timestamp'].mad() + + +class groupby_ngroups_100_max(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_max(self): + self.df.groupby('value')['timestamp'].max() + + +class groupby_ngroups_100_mean(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_mean(self): + self.df.groupby('value')['timestamp'].mean() + + +class groupby_ngroups_100_median(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_median(self): + self.df.groupby('value')['timestamp'].median() + + +class groupby_ngroups_100_min(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_min(self): + self.df.groupby('value')['timestamp'].min() + + +class groupby_ngroups_100_nunique(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_nunique(self): + self.df.groupby('value')['timestamp'].nunique() + + +class groupby_ngroups_100_pct_change(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_pct_change(self): + self.df.groupby('value')['timestamp'].pct_change() + + +class groupby_ngroups_100_prod(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_prod(self): + self.df.groupby('value')['timestamp'].prod() + + +class groupby_ngroups_100_rank(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_rank(self): + self.df.groupby('value')['timestamp'].rank() + + +class groupby_ngroups_100_sem(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_sem(self): + self.df.groupby('value')['timestamp'].sem() + + +class groupby_ngroups_100_size(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_size(self): + self.df.groupby('value')['timestamp'].size() + + +class groupby_ngroups_100_skew(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_skew(self): + self.df.groupby('value')['timestamp'].skew() + + +class groupby_ngroups_100_std(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_std(self): + self.df.groupby('value')['timestamp'].std() + + +class groupby_ngroups_100_sum(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_sum(self): + self.df.groupby('value')['timestamp'].sum() + + +class groupby_ngroups_100_tail(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_tail(self): + self.df.groupby('value')['timestamp'].tail() + + +class groupby_ngroups_100_unique(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_unique(self): + self.df.groupby('value')['timestamp'].unique() + + +class groupby_ngroups_100_value_counts(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_value_counts(self): + self.df.groupby('value')['timestamp'].value_counts() + + +class groupby_ngroups_100_var(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.ngroups = 100 + self.size = (self.ngroups * 2) + self.rng = np.arange(self.ngroups) + self.df = DataFrame(dict(timestamp=self.rng.take(np.random.randint(0, self.ngroups, size=self.size)), value=np.random.randint(0, self.size, size=self.size))) + + def time_groupby_ngroups_100_var(self): + self.df.groupby('value')['timestamp'].var() + + +class groupby_nth_datetimes_any(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': date_range('1/1/2011', periods=100000, freq='s'), 'b': range(100000), }) + + def time_groupby_nth_datetimes_any(self): + self.df.groupby('b').nth(0, dropna='all') + + +class groupby_nth_datetimes_none(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': date_range('1/1/2011', periods=100000, freq='s'), 'b': range(100000), }) + + def time_groupby_nth_datetimes_none(self): + self.df.groupby('b').nth(0) + + +class groupby_nth_float32_any(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_nth_float32_any(self): + self.data2.groupby(self.labels).nth(0, dropna='all') + + +class groupby_nth_float32_none(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_nth_float32_none(self): + self.data2.groupby(self.labels).nth(0) + + +class groupby_nth_float64_any(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_nth_float64_any(self): + self.data.groupby(self.labels).nth(0, dropna='all') + + +class groupby_nth_float64_none(object): + goal_time = 0.2 + + def setup(self): + self.labels = np.arange(10000).repeat(10) + self.data = Series(randn(len(self.labels))) + self.data[::3] = np.nan + self.data[1::3] = np.nan + self.data2 = Series(randn(len(self.labels)), dtype='float32') + self.data2[::3] = np.nan + self.data2[1::3] = np.nan + self.labels = self.labels.take(np.random.permutation(len(self.labels))) + + def time_groupby_nth_float64_none(self): + self.data.groupby(self.labels).nth(0) + + +class groupby_nth_object_any(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': (['foo'] * 100000), 'b': range(100000), }) + + def time_groupby_nth_object_any(self): + self.df.groupby('b').nth(0, dropna='any') + + +class groupby_nth_object_none(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'a': (['foo'] * 100000), 'b': range(100000), }) + + def time_groupby_nth_object_none(self): + self.df.groupby('b').nth(0) + + +class groupby_pivot_table(object): + goal_time = 0.2 + + def setup(self): + self.fac1 = np.array(['A', 'B', 'C'], dtype='O') + self.fac2 = np.array(['one', 'two'], dtype='O') + self.ind1 = np.random.randint(0, 3, size=100000) + self.ind2 = np.random.randint(0, 2, size=100000) + self.df = DataFrame({'key1': self.fac1.take(self.ind1), 'key2': self.fac2.take(self.ind2), 'key3': self.fac2.take(self.ind2), 'value1': np.random.randn(100000), 'value2': np.random.randn(100000), 'value3': np.random.randn(100000), }) + + def time_groupby_pivot_table(self): + self.df.pivot_table(index='key1', columns=['key2', 'key3']) + + +class groupby_series_nth_any(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randint(1, 100, (10000, 2))) + + def time_groupby_series_nth_any(self): + self.df[1].groupby(self.df[0]).nth(0, dropna='any') + + +class groupby_series_nth_none(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randint(1, 100, (10000, 2))) + + def time_groupby_series_nth_none(self): + self.df[1].groupby(self.df[0]).nth(0) + + +class groupby_series_simple_cython(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.ngroups = 100 + + def get_test_data(ngroups=100, n=self.N): + self.unique_groups = range(self.ngroups) + self.arr = np.asarray(np.tile(self.unique_groups, (n / self.ngroups)), dtype=object) + if (len(self.arr) < n): + self.arr = np.asarray((list(self.arr) + self.unique_groups[:(n - len(self.arr))]), dtype=object) + random.shuffle(self.arr) + return self.arr + self.df = DataFrame({'key1': get_test_data(ngroups=self.ngroups), 'key2': get_test_data(ngroups=self.ngroups), 'data1': np.random.randn(self.N), 'data2': np.random.randn(self.N), }) + + def f(): + self.df.groupby(['key1', 'key2']).agg((lambda x: x.values.sum())) + self.simple_series = Series(np.random.randn(self.N)) + self.key1 = self.df['key1'] + + def time_groupby_series_simple_cython(self): + self.df.groupby('key1').rank(pct=True) + + +class groupby_simple_compress_timing(object): + goal_time = 0.2 + + def setup(self): + self.data = np.random.randn(1000000, 2) + self.labels = np.random.randint(0, 1000, size=1000000) + self.df = DataFrame(self.data) + + def time_groupby_simple_compress_timing(self): + self.df.groupby(self.labels).mean() + + +class groupby_sum_booleans(object): + goal_time = 0.2 + + def setup(self): + self.N = 500 + self.df = DataFrame({'ii': range(self.N), 'bb': [True for x in range(self.N)], }) + + def time_groupby_sum_booleans(self): + self.df.groupby('ii').sum() + + +class groupby_sum_multiindex(object): + goal_time = 0.2 + + def setup(self): + self.N = 50 + self.df = DataFrame({'A': (range(self.N) * 2), 'B': range((self.N * 2)), 'C': 1, }).set_index(['A', 'B']) + + def time_groupby_sum_multiindex(self): + self.df.groupby(level=[0, 1]).sum() + + +class groupby_transform(object): + goal_time = 0.2 + + def setup(self): + self.n_dates = 400 + self.n_securities = 250 + self.n_columns = 3 + self.share_na = 0.1 + self.dates = date_range('1997-12-31', periods=self.n_dates, freq='B') + self.dates = Index(map((lambda x: (((x.year * 10000) + (x.month * 100)) + x.day)), self.dates)) + self.secid_min = int('10000000', 16) + self.secid_max = int('F0000000', 16) + self.step = ((self.secid_max - self.secid_min) // (self.n_securities - 1)) + self.security_ids = map((lambda x: hex(x)[2:10].upper()), range(self.secid_min, (self.secid_max + 1), self.step)) + self.data_index = MultiIndex(levels=[self.dates.values, self.security_ids], labels=[[i for i in xrange(self.n_dates) for _ in xrange(self.n_securities)], (range(self.n_securities) * self.n_dates)], names=['date', 'security_id']) + self.n_data = len(self.data_index) + self.columns = Index(['factor{}'.format(i) for i in xrange(1, (self.n_columns + 1))]) + self.data = DataFrame(np.random.randn(self.n_data, self.n_columns), index=self.data_index, columns=self.columns) + self.step = int((self.n_data * self.share_na)) + for column_index in xrange(self.n_columns): + self.index = column_index + while (self.index < self.n_data): + self.data.set_value(self.data_index[self.index], self.columns[column_index], np.nan) + self.index += self.step + self.f_fillna = (lambda x: x.fillna(method='pad')) + + def time_groupby_transform(self): + self.data.groupby(level='security_id').transform(self.f_fillna) + + +class groupby_transform_multi_key1(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(2718281) + self.n = 20000 + self.df = DataFrame(np.random.randint(1, self.n, (self.n, 3)), columns=['jim', 'joe', 'jolie']) + + def time_groupby_transform_multi_key1(self): + self.df.groupby(['jim', 'joe'])['jolie'].transform('max') + + +class groupby_transform_multi_key2(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(2718281) + self.n = 20000 + self.df = DataFrame(np.random.randint(1, self.n, (self.n, 3)), columns=['jim', 'joe', 'jolie']) + self.df['jim'] = self.df['joe'] + + def time_groupby_transform_multi_key2(self): + self.df.groupby(['jim', 'joe'])['jolie'].transform('max') + + +class groupby_transform_multi_key3(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(2718281) + self.n = 200000 + self.df = DataFrame(np.random.randint(1, (self.n / 10), (self.n, 3)), columns=['jim', 'joe', 'jolie']) + + def time_groupby_transform_multi_key3(self): + self.df.groupby(['jim', 'joe'])['jolie'].transform('max') + + +class groupby_transform_multi_key4(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(2718281) + self.n = 200000 + self.df = DataFrame(np.random.randint(1, (self.n / 10), (self.n, 3)), columns=['jim', 'joe', 'jolie']) + self.df['jim'] = self.df['joe'] + + def time_groupby_transform_multi_key4(self): + self.df.groupby(['jim', 'joe'])['jolie'].transform('max') + + +class groupby_transform_series(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(0) + self.N = 120000 + self.N_TRANSITIONS = 1400 + self.transition_points = np.random.permutation(np.arange(self.N))[:self.N_TRANSITIONS] + self.transition_points.sort() + self.transitions = np.zeros((self.N,), dtype=np.bool) + self.transitions[self.transition_points] = True + self.g = self.transitions.cumsum() + self.df = DataFrame({'signal': np.random.rand(self.N), }) + + def time_groupby_transform_series(self): + self.df['signal'].groupby(self.g).transform(np.mean) + + +class groupby_transform_series2(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(0) + self.df = DataFrame({'id': (np.arange(100000) / 3), 'val': np.random.randn(100000), }) + + def time_groupby_transform_series2(self): + self.df.groupby('id')['val'].transform(np.mean) + + +class groupby_transform_ufunc(object): + goal_time = 0.2 + + def setup(self): + self.n_dates = 400 + self.n_securities = 250 + self.n_columns = 3 + self.share_na = 0.1 + self.dates = date_range('1997-12-31', periods=self.n_dates, freq='B') + self.dates = Index(map((lambda x: (((x.year * 10000) + (x.month * 100)) + x.day)), self.dates)) + self.secid_min = int('10000000', 16) + self.secid_max = int('F0000000', 16) + self.step = ((self.secid_max - self.secid_min) // (self.n_securities - 1)) + self.security_ids = map((lambda x: hex(x)[2:10].upper()), range(self.secid_min, (self.secid_max + 1), self.step)) + self.data_index = MultiIndex(levels=[self.dates.values, self.security_ids], labels=[[i for i in xrange(self.n_dates) for _ in xrange(self.n_securities)], (range(self.n_securities) * self.n_dates)], names=['date', 'security_id']) + self.n_data = len(self.data_index) + self.columns = Index(['factor{}'.format(i) for i in xrange(1, (self.n_columns + 1))]) + self.data = DataFrame(np.random.randn(self.n_data, self.n_columns), index=self.data_index, columns=self.columns) + self.step = int((self.n_data * self.share_na)) + for column_index in xrange(self.n_columns): + self.index = column_index + while (self.index < self.n_data): + self.data.set_value(self.data_index[self.index], self.columns[column_index], np.nan) + self.index += self.step + self.f_fillna = (lambda x: x.fillna(method='pad')) + + def time_groupby_transform_ufunc(self): + self.data.groupby(level='date').transform(np.max) + + +class series_value_counts_int64(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.randint(0, 1000, size=100000)) + + def time_series_value_counts_int64(self): + self.s.value_counts() + + +class series_value_counts_strings(object): + goal_time = 0.2 + + def setup(self): + self.K = 1000 + self.N = 100000 + self.uniques = tm.makeStringIndex(self.K).values + self.s = Series(np.tile(self.uniques, (self.N // self.K))) + + def time_series_value_counts_strings(self): + self.s.value_counts() \ No newline at end of file diff --git a/asv_bench/benchmarks/hdfstore_bench.py b/asv_bench/benchmarks/hdfstore_bench.py new file mode 100644 index 0000000000000..9e36f735f8608 --- /dev/null +++ b/asv_bench/benchmarks/hdfstore_bench.py @@ -0,0 +1,351 @@ +from pandas_vb_common import * +import os + + +class query_store_table(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = date_range('1/1/2000', periods=25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('df12', self.df) + + def time_query_store_table(self): + self.store.select('df12', [('index', '>', self.df.index[10000]), ('index', '<', self.df.index[15000])]) + + def teardown(self): + self.store.close() + + +class query_store_table_wide(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = date_range('1/1/2000', periods=25000) + self.df = DataFrame(np.random.randn(25000, 100), index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('df11', self.df) + + def time_query_store_table_wide(self): + self.store.select('df11', [('index', '>', self.df.index[10000]), ('index', '<', self.df.index[15000])]) + + def teardown(self): + self.store.close() + + +class read_store(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.put('df1', self.df) + + def time_read_store(self): + self.store.get('df1') + + def teardown(self): + self.store.close() + + +class read_store_mixed(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), 'string1': (['foo'] * 25000), 'bool1': ([True] * 25000), 'int1': np.random.randint(0, 250000, size=25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.put('df3', self.df) + + def time_read_store_mixed(self): + self.store.get('df3') + + def teardown(self): + self.store.close() + + +class read_store_table(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('df7', self.df) + + def time_read_store_table(self): + self.store.select('df7') + + def teardown(self): + self.store.close() + + +class read_store_table_mixed(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 10000 + self.index = tm.makeStringIndex(self.N) + self.df = DataFrame({'float1': randn(self.N), 'float2': randn(self.N), 'string1': (['foo'] * self.N), 'bool1': ([True] * self.N), 'int1': np.random.randint(0, self.N, size=self.N), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('df5', self.df) + + def time_read_store_table_mixed(self): + self.store.select('df5') + + def teardown(self): + self.store.close() + + +class read_store_table_panel(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.p = Panel(randn(20, 1000, 25), items=[('Item%03d' % i) for i in xrange(20)], major_axis=date_range('1/1/2000', periods=1000), minor_axis=[('E%03d' % i) for i in xrange(25)]) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('p1', self.p) + + def time_read_store_table_panel(self): + self.store.select('p1') + + def teardown(self): + self.store.close() + + +class read_store_table_wide(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.df = DataFrame(np.random.randn(25000, 100)) + remove(self.f) + self.store = HDFStore(self.f) + self.store.append('df9', self.df) + + def time_read_store_table_wide(self): + self.store.select('df9') + + def teardown(self): + self.store.close() + + +class write_store(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store(self): + self.store.put('df2', self.df) + + def teardown(self): + self.store.close() + + +class write_store_mixed(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), 'string1': (['foo'] * 25000), 'bool1': ([True] * 25000), 'int1': np.random.randint(0, 250000, size=25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_mixed(self): + self.store.put('df4', self.df) + + def teardown(self): + self.store.close() + + +class write_store_table(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_table(self): + self.store.append('df8', self.df) + + def teardown(self): + self.store.close() + + +class write_store_table_dc(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.df = DataFrame(np.random.randn(10000, 10), columns=[('C%03d' % i) for i in xrange(10)]) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_table_dc(self): + self.store.append('df15', self.df, data_columns=True) + + def teardown(self): + self.store.close() + + +class write_store_table_mixed(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.index = tm.makeStringIndex(25000) + self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000), 'string1': (['foo'] * 25000), 'bool1': ([True] * 25000), 'int1': np.random.randint(0, 25000, size=25000), }, index=self.index) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_table_mixed(self): + self.store.append('df6', self.df) + + def teardown(self): + self.store.close() + + +class write_store_table_panel(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.p = Panel(randn(20, 1000, 25), items=[('Item%03d' % i) for i in xrange(20)], major_axis=date_range('1/1/2000', periods=1000), minor_axis=[('E%03d' % i) for i in xrange(25)]) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_table_panel(self): + self.store.append('p2', self.p) + + def teardown(self): + self.store.close() + + +class write_store_table_wide(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.h5' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.df = DataFrame(np.random.randn(25000, 100)) + remove(self.f) + self.store = HDFStore(self.f) + + def time_write_store_table_wide(self): + self.store.append('df10', self.df) + + def teardown(self): + self.store.close() \ No newline at end of file diff --git a/asv_bench/benchmarks/index_object.py b/asv_bench/benchmarks/index_object.py new file mode 100644 index 0000000000000..9c181c92195ea --- /dev/null +++ b/asv_bench/benchmarks/index_object.py @@ -0,0 +1,292 @@ +from pandas_vb_common import * + + +class datetime_index_intersection(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=10000, freq='T') + self.rng2 = self.rng[:(-1)] + + def time_datetime_index_intersection(self): + self.rng.intersection(self.rng2) + + +class datetime_index_repr(object): + goal_time = 0.2 + + def setup(self): + self.dr = pd.date_range('20000101', freq='D', periods=100000) + + def time_datetime_index_repr(self): + self.dr._is_dates_only + + +class datetime_index_union(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=10000, freq='T') + self.rng2 = self.rng[:(-1)] + + def time_datetime_index_union(self): + self.rng.union(self.rng2) + + +class index_datetime_intersection(object): + goal_time = 0.2 + + def setup(self): + self.rng = DatetimeIndex(start='1/1/2000', periods=10000, freq=datetools.Minute()) + if (self.rng.dtype == object): + self.rng = self.rng.view(Index) + else: + self.rng = self.rng.asobject + self.rng2 = self.rng[:(-1)] + + def time_index_datetime_intersection(self): + self.rng.intersection(self.rng2) + + +class index_datetime_union(object): + goal_time = 0.2 + + def setup(self): + self.rng = DatetimeIndex(start='1/1/2000', periods=10000, freq=datetools.Minute()) + if (self.rng.dtype == object): + self.rng = self.rng.view(Index) + else: + self.rng = self.rng.asobject + self.rng2 = self.rng[:(-1)] + + def time_index_datetime_union(self): + self.rng.union(self.rng2) + + +class index_float64_boolean_indexer(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_boolean_indexer(self): + self.idx[self.mask] + + +class index_float64_boolean_series_indexer(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_boolean_series_indexer(self): + self.idx[self.series_mask] + + +class index_float64_construct(object): + goal_time = 0.2 + + def setup(self): + self.baseidx = np.arange(1000000.0) + + def time_index_float64_construct(self): + Index(self.baseidx) + + +class index_float64_div(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_div(self): + (self.idx / 2) + + +class index_float64_get(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_get(self): + self.idx[1] + + +class index_float64_mul(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_mul(self): + (self.idx * 2) + + +class index_float64_slice_indexer_basic(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_slice_indexer_basic(self): + self.idx[:(-1)] + + +class index_float64_slice_indexer_even(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeFloatIndex(1000000) + self.mask = ((np.arange(self.idx.size) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_float64_slice_indexer_even(self): + self.idx[::2] + + +class index_int64_intersection(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.options = np.arange(self.N) + self.left = Index(self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) + self.right = Index(self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) + + def time_index_int64_intersection(self): + self.left.intersection(self.right) + + +class index_int64_union(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + self.options = np.arange(self.N) + self.left = Index(self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) + self.right = Index(self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) + + def time_index_int64_union(self): + self.left.union(self.right) + + +class index_str_boolean_indexer(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeStringIndex(1000000) + self.mask = ((np.arange(1000000) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_str_boolean_indexer(self): + self.idx[self.mask] + + +class index_str_boolean_series_indexer(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeStringIndex(1000000) + self.mask = ((np.arange(1000000) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_str_boolean_series_indexer(self): + self.idx[self.series_mask] + + +class index_str_slice_indexer_basic(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeStringIndex(1000000) + self.mask = ((np.arange(1000000) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_str_slice_indexer_basic(self): + self.idx[:(-1)] + + +class index_str_slice_indexer_even(object): + goal_time = 0.2 + + def setup(self): + self.idx = tm.makeStringIndex(1000000) + self.mask = ((np.arange(1000000) % 3) == 0) + self.series_mask = Series(self.mask) + + def time_index_str_slice_indexer_even(self): + self.idx[::2] + + +class multiindex_duplicated(object): + goal_time = 0.2 + + def setup(self): + (n, k) = (200, 5000) + self.levels = [np.arange(n), tm.makeStringIndex(n).values, (1000 + np.arange(n))] + self.labels = [np.random.choice(n, (k * n)) for lev in self.levels] + self.mi = MultiIndex(levels=self.levels, labels=self.labels) + + def time_multiindex_duplicated(self): + self.mi.duplicated() + + +class multiindex_from_product(object): + goal_time = 0.2 + + def setup(self): + self.iterables = [tm.makeStringIndex(10000), xrange(20)] + + def time_multiindex_from_product(self): + MultiIndex.from_product(self.iterables) + + +class multiindex_sortlevel_int64(object): + goal_time = 0.2 + + def setup(self): + self.n = ((((3 * 5) * 7) * 11) * (1 << 10)) + (low, high) = (((-1) << 12), (1 << 12)) + self.f = (lambda k: np.repeat(np.random.randint(low, high, (self.n // k)), k)) + self.i = np.random.permutation(self.n) + self.mi = MultiIndex.from_arrays([self.f(11), self.f(7), self.f(5), self.f(3), self.f(1)])[self.i] + + def time_multiindex_sortlevel_int64(self): + self.mi.sortlevel() + + +class multiindex_with_datetime_level_full(object): + goal_time = 0.2 + + def setup(self): + self.level1 = range(1000) + self.level2 = date_range(start='1/1/2012', periods=100) + self.mi = MultiIndex.from_product([self.level1, self.level2]) + + def time_multiindex_with_datetime_level_full(self): + self.mi.copy().values + + +class multiindex_with_datetime_level_sliced(object): + goal_time = 0.2 + + def setup(self): + self.level1 = range(1000) + self.level2 = date_range(start='1/1/2012', periods=100) + self.mi = MultiIndex.from_product([self.level1, self.level2]) + + def time_multiindex_with_datetime_level_sliced(self): + self.mi[:10].values \ No newline at end of file diff --git a/asv_bench/benchmarks/indexing.py b/asv_bench/benchmarks/indexing.py new file mode 100644 index 0000000000000..e76a87ab881c9 --- /dev/null +++ b/asv_bench/benchmarks/indexing.py @@ -0,0 +1,458 @@ +from pandas_vb_common import * +import pandas.computation.expressions as expr + + +class dataframe_getitem_scalar(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000) + self.columns = tm.makeStringIndex(30) + self.df = DataFrame(np.random.rand(1000, 30), index=self.index, columns=self.columns) + self.idx = self.index[100] + self.col = self.columns[10] + + def time_dataframe_getitem_scalar(self): + self.df[self.col][self.idx] + + +class datamatrix_getitem_scalar(object): + goal_time = 0.2 + + def setup(self): + try: + self.klass = DataMatrix + except: + self.klass = DataFrame + self.index = tm.makeStringIndex(1000) + self.columns = tm.makeStringIndex(30) + self.df = self.klass(np.random.rand(1000, 30), index=self.index, columns=self.columns) + self.idx = self.index[100] + self.col = self.columns[10] + + def time_datamatrix_getitem_scalar(self): + self.df[self.col][self.idx] + + +class series_get_value(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000) + self.s = Series(np.random.rand(1000), index=self.index) + self.idx = self.index[100] + + def time_series_get_value(self): + self.s.get_value(self.idx) + + +class time_series_getitem_scalar(object): + goal_time = 0.2 + + def setup(self): + tm.N = 1000 + self.ts = tm.makeTimeSeries() + self.dt = self.ts.index[500] + + def time_time_series_getitem_scalar(self): + self.ts[self.dt] + + +class frame_iloc_big(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(dict(A=(['foo'] * 1000000))) + + def time_frame_iloc_big(self): + self.df.iloc[:100, 0] + + +class frame_iloc_dups(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'A': ([0.1] * 3000), 'B': ([1] * 3000), }) + self.idx = (np.array(range(30)) * 99) + self.df2 = DataFrame({'A': ([0.1] * 1000), 'B': ([1] * 1000), }) + self.df2 = concat([self.df2, (2 * self.df2), (3 * self.df2)]) + + def time_frame_iloc_dups(self): + self.df2.iloc[self.idx] + + +class frame_loc_dups(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'A': ([0.1] * 3000), 'B': ([1] * 3000), }) + self.idx = (np.array(range(30)) * 99) + self.df2 = DataFrame({'A': ([0.1] * 1000), 'B': ([1] * 1000), }) + self.df2 = concat([self.df2, (2 * self.df2), (3 * self.df2)]) + + def time_frame_loc_dups(self): + self.df2.loc[self.idx] + + +class frame_xs_mi_ix(object): + goal_time = 0.2 + + def setup(self): + self.mi = MultiIndex.from_tuples([(x, y) for x in range(1000) for y in range(1000)]) + self.s = Series(np.random.randn(1000000), index=self.mi) + self.df = DataFrame(self.s) + + def time_frame_xs_mi_ix(self): + self.df.ix[999] + + +class indexing_dataframe_boolean(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(50000, 100)) + self.df2 = DataFrame(np.random.randn(50000, 100)) + + def time_indexing_dataframe_boolean(self): + (self.df > self.df2) + + +class indexing_dataframe_boolean_no_ne(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(50000, 100)) + self.df2 = DataFrame(np.random.randn(50000, 100)) + expr.set_use_numexpr(False) + + def time_indexing_dataframe_boolean_no_ne(self): + (self.df > self.df2) + + def teardown(self): + expr.set_use_numexpr(True) + + +class indexing_dataframe_boolean_rows(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10000, 4), columns=['A', 'B', 'C', 'D']) + self.indexer = (self.df['B'] > 0) + self.obj_indexer = self.indexer.astype('O') + + def time_indexing_dataframe_boolean_rows(self): + self.df[self.indexer] + + +class indexing_dataframe_boolean_rows_object(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10000, 4), columns=['A', 'B', 'C', 'D']) + self.indexer = (self.df['B'] > 0) + self.obj_indexer = self.indexer.astype('O') + + def time_indexing_dataframe_boolean_rows_object(self): + self.df[self.obj_indexer] + + +class indexing_dataframe_boolean_st(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(50000, 100)) + self.df2 = DataFrame(np.random.randn(50000, 100)) + expr.set_numexpr_threads(1) + + def time_indexing_dataframe_boolean_st(self): + (self.df > self.df2) + + def teardown(self): + expr.set_numexpr_threads() + + +class indexing_frame_get_value(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000) + self.columns = tm.makeStringIndex(30) + self.df = DataFrame(np.random.randn(1000, 30), index=self.index, columns=self.columns) + self.idx = self.index[100] + self.col = self.columns[10] + + def time_indexing_frame_get_value(self): + self.df.get_value(self.idx, self.col) + + +class indexing_frame_get_value_ix(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000) + self.columns = tm.makeStringIndex(30) + self.df = DataFrame(np.random.randn(1000, 30), index=self.index, columns=self.columns) + self.idx = self.index[100] + self.col = self.columns[10] + + def time_indexing_frame_get_value_ix(self): + self.df.ix[(self.idx, self.col)] + + +class indexing_panel_subset(object): + goal_time = 0.2 + + def setup(self): + self.p = Panel(np.random.randn(100, 100, 100)) + self.inds = range(0, 100, 10) + + def time_indexing_panel_subset(self): + self.p.ix[(self.inds, self.inds, self.inds)] + + +class multiindex_slicers(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(1234) + self.idx = pd.IndexSlice + self.n = 100000 + self.mdt = pandas.DataFrame() + self.mdt['A'] = np.random.choice(range(10000, 45000, 1000), self.n) + self.mdt['B'] = np.random.choice(range(10, 400), self.n) + self.mdt['C'] = np.random.choice(range(1, 150), self.n) + self.mdt['D'] = np.random.choice(range(10000, 45000), self.n) + self.mdt['x'] = np.random.choice(range(400), self.n) + self.mdt['y'] = np.random.choice(range(25), self.n) + self.test_A = 25000 + self.test_B = 25 + self.test_C = 40 + self.test_D = 35000 + self.eps_A = 5000 + self.eps_B = 5 + self.eps_C = 5 + self.eps_D = 5000 + self.mdt2 = self.mdt.set_index(['A', 'B', 'C', 'D']).sortlevel() + + def time_multiindex_slicers(self): + self.mdt2.loc[self.idx[(self.test_A - self.eps_A):(self.test_A + self.eps_A), (self.test_B - self.eps_B):(self.test_B + self.eps_B), (self.test_C - self.eps_C):(self.test_C + self.eps_C), (self.test_D - self.eps_D):(self.test_D + self.eps_D)], :] + + +class series_getitem_array(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_getitem_array(self): + self.s[np.arange(10000)] + + +class series_getitem_label_slice(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000000) + self.s = Series(np.random.rand(1000000), index=self.index) + self.lbl = self.s.index[800000] + + def time_series_getitem_label_slice(self): + self.s[:self.lbl] + + +class series_getitem_list_like(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_getitem_list_like(self): + self.s[[800000]] + + +class series_getitem_pos_slice(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(1000000) + self.s = Series(np.random.rand(1000000), index=self.index) + + def time_series_getitem_pos_slice(self): + self.s[:800000] + + +class series_getitem_scalar(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_getitem_scalar(self): + self.s[800000] + + +class series_getitem_slice(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_getitem_slice(self): + self.s[:800000] + + +class series_iloc_array(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_iloc_array(self): + self.s.iloc[np.arange(10000)] + + +class series_iloc_list_like(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_iloc_list_like(self): + self.s.iloc[[800000]] + + +class series_iloc_scalar(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_iloc_scalar(self): + self.s.iloc[800000] + + +class series_iloc_slice(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_iloc_slice(self): + self.s.iloc[:800000] + + +class series_ix_array(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_ix_array(self): + self.s.ix[np.arange(10000)] + + +class series_ix_list_like(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_ix_list_like(self): + self.s.ix[[800000]] + + +class series_ix_scalar(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_ix_scalar(self): + self.s.ix[800000] + + +class series_ix_slice(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_ix_slice(self): + self.s.ix[:800000] + + +class series_loc_array(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_loc_array(self): + self.s.loc[np.arange(10000)] + + +class series_loc_list_like(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_loc_list_like(self): + self.s.loc[[800000]] + + +class series_loc_scalar(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_loc_scalar(self): + self.s.loc[800000] + + +class series_loc_slice(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.rand(1000000)) + + def time_series_loc_slice(self): + self.s.loc[:800000] + + +class series_xs_mi_ix(object): + goal_time = 0.2 + + def setup(self): + self.mi = MultiIndex.from_tuples([(x, y) for x in range(1000) for y in range(1000)]) + self.s = Series(np.random.randn(1000000), index=self.mi) + + def time_series_xs_mi_ix(self): + self.s.ix[999] + + +class sort_level_one(object): + goal_time = 0.2 + + def setup(self): + self.a = np.repeat(np.arange(100), 1000) + self.b = np.tile(np.arange(1000), 100) + self.midx = MultiIndex.from_arrays([self.a, self.b]) + self.midx = self.midx.take(np.random.permutation(np.arange(100000))) + + def time_sort_level_one(self): + self.midx.sortlevel(1) + + +class sort_level_zero(object): + goal_time = 0.2 + + def setup(self): + self.a = np.repeat(np.arange(100), 1000) + self.b = np.tile(np.arange(1000), 100) + self.midx = MultiIndex.from_arrays([self.a, self.b]) + self.midx = self.midx.take(np.random.permutation(np.arange(100000))) + + def time_sort_level_zero(self): + self.midx.sortlevel(0) \ No newline at end of file diff --git a/asv_bench/benchmarks/inference.py b/asv_bench/benchmarks/inference.py new file mode 100644 index 0000000000000..2addc810a218f --- /dev/null +++ b/asv_bench/benchmarks/inference.py @@ -0,0 +1,138 @@ +from pandas_vb_common import * +import pandas as pd + + +class dtype_infer_datetime64(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_datetime64(self): + (self.df_datetime64['A'] - self.df_datetime64['B']) + + +class dtype_infer_float32(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_float32(self): + (self.df_float32['A'] + self.df_float32['B']) + + +class dtype_infer_float64(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_float64(self): + (self.df_float64['A'] + self.df_float64['B']) + + +class dtype_infer_int32(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_int32(self): + (self.df_int32['A'] + self.df_int32['B']) + + +class dtype_infer_int64(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_int64(self): + (self.df_int64['A'] + self.df_int64['B']) + + +class dtype_infer_timedelta64_1(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_timedelta64_1(self): + (self.df_timedelta64['A'] + self.df_timedelta64['B']) + + +class dtype_infer_timedelta64_2(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_timedelta64_2(self): + (self.df_timedelta64['A'] + self.df_timedelta64['A']) + + +class dtype_infer_uint32(object): + goal_time = 0.2 + + def setup(self): + self.N = 500000 + self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), B=np.arange(self.N, dtype='int64'))) + self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), B=np.arange(self.N, dtype='int32'))) + self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), B=np.arange(self.N, dtype='uint32'))) + self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), B=np.arange(self.N, dtype='float64'))) + self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), B=np.arange(self.N, dtype='float32'))) + self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) + self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), B=self.df_datetime64['B'])) + + def time_dtype_infer_uint32(self): + (self.df_uint32['A'] + self.df_uint32['B']) \ No newline at end of file diff --git a/asv_bench/benchmarks/io_bench.py b/asv_bench/benchmarks/io_bench.py new file mode 100644 index 0000000000000..9eee932de8b7c --- /dev/null +++ b/asv_bench/benchmarks/io_bench.py @@ -0,0 +1,135 @@ +from pandas_vb_common import * +from pandas import concat, Timestamp +from StringIO import StringIO + + +class frame_to_csv(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(3000, 30)) + + def time_frame_to_csv(self): + self.df.to_csv('__test__.csv') + + +class frame_to_csv2(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame({'A': range(50000), }) + self.df['B'] = (self.df.A + 1.0) + self.df['C'] = (self.df.A + 2.0) + self.df['D'] = (self.df.A + 3.0) + + def time_frame_to_csv2(self): + self.df.to_csv('__test__.csv') + + +class frame_to_csv_date_formatting(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=1000) + self.data = DataFrame(self.rng, index=self.rng) + + def time_frame_to_csv_date_formatting(self): + self.data.to_csv('__test__.csv', date_format='%Y%m%d') + + +class frame_to_csv_mixed(object): + goal_time = 0.2 + + def setup(self): + + def create_cols(name): + return [('%s%03d' % (name, i)) for i in xrange(5)] + self.df_float = DataFrame(np.random.randn(5000, 5), dtype='float64', columns=create_cols('float')) + self.df_int = DataFrame(np.random.randn(5000, 5), dtype='int64', columns=create_cols('int')) + self.df_bool = DataFrame(True, index=self.df_float.index, columns=create_cols('bool')) + self.df_object = DataFrame('foo', index=self.df_float.index, columns=create_cols('object')) + self.df_dt = DataFrame(Timestamp('20010101'), index=self.df_float.index, columns=create_cols('date')) + self.df_float.ix[30:500, 1:3] = np.nan + self.df = concat([self.df_float, self.df_int, self.df_bool, self.df_object, self.df_dt], axis=1) + + def time_frame_to_csv_mixed(self): + self.df.to_csv('__test__.csv') + + +class read_csv_infer_datetime_format_custom(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=1000) + self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%m/%d/%Y %H:%M:%S.%f')))) + + def time_read_csv_infer_datetime_format_custom(self): + read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) + + +class read_csv_infer_datetime_format_iso8601(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=1000) + self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y-%m-%d %H:%M:%S')))) + + def time_read_csv_infer_datetime_format_iso8601(self): + read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) + + +class read_csv_infer_datetime_format_ymd(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=1000) + self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y%m%d')))) + + def time_read_csv_infer_datetime_format_ymd(self): + read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) + + +class read_csv_skiprows(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(20000) + self.df = DataFrame({'float1': randn(20000), 'float2': randn(20000), 'string1': (['foo'] * 20000), 'bool1': ([True] * 20000), 'int1': np.random.randint(0, 200000, size=20000), }, index=self.index) + self.df.to_csv('__test__.csv') + + def time_read_csv_skiprows(self): + read_csv('__test__.csv', skiprows=10000) + + +class read_csv_standard(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + self.df.to_csv('__test__.csv') + + def time_read_csv_standard(self): + read_csv('__test__.csv') + + +class read_parse_dates_iso8601(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=1000) + self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y-%m-%d %H:%M:%S')))) + + def time_read_parse_dates_iso8601(self): + read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo']) + + +class write_csv_standard(object): + goal_time = 0.2 + + def setup(self): + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + + def time_write_csv_standard(self): + self.df.to_csv('__test__.csv') \ No newline at end of file diff --git a/asv_bench/benchmarks/io_sql.py b/asv_bench/benchmarks/io_sql.py new file mode 100644 index 0000000000000..e75e691b61c96 --- /dev/null +++ b/asv_bench/benchmarks/io_sql.py @@ -0,0 +1,215 @@ +from pandas_vb_common import * +from sqlalchemy import create_engine +import sqlite3 +import sqlalchemy + + +class sql_datetime_read_and_parse_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df['datetime_string'] = self.df['datetime'].map(str) + self.df.to_sql('test_type', self.engine, if_exists='replace') + self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') + + def time_sql_datetime_read_and_parse_sqlalchemy(self): + read_sql_table('test_type', self.engine, columns=['datetime_string'], parse_dates=['datetime_string']) + + +class sql_datetime_read_as_native_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df['datetime_string'] = self.df['datetime'].map(str) + self.df.to_sql('test_type', self.engine, if_exists='replace') + self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') + + def time_sql_datetime_read_as_native_sqlalchemy(self): + read_sql_table('test_type', self.engine, columns=['datetime']) + + +class sql_datetime_write_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df.loc[1000:3000, 'float'] = np.nan + + def time_sql_datetime_write_sqlalchemy(self): + self.df[['datetime']].to_sql('test_datetime', self.engine, if_exists='replace') + + +class sql_float_read_query_fallback(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df['datetime_string'] = self.df['datetime'].map(str) + self.df.to_sql('test_type', self.engine, if_exists='replace') + self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') + + def time_sql_float_read_query_fallback(self): + read_sql_query('SELECT float FROM test_type', self.con) + + +class sql_float_read_query_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df['datetime_string'] = self.df['datetime'].map(str) + self.df.to_sql('test_type', self.engine, if_exists='replace') + self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') + + def time_sql_float_read_query_sqlalchemy(self): + read_sql_query('SELECT float FROM test_type', self.engine) + + +class sql_float_read_table_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df['datetime_string'] = self.df['datetime'].map(str) + self.df.to_sql('test_type', self.engine, if_exists='replace') + self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') + + def time_sql_float_read_table_sqlalchemy(self): + read_sql_table('test_type', self.engine, columns=['float']) + + +class sql_float_write_fallback(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df.loc[1000:3000, 'float'] = np.nan + + def time_sql_float_write_fallback(self): + self.df[['float']].to_sql('test_float', self.con, if_exists='replace') + + +class sql_float_write_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df.loc[1000:3000, 'float'] = np.nan + + def time_sql_float_write_sqlalchemy(self): + self.df[['float']].to_sql('test_float', self.engine, if_exists='replace') + + +class sql_read_query_fallback(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + self.df.to_sql('test2', self.engine, if_exists='replace') + self.df.to_sql('test2', self.con, if_exists='replace') + + def time_sql_read_query_fallback(self): + read_sql_query('SELECT * FROM test2', self.con) + + +class sql_read_query_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + self.df.to_sql('test2', self.engine, if_exists='replace') + self.df.to_sql('test2', self.con, if_exists='replace') + + def time_sql_read_query_sqlalchemy(self): + read_sql_query('SELECT * FROM test2', self.engine) + + +class sql_read_table_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + self.df.to_sql('test2', self.engine, if_exists='replace') + self.df.to_sql('test2', self.con, if_exists='replace') + + def time_sql_read_table_sqlalchemy(self): + read_sql_table('test2', self.engine) + + +class sql_string_write_fallback(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df.loc[1000:3000, 'float'] = np.nan + + def time_sql_string_write_fallback(self): + self.df[['string']].to_sql('test_string', self.con, if_exists='replace') + + +class sql_string_write_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) + self.df.loc[1000:3000, 'float'] = np.nan + + def time_sql_string_write_sqlalchemy(self): + self.df[['string']].to_sql('test_string', self.engine, if_exists='replace') + + +class sql_write_fallback(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + + def time_sql_write_fallback(self): + self.df.to_sql('test1', self.con, if_exists='replace') + + +class sql_write_sqlalchemy(object): + goal_time = 0.2 + + def setup(self): + self.engine = create_engine('sqlite:///:memory:') + self.con = sqlite3.connect(':memory:') + self.index = tm.makeStringIndex(10000) + self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) + + def time_sql_write_sqlalchemy(self): + self.df.to_sql('test1', self.engine, if_exists='replace') \ No newline at end of file diff --git a/asv_bench/benchmarks/join_merge.py b/asv_bench/benchmarks/join_merge.py new file mode 100644 index 0000000000000..08ae439e8fd5d --- /dev/null +++ b/asv_bench/benchmarks/join_merge.py @@ -0,0 +1,359 @@ +from pandas_vb_common import * + + +class append_frame_single_homogenous(object): + goal_time = 0.2 + + def setup(self): + self.df1 = pd.DataFrame(np.random.randn(10000, 4), columns=['A', 'B', 'C', 'D']) + self.df2 = self.df1.copy() + self.df2.index = np.arange(10000, 20000) + self.mdf1 = self.df1.copy() + self.mdf1['obj1'] = 'bar' + self.mdf1['obj2'] = 'bar' + self.mdf1['int1'] = 5 + try: + self.mdf1.consolidate(inplace=True) + except: + pass + self.mdf2 = self.mdf1.copy() + self.mdf2.index = self.df2.index + + def time_append_frame_single_homogenous(self): + self.df1.append(self.df2) + + +class append_frame_single_mixed(object): + goal_time = 0.2 + + def setup(self): + self.df1 = pd.DataFrame(np.random.randn(10000, 4), columns=['A', 'B', 'C', 'D']) + self.df2 = self.df1.copy() + self.df2.index = np.arange(10000, 20000) + self.mdf1 = self.df1.copy() + self.mdf1['obj1'] = 'bar' + self.mdf1['obj2'] = 'bar' + self.mdf1['int1'] = 5 + try: + self.mdf1.consolidate(inplace=True) + except: + pass + self.mdf2 = self.mdf1.copy() + self.mdf2.index = self.df2.index + + def time_append_frame_single_mixed(self): + self.mdf1.append(self.mdf2) + + +class concat_empty_frames1(object): + goal_time = 0.2 + + def setup(self): + self.df = pd.DataFrame(dict(A=range(10000)), index=date_range('20130101', periods=10000, freq='s')) + self.empty = pd.DataFrame() + + def time_concat_empty_frames1(self): + concat([self.df, self.empty]) + + +class concat_empty_frames2(object): + goal_time = 0.2 + + def setup(self): + self.df = pd.DataFrame(dict(A=range(10000)), index=date_range('20130101', periods=10000, freq='s')) + self.empty = pd.DataFrame() + + def time_concat_empty_frames2(self): + concat([self.empty, self.df]) + + +class concat_series_axis1(object): + goal_time = 0.2 + + def setup(self): + self.n = 1000 + self.indices = tm.makeStringIndex(1000) + self.s = Series(self.n, index=self.indices) + self.pieces = [self.s[i:(- i)] for i in range(1, 10)] + self.pieces = (self.pieces * 50) + + def time_concat_series_axis1(self): + concat(self.pieces, axis=1) + + +class concat_small_frames(object): + goal_time = 0.2 + + def setup(self): + self.df = pd.DataFrame(randn(5, 4)) + + def time_concat_small_frames(self): + concat(([self.df] * 1000)) + + +class i8merge(object): + goal_time = 0.2 + + def setup(self): + (low, high, n) = (((-1) << 10), (1 << 10), (1 << 20)) + self.left = pd.DataFrame(np.random.randint(low, high, (n, 7)), columns=list('ABCDEFG')) + self.left['left'] = self.left.sum(axis=1) + self.i = np.random.permutation(len(self.left)) + self.right = self.left.iloc[self.i].copy() + self.right.columns = (self.right.columns[:(-1)].tolist() + ['right']) + self.right.index = np.arange(len(self.right)) + self.right['right'] *= (-1) + + def time_i8merge(self): + merge(self.left, self.right, how='outer') + + +class join_dataframe_index_multi(object): + goal_time = 0.2 + + def setup(self): + self.level1 = tm.makeStringIndex(10).values + self.level2 = tm.makeStringIndex(1000).values + self.label1 = np.arange(10).repeat(1000) + self.label2 = np.tile(np.arange(1000), 10) + self.key1 = np.tile(self.level1.take(self.label1), 10) + self.key2 = np.tile(self.level2.take(self.label2), 10) + self.shuf = np.arange(100000) + random.shuffle(self.shuf) + try: + self.index2 = MultiIndex(levels=[self.level1, self.level2], labels=[self.label1, self.label2]) + self.index3 = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + self.df_multi = DataFrame(np.random.randn(len(self.index2), 4), index=self.index2, columns=['A', 'B', 'C', 'D']) + except: + pass + try: + self.DataFrame = DataMatrix + except: + pass + self.df = pd.DataFrame({'data1': np.random.randn(100000), 'data2': np.random.randn(100000), 'key1': self.key1, 'key2': self.key2, }) + self.df_key1 = pd.DataFrame(np.random.randn(len(self.level1), 4), index=self.level1, columns=['A', 'B', 'C', 'D']) + self.df_key2 = pd.DataFrame(np.random.randn(len(self.level2), 4), index=self.level2, columns=['A', 'B', 'C', 'D']) + self.df_shuf = self.df.reindex(self.df.index[self.shuf]) + + def time_join_dataframe_index_multi(self): + self.df.join(self.df_multi, on=['key1', 'key2']) + + +class join_dataframe_index_single_key_bigger(object): + goal_time = 0.2 + + def setup(self): + self.level1 = tm.makeStringIndex(10).values + self.level2 = tm.makeStringIndex(1000).values + self.label1 = np.arange(10).repeat(1000) + self.label2 = np.tile(np.arange(1000), 10) + self.key1 = np.tile(self.level1.take(self.label1), 10) + self.key2 = np.tile(self.level2.take(self.label2), 10) + self.shuf = np.arange(100000) + random.shuffle(self.shuf) + try: + self.index2 = MultiIndex(levels=[self.level1, self.level2], labels=[self.label1, self.label2]) + self.index3 = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + self.df_multi = DataFrame(np.random.randn(len(self.index2), 4), index=self.index2, columns=['A', 'B', 'C', 'D']) + except: + pass + try: + self.DataFrame = DataMatrix + except: + pass + self.df = pd.DataFrame({'data1': np.random.randn(100000), 'data2': np.random.randn(100000), 'key1': self.key1, 'key2': self.key2, }) + self.df_key1 = pd.DataFrame(np.random.randn(len(self.level1), 4), index=self.level1, columns=['A', 'B', 'C', 'D']) + self.df_key2 = pd.DataFrame(np.random.randn(len(self.level2), 4), index=self.level2, columns=['A', 'B', 'C', 'D']) + self.df_shuf = self.df.reindex(self.df.index[self.shuf]) + + def time_join_dataframe_index_single_key_bigger(self): + self.df.join(self.df_key2, on='key2') + + +class join_dataframe_index_single_key_bigger_sort(object): + goal_time = 0.2 + + def setup(self): + self.level1 = tm.makeStringIndex(10).values + self.level2 = tm.makeStringIndex(1000).values + self.label1 = np.arange(10).repeat(1000) + self.label2 = np.tile(np.arange(1000), 10) + self.key1 = np.tile(self.level1.take(self.label1), 10) + self.key2 = np.tile(self.level2.take(self.label2), 10) + self.shuf = np.arange(100000) + random.shuffle(self.shuf) + try: + self.index2 = MultiIndex(levels=[self.level1, self.level2], labels=[self.label1, self.label2]) + self.index3 = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + self.df_multi = DataFrame(np.random.randn(len(self.index2), 4), index=self.index2, columns=['A', 'B', 'C', 'D']) + except: + pass + try: + self.DataFrame = DataMatrix + except: + pass + self.df = pd.DataFrame({'data1': np.random.randn(100000), 'data2': np.random.randn(100000), 'key1': self.key1, 'key2': self.key2, }) + self.df_key1 = pd.DataFrame(np.random.randn(len(self.level1), 4), index=self.level1, columns=['A', 'B', 'C', 'D']) + self.df_key2 = pd.DataFrame(np.random.randn(len(self.level2), 4), index=self.level2, columns=['A', 'B', 'C', 'D']) + self.df_shuf = self.df.reindex(self.df.index[self.shuf]) + + def time_join_dataframe_index_single_key_bigger_sort(self): + self.df_shuf.join(self.df_key2, on='key2', sort=True) + + +class join_dataframe_index_single_key_small(object): + goal_time = 0.2 + + def setup(self): + self.level1 = tm.makeStringIndex(10).values + self.level2 = tm.makeStringIndex(1000).values + self.label1 = np.arange(10).repeat(1000) + self.label2 = np.tile(np.arange(1000), 10) + self.key1 = np.tile(self.level1.take(self.label1), 10) + self.key2 = np.tile(self.level2.take(self.label2), 10) + self.shuf = np.arange(100000) + random.shuffle(self.shuf) + try: + self.index2 = MultiIndex(levels=[self.level1, self.level2], labels=[self.label1, self.label2]) + self.index3 = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + self.df_multi = DataFrame(np.random.randn(len(self.index2), 4), index=self.index2, columns=['A', 'B', 'C', 'D']) + except: + pass + try: + self.DataFrame = DataMatrix + except: + pass + self.df = pd.DataFrame({'data1': np.random.randn(100000), 'data2': np.random.randn(100000), 'key1': self.key1, 'key2': self.key2, }) + self.df_key1 = pd.DataFrame(np.random.randn(len(self.level1), 4), index=self.level1, columns=['A', 'B', 'C', 'D']) + self.df_key2 = pd.DataFrame(np.random.randn(len(self.level2), 4), index=self.level2, columns=['A', 'B', 'C', 'D']) + self.df_shuf = self.df.reindex(self.df.index[self.shuf]) + + def time_join_dataframe_index_single_key_small(self): + self.df.join(self.df_key1, on='key1') + + +class join_dataframe_integer_2key(object): + goal_time = 0.2 + + def setup(self): + self.df = pd.DataFrame({'key1': np.tile(np.arange(500).repeat(10), 2), 'key2': np.tile(np.arange(250).repeat(10), 4), 'value': np.random.randn(10000), }) + self.df2 = pd.DataFrame({'key1': np.arange(500), 'value2': randn(500), }) + self.df3 = self.df[:5000] + + def time_join_dataframe_integer_2key(self): + merge(self.df, self.df3) + + +class join_dataframe_integer_key(object): + goal_time = 0.2 + + def setup(self): + self.df = pd.DataFrame({'key1': np.tile(np.arange(500).repeat(10), 2), 'key2': np.tile(np.arange(250).repeat(10), 4), 'value': np.random.randn(10000), }) + self.df2 = pd.DataFrame({'key1': np.arange(500), 'value2': randn(500), }) + self.df3 = self.df[:5000] + + def time_join_dataframe_integer_key(self): + merge(self.df, self.df2, on='key1') + + +class join_non_unique_equal(object): + goal_time = 0.2 + + def setup(self): + self.date_index = date_range('01-Jan-2013', '23-Jan-2013', freq='T') + self.daily_dates = self.date_index.to_period('D').to_timestamp('S', 'S') + self.fracofday = (self.date_index.view(np.ndarray) - self.daily_dates.view(np.ndarray)) + self.fracofday = (self.fracofday.astype('timedelta64[ns]').astype(np.float64) / 86400000000000.0) + self.fracofday = TimeSeries(self.fracofday, self.daily_dates) + self.index = date_range(self.date_index.min().to_period('A').to_timestamp('D', 'S'), self.date_index.max().to_period('A').to_timestamp('D', 'E'), freq='D') + self.temp = TimeSeries(1.0, self.index) + + def time_join_non_unique_equal(self): + (self.fracofday * self.temp[self.fracofday.index]) + + +class left_outer_join_index(object): + goal_time = 0.2 + + def setup(self): + np.random.seed(2718281) + self.n = 50000 + self.left = pd.DataFrame(np.random.randint(1, (self.n / 500), (self.n, 2)), columns=['jim', 'joe']) + self.right = pd.DataFrame(np.random.randint(1, (self.n / 500), (self.n, 2)), columns=['jolie', 'jolia']).set_index('jolie') + + def time_left_outer_join_index(self): + self.left.join(self.right, on='jim') + + +class merge_2intkey_nosort(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.indices = tm.makeStringIndex(self.N).values + self.indices2 = tm.makeStringIndex(self.N).values + self.key = np.tile(self.indices[:8000], 10) + self.key2 = np.tile(self.indices2[:8000], 10) + self.left = pd.DataFrame({'key': self.key, 'key2': self.key2, 'value': np.random.randn(80000), }) + self.right = pd.DataFrame({'key': self.indices[2000:], 'key2': self.indices2[2000:], 'value2': np.random.randn(8000), }) + + def time_merge_2intkey_nosort(self): + merge(self.left, self.right, sort=False) + + +class merge_2intkey_sort(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.indices = tm.makeStringIndex(self.N).values + self.indices2 = tm.makeStringIndex(self.N).values + self.key = np.tile(self.indices[:8000], 10) + self.key2 = np.tile(self.indices2[:8000], 10) + self.left = pd.DataFrame({'key': self.key, 'key2': self.key2, 'value': np.random.randn(80000), }) + self.right = pd.DataFrame({'key': self.indices[2000:], 'key2': self.indices2[2000:], 'value2': np.random.randn(8000), }) + + def time_merge_2intkey_sort(self): + merge(self.left, self.right, sort=True) + + +class series_align_int64_index(object): + goal_time = 0.2 + + def setup(self): + self.n = 1000000 + + def sample(values, k): + self.sampler = np.random.permutation(len(values)) + return values.take(self.sampler[:k]) + self.sz = 500000 + self.rng = np.arange(0, 10000000000000, 10000000) + self.stamps = (np.datetime64(datetime.now()).view('i8') + self.rng) + self.idx1 = np.sort(sample(self.stamps, self.sz)) + self.idx2 = np.sort(sample(self.stamps, self.sz)) + self.ts1 = Series(np.random.randn(self.sz), self.idx1) + self.ts2 = Series(np.random.randn(self.sz), self.idx2) + + def time_series_align_int64_index(self): + (self.ts1 + self.ts2) + + +class series_align_left_monotonic(object): + goal_time = 0.2 + + def setup(self): + self.n = 1000000 + + def sample(values, k): + self.sampler = np.random.permutation(len(values)) + return values.take(self.sampler[:k]) + self.sz = 500000 + self.rng = np.arange(0, 10000000000000, 10000000) + self.stamps = (np.datetime64(datetime.now()).view('i8') + self.rng) + self.idx1 = np.sort(sample(self.stamps, self.sz)) + self.idx2 = np.sort(sample(self.stamps, self.sz)) + self.ts1 = Series(np.random.randn(self.sz), self.idx1) + self.ts2 = Series(np.random.randn(self.sz), self.idx2) + + def time_series_align_left_monotonic(self): + self.ts1.align(self.ts2, join='left') \ No newline at end of file diff --git a/asv_bench/benchmarks/miscellaneous.py b/asv_bench/benchmarks/miscellaneous.py new file mode 100644 index 0000000000000..b9c02c85fb096 --- /dev/null +++ b/asv_bench/benchmarks/miscellaneous.py @@ -0,0 +1,30 @@ +from pandas_vb_common import * +from pandas.util.decorators import cache_readonly + + +class match_strings(object): + goal_time = 0.2 + + def setup(self): + self.uniques = tm.makeStringIndex(1000).values + self.all = self.uniques.repeat(10) + + def time_match_strings(self): + match(self.all, self.uniques) + + +class misc_cache_readonly(object): + goal_time = 0.2 + + def setup(self): + + + class Foo: + + @cache_readonly + def prop(self): + return 5 + self.obj = Foo() + + def time_misc_cache_readonly(self): + self.obj.prop \ No newline at end of file diff --git a/asv_bench/benchmarks/packers.py b/asv_bench/benchmarks/packers.py new file mode 100644 index 0000000000000..81fa7c2238d16 --- /dev/null +++ b/asv_bench/benchmarks/packers.py @@ -0,0 +1,857 @@ +from numpy.random import randint +import pandas as pd +from collections import OrderedDict +from pandas.compat import BytesIO +import sqlite3 +from pandas_vb_common import * +import os +from sqlalchemy import create_engine +import numpy as np +from random import randrange +from pandas.core import common as com + + +class packers_read_csv(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.to_csv(self.f) + + def time_packers_read_csv(self): + pd.read_csv(self.f) + + +class packers_read_excel(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.bio = BytesIO() + self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlsxwriter') + self.df[:2000].to_excel(self.writer) + self.writer.save() + + def time_packers_read_excel(self): + self.bio.seek(0) + pd.read_excel(self.bio) + + +class packers_read_hdf_store(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df2.to_hdf(self.f, 'df') + + def time_packers_read_hdf_store(self): + pd.read_hdf(self.f, 'df') + + +class packers_read_hdf_table(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df2.to_hdf(self.f, 'df', format='table') + + def time_packers_read_hdf_table(self): + pd.read_hdf(self.f, 'df') + + +class packers_read_json(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.to_json(self.f, orient='split') + self.df.index = np.arange(self.N) + + def time_packers_read_json(self): + pd.read_json(self.f, orient='split') + + +class packers_read_json_date_index(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.to_json(self.f, orient='split') + + def time_packers_read_json_date_index(self): + pd.read_json(self.f, orient='split') + + +class packers_read_pack(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df2.to_msgpack(self.f) + + def time_packers_read_pack(self): + pd.read_msgpack(self.f) + + +class packers_read_pickle(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df2.to_pickle(self.f) + + def time_packers_read_pickle(self): + pd.read_pickle(self.f) + + +class packers_read_sql(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.engine = create_engine('sqlite:///:memory:') + self.df2.to_sql('table', self.engine, if_exists='replace') + + def time_packers_read_sql(self): + pd.read_sql_table('table', self.engine) + + +class packers_read_stata(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.to_stata(self.f, {'index': 'tc', }) + + def time_packers_read_stata(self): + pd.read_stata(self.f) + + +class packers_read_stata_with_validation(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df['int8_'] = [randint(np.iinfo(np.int8).min, (np.iinfo(np.int8).max - 27)) for _ in range(self.N)] + self.df['int16_'] = [randint(np.iinfo(np.int16).min, (np.iinfo(np.int16).max - 27)) for _ in range(self.N)] + self.df['int32_'] = [randint(np.iinfo(np.int32).min, (np.iinfo(np.int32).max - 27)) for _ in range(self.N)] + self.df['float32_'] = np.array(randn(self.N), dtype=np.float32) + self.df.to_stata(self.f, {'index': 'tc', }) + + def time_packers_read_stata_with_validation(self): + pd.read_stata(self.f) + + +class packers_write_csv(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_csv(self): + self.df.to_csv(self.f) + + def teardown(self): + remove(self.f) + + +class packers_write_excel_openpyxl(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.bio = BytesIO() + + def time_packers_write_excel_openpyxl(self): + self.bio.seek(0) + self.writer = pd.io.excel.ExcelWriter(self.bio, engine='openpyxl') + self.df[:2000].to_excel(self.writer) + self.writer.save() + + +class packers_write_excel_xlsxwriter(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.bio = BytesIO() + + def time_packers_write_excel_xlsxwriter(self): + self.bio.seek(0) + self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlsxwriter') + self.df[:2000].to_excel(self.writer) + self.writer.save() + + +class packers_write_excel_xlwt(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.bio = BytesIO() + + def time_packers_write_excel_xlwt(self): + self.bio.seek(0) + self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlwt') + self.df[:2000].to_excel(self.writer) + self.writer.save() + + +class packers_write_hdf_store(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_hdf_store(self): + self.df2.to_hdf(self.f, 'df') + + def teardown(self): + remove(self.f) + + +class packers_write_hdf_table(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_hdf_table(self): + self.df2.to_hdf(self.f, 'df', table=True) + + def teardown(self): + remove(self.f) + + +class packers_write_json(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.index = np.arange(self.N) + + def time_packers_write_json(self): + self.df.to_json(self.f, orient='split') + + def teardown(self): + remove(self.f) + + +class packers_write_json_T(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.index = np.arange(self.N) + + def time_packers_write_json_T(self): + self.df.to_json(self.f, orient='columns') + + def teardown(self): + remove(self.f) + + +class packers_write_json_date_index(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_json_date_index(self): + self.df.to_json(self.f, orient='split') + + def teardown(self): + remove(self.f) + + +class packers_write_json_mixed_delta_int_tstamp(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.cols = [(lambda i: ('{0}_timedelta'.format(i), [pd.Timedelta(('%d seconds' % randrange(1000000.0))) for _ in range(self.N)])), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N))), (lambda i: ('{0}_timestamp'.format(i), [pd.Timestamp((1418842918083256000 + randrange(1000000000.0, 1e+18, 200))) for _ in range(self.N)]))] + self.df_mixed = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) + + def time_packers_write_json_mixed_delta_int_tstamp(self): + self.df_mixed.to_json(self.f, orient='split') + + def teardown(self): + remove(self.f) + + +class packers_write_json_mixed_float_int(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.cols = [(lambda i: ('{0}_float'.format(i), randn(self.N))), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N)))] + self.df_mixed = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) + + def time_packers_write_json_mixed_float_int(self): + self.df_mixed.to_json(self.f, orient='index') + + def teardown(self): + remove(self.f) + + +class packers_write_json_mixed_float_int_T(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.cols = [(lambda i: ('{0}_float'.format(i), randn(self.N))), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N)))] + self.df_mixed = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) + + def time_packers_write_json_mixed_float_int_T(self): + self.df_mixed.to_json(self.f, orient='columns') + + def teardown(self): + remove(self.f) + + +class packers_write_json_mixed_float_int_str(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.cols = [(lambda i: ('{0}_float'.format(i), randn(self.N))), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N))), (lambda i: ('{0}_str'.format(i), [('%08x' % randrange((16 ** 8))) for _ in range(self.N)]))] + self.df_mixed = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) + + def time_packers_write_json_mixed_float_int_str(self): + self.df_mixed.to_json(self.f, orient='split') + + def teardown(self): + remove(self.f) + + +class packers_write_pack(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_pack(self): + self.df2.to_msgpack(self.f) + + def teardown(self): + remove(self.f) + + +class packers_write_pickle(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + + def time_packers_write_pickle(self): + self.df2.to_pickle(self.f) + + def teardown(self): + remove(self.f) + + +class packers_write_sql(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.engine = create_engine('sqlite:///:memory:') + + def time_packers_write_sql(self): + self.df2.to_sql('table', self.engine, if_exists='replace') + + +class packers_write_stata(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df.to_stata(self.f, {'index': 'tc', }) + + def time_packers_write_stata(self): + self.df.to_stata(self.f, {'index': 'tc', }) + + def teardown(self): + remove(self.f) + + +class packers_write_stata_with_validation(object): + goal_time = 0.2 + + def setup(self): + self.f = '__test__.msg' + + def remove(f): + try: + os.remove(self.f) + except: + pass + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.N = 100000 + self.C = 5 + self.index = date_range('20000101', periods=self.N, freq='H') + self.df2 = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) + self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] + remove(self.f) + self.df['int8_'] = [randint(np.iinfo(np.int8).min, (np.iinfo(np.int8).max - 27)) for _ in range(self.N)] + self.df['int16_'] = [randint(np.iinfo(np.int16).min, (np.iinfo(np.int16).max - 27)) for _ in range(self.N)] + self.df['int32_'] = [randint(np.iinfo(np.int32).min, (np.iinfo(np.int32).max - 27)) for _ in range(self.N)] + self.df['float32_'] = np.array(randn(self.N), dtype=np.float32) + self.df.to_stata(self.f, {'index': 'tc', }) + + def time_packers_write_stata_with_validation(self): + self.df.to_stata(self.f, {'index': 'tc', }) + + def teardown(self): + remove(self.f) \ No newline at end of file diff --git a/asv_bench/benchmarks/pandas_vb_common.py b/asv_bench/benchmarks/pandas_vb_common.py new file mode 120000 index 0000000000000..6e2e449a4c00a --- /dev/null +++ b/asv_bench/benchmarks/pandas_vb_common.py @@ -0,0 +1 @@ +../../vb_suite/pandas_vb_common.py \ No newline at end of file diff --git a/asv_bench/benchmarks/panel_ctor.py b/asv_bench/benchmarks/panel_ctor.py new file mode 100644 index 0000000000000..c755cb122a0bf --- /dev/null +++ b/asv_bench/benchmarks/panel_ctor.py @@ -0,0 +1,64 @@ +from pandas_vb_common import * + + +class panel_from_dict_all_different_indexes(object): + goal_time = 0.2 + + def setup(self): + self.data_frames = {} + self.start = datetime(1990, 1, 1) + self.end = datetime(2012, 1, 1) + for x in xrange(100): + self.end += timedelta(days=1) + self.dr = np.asarray(date_range(self.start, self.end)) + self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) + self.data_frames[x] = self.df + + def time_panel_from_dict_all_different_indexes(self): + Panel.from_dict(self.data_frames) + + +class panel_from_dict_equiv_indexes(object): + goal_time = 0.2 + + def setup(self): + self.data_frames = {} + for x in xrange(100): + self.dr = np.asarray(DatetimeIndex(start=datetime(1990, 1, 1), end=datetime(2012, 1, 1), freq=datetools.Day(1))) + self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) + self.data_frames[x] = self.df + + def time_panel_from_dict_equiv_indexes(self): + Panel.from_dict(self.data_frames) + + +class panel_from_dict_same_index(object): + goal_time = 0.2 + + def setup(self): + self.dr = np.asarray(DatetimeIndex(start=datetime(1990, 1, 1), end=datetime(2012, 1, 1), freq=datetools.Day(1))) + self.data_frames = {} + for x in xrange(100): + self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) + self.data_frames[x] = self.df + + def time_panel_from_dict_same_index(self): + Panel.from_dict(self.data_frames) + + +class panel_from_dict_two_different_indexes(object): + goal_time = 0.2 + + def setup(self): + self.data_frames = {} + self.start = datetime(1990, 1, 1) + self.end = datetime(2012, 1, 1) + for x in xrange(100): + if (x == 50): + self.end += timedelta(days=1) + self.dr = np.asarray(date_range(self.start, self.end)) + self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) + self.data_frames[x] = self.df + + def time_panel_from_dict_two_different_indexes(self): + Panel.from_dict(self.data_frames) \ No newline at end of file diff --git a/asv_bench/benchmarks/panel_methods.py b/asv_bench/benchmarks/panel_methods.py new file mode 100644 index 0000000000000..4145b68dca997 --- /dev/null +++ b/asv_bench/benchmarks/panel_methods.py @@ -0,0 +1,56 @@ +from pandas_vb_common import * + + +class panel_pct_change_items(object): + goal_time = 0.2 + + def setup(self): + self.index = date_range(start='2000', freq='D', periods=1000) + self.panel = Panel(np.random.randn(100, len(self.index), 1000)) + + def time_panel_pct_change_items(self): + self.panel.pct_change(1, axis='items') + + +class panel_pct_change_major(object): + goal_time = 0.2 + + def setup(self): + self.index = date_range(start='2000', freq='D', periods=1000) + self.panel = Panel(np.random.randn(100, len(self.index), 1000)) + + def time_panel_pct_change_major(self): + self.panel.pct_change(1, axis='major') + + +class panel_pct_change_minor(object): + goal_time = 0.2 + + def setup(self): + self.index = date_range(start='2000', freq='D', periods=1000) + self.panel = Panel(np.random.randn(100, len(self.index), 1000)) + + def time_panel_pct_change_minor(self): + self.panel.pct_change(1, axis='minor') + + +class panel_shift(object): + goal_time = 0.2 + + def setup(self): + self.index = date_range(start='2000', freq='D', periods=1000) + self.panel = Panel(np.random.randn(100, len(self.index), 1000)) + + def time_panel_shift(self): + self.panel.shift(1) + + +class panel_shift_minor(object): + goal_time = 0.2 + + def setup(self): + self.index = date_range(start='2000', freq='D', periods=1000) + self.panel = Panel(np.random.randn(100, len(self.index), 1000)) + + def time_panel_shift_minor(self): + self.panel.shift(1, axis='minor') \ No newline at end of file diff --git a/asv_bench/benchmarks/parser_vb.py b/asv_bench/benchmarks/parser_vb.py new file mode 100644 index 0000000000000..46167dc2bb33c --- /dev/null +++ b/asv_bench/benchmarks/parser_vb.py @@ -0,0 +1,109 @@ +from cStringIO import StringIO +from pandas_vb_common import * +import os +from pandas import read_csv, read_table + + +class read_csv_comment2(object): + goal_time = 0.2 + + def setup(self): + self.data = ['A,B,C'] + self.data = (self.data + (['1,2,3 # comment'] * 100000)) + self.data = '\n'.join(self.data) + + def time_read_csv_comment2(self): + read_csv(StringIO(self.data), comment='#') + + +class read_csv_default_converter(object): + goal_time = 0.2 + + def setup(self): + self.data = '0.1213700904466425978256438611,0.0525708283766902484401839501,0.4174092731488769913994474336\n 0.4096341697147408700274695547,0.1587830198973579909349496119,0.1292545832485494372576795285\n 0.8323255650024565799327547210,0.9694902427379478160318626578,0.6295047811546814475747169126\n 0.4679375305798131323697930383,0.2963942381834381301075609371,0.5268936082160610157032465394\n 0.6685382761849776311890991564,0.6721207066140679753374342908,0.6519975277021627935170045020\n ' + self.data = (self.data * 200) + + def time_read_csv_default_converter(self): + read_csv(StringIO(self.data), sep=',', header=None, float_precision=None) + + +class read_csv_precise_converter(object): + goal_time = 0.2 + + def setup(self): + self.data = '0.1213700904466425978256438611,0.0525708283766902484401839501,0.4174092731488769913994474336\n 0.4096341697147408700274695547,0.1587830198973579909349496119,0.1292545832485494372576795285\n 0.8323255650024565799327547210,0.9694902427379478160318626578,0.6295047811546814475747169126\n 0.4679375305798131323697930383,0.2963942381834381301075609371,0.5268936082160610157032465394\n 0.6685382761849776311890991564,0.6721207066140679753374342908,0.6519975277021627935170045020\n ' + self.data = (self.data * 200) + + def time_read_csv_precise_converter(self): + read_csv(StringIO(self.data), sep=',', header=None, float_precision='high') + + +class read_csv_roundtrip_converter(object): + goal_time = 0.2 + + def setup(self): + self.data = '0.1213700904466425978256438611,0.0525708283766902484401839501,0.4174092731488769913994474336\n 0.4096341697147408700274695547,0.1587830198973579909349496119,0.1292545832485494372576795285\n 0.8323255650024565799327547210,0.9694902427379478160318626578,0.6295047811546814475747169126\n 0.4679375305798131323697930383,0.2963942381834381301075609371,0.5268936082160610157032465394\n 0.6685382761849776311890991564,0.6721207066140679753374342908,0.6519975277021627935170045020\n ' + self.data = (self.data * 200) + + def time_read_csv_roundtrip_converter(self): + read_csv(StringIO(self.data), sep=',', header=None, float_precision='round_trip') + + +class read_csv_thou_vb(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 8 + self.format = (lambda x: '{:,}'.format(x)) + self.df = DataFrame((np.random.randn(self.N, self.K) * np.random.randint(100, 10000, (self.N, self.K)))) + self.df = self.df.applymap(self.format) + self.df.to_csv('test.csv', sep='|') + + def time_read_csv_thou_vb(self): + read_csv('test.csv', sep='|', thousands=',') + + def teardown(self): + os.remove('test.csv') + + +class read_csv_vb(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 8 + self.df = DataFrame((np.random.randn(self.N, self.K) * np.random.randint(100, 10000, (self.N, self.K)))) + self.df.to_csv('test.csv', sep='|') + + def time_read_csv_vb(self): + read_csv('test.csv', sep='|') + + def teardown(self): + os.remove('test.csv') + + +class read_table_multiple_date(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 8 + self.data = 'KORD,19990127, 19:00:00, 18:56:00, 0.8100, 2.8100, 7.2000, 0.0000, 280.0000\n KORD,19990127, 20:00:00, 19:56:00, 0.0100, 2.2100, 7.2000, 0.0000, 260.0000\n KORD,19990127, 21:00:00, 20:56:00, -0.5900, 2.2100, 5.7000, 0.0000, 280.0000\n KORD,19990127, 21:00:00, 21:18:00, -0.9900, 2.0100, 3.6000, 0.0000, 270.0000\n KORD,19990127, 22:00:00, 21:56:00, -0.5900, 1.7100, 5.1000, 0.0000, 290.0000\n ' + self.data = (self.data * 200) + + def time_read_table_multiple_date(self): + read_table(StringIO(self.data), sep=',', header=None, parse_dates=[[1, 2], [1, 3]]) + + +class read_table_multiple_date_baseline(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 8 + self.data = 'KORD,19990127 19:00:00, 18:56:00, 0.8100, 2.8100, 7.2000, 0.0000, 280.0000\n KORD,19990127 20:00:00, 19:56:00, 0.0100, 2.2100, 7.2000, 0.0000, 260.0000\n KORD,19990127 21:00:00, 20:56:00, -0.5900, 2.2100, 5.7000, 0.0000, 280.0000\n KORD,19990127 21:00:00, 21:18:00, -0.9900, 2.0100, 3.6000, 0.0000, 270.0000\n KORD,19990127 22:00:00, 21:56:00, -0.5900, 1.7100, 5.1000, 0.0000, 290.0000\n ' + self.data = (self.data * 200) + + def time_read_table_multiple_date_baseline(self): + read_table(StringIO(self.data), sep=',', header=None, parse_dates=[1]) \ No newline at end of file diff --git a/asv_bench/benchmarks/plotting.py b/asv_bench/benchmarks/plotting.py new file mode 100644 index 0000000000000..d1df1b429c656 --- /dev/null +++ b/asv_bench/benchmarks/plotting.py @@ -0,0 +1,19 @@ +from pandas_vb_common import * +try: + from pandas import date_range +except ImportError: + + def date_range(start=None, end=None, periods=None, freq=None): + return DatetimeIndex(start, end, periods=periods, offset=freq) + + +class plot_timeseries_period(object): + goal_time = 0.2 + + def setup(self): + self.N = 2000 + self.M = 5 + self.df = DataFrame(np.random.randn(self.N, self.M), index=date_range('1/1/1975', periods=self.N)) + + def time_plot_timeseries_period(self): + self.df.plot() \ No newline at end of file diff --git a/asv_bench/benchmarks/reindex.py b/asv_bench/benchmarks/reindex.py new file mode 100644 index 0000000000000..d6fbd0d31c389 --- /dev/null +++ b/asv_bench/benchmarks/reindex.py @@ -0,0 +1,384 @@ +from pandas_vb_common import * +from random import shuffle + + +class dataframe_reindex(object): + goal_time = 0.2 + + def setup(self): + self.rng = DatetimeIndex(start='1/1/1970', periods=10000, freq=datetools.Minute()) + self.df = DataFrame(np.random.rand(10000, 10), index=self.rng, columns=range(10)) + self.df['foo'] = 'bar' + self.rng2 = Index(self.rng[::2]) + + def time_dataframe_reindex(self): + self.df.reindex(self.rng2) + + +class frame_drop_dup_inplace(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + + def time_frame_drop_dup_inplace(self): + self.df.drop_duplicates(['key1', 'key2'], inplace=True) + + +class frame_drop_dup_na_inplace(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + self.df.ix[:10000, :] = np.nan + + def time_frame_drop_dup_na_inplace(self): + self.df.drop_duplicates(['key1', 'key2'], inplace=True) + + +class frame_drop_duplicates(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + + def time_frame_drop_duplicates(self): + self.df.drop_duplicates(['key1', 'key2']) + + +class frame_drop_duplicates_na(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + self.df.ix[:10000, :] = np.nan + + def time_frame_drop_duplicates_na(self): + self.df.drop_duplicates(['key1', 'key2']) + + +class frame_fillna_many_columns_pad(object): + goal_time = 0.2 + + def setup(self): + self.values = np.random.randn(1000, 1000) + self.values[::2] = np.nan + self.df = DataFrame(self.values) + + def time_frame_fillna_many_columns_pad(self): + self.df.fillna(method='pad') + + +class frame_reindex_columns(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(index=range(10000), data=np.random.rand(10000, 30), columns=range(30)) + + def time_frame_reindex_columns(self): + self.df.reindex(columns=self.df.columns[1:5]) + + +class frame_sort_index_by_columns(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + + def time_frame_sort_index_by_columns(self): + self.df.sort_index(by=['key1', 'key2']) + + +class lib_fast_zip(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + + def time_lib_fast_zip(self): + lib.fast_zip(self.col_array_list) + + +class lib_fast_zip_fillna(object): + goal_time = 0.2 + + def setup(self): + self.N = 10000 + self.K = 10 + self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) + self.col_array_list = list(self.df.values.T) + self.df.ix[:10000, :] = np.nan + + def time_lib_fast_zip_fillna(self): + lib.fast_zip_fillna(self.col_array_list) + + +class reindex_daterange_backfill(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_daterange_backfill(self): + backfill(self.ts2, self.ts.index) + + +class reindex_daterange_pad(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_daterange_pad(self): + pad(self.ts2, self.ts.index) + + +class reindex_fillna_backfill(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_fillna_backfill(self): + self.ts3.fillna(method='backfill') + + +class reindex_fillna_backfill_float32(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_fillna_backfill_float32(self): + self.ts4.fillna(method='backfill') + + +class reindex_fillna_pad(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_fillna_pad(self): + self.ts3.fillna(method='pad') + + +class reindex_fillna_pad_float32(object): + goal_time = 0.2 + + def setup(self): + self.rng = date_range('1/1/2000', periods=100000, freq=datetools.Minute()) + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + self.ts2 = self.ts[::2] + self.ts3 = self.ts2.reindex(self.ts.index) + self.ts4 = self.ts3.astype('float32') + + def pad(source_series, target_index): + try: + source_series.reindex(target_index, method='pad') + except: + source_series.reindex(target_index, fillMethod='pad') + + def backfill(source_series, target_index): + try: + source_series.reindex(target_index, method='backfill') + except: + source_series.reindex(target_index, fillMethod='backfill') + + def time_reindex_fillna_pad_float32(self): + self.ts4.fillna(method='pad') + + +class reindex_frame_level_align(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_reindex_frame_level_align(self): + self.df.align(self.df_level, level=1, copy=False) + + +class reindex_frame_level_reindex(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_reindex_frame_level_reindex(self): + self.df_level.reindex(self.df.index, level=1) + + +class reindex_multiindex(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000 + self.K = 20 + self.level1 = tm.makeStringIndex(self.N).values.repeat(self.K) + self.level2 = np.tile(tm.makeStringIndex(self.K).values, self.N) + self.index = MultiIndex.from_arrays([self.level1, self.level2]) + self.s1 = Series(np.random.randn((self.N * self.K)), index=self.index) + self.s2 = self.s1[::2] + + def time_reindex_multiindex(self): + self.s1.reindex(self.s2.index) + + +class series_align_irregular_string(object): + goal_time = 0.2 + + def setup(self): + self.n = 50000 + self.indices = tm.makeStringIndex(self.n) + + def sample(values, k): + self.sampler = np.arange(len(values)) + shuffle(self.sampler) + return values.take(self.sampler[:k]) + self.subsample_size = 40000 + self.x = Series(np.random.randn(50000), self.indices) + self.y = Series(np.random.randn(self.subsample_size), index=sample(self.indices, self.subsample_size)) + + def time_series_align_irregular_string(self): + (self.x + self.y) + + +class series_drop_duplicates_int(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.randint(0, 1000, size=10000)) + self.s2 = Series(np.tile(tm.makeStringIndex(1000).values, 10)) + + def time_series_drop_duplicates_int(self): + self.s.drop_duplicates() + + +class series_drop_duplicates_string(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.randint(0, 1000, size=10000)) + self.s2 = Series(np.tile(tm.makeStringIndex(1000).values, 10)) + + def time_series_drop_duplicates_string(self): + self.s2.drop_duplicates() \ No newline at end of file diff --git a/asv_bench/benchmarks/replace.py b/asv_bench/benchmarks/replace.py new file mode 100644 index 0000000000000..9b78c287c5ad4 --- /dev/null +++ b/asv_bench/benchmarks/replace.py @@ -0,0 +1,48 @@ +from pandas_vb_common import * +from pandas.compat import range +from datetime import timedelta + + +class replace_fillna(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + try: + self.rng = date_range('1/1/2000', periods=self.N, freq='min') + except NameError: + self.rng = DatetimeIndex('1/1/2000', periods=self.N, offset=datetools.Minute()) + self.date_range = DateRange + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_replace_fillna(self): + self.ts.fillna(0.0, inplace=True) + + +class replace_large_dict(object): + goal_time = 0.2 + + def setup(self): + self.n = (10 ** 6) + self.start_value = (10 ** 5) + self.to_rep = dict(((i, (self.start_value + i)) for i in range(self.n))) + self.s = Series(np.random.randint(self.n, size=(10 ** 3))) + + def time_replace_large_dict(self): + self.s.replace(self.to_rep, inplace=True) + + +class replace_replacena(object): + goal_time = 0.2 + + def setup(self): + self.N = 1000000 + try: + self.rng = date_range('1/1/2000', periods=self.N, freq='min') + except NameError: + self.rng = DatetimeIndex('1/1/2000', periods=self.N, offset=datetools.Minute()) + self.date_range = DateRange + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_replace_replacena(self): + self.ts.replace(np.nan, 0.0, inplace=True) \ No newline at end of file diff --git a/asv_bench/benchmarks/reshape.py b/asv_bench/benchmarks/reshape.py new file mode 100644 index 0000000000000..b4081957af97b --- /dev/null +++ b/asv_bench/benchmarks/reshape.py @@ -0,0 +1,76 @@ +from pandas_vb_common import * +from pandas.core.reshape import melt + + +class melt_dataframe(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) + self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + self.df = DataFrame(np.random.randn(10000, 3), columns=['A', 'B', 'C']) + self.df['id1'] = np.random.randint(0, 10, 10000) + self.df['id2'] = np.random.randint(100, 1000, 10000) + + def time_melt_dataframe(self): + melt(self.df, id_vars=['id1', 'id2']) + + +class reshape_pivot_time_series(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) + self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + + def unpivot(frame): + (N, K) = frame.shape + self.data = {'value': frame.values.ravel('F'), 'variable': np.asarray(frame.columns).repeat(N), 'date': np.tile(np.asarray(frame.index), K), } + return DataFrame(self.data, columns=['date', 'variable', 'value']) + self.index = date_range('1/1/2000', periods=10000, freq='h') + self.df = DataFrame(randn(10000, 50), index=self.index, columns=range(50)) + self.pdf = unpivot(self.df) + self.f = (lambda : self.pdf.pivot('date', 'variable', 'value')) + + def time_reshape_pivot_time_series(self): + self.f() + + +class reshape_stack_simple(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) + self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + self.udf = self.df.unstack(1) + + def time_reshape_stack_simple(self): + self.udf.stack() + + +class reshape_unstack_simple(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) + self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + + def time_reshape_unstack_simple(self): + self.df.unstack(1) + + +class unstack_sparse_keyspace(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) + self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + self.NUM_ROWS = 1000 + for iter in range(10): + self.df = DataFrame({'A': np.random.randint(50, size=self.NUM_ROWS), 'B': np.random.randint(50, size=self.NUM_ROWS), 'C': np.random.randint((-10), 10, size=self.NUM_ROWS), 'D': np.random.randint((-10), 10, size=self.NUM_ROWS), 'E': np.random.randint(10, size=self.NUM_ROWS), 'F': np.random.randn(self.NUM_ROWS), }) + self.idf = self.df.set_index(['A', 'B', 'C', 'D', 'E']) + if (len(self.idf.index.unique()) == self.NUM_ROWS): + break + + def time_unstack_sparse_keyspace(self): + self.idf.unstack() \ No newline at end of file diff --git a/asv_bench/benchmarks/series_methods.py b/asv_bench/benchmarks/series_methods.py new file mode 100644 index 0000000000000..9cd61c741dae1 --- /dev/null +++ b/asv_bench/benchmarks/series_methods.py @@ -0,0 +1,74 @@ +from pandas_vb_common import * + + +class series_isin_int64(object): + goal_time = 0.2 + + def setup(self): + self.s1 = Series(np.random.randn(10000)) + self.s2 = Series(np.random.randint(1, 10, 10000)) + self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') + self.values = [1, 2] + self.s4 = self.s3.astype('object') + + def time_series_isin_int64(self): + self.s3.isin(self.values) + + +class series_isin_object(object): + goal_time = 0.2 + + def setup(self): + self.s1 = Series(np.random.randn(10000)) + self.s2 = Series(np.random.randint(1, 10, 10000)) + self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') + self.values = [1, 2] + self.s4 = self.s3.astype('object') + + def time_series_isin_object(self): + self.s4.isin(self.values) + + +class series_nlargest1(object): + goal_time = 0.2 + + def setup(self): + self.s1 = Series(np.random.randn(10000)) + self.s2 = Series(np.random.randint(1, 10, 10000)) + self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') + self.values = [1, 2] + self.s4 = self.s3.astype('object') + + def time_series_nlargest1(self): + self.s1.nlargest(3, take_last=True) + self.s1.nlargest(3, take_last=False) + + +class series_nlargest2(object): + goal_time = 0.2 + + def setup(self): + self.s1 = Series(np.random.randn(10000)) + self.s2 = Series(np.random.randint(1, 10, 10000)) + self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') + self.values = [1, 2] + self.s4 = self.s3.astype('object') + + def time_series_nlargest2(self): + self.s2.nlargest(3, take_last=True) + self.s2.nlargest(3, take_last=False) + + +class series_nsmallest2(object): + goal_time = 0.2 + + def setup(self): + self.s1 = Series(np.random.randn(10000)) + self.s2 = Series(np.random.randint(1, 10, 10000)) + self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') + self.values = [1, 2] + self.s4 = self.s3.astype('object') + + def time_series_nsmallest2(self): + self.s2.nsmallest(3, take_last=True) + self.s2.nsmallest(3, take_last=False) \ No newline at end of file diff --git a/asv_bench/benchmarks/sparse.py b/asv_bench/benchmarks/sparse.py new file mode 100644 index 0000000000000..dbf35f5e40f55 --- /dev/null +++ b/asv_bench/benchmarks/sparse.py @@ -0,0 +1,55 @@ +from pandas_vb_common import * +import scipy.sparse +import pandas.sparse.series +from pandas.core.sparse import SparseSeries, SparseDataFrame +from pandas.core.sparse import SparseDataFrame + + +class sparse_series_to_frame(object): + goal_time = 0.2 + + def setup(self): + self.K = 50 + self.N = 50000 + self.rng = np.asarray(date_range('1/1/2000', periods=self.N, freq='T')) + self.series = {} + for i in range(1, (self.K + 1)): + self.data = np.random.randn(self.N)[:(- i)] + self.this_rng = self.rng[:(- i)] + self.data[100:] = np.nan + self.series[i] = SparseSeries(self.data, index=self.this_rng) + + def time_sparse_series_to_frame(self): + SparseDataFrame(self.series) + + +class sparse_frame_constructor(object): + goal_time = 0.2 + + def time_sparse_frame_constructor(self): + SparseDataFrame(columns=np.arange(100), index=np.arange(1000)) + + +class sparse_series_from_coo(object): + goal_time = 0.2 + + def setup(self): + self.A = scipy.sparse.coo_matrix(([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])), shape=(100, 100)) + + def time_sparse_series_from_coo(self): + self.ss = pandas.sparse.series.SparseSeries.from_coo(self.A) + + +class sparse_series_to_coo(object): + goal_time = 0.2 + + def setup(self): + self.s = pd.Series(([np.nan] * 10000)) + self.s[0] = 3.0 + self.s[100] = (-1.0) + self.s[999] = 12.1 + self.s.index = pd.MultiIndex.from_product((range(10), range(10), range(10), range(10))) + self.ss = self.s.to_sparse() + + def time_sparse_series_to_coo(self): + self.ss.to_coo(row_levels=[0, 1], column_levels=[2, 3], sort_labels=True) \ No newline at end of file diff --git a/asv_bench/benchmarks/stat_ops.py b/asv_bench/benchmarks/stat_ops.py new file mode 100644 index 0000000000000..98e2bbfce1a44 --- /dev/null +++ b/asv_bench/benchmarks/stat_ops.py @@ -0,0 +1,236 @@ +from pandas_vb_common import * + + +class stat_ops_frame_mean_float_axis_0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_mean_float_axis_0(self): + self.df.mean() + + +class stat_ops_frame_mean_float_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_mean_float_axis_1(self): + self.df.mean(1) + + +class stat_ops_frame_mean_int_axis_0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_mean_int_axis_0(self): + self.dfi.mean() + + +class stat_ops_frame_mean_int_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_mean_int_axis_1(self): + self.dfi.mean(1) + + +class stat_ops_frame_sum_float_axis_0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_sum_float_axis_0(self): + self.df.sum() + + +class stat_ops_frame_sum_float_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_sum_float_axis_1(self): + self.df.sum(1) + + +class stat_ops_frame_sum_int_axis_0(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_sum_int_axis_0(self): + self.dfi.sum() + + +class stat_ops_frame_sum_int_axis_1(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(100000, 4)) + self.dfi = DataFrame(np.random.randint(1000, size=self.df.shape)) + + def time_stat_ops_frame_sum_int_axis_1(self): + self.dfi.sum(1) + + +class stat_ops_level_frame_sum(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_stat_ops_level_frame_sum(self): + self.df.sum(level=1) + + +class stat_ops_level_frame_sum_multiple(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_stat_ops_level_frame_sum_multiple(self): + self.df.sum(level=[0, 1]) + + +class stat_ops_level_series_sum(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_stat_ops_level_series_sum(self): + self.df[1].sum(level=1) + + +class stat_ops_level_series_sum_multiple(object): + goal_time = 0.2 + + def setup(self): + self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) + random.shuffle(self.index.values) + self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) + self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + + def time_stat_ops_level_series_sum_multiple(self): + self.df[1].sum(level=[0, 1]) + + +class stat_ops_series_std(object): + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.randn(100000), index=np.arange(100000)) + self.s[::2] = np.nan + + def time_stat_ops_series_std(self): + self.s.std() + + +class stats_corr_spearman(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(1000, 30)) + + def time_stats_corr_spearman(self): + self.df.corr(method='spearman') + + +class stats_rank2d_axis0_average(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(5000, 50)) + + def time_stats_rank2d_axis0_average(self): + self.df.rank() + + +class stats_rank2d_axis1_average(object): + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(5000, 50)) + + def time_stats_rank2d_axis1_average(self): + self.df.rank(1) + + +class stats_rank_average(object): + goal_time = 0.2 + + def setup(self): + self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) + self.s = Series(self.values) + + def time_stats_rank_average(self): + self.s.rank() + + +class stats_rank_average_int(object): + goal_time = 0.2 + + def setup(self): + self.values = np.random.randint(0, 100000, size=200000) + self.s = Series(self.values) + + def time_stats_rank_average_int(self): + self.s.rank() + + +class stats_rank_pct_average(object): + goal_time = 0.2 + + def setup(self): + self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) + self.s = Series(self.values) + + def time_stats_rank_pct_average(self): + self.s.rank(pct=True) + + +class stats_rank_pct_average_old(object): + goal_time = 0.2 + + def setup(self): + self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) + self.s = Series(self.values) + + def time_stats_rank_pct_average_old(self): + (self.s.rank() / len(self.s)) + + +class stats_rolling_mean(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randn(100000) + + def time_stats_rolling_mean(self): + rolling_mean(self.arr, 100) \ No newline at end of file diff --git a/asv_bench/benchmarks/strings.py b/asv_bench/benchmarks/strings.py new file mode 100644 index 0000000000000..5adfbf4c2557d --- /dev/null +++ b/asv_bench/benchmarks/strings.py @@ -0,0 +1,393 @@ +from pandas_vb_common import * +import string +import itertools as IT +import pandas.util.testing as testing + + +class strings_cat(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_cat(self): + self.many.str.cat(sep=',') + + +class strings_center(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_center(self): + self.many.str.center(100) + + +class strings_contains_few(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_contains_few(self): + self.few.str.contains('matchthis') + + +class strings_contains_few_noregex(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_contains_few_noregex(self): + self.few.str.contains('matchthis', regex=False) + + +class strings_contains_many(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_contains_many(self): + self.many.str.contains('matchthis') + + +class strings_contains_many_noregex(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_contains_many_noregex(self): + self.many.str.contains('matchthis', regex=False) + + +class strings_count(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_count(self): + self.many.str.count('matchthis') + + +class strings_encode_decode(object): + goal_time = 0.2 + + def setup(self): + self.ser = Series(testing.makeUnicodeIndex()) + + def time_strings_encode_decode(self): + self.ser.str.encode('utf-8').str.decode('utf-8') + + +class strings_endswith(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_endswith(self): + self.many.str.endswith('matchthis') + + +class strings_extract(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_extract(self): + self.many.str.extract('(\\w*)matchthis(\\w*)') + + +class strings_findall(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_findall(self): + self.many.str.findall('[A-Z]+') + + +class strings_get(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_get(self): + self.many.str.get(0) + + +class strings_get_dummies(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + self.s = make_series(string.uppercase, strlen=10, size=10000).str.join('|') + + def time_strings_get_dummies(self): + self.s.str.get_dummies('|') + + +class strings_join_split(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_join_split(self): + self.many.str.join('--').str.split('--') + + +class strings_join_split_expand(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_join_split_expand(self): + self.many.str.join('--').str.split('--', expand=True) + + +class strings_len(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_len(self): + self.many.str.len() + + +class strings_lower(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_lower(self): + self.many.str.lower() + + +class strings_lstrip(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_lstrip(self): + self.many.str.lstrip('matchthis') + + +class strings_match(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_match(self): + self.many.str.match('mat..this') + + +class strings_pad(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_pad(self): + self.many.str.pad(100, side='both') + + +class strings_repeat(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_repeat(self): + self.many.str.repeat(list(IT.islice(IT.cycle(range(1, 4)), len(self.many)))) + + +class strings_replace(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_replace(self): + self.many.str.replace('(matchthis)', '\x01\x01') + + +class strings_rstrip(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_rstrip(self): + self.many.str.rstrip('matchthis') + + +class strings_slice(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_slice(self): + self.many.str.slice(5, 15, 2) + + +class strings_startswith(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_startswith(self): + self.many.str.startswith('matchthis') + + +class strings_strip(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_strip(self): + self.many.str.strip('matchthis') + + +class strings_title(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_title(self): + self.many.str.title() + + +class strings_upper(object): + goal_time = 0.2 + + def setup(self): + + def make_series(letters, strlen, size): + return Series(np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))) + self.many = make_series(('matchthis' + string.uppercase), strlen=19, size=10000) + self.few = make_series(('matchthis' + (string.uppercase * 42)), strlen=19, size=10000) + + def time_strings_upper(self): + self.many.str.upper() \ No newline at end of file diff --git a/asv_bench/benchmarks/timedelta.py b/asv_bench/benchmarks/timedelta.py new file mode 100644 index 0000000000000..36a0f98e3f5ef --- /dev/null +++ b/asv_bench/benchmarks/timedelta.py @@ -0,0 +1,34 @@ +from pandas_vb_common import * +from pandas import to_timedelta + + +class timedelta_convert_int(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randint(0, 1000, size=10000) + + def time_timedelta_convert_int(self): + to_timedelta(self.arr, unit='s') + + +class timedelta_convert_string(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randint(0, 1000, size=10000) + self.arr = ['{0} days'.format(i) for i in self.arr] + + def time_timedelta_convert_string(self): + to_timedelta(self.arr) + + +class timedelta_convert_string_seconds(object): + goal_time = 0.2 + + def setup(self): + self.arr = np.random.randint(0, 60, size=10000) + self.arr = ['00:00:{0:02d}'.format(i) for i in self.arr] + + def time_timedelta_convert_string_seconds(self): + to_timedelta(self.arr) \ No newline at end of file diff --git a/asv_bench/benchmarks/timeseries.py b/asv_bench/benchmarks/timeseries.py new file mode 100644 index 0000000000000..266c198de1455 --- /dev/null +++ b/asv_bench/benchmarks/timeseries.py @@ -0,0 +1,1046 @@ +from pandas.tseries.converter import DatetimeConverter +import pandas as pd +from datetime import timedelta +import datetime as dt +from pandas_vb_common import * +from pandas.tseries.frequencies import infer_freq +import pandas.tseries.holiday +import numpy as np + + +class dataframe_resample_max_numpy(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_max_numpy(self): + self.df.resample('1s', how=np.max) + + +class dataframe_resample_max_string(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_max_string(self): + self.df.resample('1s', how='max') + + +class dataframe_resample_mean_numpy(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_mean_numpy(self): + self.df.resample('1s', how=np.mean) + + +class dataframe_resample_mean_string(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_mean_string(self): + self.df.resample('1s', how='mean') + + +class dataframe_resample_min_numpy(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_min_numpy(self): + self.df.resample('1s', how=np.min) + + +class dataframe_resample_min_string(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='20130101', periods=100000, freq='50L') + self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) + + def time_dataframe_resample_min_string(self): + self.df.resample('1s', how='min') + + +class datetimeindex_add_offset(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=10000, freq='T') + + def time_datetimeindex_add_offset(self): + (self.rng + timedelta(minutes=2)) + + +class datetimeindex_converter(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_datetimeindex_converter(self): + DatetimeConverter.convert(self.rng, None, None) + + +class datetimeindex_infer_dst(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.dst_rng = date_range(start='10/29/2000 1:00:00', end='10/29/2000 1:59:59', freq='S') + self.index = date_range(start='10/29/2000', end='10/29/2000 00:59:59', freq='S') + self.index = self.index.append(self.dst_rng) + self.index = self.index.append(self.dst_rng) + self.index = self.index.append(date_range(start='10/29/2000 2:00:00', end='10/29/2000 3:00:00', freq='S')) + + def time_datetimeindex_infer_dst(self): + self.index.tz_localize('US/Eastern', infer_dst=True) + + +class datetimeindex_normalize(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000 9:30', periods=10000, freq='S', tz='US/Eastern') + + def time_datetimeindex_normalize(self): + self.rng.normalize() + + +class datetimeindex_unique(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=1000, freq='T') + self.index = self.rng.repeat(10) + + def time_datetimeindex_unique(self): + self.index.unique() + + +class dti_reset_index(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=1000, freq='H') + self.df = DataFrame(np.random.randn(len(self.rng), 2), self.rng) + + def time_dti_reset_index(self): + self.df.reset_index() + + +class dti_reset_index_tz(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=1000, freq='H', tz='US/Eastern') + self.df = DataFrame(np.random.randn(len(self.rng), 2), index=self.rng) + + def time_dti_reset_index_tz(self): + self.df.reset_index() + + +class period_setitem(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = period_range(start='1/1/1990', freq='S', periods=20000) + self.df = DataFrame(index=range(len(self.rng))) + + def time_period_setitem(self): + self.df['col'] = self.rng + + +class timeseries_1min_5min_mean(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_timeseries_1min_5min_mean(self): + self.ts[:10000].resample('5min', how='mean') + + +class timeseries_1min_5min_ohlc(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_timeseries_1min_5min_ohlc(self): + self.ts[:10000].resample('5min', how='ohlc') + + +class timeseries_add_irregular(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.lindex = np.random.permutation(self.N)[:(self.N // 2)] + self.rindex = np.random.permutation(self.N)[:(self.N // 2)] + self.left = Series(self.ts.values.take(self.lindex), index=self.ts.index.take(self.lindex)) + self.right = Series(self.ts.values.take(self.rindex), index=self.ts.index.take(self.rindex)) + + def time_timeseries_add_irregular(self): + (self.left + self.right) + + +class timeseries_asof(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 10000 + self.rng = date_range(start='1/1/1990', periods=self.N, freq='53s') + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.dates = date_range(start='1/1/1990', periods=(self.N * 10), freq='5s') + + def time_timeseries_asof(self): + self.ts.asof(self.dates) + + +class timeseries_asof_nan(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 10000 + self.rng = date_range(start='1/1/1990', periods=self.N, freq='53s') + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.dates = date_range(start='1/1/1990', periods=(self.N * 10), freq='5s') + self.ts[250:5000] = np.nan + + def time_timeseries_asof_nan(self): + self.ts.asof(self.dates) + + +class timeseries_asof_single(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 10000 + self.rng = date_range(start='1/1/1990', periods=self.N, freq='53s') + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.dates = date_range(start='1/1/1990', periods=(self.N * 10), freq='5s') + + def time_timeseries_asof_single(self): + self.ts.asof(self.dates[0]) + + +class timeseries_custom_bday_apply(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_apply(self): + self.cday.apply(self.date) + + +class timeseries_custom_bday_apply_dt64(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_apply_dt64(self): + self.cday.apply(self.dt64) + + +class timeseries_custom_bday_cal_decr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_cal_decr(self): + (self.date - (1 * self.cdayh)) + + +class timeseries_custom_bday_cal_incr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_cal_incr(self): + (self.date + (1 * self.cdayh)) + + +class timeseries_custom_bday_cal_incr_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_cal_incr_n(self): + (self.date + (10 * self.cdayh)) + + +class timeseries_custom_bday_cal_incr_neg_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_cal_incr_neg_n(self): + (self.date - (10 * self.cdayh)) + + +class timeseries_custom_bday_decr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_decr(self): + (self.date - self.cday) + + +class timeseries_custom_bday_incr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bday_incr(self): + (self.date + self.cday) + + +class timeseries_custom_bmonthbegin_decr_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bmonthbegin_decr_n(self): + (self.date - (10 * self.cmb)) + + +class timeseries_custom_bmonthbegin_incr_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bmonthbegin_incr_n(self): + (self.date + (10 * self.cmb)) + + +class timeseries_custom_bmonthend_decr_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bmonthend_decr_n(self): + (self.date - (10 * self.cme)) + + +class timeseries_custom_bmonthend_incr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bmonthend_incr(self): + (self.date + self.cme) + + +class timeseries_custom_bmonthend_incr_n(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_custom_bmonthend_incr_n(self): + (self.date + (10 * self.cme)) + + +class timeseries_day_apply(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_day_apply(self): + self.day.apply(self.date) + + +class timeseries_day_incr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_day_incr(self): + (self.date + self.day) + + +class timeseries_infer_freq(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/1700', freq='D', periods=100000) + self.a = self.rng[:50000].append(self.rng[50002:]) + + def time_timeseries_infer_freq(self): + infer_freq(self.a) + + +class timeseries_is_month_start(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 10000 + self.rng = date_range(start='1/1/1', periods=self.N, freq='B') + + def time_timeseries_is_month_start(self): + self.rng.is_month_start + + +class timeseries_iter_datetimeindex(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 1000000 + self.M = 10000 + self.idx1 = date_range(start='20140101', freq='T', periods=self.N) + self.idx2 = period_range(start='20140101', freq='T', periods=self.N) + + def iter_n(iterable, n=None): + self.i = 0 + for _ in iterable: + self.i += 1 + if ((n is not None) and (self.i > n)): + break + + def time_timeseries_iter_datetimeindex(self): + iter_n(self.idx1) + + +class timeseries_iter_datetimeindex_preexit(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 1000000 + self.M = 10000 + self.idx1 = date_range(start='20140101', freq='T', periods=self.N) + self.idx2 = period_range(start='20140101', freq='T', periods=self.N) + + def iter_n(iterable, n=None): + self.i = 0 + for _ in iterable: + self.i += 1 + if ((n is not None) and (self.i > n)): + break + + def time_timeseries_iter_datetimeindex_preexit(self): + iter_n(self.idx1, self.M) + + +class timeseries_iter_periodindex(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 1000000 + self.M = 10000 + self.idx1 = date_range(start='20140101', freq='T', periods=self.N) + self.idx2 = period_range(start='20140101', freq='T', periods=self.N) + + def iter_n(iterable, n=None): + self.i = 0 + for _ in iterable: + self.i += 1 + if ((n is not None) and (self.i > n)): + break + + def time_timeseries_iter_periodindex(self): + iter_n(self.idx2) + + +class timeseries_iter_periodindex_preexit(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 1000000 + self.M = 10000 + self.idx1 = date_range(start='20140101', freq='T', periods=self.N) + self.idx2 = period_range(start='20140101', freq='T', periods=self.N) + + def iter_n(iterable, n=None): + self.i = 0 + for _ in iterable: + self.i += 1 + if ((n is not None) and (self.i > n)): + break + + def time_timeseries_iter_periodindex_preexit(self): + iter_n(self.idx2, self.M) + + +class timeseries_large_lookup_value(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=1500000, freq='S') + self.ts = Series(1, index=self.rng) + + def time_timeseries_large_lookup_value(self): + self.ts[self.ts.index[(len(self.ts) // 2)]] + self.ts.index._cleanup() + + +class timeseries_period_downsample_mean(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = period_range(start='1/1/2000', end='1/1/2001', freq='T') + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + + def time_timeseries_period_downsample_mean(self): + self.ts.resample('D', how='mean') + + +class timeseries_resample_datetime64(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='2000-01-01 00:00:00', end='2000-01-01 10:00:00', freq='555000U') + self.int_ts = Series(5, self.rng, dtype='int64') + self.ts = self.int_ts.astype('datetime64[ns]') + + def time_timeseries_resample_datetime64(self): + self.ts.resample('1S', how='last') + + +class timeseries_slice_minutely(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_timeseries_slice_minutely(self): + self.ts[:10000] + + +class timeseries_sort_index(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='s') + self.rng = self.rng.take(np.random.permutation(self.N)) + self.ts = Series(np.random.randn(self.N), index=self.rng) + + def time_timeseries_sort_index(self): + self.ts.sort_index() + + +class timeseries_timestamp_downsample_mean(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', end='1/1/2001', freq='T') + self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) + + def time_timeseries_timestamp_downsample_mean(self): + self.ts.resample('D', how='mean') + + +class timeseries_timestamp_tzinfo_cons(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', end='3/1/2000', tz='US/Eastern') + + def time_timeseries_timestamp_tzinfo_cons(self): + self.rng[0] + + +class timeseries_to_datetime_YYYYMMDD(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=10000, freq='D') + self.strings = Series((((self.rng.year * 10000) + (self.rng.month * 100)) + self.rng.day), dtype=np.int64).apply(str) + + def time_timeseries_to_datetime_YYYYMMDD(self): + to_datetime(self.strings, format='%Y%m%d') + + +class timeseries_to_datetime_iso8601(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=20000, freq='H') + self.strings = [x.strftime('%Y-%m-%d %H:%M:%S') for x in self.rng] + + def time_timeseries_to_datetime_iso8601(self): + to_datetime(self.strings) + + +class timeseries_to_datetime_iso8601_format(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.rng = date_range(start='1/1/2000', periods=20000, freq='H') + self.strings = [x.strftime('%Y-%m-%d %H:%M:%S') for x in self.rng] + + def time_timeseries_to_datetime_iso8601_format(self): + to_datetime(self.strings, format='%Y-%m-%d %H:%M:%S') + + +class timeseries_with_format_no_exact(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.s = Series((['19MAY11', '19MAY11:00:00:00'] * 100000)) + + def time_timeseries_with_format_no_exact(self): + to_datetime(self.s, format='%d%b%y', exact=False) + + +class timeseries_with_format_replace(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.s = Series((['19MAY11', '19MAY11:00:00:00'] * 100000)) + + def time_timeseries_with_format_replace(self): + to_datetime(self.s.str.replace(':\\S+$', ''), format='%d%b%y') + + +class timeseries_year_apply(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_year_apply(self): + self.year.apply(self.date) + + +class timeseries_year_incr(object): + goal_time = 0.2 + + def setup(self): + self.N = 100000 + self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + if hasattr(Series, 'convert'): + Series.resample = Series.convert + self.ts = Series(np.random.randn(self.N), index=self.rng) + self.date = dt.datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() + self.day = pd.offsets.Day() + self.year = pd.offsets.YearBegin() + self.cday = pd.offsets.CustomBusinessDay() + self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) + self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) + self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + + def time_timeseries_year_incr(self): + (self.date + self.year) \ No newline at end of file diff --git a/asv_bench/vbench_to_asv.py b/asv_bench/vbench_to_asv.py new file mode 100644 index 0000000000000..b3980ffed1a57 --- /dev/null +++ b/asv_bench/vbench_to_asv.py @@ -0,0 +1,151 @@ +import ast +import vbench +import os +import sys +import astor +import glob + + +def vbench_to_asv_source(bench, kinds=None): + tab = ' ' * 4 + if kinds is None: + kinds = ['time'] + + output = 'class {}(object):\n'.format(bench.name) + output += tab + 'goal_time = 0.2\n\n' + + if bench.setup: + indented_setup = [tab * 2 + '{}\n'.format(x) for x in bench.setup.splitlines()] + output += tab + 'def setup(self):\n' + ''.join(indented_setup) + '\n' + + for kind in kinds: + output += tab + 'def {}_{}(self):\n'.format(kind, bench.name) + for line in bench.code.splitlines(): + output += tab * 2 + line + '\n' + output += '\n\n' + + if bench.cleanup: + output += tab + 'def teardown(self):\n' + tab * 2 + bench.cleanup + + output += '\n\n' + return output + + +class AssignToSelf(ast.NodeTransformer): + def __init__(self): + super(AssignToSelf, self).__init__() + self.transforms = {} + self.imports = [] + + self.in_class_define = False + self.in_setup = False + + def visit_ClassDef(self, node): + self.transforms = {} + self.in_class_define = True + self.generic_visit(node) + return node + + def visit_TryExcept(self, node): + if any([isinstance(x, (ast.Import, ast.ImportFrom)) for x in node.body]): + self.imports.append(node) + else: + self.generic_visit(node) + return node + + def visit_Assign(self, node): + for target in node.targets: + if isinstance(target, ast.Name) and not isinstance(target.ctx, ast.Param) and not self.in_class_define: + self.transforms[target.id] = 'self.' + target.id + self.generic_visit(node) + + return node + + def visit_Name(self, node): + new_node = node + if node.id in self.transforms: + if not isinstance(node.ctx, ast.Param): + new_node = ast.Attribute(value=ast.Name(id='self', ctx=node.ctx), attr=node.id, ctx=node.ctx) + + self.generic_visit(node) + + return ast.copy_location(new_node, node) + + def visit_Import(self, node): + self.imports.append(node) + + def visit_ImportFrom(self, node): + self.imports.append(node) + + def visit_FunctionDef(self, node): + """Delete functions that are empty due to imports being moved""" + self.in_class_define = False + + if self.in_setup: + node.col_offset -= 4 + ast.increment_lineno(node, -1) + + if node.name == 'setup': + self.in_setup = True + + self.generic_visit(node) + + if node.name == 'setup': + self.in_setup = False + + if node.body: + return node + + +def translate_module(target_module): + g_vars = {} + l_vars = {} + exec('import ' + target_module) in g_vars + + print target_module + module = eval(target_module, g_vars) + + benchmarks = [] + for obj_str in dir(module): + obj = getattr(module, obj_str) + if isinstance(obj, vbench.benchmark.Benchmark): + benchmarks.append(obj) + + if not benchmarks: + return + + rewritten_output = '' + for bench in benchmarks: + rewritten_output += vbench_to_asv_source(bench) + + with open('rewrite.py', 'w') as f: + f.write(rewritten_output) + + ast_module = ast.parse(rewritten_output) + + transformer = AssignToSelf() + transformed_module = transformer.visit(ast_module) + + unique_imports = {astor.to_source(node): node for node in transformer.imports} + + transformed_module.body = unique_imports.values() + transformed_module.body + + transformed_source = astor.to_source(transformed_module) + + with open('benchmarks/{}.py'.format(target_module), 'w') as f: + f.write(transformed_source) + + +if __name__ == '__main__': + cwd = os.getcwd() + new_dir = os.path.join(os.path.dirname(__file__), '../vb_suite') + sys.path.insert(0, new_dir) + + for module in glob.glob(os.path.join(new_dir, '*.py')): + mod = os.path.basename(module) + if mod in ['make.py', 'measure_memory_consumption.py', 'perf_HEAD.py', 'run_suite.py', 'test_perf.py', 'generate_rst_files.py', 'test.py', 'suite.py']: + continue + print + print mod + + translate_module(mod.replace('.py', '')) diff --git a/bench/bench_sparse.py b/bench/bench_sparse.py index 7dc2db05cfe20..0aa705118d970 100644 --- a/bench/bench_sparse.py +++ b/bench/bench_sparse.py @@ -1,4 +1,3 @@ -import sys import numpy as np from pandas import * @@ -30,7 +29,7 @@ s1_dense = s1.to_dense() s2_dense = s2.to_dense() -if 'linux' in sys.platform: +if compat.is_platform_linux(): pth = '/home/wesm/code/pandas/example' else: pth = '/Users/wesm/code/pandas/example' diff --git a/ci/requirements-2.7.txt b/ci/requirements-2.7.txt index 0d515f300f5a7..951c8798bef15 100644 --- a/ci/requirements-2.7.txt +++ b/ci/requirements-2.7.txt @@ -17,7 +17,7 @@ boto=2.36.0 bottleneck=0.8.0 psycopg2=2.5.2 patsy -pymysql=0.6.1 +pymysql=0.6.3 html5lib=1.0b2 beautiful-soup=4.2.1 httplib2=0.8 diff --git a/ci/requirements-3.2.txt b/ci/requirements-3.2.txt deleted file mode 100644 index 8c2f675b65603..0000000000000 --- a/ci/requirements-3.2.txt +++ /dev/null @@ -1,4 +0,0 @@ -python-dateutil==2.1 -pytz==2013b -numpy==1.7.1 -cython==0.19.1 diff --git a/ci/requirements-3.4.txt b/ci/requirements-3.4.txt index 24af93fb16194..fd0a5bc53dd7e 100644 --- a/ci/requirements-3.4.txt +++ b/ci/requirements-3.4.txt @@ -3,6 +3,7 @@ pytz openpyxl xlsxwriter xlrd +xlwt html5lib patsy beautiful-soup diff --git a/ci/requirements-3.4_SLOW.txt b/ci/requirements-3.4_SLOW.txt index 6372d9b4f6068..ecc31dad78d07 100644 --- a/ci/requirements-3.4_SLOW.txt +++ b/ci/requirements-3.4_SLOW.txt @@ -3,6 +3,7 @@ pytz openpyxl xlsxwriter xlrd +xlwt html5lib patsy beautiful-soup diff --git a/ci/script.sh b/ci/script.sh index d5082234024d5..1126e8249646c 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -15,8 +15,8 @@ fi if [ "$BUILD_TEST" ]; then echo "We are not running nosetests as this is simply a build test." else - echo nosetests --exe -A "$NOSE_ARGS" pandas --with-xunit --xunit-file=/tmp/nosetests.xml - nosetests --exe -A "$NOSE_ARGS" pandas --with-xunit --xunit-file=/tmp/nosetests.xml + echo nosetests --exe -A "$NOSE_ARGS" pandas --doctest-tests --with-xunit --xunit-file=/tmp/nosetests.xml + nosetests --exe -A "$NOSE_ARGS" pandas --doctest-tests --with-xunit --xunit-file=/tmp/nosetests.xml fi RET="$?" diff --git a/conda.recipe/bld.bat b/conda.recipe/bld.bat index cc977c65dcbe1..284926fae8c04 100644 --- a/conda.recipe/bld.bat +++ b/conda.recipe/bld.bat @@ -1,2 +1,2 @@ @echo off -%PYTHON% setup.py install --quiet +%PYTHON% setup.py install diff --git a/conda.recipe/build.sh b/conda.recipe/build.sh index bce23bf0c6549..f341bce6fcf96 100644 --- a/conda.recipe/build.sh +++ b/conda.recipe/build.sh @@ -1,2 +1,2 @@ -#!/bin/bash -$PYTHON setup.py install --quiet +#!/bin/sh +$PYTHON setup.py install diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 6817fbc9b43e0..6f0fd4fda47a3 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,6 +1,6 @@ package: - name: pandas - version: {{ environ.get('GIT_DESCRIBE_TAG', '') }} + name: pandas + version: {{ environ.get('GIT_DESCRIBE_TAG', '').replace('.dev', 'dev') }} build: number: {{ environ.get('GIT_DESCRIBE_NUMBER', 0) }} @@ -28,10 +28,9 @@ requirements: test: requires: - nose - - coverage commands: - - python -c "import pandas" + - nosetests --exe -A "not slow and not network and not disabled" pandas about: home: http://pandas.pydata.org diff --git a/doc/source/api.rst b/doc/source/api.rst index 76e03ce70342f..6b188deb9eb42 100644 --- a/doc/source/api.rst +++ b/doc/source/api.rst @@ -82,6 +82,15 @@ HDFStore: PyTables (HDF5) HDFStore.get HDFStore.select +SAS +~~~ + +.. autosummary:: + :toctree: generated/ + + read_sas + XportReader + SQL ~~~ @@ -509,6 +518,7 @@ These can be accessed like ``Series.dt.``. Series.dt.tz_localize Series.dt.tz_convert Series.dt.normalize + Series.dt.strftime **Timedelta Properties** @@ -798,9 +808,7 @@ Binary operator functions DataFrame.ne DataFrame.eq DataFrame.combine - DataFrame.combineAdd DataFrame.combine_first - DataFrame.combineMult Function application, GroupBy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -903,6 +911,8 @@ Reshaping, sorting, transposing DataFrame.sort DataFrame.sort_index DataFrame.sortlevel + DataFrame.nlargest + DataFrame.nsmallest DataFrame.swaplevel DataFrame.stack DataFrame.unstack @@ -1443,6 +1453,7 @@ Conversion DatetimeIndex.to_datetime DatetimeIndex.to_period + DatetimeIndex.to_perioddelta DatetimeIndex.to_pydatetime DatetimeIndex.to_series @@ -1558,7 +1569,6 @@ application to columns of a specific data type. DataFrameGroupBy.hist DataFrameGroupBy.idxmax DataFrameGroupBy.idxmin - DataFrameGroupBy.irow DataFrameGroupBy.mad DataFrameGroupBy.pct_change DataFrameGroupBy.plot diff --git a/doc/source/basics.rst b/doc/source/basics.rst index 349e7e25fdafb..71d16a40f0215 100644 --- a/doc/source/basics.rst +++ b/doc/source/basics.rst @@ -240,14 +240,14 @@ way to summarize a boolean result. .. ipython:: python - (df>0).all() - (df>0).any() + (df > 0).all() + (df > 0).any() You can reduce to a final boolean value. .. ipython:: python - (df>0).any().any() + (df > 0).any().any() You can test if a pandas object is empty, via the :attr:`~DataFrame.empty` property. @@ -330,6 +330,48 @@ equality to be True: df1.equals(df2) df1.equals(df2.sort()) +Comparing array-like objects +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can conveniently do element-wise comparisons when comparing a pandas +data structure with a scalar value: + +.. ipython:: python + + pd.Series(['foo', 'bar', 'baz']) == 'foo' + pd.Index(['foo', 'bar', 'baz']) == 'foo' + +Pandas also handles element-wise comparisons between different array-like +objects of the same length: + +.. ipython:: python + + pd.Series(['foo', 'bar', 'baz']) == pd.Index(['foo', 'bar', 'qux']) + pd.Series(['foo', 'bar', 'baz']) == np.array(['foo', 'bar', 'qux']) + +Trying to compare ``Index`` or ``Series`` objects of different lengths will +raise a ValueError: + +.. code-block:: python + + In [55]: pd.Series(['foo', 'bar', 'baz']) == pd.Series(['foo', 'bar']) + ValueError: Series lengths must match to compare + + In [56]: pd.Series(['foo', 'bar', 'baz']) == pd.Series(['foo']) + ValueError: Series lengths must match to compare + +Note that this is different from the numpy behavior where a comparison can +be broadcast: + +.. ipython:: python + + np.array([1, 2, 3]) == np.array([2]) + +or it can return False if broadcasting can not be done: + +.. ipython:: python + + np.array([1, 2, 3]) == np.array([1, 2]) Combining overlapping data sets ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1058,6 +1100,30 @@ Note that the same result could have been achieved using increasing or descreasing. :meth:`~Series.fillna` and :meth:`~Series.interpolate` will not make any checks on the order of the index. +.. _basics.limits_on_reindex_fill: + +Limits on filling while reindexing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``limit`` and ``tolerance`` arguments provide additional control over +filling while reindexing. Limit specifies the maximum count of consecutive +matches: + +.. ipython:: python + + ts2.reindex(ts.index, method='ffill', limit=1) + +In contrast, tolerance specifies the maximum distance between the index and +indexer values: + +.. ipython:: python + + ts2.reindex(ts.index, method='ffill', tolerance='1 day') + +Notice that when used on a ``DatetimeIndex``, ``TimedeltaIndex`` or +``PeriodIndex``, ``tolerance`` will coerced into a ``Timedelta`` if possible. +This allows you to specify tolerance with appropriate strings. + .. _basics.drop: Dropping labels from an axis @@ -1109,24 +1175,81 @@ parameter that is by default ``False`` and copies the underlying data. Pass The Panel class has a related :meth:`~Panel.rename_axis` class which can rename any of its three axes. +.. _basics.iteration: + Iteration --------- -Because Series is array-like, basic iteration produces the values. Other data -structures follow the dict-like convention of iterating over the "keys" of the -objects. In short: +The behavior of basic iteration over pandas objects depends on the type. +When iterating over a Series, it is regarded as array-like, and basic iteration +produces the values. Other data structures, like DataFrame and Panel, +follow the dict-like convention of iterating over the "keys" of the +objects. - * **Series**: values - * **DataFrame**: column labels - * **Panel**: item labels +In short, basic iteration (``for i in object``) produces: -Thus, for example: +* **Series**: values +* **DataFrame**: column labels +* **Panel**: item labels + +Thus, for example, iterating over a DataFrame gives you the column names: .. ipython:: - In [0]: for col in df: - ...: print(col) - ...: + In [0]: df = pd.DataFrame({'col1' : np.random.randn(3), 'col2' : np.random.randn(3)}, + ...: index=['a', 'b', 'c']) + + In [0]: for col in df: + ...: print(col) + ...: + +Pandas objects also have the dict-like :meth:`~DataFrame.iteritems` method to +iterate over the (key, value) pairs. + +To iterate over the rows of a DataFrame, you can use the following methods: + +* :meth:`~DataFrame.iterrows`: Iterate over the rows of a DataFrame as (index, Series) pairs. + This converts the rows to Series objects, which can change the dtypes and has some + performance implications. +* :meth:`~DataFrame.itertuples`: Iterate over the rows of a DataFrame as tuples of the values. + This is a lot faster as :meth:`~DataFrame.iterrows`, and is in most cases preferable to + use to iterate over the values of a DataFrame. + +.. warning:: + + Iterating through pandas objects is generally **slow**. In many cases, + iterating manually over the rows is not needed and can be avoided with + one of the following approaches: + + * Look for a *vectorized* solution: many operations can be performed using + built-in methods or numpy functions, (boolean) indexing, ... + + * When you have a function that cannot work on the full DataFrame/Series + at once, it is better to use :meth:`~DataFrame.apply` instead of iterating + over the values. See the docs on :ref:`function application `. + + * If you need to do iterative manipulations on the values but performance is + important, consider writing the inner loop using e.g. cython or numba. + See the :ref:`enhancing performance ` section for some + examples of this approach. + +.. warning:: + + You should **never modify** something you are iterating over. + This is not guaranteed to work in all cases. Depending on the + data types, the iterator returns a copy and not a view, and writing + to it will have no effect! + + For example, in the following case setting the value has no effect: + + .. ipython:: python + + df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c']}) + + for index, row in df.iterrows(): + row['a'] = 10 + + df iteritems ~~~~~~~~~ @@ -1134,9 +1257,9 @@ iteritems Consistent with the dict-like interface, :meth:`~DataFrame.iteritems` iterates through key-value pairs: - * **Series**: (index, scalar value) pairs - * **DataFrame**: (column, Series) pairs - * **Panel**: (item, DataFrame) pairs +* **Series**: (index, scalar value) pairs +* **DataFrame**: (column, Series) pairs +* **Panel**: (item, DataFrame) pairs For example: @@ -1147,22 +1270,46 @@ For example: ...: print(frame) ...: - .. _basics.iterrows: iterrows ~~~~~~~~ -New in v0.7 is the ability to iterate efficiently through rows of a -DataFrame with :meth:`~DataFrame.iterrows`. It returns an iterator yielding each +:meth:`~DataFrame.iterrows` allows you to iterate through the rows of a +DataFrame as Series objects. It returns an iterator yielding each index value along with a Series containing the data in each row: .. ipython:: - In [0]: for row_index, row in df2.iterrows(): + In [0]: for row_index, row in df.iterrows(): ...: print('%s\n%s' % (row_index, row)) ...: +.. note:: + + Because :meth:`~DataFrame.iterrows` returns a Series for each row, + it does **not** preserve dtypes across the rows (dtypes are + preserved across columns for DataFrames). For example, + + .. ipython:: python + + df_orig = pd.DataFrame([[1, 1.5]], columns=['int', 'float']) + df_orig.dtypes + row = next(df_orig.iterrows())[1] + row + + All values in ``row``, returned as a Series, are now upcasted + to floats, also the original integer value in column `x`: + + .. ipython:: python + + row['int'].dtype + df_orig['int'].dtype + + To preserve dtypes while iterating over the rows, it is better + to use :meth:`~DataFrame.itertuples` which returns tuples of the values + and which is generally much faster as ``iterrows``. + For instance, a contrived way to transpose the DataFrame would be: .. ipython:: python @@ -1174,45 +1321,38 @@ For instance, a contrived way to transpose the DataFrame would be: df2_t = pd.DataFrame(dict((idx,values) for idx, values in df2.iterrows())) print(df2_t) -.. note:: - - ``iterrows`` does **not** preserve dtypes across the rows (dtypes are - preserved across columns for DataFrames). For example, - - .. ipython:: python - - df_iter = pd.DataFrame([[1, 1.0]], columns=['x', 'y']) - row = next(df_iter.iterrows())[1] - print(row['x'].dtype) - print(df_iter['x'].dtype) - itertuples ~~~~~~~~~~ -The :meth:`~DataFrame.itertuples` method will return an iterator yielding a tuple for each row in the -DataFrame. The first element of the tuple will be the row's corresponding index -value, while the remaining values are the row values proper. +The :meth:`~DataFrame.itertuples` method will return an iterator +yielding a tuple for each row in the DataFrame. The first element +of the tuple will be the row's corresponding index value, +while the remaining values are the row values. For instance, .. ipython:: python - for r in df2.itertuples(): - print(r) + for row in df.itertuples(): + print(row) + +This method does not convert the row to a Series object but just returns the +values inside a tuple. Therefore, :meth:`~DataFrame.itertuples` preserves the +data type of the values and is generally faster as :meth:`~DataFrame.iterrows`. .. _basics.dt_accessors: .dt accessor -~~~~~~~~~~~~ +------------ ``Series`` has an accessor to succinctly return datetime like properties for the -*values* of the Series, if its a datetime/period like Series. +*values* of the Series, if it is a datetime/period like Series. This will return a Series, indexed like the existing Series. .. ipython:: python # datetime - s = pd.Series(pd.date_range('20130101 09:10:12',periods=4)) + s = pd.Series(pd.date_range('20130101 09:10:12', periods=4)) s s.dt.hour s.dt.second @@ -1238,12 +1378,29 @@ You can also chain these types of operations: s.dt.tz_localize('UTC').dt.tz_convert('US/Eastern') +You can also format datetime values as strings with :meth:`Series.dt.strftime` which +supports the same format as the standard :meth:`~datetime.datetime.strftime`. + +.. ipython:: python + + # DatetimeIndex + s = pd.Series(pd.date_range('20130101', periods=4)) + s + s.dt.strftime('%Y/%m/%d') + +.. ipython:: python + + # PeriodIndex + s = pd.Series(pd.period_range('20130101', periods=4)) + s + s.dt.strftime('%Y/%m/%d') + The ``.dt`` accessor works for period and timedelta dtypes. .. ipython:: python # period - s = pd.Series(pd.period_range('20130101', periods=4,freq='D')) + s = pd.Series(pd.period_range('20130101', periods=4, freq='D')) s s.dt.year s.dt.day @@ -1251,7 +1408,7 @@ The ``.dt`` accessor works for period and timedelta dtypes. .. ipython:: python # timedelta - s = pd.Series(pd.timedelta_range('1 day 00:00:05',periods=4,freq='s')) + s = pd.Series(pd.timedelta_range('1 day 00:00:05', periods=4, freq='s')) s s.dt.days s.dt.seconds @@ -1364,6 +1521,20 @@ faster than sorting the entire Series and calling ``head(n)`` on the result. s.nsmallest(3) s.nlargest(3) +.. versionadded:: 0.17.0 + +``DataFrame`` also has the ``nlargest`` and ``nsmallest`` methods. + +.. ipython:: python + + df = pd.DataFrame({'a': [-2, -1, 1, 10, 8, 11, -1], + 'b': list('abdceff'), + 'c': [1.0, 2.0, 4.0, 3.2, np.nan, 3.0, 4.0]}) + df.nlargest(3, 'a') + df.nlargest(5, ['a', 'c']) + df.nsmallest(3, 'a') + df.nsmallest(5, ['a', 'c']) + .. _basics.multi-index_sorting: @@ -1522,26 +1693,36 @@ then the more *general* one will be used as the result of the operation. object conversion ~~~~~~~~~~~~~~~~~ -:meth:`~DataFrame.convert_objects` is a method to try to force conversion of types from the ``object`` dtype to other types. -To force conversion of specific types that are *number like*, e.g. could be a string that represents a number, -pass ``convert_numeric=True``. This will force strings and numbers alike to be numbers if possible, otherwise -they will be set to ``np.nan``. +.. note:: + + The syntax of :meth:`~DataFrame.convert_objects` changed in 0.17.0. See + :ref:`API changes ` + for more details. + +:meth:`~DataFrame.convert_objects` is a method that converts columns from +the ``object`` dtype to datetimes, timedeltas or floats. For example, to +attempt conversion of object data that are *number like*, e.g. could be a +string that represents a number, pass ``numeric=True``. By default, this will +attempt a soft conversion and so will only succeed if the entire column is +convertible. To force the conversion, add the keyword argument ``coerce=True``. +This will force strings and number-like objects to be numbers if +possible, and other values will be set to ``np.nan``. .. ipython:: python df3['D'] = '1.' df3['E'] = '1' - df3.convert_objects(convert_numeric=True).dtypes + df3.convert_objects(numeric=True).dtypes # same, but specific dtype conversion df3['D'] = df3['D'].astype('float16') df3['E'] = df3['E'].astype('int32') df3.dtypes -To force conversion to ``datetime64[ns]``, pass ``convert_dates='coerce'``. +To force conversion to ``datetime64[ns]``, pass ``datetime=True`` and ``coerce=True``. This will convert any datetime-like object to dates, forcing other values to ``NaT``. This might be useful if you are reading in data which is mostly dates, -but occasionally has non-dates intermixed and you want to represent as missing. +but occasionally contains non-dates that you wish to represent as missing. .. ipython:: python @@ -1550,10 +1731,15 @@ but occasionally has non-dates intermixed and you want to represent as missing. 'foo', 1.0, 1, pd.Timestamp('20010104'), '20010105'], dtype='O') s - s.convert_objects(convert_dates='coerce') + s.convert_objects(datetime=True, coerce=True) -In addition, :meth:`~DataFrame.convert_objects` will attempt the *soft* conversion of any *object* dtypes, meaning that if all +Without passing ``coerce=True``, :meth:`~DataFrame.convert_objects` will attempt +*soft* conversion of any *object* dtypes, meaning that if all the objects in a Series are of the same type, the Series will have that dtype. +Note that setting ``coerce=True`` does not *convert* arbitrary types to either +``datetime64[ns]`` or ``timedelta64[ns]``. For example, a series containing string +dates will not be converted to a series of datetimes. To convert between types, +see :ref:`converting to timestamps `. gotchas ~~~~~~~ diff --git a/doc/source/conf.py b/doc/source/conf.py index 08fc8483762ab..57c1667dca0c3 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -52,7 +52,7 @@ with open("index.rst") as f: - lines = f.readlines() + index_rst_lines = f.readlines() # only include the slow autosummary feature if we're building the API section # of the docs @@ -60,20 +60,21 @@ # JP: added from sphinxdocs autosummary_generate = False -if any([re.match("\s*api\s*",l) for l in lines]): +if any([re.match("\s*api\s*",l) for l in index_rst_lines]): autosummary_generate = True -ds = [] +files_to_delete = [] for f in os.listdir(os.path.dirname(__file__)): - if (not f.endswith(('.rst'))) or (f.startswith('.')) or os.path.basename(f) == 'index.rst': + if not f.endswith('.rst') or f.startswith('.') or os.path.basename(f) == 'index.rst': continue - _f = f.split('.rst')[0] - if not any([re.match("\s*%s\s*$" % _f,l) for l in lines]): - ds.append(f) + _file_basename = f.split('.rst')[0] + _regex_to_match = "\s*{}\s*$".format(_file_basename) + if not any([re.match(_regex_to_match, line) for line in index_rst_lines]): + files_to_delete.append(f) -if ds: - print("I'm about to DELETE the following:\n%s\n" % list(sorted(ds))) +if files_to_delete: + print("I'm about to DELETE the following:\n%s\n" % list(sorted(files_to_delete))) sys.stdout.write("WARNING: I'd like to delete those to speed up processing (yes/no)? ") if PY3: answer = input() @@ -81,7 +82,7 @@ answer = raw_input() if answer.lower().strip() in ('y','yes'): - for f in ds: + for f in files_to_delete: f = os.path.join(os.path.join(os.path.dirname(__file__),f)) f= os.path.abspath(f) try: diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst index 1f58992dba017..4ec2258df56f2 100644 --- a/doc/source/contributing.rst +++ b/doc/source/contributing.rst @@ -247,6 +247,8 @@ just checked out. There are two primary methods of doing this. from your development directory. Thus, you can always be using the development version on your system without being inside the clone directory. +.. _contributing.documentation: + Contributing to the documentation ================================= @@ -316,6 +318,13 @@ Some other important things to know about the docs: output saved) during the doc build. This way, they will always be up to date, but it makes the doc building a bit more complex. +The utility script ``scripts/api_rst_coverage.py`` can be used to compare +the list of methods documented in ``doc/source/api.rst`` (which is used to generate +the `API Reference `_ page) +and the actual public methods. +It will identify methods documented in in ``doc/source/api.rst`` that are not actually +class methods, and existing methods that are not documented in ``doc/source/api.rst``. + How to build the pandas documentation ------------------------------------- @@ -536,10 +545,23 @@ Documenting your code Changes should be reflected in the release notes located in `doc/source/whatsnew/vx.y.z.txt`. This file contains an ongoing change log for each release. Add an entry to this file to document your fix, enhancement or (unavoidable) breaking change. Make sure to include the -GitHub issue number when adding your entry. +GitHub issue number when adding your entry (using `` :issue:`1234` `` where `1234` is the +issue/pull request number). + +If your code is an enhancement, it is most likely necessary to add usage +examples to the existing documentation. This can be done following the section +regarding documentation :ref:`above `. +Further, to let users know when this feature was added, the ``versionadded`` +directive is used. The sphinx syntax for that is: + +.. code-block:: rst + + .. versionadded:: 0.17.0 -If your code is an enhancement, it is most likely necessary to add usage examples to the -existing documentation. This can be done following the section regarding documentation. +This will put the text *New in version 0.17.0* wherever you put the sphinx +directive. This should also be put in the docstring when adding a new function +or method (`example `__) +or a new keyword argument (`example `__). Contributing your changes to *pandas* ===================================== diff --git a/doc/source/cookbook.rst b/doc/source/cookbook.rst index f69f926296020..9e7b9ad0b7582 100644 --- a/doc/source/cookbook.rst +++ b/doc/source/cookbook.rst @@ -745,6 +745,9 @@ Timeseries `Vectorized Lookup `__ +`Aggregation and plotting time series +`__ + Turn a matrix with hours in columns and days in rows into a continuous row sequence in the form of a time series. `How to rearrange a python pandas DataFrame? `__ @@ -831,6 +834,9 @@ ignore_index is needed in pandas < v0.13, and depending on df construction `Join with a criteria based on the values `__ +`Using searchsorted to merge based on values inside a range +`__ + .. _cookbook.plotting: Plotting @@ -985,8 +991,14 @@ The :ref:`Excel ` docs `Reading from a filelike handle `__ +`Modifying formatting in XlsxWriter output +`__ + .. _cookbook.html: +HTML +**** + `Reading HTML tables from a server that cannot handle the default request header `__ diff --git a/doc/source/dsintro.rst b/doc/source/dsintro.rst index 9221f2685d79b..5a62e7dccea34 100644 --- a/doc/source/dsintro.rst +++ b/doc/source/dsintro.rst @@ -1,18 +1,23 @@ .. currentmodule:: pandas -.. _dsintro: - .. ipython:: python :suppress: import numpy as np - from pandas import * - randn = np.random.randn np.set_printoptions(precision=4, suppress=True) - set_option('display.precision', 4, 'display.max_columns', 8) - options.display.max_rows=15 import pandas as pd + pd.set_option('display.precision', 4, 'display.max_columns', 8) + pd.options.display.max_rows = 15 + + import matplotlib + try: + matplotlib.style.use('ggplot') + except AttributeError: + pd.options.display.mpl_style = 'default' + import matplotlib.pyplot as plt + plt.close('all') +.. _dsintro: ************************ Intro to Data Structures @@ -26,9 +31,7 @@ objects. To get started, import numpy and load pandas into your namespace: .. ipython:: python import numpy as np - # will use a lot in examples - randn = np.random.randn - from pandas import * + import pandas as pd Here is a basic tenet to keep in mind: **data alignment is intrinsic**. The link between labels and data will not be broken unless done so explicitly by you. @@ -36,13 +39,6 @@ between labels and data will not be broken unless done so explicitly by you. We'll give a brief intro to the data structures, then consider all of the broad categories of functionality and methods in separate sections. -When using pandas, we recommend the following import convention: - -.. code-block:: python - - import pandas as pd - - .. _basics.series: Series @@ -60,7 +56,7 @@ labels are collectively referred to as the **index**. The basic method to create :: - >>> s = Series(data, index=index) + >>> s = pd.Series(data, index=index) Here, ``data`` can be many different things: @@ -78,11 +74,11 @@ index is passed, one will be created having values ``[0, ..., len(data) - 1]``. .. ipython:: python - s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e']) + s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) s s.index - Series(randn(5)) + pd.Series(np.random.randn(5)) .. note:: @@ -101,8 +97,8 @@ constructed from the sorted keys of the dict, if possible. .. ipython:: python d = {'a' : 0., 'b' : 1., 'c' : 2.} - Series(d) - Series(d, index=['b', 'c', 'd', 'a']) + pd.Series(d) + pd.Series(d, index=['b', 'c', 'd', 'a']) .. note:: @@ -113,7 +109,7 @@ provided. The value will be repeated to match the length of **index** .. ipython:: python - Series(5., index=['a', 'b', 'c', 'd', 'e']) + pd.Series(5., index=['a', 'b', 'c', 'd', 'e']) Series is ndarray-like ~~~~~~~~~~~~~~~~~~~~~~ @@ -211,7 +207,7 @@ Series can also have a ``name`` attribute: .. ipython:: python - s = Series(np.random.randn(5), name='something') + s = pd.Series(np.random.randn(5), name='something') s s.name @@ -254,13 +250,13 @@ keys. .. ipython:: python - d = {'one' : Series([1., 2., 3.], index=['a', 'b', 'c']), - 'two' : Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} - df = DataFrame(d) + d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), + 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} + df = pd.DataFrame(d) df - DataFrame(d, index=['d', 'b', 'a']) - DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three']) + pd.DataFrame(d, index=['d', 'b', 'a']) + pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three']) The row and column labels can be accessed respectively by accessing the **index** and **columns** attributes: @@ -286,8 +282,8 @@ result will be ``range(n)``, where ``n`` is the array length. d = {'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]} - DataFrame(d) - DataFrame(d, index=['a', 'b', 'c', 'd']) + pd.DataFrame(d) + pd.DataFrame(d, index=['a', 'b', 'c', 'd']) From structured or record array ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -296,12 +292,12 @@ This case is handled identically to a dict of arrays. .. ipython:: python - data = np.zeros((2,),dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')]) - data[:] = [(1,2.,'Hello'),(2,3.,"World")] + data = np.zeros((2,), dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')]) + data[:] = [(1,2.,'Hello'), (2,3.,"World")] - DataFrame(data) - DataFrame(data, index=['first', 'second']) - DataFrame(data, columns=['C', 'A', 'B']) + pd.DataFrame(data) + pd.DataFrame(data, index=['first', 'second']) + pd.DataFrame(data, columns=['C', 'A', 'B']) .. note:: @@ -316,9 +312,9 @@ From a list of dicts .. ipython:: python data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] - DataFrame(data2) - DataFrame(data2, index=['first', 'second']) - DataFrame(data2, columns=['a', 'b']) + pd.DataFrame(data2) + pd.DataFrame(data2, index=['first', 'second']) + pd.DataFrame(data2, columns=['a', 'b']) .. _basics.dataframe.from_dict_of_tuples: @@ -329,11 +325,11 @@ You can automatically create a multi-indexed frame by passing a tuples dictionar .. ipython:: python - DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, - ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, - ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, - ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, - ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) + pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, + ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, + ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, + ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, + ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) .. _basics.dataframe.from_series: @@ -376,7 +372,7 @@ For example: .. ipython:: python data - DataFrame.from_records(data, index='C') + pd.DataFrame.from_records(data, index='C') .. _basics.dataframe.from_items: @@ -391,15 +387,15 @@ of columns: .. ipython:: python - DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])]) + pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])]) If you pass ``orient='index'``, the keys will be the row labels. But in this case you must also pass the desired column names: .. ipython:: python - DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])], - orient='index', columns=['one', 'two', 'three']) + pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])], + orient='index', columns=['one', 'two', 'three']) Column selection, addition, deletion ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -465,7 +461,7 @@ derived from existing columns. .. ipython:: python - iris = read_csv('data/iris.data') + iris = pd.read_csv('data/iris.data') iris.head() (iris.assign(sepal_ratio = iris['SepalWidth'] / iris['SepalLength']) @@ -564,8 +560,8 @@ union of the column and row labels. .. ipython:: python - df = DataFrame(randn(10, 4), columns=['A', 'B', 'C', 'D']) - df2 = DataFrame(randn(7, 3), columns=['A', 'B', 'C']) + df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D']) + df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C']) df + df2 When doing an operation between DataFrame and Series, the default behavior is @@ -583,8 +579,8 @@ also contains dates, the broadcasting will be column-wise: .. ipython:: python :okwarning: - index = date_range('1/1/2000', periods=8) - df = DataFrame(randn(8, 3), index=index, columns=list('ABC')) + index = pd.date_range('1/1/2000', periods=8) + df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC')) df type(df['A']) df - df['A'] @@ -619,8 +615,8 @@ Boolean operators work as well: .. ipython:: python - df1 = DataFrame({'a' : [1, 0, 1], 'b' : [0, 1, 1] }, dtype=bool) - df2 = DataFrame({'a' : [0, 1, 1], 'b' : [1, 1, 0] }, dtype=bool) + df1 = pd.DataFrame({'a' : [1, 0, 1], 'b' : [0, 1, 1] }, dtype=bool) + df2 = pd.DataFrame({'a' : [0, 1, 1], 'b' : [1, 1, 0] }, dtype=bool) df1 & df2 df1 | df2 df1 ^ df2 @@ -660,7 +656,7 @@ Similarly, the dot method on Series implements dot product: .. ipython:: python - s1 = Series(np.arange(5,10)) + s1 = pd.Series(np.arange(5,10)) s1.dot(s1) DataFrame is not intended to be a drop-in replacement for ndarray as its @@ -682,7 +678,7 @@ R package): .. ipython:: python - baseball = read_csv('data/baseball.csv') + baseball = pd.read_csv('data/baseball.csv') print(baseball) baseball.info() @@ -704,21 +700,21 @@ default: .. ipython:: python - DataFrame(randn(3, 12)) + pd.DataFrame(np.random.randn(3, 12)) You can change how much to print on a single row by setting the ``display.width`` option: .. ipython:: python - set_option('display.width', 40) # default is 80 + pd.set_option('display.width', 40) # default is 80 - DataFrame(randn(3, 12)) + pd.DataFrame(np.random.randn(3, 12)) .. ipython:: python :suppress: - reset_option('display.width') + pd.reset_option('display.width') You can also disable this feature via the ``expand_frame_repr`` option. This will print the table in one block. @@ -731,8 +727,8 @@ accessed like attributes: .. ipython:: python - df = DataFrame({'foo1' : np.random.randn(5), - 'foo2' : np.random.randn(5)}) + df = pd.DataFrame({'foo1' : np.random.randn(5), + 'foo2' : np.random.randn(5)}) df df.foo1 @@ -770,9 +766,9 @@ From 3D ndarray with optional axis labels .. ipython:: python - wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'], - major_axis=date_range('1/1/2000', periods=5), - minor_axis=['A', 'B', 'C', 'D']) + wp = pd.Panel(np.random.randn(2, 5, 4), items=['Item1', 'Item2'], + major_axis=pd.date_range('1/1/2000', periods=5), + minor_axis=['A', 'B', 'C', 'D']) wp @@ -781,9 +777,9 @@ From dict of DataFrame objects .. ipython:: python - data = {'Item1' : DataFrame(randn(4, 3)), - 'Item2' : DataFrame(randn(4, 2))} - Panel(data) + data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)), + 'Item2' : pd.DataFrame(np.random.randn(4, 2))} + pd.Panel(data) Note that the values in the dict need only be **convertible to DataFrame**. Thus, they can be any of the other valid inputs to DataFrame as @@ -803,7 +799,7 @@ For example, compare to the construction above: .. ipython:: python - Panel.from_dict(data, orient='minor') + pd.Panel.from_dict(data, orient='minor') Orient is especially useful for mixed-type DataFrames. If you pass a dict of DataFrame objects with mixed-type columns, all of the data will get upcasted to @@ -811,11 +807,11 @@ DataFrame objects with mixed-type columns, all of the data will get upcasted to .. ipython:: python - df = DataFrame({'a': ['foo', 'bar', 'baz'], - 'b': np.random.randn(3)}) + df = pd.DataFrame({'a': ['foo', 'bar', 'baz'], + 'b': np.random.randn(3)}) df data = {'item1': df, 'item2': df} - panel = Panel.from_dict(data, orient='minor') + panel = pd.Panel.from_dict(data, orient='minor') panel['a'] panel['b'] panel['b'].dtypes @@ -838,8 +834,8 @@ a DataFrame with a two-level index to a Panel. .. ipython:: python - midx = MultiIndex(levels=[['one', 'two'], ['x','y']], labels=[[1,1,0,0],[1,0,1,0]]) - df = DataFrame({'A' : [1, 2, 3, 4], 'B': [5, 6, 7, 8]}, index=midx) + midx = pd.MultiIndex(levels=[['one', 'two'], ['x','y']], labels=[[1,1,0,0],[1,0,1,0]]) + df = pd.DataFrame({'A' : [1, 2, 3, 4], 'B': [5, 6, 7, 8]}, index=midx) df.to_panel() .. _dsintro.panel_item_selection: @@ -897,7 +893,7 @@ Another way to change the dimensionality of an object is to ``squeeze`` a 1-len .. ipython:: python wp.reindex(items=['Item1']).squeeze() - wp.reindex(items=['Item1'],minor=['B']).squeeze() + wp.reindex(items=['Item1'], minor=['B']).squeeze() Conversion to DataFrame @@ -910,9 +906,9 @@ method: .. ipython:: python - panel = Panel(np.random.randn(3, 5, 4), items=['one', 'two', 'three'], - major_axis=date_range('1/1/2000', periods=5), - minor_axis=['a', 'b', 'c', 'd']) + panel = pd.Panel(np.random.randn(3, 5, 4), items=['one', 'two', 'three'], + major_axis=pd.date_range('1/1/2000', periods=5), + minor_axis=['a', 'b', 'c', 'd']) panel.to_frame() @@ -931,7 +927,6 @@ containers. DataFrames - **minor_axis**: axis 3, it is the **columns** of each of the DataFrames - ``Panel4D`` is a sub-class of ``Panel``, so most methods that work on Panels are applicable to Panel4D. The following methods are disabled: @@ -944,11 +939,11 @@ From 4D ndarray with optional axis labels .. ipython:: python - p4d = Panel4D(randn(2, 2, 5, 4), - labels=['Label1','Label2'], - items=['Item1', 'Item2'], - major_axis=date_range('1/1/2000', periods=5), - minor_axis=['A', 'B', 'C', 'D']) + p4d = pd.Panel4D(np.random.randn(2, 2, 5, 4), + labels=['Label1','Label2'], + items=['Item1', 'Item2'], + major_axis=pd.date_range('1/1/2000', periods=5), + minor_axis=['A', 'B', 'C', 'D']) p4d @@ -957,9 +952,9 @@ From dict of Panel objects .. ipython:: python - data = { 'Label1' : Panel({ 'Item1' : DataFrame(randn(4, 3)) }), - 'Label2' : Panel({ 'Item2' : DataFrame(randn(4, 2)) }) } - Panel4D(data) + data = { 'Label1' : pd.Panel({ 'Item1' : pd.DataFrame(np.random.randn(4, 3)) }), + 'Label2' : pd.Panel({ 'Item2' : pd.DataFrame(np.random.randn(4, 2)) }) } + pd.Panel4D(data) Note that the values in the dict need only be **convertible to Panels**. Thus, they can be any of the other valid inputs to Panel as per above. @@ -1022,7 +1017,7 @@ Here we slice to a Panel4D. orders = [ 'cool', 'labels','items','major_axis','minor_axis'], slices = { 'labels' : 'labels', 'items' : 'items', 'major_axis' : 'major_axis', 'minor_axis' : 'minor_axis' }, - slicer = Panel4D, + slicer = pd.Panel4D, aliases = { 'major' : 'major_axis', 'minor' : 'minor_axis' }, stat_axis = 2) diff --git a/doc/source/ecosystem.rst b/doc/source/ecosystem.rst index c70b6deade36e..762656ba05bd6 100644 --- a/doc/source/ecosystem.rst +++ b/doc/source/ecosystem.rst @@ -80,6 +80,10 @@ The `Vincent `__ project leverages `Vega < (that in turn, leverages `d3 `__) to create plots . It has great support for pandas data objects. +`Plotly `__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`Plotly’s `__ `Python API `__ enables interactive figures and web shareability. Maps, 2D, 3D, and live-streaming graphs are rendered with WebGL and `D3.js `__. The library supports plotting directly from a pandas DataFrame and cloud-based collaboration. Users of `matplotlib, ggplot for Python, and Seaborn `__ can convert figures into interactive web-based plots. Plots can be drawn in `IPython Notebooks `__ , edited with R or MATLAB, modified in a GUI, or embedded in apps and dashboards. Plotly is free for unlimited sharing, and has `cloud `__, `offline `__, or `on-premise `__ accounts for private use. .. _ecosystem.ide: @@ -132,19 +136,19 @@ Pandas DataFrames with timeseries indexes. `pydatastream `_ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -PyDatastream is a Python interface to the +PyDatastream is a Python interface to the `Thomson Dataworks Enterprise (DWE/Datastream) `__ -SOAP API to return indexed Pandas DataFrames or Panels with financial data. +SOAP API to return indexed Pandas DataFrames or Panels with financial data. This package requires valid credentials for this API (non free). `pandaSDMX `_ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -pandaSDMX is an extensible library to retrieve and acquire statistical data -and metadata disseminated in -`SDMX `_ 2.1. This standard is currently supported by +pandaSDMX is an extensible library to retrieve and acquire statistical data +and metadata disseminated in +`SDMX `_ 2.1. This standard is currently supported by the European statistics office (Eurostat) -and the European Central Bank (ECB). Datasets may be returned as pandas Series -or multi-indexed DataFrames. +and the European Central Bank (ECB). Datasets may be returned as pandas Series +or multi-indexed DataFrames. `fredapi `_ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -183,8 +187,16 @@ Out-of-core ------------- `Blaze `__ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Blaze provides a standard API for doing computations with various in-memory and on-disk backends: NumPy, Pandas, SQLAlchemy, MongoDB, PyTables, PySpark. + +`Odo `__ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Odo provides a uniform API for moving data between different formats. It uses +pandas own ``read_csv`` for CSV IO and leverages many existing packages such as +PyTables, h5py, and pymongo to move data between non pandas formats. Its graph +based approach is also extensible by end users for custom formats that may be +too specific for the core of odo. diff --git a/doc/source/enhancingperf.rst b/doc/source/enhancingperf.rst index 517c91c93d821..855a459f48cf4 100644 --- a/doc/source/enhancingperf.rst +++ b/doc/source/enhancingperf.rst @@ -5,17 +5,14 @@ .. ipython:: python :suppress: - import os - import csv - from pandas import DataFrame, Series - import pandas as pd - pd.options.display.max_rows=15 - import numpy as np np.random.seed(123456) - randn = np.random.randn - randint = np.random.randint np.set_printoptions(precision=4, suppress=True) + import pandas as pd + pd.options.display.max_rows=15 + + import os + import csv ********************* @@ -49,7 +46,10 @@ We have a DataFrame to which we want to apply a function row-wise. .. ipython:: python - df = DataFrame({'a': randn(1000), 'b': randn(1000),'N': randint(100, 1000, (1000)), 'x': 'x'}) + df = pd.DataFrame({'a': np.random.randn(1000), + 'b': np.random.randn(1000), + 'N': np.random.randint(100, 1000, (1000)), + 'x': 'x'}) df Here's the function in pure python: @@ -94,7 +94,8 @@ hence we'll concentrate our efforts cythonizing these two functions. Plain cython ~~~~~~~~~~~~ -First we're going to need to import the cython magic function to ipython: +First we're going to need to import the cython magic function to ipython (for +cython versions >=0.21 you can use ``%load_ext Cython``): .. ipython:: python @@ -306,7 +307,14 @@ Numba works by generating optimized machine code using the LLVM compiler infrast You will need to install ``numba``. This is easy with ``conda``, by using: ``conda install numba``, see :ref:`installing using miniconda`. -We simply take the plain python code from above and annotate with the ``@jit`` decorator. +.. note:: + + As of ``numba`` version 0.20, pandas objects cannot be passed directly to numba-compiled functions. Instead, one must pass the ``numpy`` array underlying the ``pandas`` object to the numba-compiled function as demonstrated below. + +Jit +~~~ + +Using ``numba`` to just-in-time compile your code. We simply take the plain python code from above and annotate with the ``@jit`` decorator. .. code-block:: python @@ -335,16 +343,57 @@ We simply take the plain python code from above and annotate with the ``@jit`` d def compute_numba(df): result = apply_integrate_f_numba(df['a'].values, df['b'].values, df['N'].values) - return Series(result, index=df.index, name='result') + return pd.Series(result, index=df.index, name='result') -Similar to above, we directly pass ``numpy`` arrays directly to the numba function. Further -we are wrapping the results to provide a nice interface by passing/returning pandas objects. +Note that we directly pass ``numpy`` arrays to the numba function. ``compute_numba`` is just a wrapper that provides a nicer interface by passing/returning pandas objects. .. code-block:: python In [4]: %timeit compute_numba(df) 1000 loops, best of 3: 798 us per loop +Vectorize +~~~~~~~~~ + +``numba`` can also be used to write vectorized functions that do not require the user to explicitly +loop over the observations of a vector; a vectorized function will be applied to each row automatically. +Consider the following toy example of doubling each observation: + +.. code-block:: python + + import numba + + def double_every_value_nonumba(x): + return x*2 + + @numba.vectorize + def double_every_value_withnumba(x): + return x*2 + + + # Custom function without numba + In [5]: %timeit df['col1_doubled'] = df.a.apply(double_every_value_nonumba) + 1000 loops, best of 3: 797 us per loop + + # Standard implementation (faster than a custom function) + In [6]: %timeit df['col1_doubled'] = df.a*2 + 1000 loops, best of 3: 233 us per loop + + # Custom function with numba + In [7]: %timeit df['col1_doubled'] = double_every_value_withnumba(df.a.values) + 1000 loops, best of 3: 145 us per loop + +Caveats +~~~~~~~ + +.. note:: + + ``numba`` will execute on any function, but can only accelerate certain classes of functions. + +``numba`` is best at accelerating functions that apply numerical functions to numpy arrays. When passed a function that only uses operations it knows how to accelerate, it will execute in ``nopython`` mode. + +If ``numba`` is passed a function that includes something it doesn't know how to work with -- a category that currently includes sets, lists, dictionaries, or string functions -- it will revert to ``object mode``. In ``object mode``, numba will execute but your code will not speed up significantly. If you would prefer that ``numba`` throw an error if it cannot compile a function in a way that speeds up your code, pass numba the argument ``nopython=True`` (e.g. ``@numba.jit(nopython=True)``). For more on troubleshooting ``numba`` modes, see the `numba troubleshooting page `__. + Read more in the `numba docs `__. .. _enhancingperf.eval: @@ -433,18 +482,13 @@ First let's create a few decent-sized arrays to play with: .. ipython:: python - import pandas as pd - from pandas import DataFrame, Series - from numpy.random import randn - import numpy as np nrows, ncols = 20000, 100 - df1, df2, df3, df4 = [DataFrame(randn(nrows, ncols)) for _ in range(4)] + df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols)) for _ in range(4)] Now let's compare adding them together using plain ol' Python versus :func:`~pandas.eval`: - .. ipython:: python %timeit df1 + df2 + df3 + df4 @@ -467,10 +511,9 @@ Now let's do the same thing but with comparisons: :func:`~pandas.eval` also works with unaligned pandas objects: - .. ipython:: python - s = Series(randn(50)) + s = pd.Series(np.random.randn(50)) %timeit df1 + df2 + df3 + df4 + s .. ipython:: python @@ -515,7 +558,7 @@ evaluate an expression in the "context" of a :class:`~pandas.DataFrame`. .. ipython:: python - df = DataFrame(randn(5, 2), columns=['a', 'b']) + df = pd.DataFrame(np.random.randn(5, 2), columns=['a', 'b']) df.eval('a + b') Any expression that is a valid :func:`pandas.eval` expression is also a valid @@ -530,7 +573,7 @@ it must be a valid Python identifier. .. ipython:: python - df = DataFrame(dict(a=range(5), b=range(5, 10))) + df = pd.DataFrame(dict(a=range(5), b=range(5, 10))) df.eval('c = a + b') df.eval('d = a + b + c') df.eval('a = 1') @@ -540,7 +583,7 @@ The equivalent in standard Python would be .. ipython:: python - df = DataFrame(dict(a=range(5), b=range(5, 10))) + df = pd.DataFrame(dict(a=range(5), b=range(5, 10))) df['c'] = df.a + df.b df['d'] = df.a + df.b + df.c df['a'] = 1 @@ -555,8 +598,8 @@ For example, .. code-block:: python - df = DataFrame(randn(5, 2), columns=['a', 'b']) - newcol = randn(len(df)) + df = pd.DataFrame(np.random.randn(5, 2), columns=['a', 'b']) + newcol = np.random.randn(len(df)) df.eval('b + newcol') UndefinedVariableError: name 'newcol' is not defined @@ -567,8 +610,8 @@ expression by placing the ``@`` character in front of the name. For example, .. ipython:: python - df = DataFrame(randn(5, 2), columns=list('ab')) - newcol = randn(len(df)) + df = pd.DataFrame(np.random.randn(5, 2), columns=list('ab')) + newcol = np.random.randn(len(df)) df.eval('b + @newcol') df.query('b < @newcol') @@ -582,7 +625,7 @@ name in an expression. .. ipython:: python - a = randn() + a = np.random.randn() df.query('@a < a') df.loc[a < df.a] # same as the previous expression @@ -710,8 +753,8 @@ you have an expression--for example .. ipython:: python - df = DataFrame({'strings': np.repeat(list('cba'), 3), - 'nums': np.repeat(range(3), 3)}) + df = pd.DataFrame({'strings': np.repeat(list('cba'), 3), + 'nums': np.repeat(range(3), 3)}) df df.query('strings == "a" and nums == 1') diff --git a/doc/source/faq.rst b/doc/source/faq.rst index 32290839ad71d..7714d937e15d6 100644 --- a/doc/source/faq.rst +++ b/doc/source/faq.rst @@ -8,26 +8,18 @@ Frequently Asked Questions (FAQ) .. ipython:: python :suppress: - from datetime import datetime import numpy as np np.random.seed(123456) - from pandas import * - options.display.max_rows=15 - randn = np.random.randn - randint = np.random.randint np.set_printoptions(precision=4, suppress=True) - from dateutil.relativedelta import relativedelta - from pandas.tseries.api import * - from pandas.tseries.offsets import * - import matplotlib.pyplot as plt - plt.close('all') + import pandas as pd + pd.options.display.max_rows = 15 import matplotlib try: matplotlib.style.use('ggplot') except AttributeError: - options.display.mpl_style = 'default' - from pandas.compat import lrange - + pd.options.display.mpl_style = 'default' + import matplotlib.pyplot as plt + plt.close('all') .. _df-memory-usage: @@ -45,11 +37,11 @@ when calling ``df.info()``: .. ipython:: python dtypes = ['int64', 'float64', 'datetime64[ns]', 'timedelta64[ns]', - 'complex128', 'object', 'bool'] + 'complex128', 'object', 'bool'] n = 5000 data = dict([ (t, np.random.randint(100, size=n).astype(t)) for t in dtypes]) - df = DataFrame(data) + df = pd.DataFrame(data) df['categorical'] = df['object'].astype('category') df.info() @@ -89,149 +81,6 @@ representation; i.e., 1KB = 1024 bytes). See also :ref:`Categorical Memory Usage `. - -.. _ref-scikits-migration: - -Migrating from scikits.timeseries to pandas >= 0.8.0 ----------------------------------------------------- - -Starting with pandas 0.8.0, users of scikits.timeseries should have all of the -features that they need to migrate their code to use pandas. Portions of the -scikits.timeseries codebase for implementing calendar logic and timespan -frequency conversions (but **not** resampling, that has all been implemented -from scratch from the ground up) have been ported to the pandas codebase. - -The scikits.timeseries notions of ``Date`` and ``DateArray`` are responsible -for implementing calendar logic: - -:: - - In [16]: dt = ts.Date('Q', '1984Q3') - - # sic - In [17]: dt - Out[17]: - - In [18]: dt.asfreq('D', 'start') - Out[18]: - - In [19]: dt.asfreq('D', 'end') - Out[19]: - - In [20]: dt + 3 - Out[20]: - -``Date`` and ``DateArray`` from scikits.timeseries have been reincarnated in -pandas ``Period`` and ``PeriodIndex``: - -.. ipython:: python - - pnow('D') # scikits.timeseries.now() - Period(year=2007, month=3, day=15, freq='D') - p = Period('1984Q3') - p - p.asfreq('D', 'start') - p.asfreq('D', 'end') - (p + 3).asfreq('T') + 6 * 60 + 30 - rng = period_range('1990', '2010', freq='A') - rng - rng.asfreq('B', 'end') - 3 - -.. csv-table:: - :header: "scikits.timeseries", "pandas", "Notes" - :widths: 20, 20, 60 - - Date, Period, "A span of time, from yearly through to secondly" - DateArray, PeriodIndex, "An array of timespans" - convert, resample, "Frequency conversion in scikits.timeseries" - convert_to_annual, pivot_annual, "currently supports up to daily frequency, see :issue:`736`" - - -PeriodIndex / DateArray properties and functions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The scikits.timeseries ``DateArray`` had a number of information -properties. Here are the pandas equivalents: - -.. csv-table:: - :header: "scikits.timeseries", "pandas", "Notes" - :widths: 20, 60, 20 - - get_steps, ``np.diff(idx.values)``, - has_missing_dates, ``not idx.is_full``, - is_full, ``idx.is_full``, - is_valid, ``idx.is_monotonic and idx.is_unique``, - is_chronological, ``is_monotonic``, - ``arr.sort_chronologically()``, ``idx.order()``, - -Frequency conversion -~~~~~~~~~~~~~~~~~~~~ - -Frequency conversion is implemented using the ``resample`` method on Series -and DataFrame objects with a DatetimeIndex or PeriodIndex. ``resample`` also -works on panels (3D). Here is some code that resamples daily data to montly: - -.. ipython:: python - - rng = period_range('Jan-2000', periods=50, freq='M') - data = Series(np.random.randn(50), index=rng) - data - data.resample('A', how=np.mean) - -Plotting -~~~~~~~~ - -Much of the plotting functionality of scikits.timeseries has been ported and -adopted to pandas's data structures. For example: - -.. ipython:: python - - rng = period_range('1987Q2', periods=10, freq='Q-DEC') - data = Series(np.random.randn(10), index=rng) - - @savefig skts_ts_plot.png - plt.figure(); data.plot() - -Converting to and from period format -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Use the ``to_timestamp`` and ``to_period`` instance methods. - -Treatment of missing data -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Unlike scikits.timeseries, pandas data structures are not based on NumPy's -``MaskedArray`` object. Missing data is represented as ``NaN`` in numerical -arrays and either as ``None`` or ``NaN`` in non-numerical arrays. Implementing -a version of pandas's data structures that use MaskedArray is possible but -would require the involvement of a dedicated maintainer. Active pandas -developers are not interested in this. - -Resampling with timestamps and periods -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``resample`` has a ``kind`` argument which allows you to resample time series -with a DatetimeIndex to PeriodIndex: - -.. ipython:: python - - rng = date_range('1/1/2000', periods=200, freq='D') - data = Series(np.random.randn(200), index=rng) - data[:10] - data.index - data.resample('M', kind='period') - -Similarly, resampling from periods to timestamps is possible with an optional -interval (``'start'`` or ``'end'``) convention: - -.. ipython:: python - - rng = period_range('Jan-2000', periods=50, freq='M') - data = Series(np.random.randn(50), index=rng) - resampled = data.resample('A', kind='timestamp', convention='end') - resampled.index - - Byte-Ordering Issues -------------------- Occasionally you may have to deal with data that were created on a machine with @@ -244,7 +93,7 @@ using something similar to the following: x = np.array(list(range(10)), '>i4') # big endian newx = x.byteswap().newbyteorder() # force native byteorder - s = Series(newx) + s = pd.Series(newx) See `the NumPy documentation on byte order `__ for more diff --git a/doc/source/gotchas.rst b/doc/source/gotchas.rst index addeddcb0bdde..cf4a86d530180 100644 --- a/doc/source/gotchas.rst +++ b/doc/source/gotchas.rst @@ -4,13 +4,11 @@ .. ipython:: python :suppress: - import os import numpy as np - from pandas import * - options.display.max_rows=15 - randn = np.random.randn np.set_printoptions(precision=4, suppress=True) - from pandas.compat import lrange + import pandas as pd + pd.options.display.max_rows=15 + ******************* Caveats and Gotchas @@ -27,7 +25,7 @@ what the result of .. code-block:: python - >>> if Series([False, True, False]): + >>> if pd.Series([False, True, False]): ... should be. Should it be ``True`` because it's not zero-length? ``False`` because there are ``False`` values? @@ -64,10 +62,10 @@ To evaluate single-element pandas objects in a boolean context, use the method ` .. ipython:: python - Series([True]).bool() - Series([False]).bool() - DataFrame([[True]]).bool() - DataFrame([[False]]).bool() + pd.Series([True]).bool() + pd.Series([False]).bool() + pd.DataFrame([[True]]).bool() + pd.DataFrame([[False]]).bool() Bitwise boolean ~~~~~~~~~~~~~~~ @@ -147,7 +145,7 @@ arrays. For example: .. ipython:: python - s = Series([1, 2, 3, 4, 5], index=list('abcde')) + s = pd.Series([1, 2, 3, 4, 5], index=list('abcde')) s s.dtype @@ -228,9 +226,9 @@ following code will generate exceptions: .. code-block:: python - s = Series(range(5)) + s = pd.Series(range(5)) s[-1] - df = DataFrame(np.random.randn(5, 4)) + df = pd.DataFrame(np.random.randn(5, 4)) df df.ix[-2:] @@ -255,7 +253,7 @@ consider the following Series: .. ipython:: python - s = Series(randn(6), index=list('abcdef')) + s = pd.Series(np.random.randn(6), index=list('abcdef')) s Suppose we wished to slice from ``c`` to ``e``, using integers this would be @@ -294,8 +292,8 @@ concise means of selecting data from a pandas object: .. ipython:: python - df = DataFrame(randn(6, 4), columns=['one', 'two', 'three', 'four'], - index=list('abcdef')) + df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'], + index=list('abcdef')) df df.ix[['b', 'c', 'e']] @@ -326,7 +324,7 @@ cases where an index contains, say, both integers and strings: .. ipython:: python - s = Series([1, 2, 3], index=['a', 0, 1]) + s = pd.Series([1, 2, 3], index=['a', 0, 1]) s s.ix[[0, 1]] s.reindex([0, 1]) @@ -345,10 +343,10 @@ The use of ``reindex_like`` can potentially change the dtype of a ``Series``. .. ipython:: python - series = Series([1, 2, 3]) - x = Series([True]) + series = pd.Series([1, 2, 3]) + x = pd.Series([True]) x.dtype - x = Series([True]).reindex_like(series) + x = pd.Series([True]).reindex_like(series) x.dtype This is because ``reindex_like`` silently inserts ``NaNs`` and the ``dtype`` @@ -371,10 +369,10 @@ can be represented using a 64-bit integer is limited to approximately 584 years: .. ipython:: python - begin = Timestamp.min + begin = pd.Timestamp.min begin - end = Timestamp.max + end = pd.Timestamp.max end See :ref:`here ` for ways to represent data outside these bound. @@ -404,10 +402,10 @@ of the new set of columns rather than the original ones: print(open('tmp.csv').read()) date_spec = {'nominal': [1, 2], 'actual': [1, 3]} - df = read_csv('tmp.csv', header=None, - parse_dates=date_spec, - keep_date_col=True, - index_col=0) + df = pd.read_csv('tmp.csv', header=None, + parse_dates=date_spec, + keep_date_col=True, + index_col=0) # index_col=0 refers to the combined column "nominal" and not the original # first column of 'KORD' strings @@ -417,6 +415,7 @@ of the new set of columns rather than the original ones: .. ipython:: python :suppress: + import os os.remove('tmp.csv') @@ -569,7 +568,7 @@ using something similar to the following: x = np.array(list(range(10)), '>i4') # big endian newx = x.byteswap().newbyteorder() # force native byteorder - s = Series(newx) + s = pd.Series(newx) See `the NumPy documentation on byte order `__ for more diff --git a/doc/source/groupby.rst b/doc/source/groupby.rst index c9e18b585c764..acddf1bb3fe30 100644 --- a/doc/source/groupby.rst +++ b/doc/source/groupby.rst @@ -6,18 +6,16 @@ import numpy as np np.random.seed(123456) - from pandas import * - options.display.max_rows=15 - randn = np.random.randn np.set_printoptions(precision=4, suppress=True) - import matplotlib.pyplot as plt - plt.close('all') + import pandas as pd + pd.options.display.max_rows = 15 import matplotlib try: matplotlib.style.use('ggplot') except AttributeError: - options.display.mpl_style = 'default' - from pandas.compat import zip + pd.options.display.mpl_style = 'default' + import matplotlib.pyplot as plt + plt.close('all') ***************************** Group By: split-apply-combine @@ -105,11 +103,12 @@ consider the following DataFrame: .. ipython:: python - df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', - 'foo', 'bar', 'foo', 'foo'], - 'B' : ['one', 'one', 'two', 'three', - 'two', 'two', 'one', 'three'], - 'C' : randn(8), 'D' : randn(8)}) + df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', + 'foo', 'bar', 'foo', 'foo'], + 'B' : ['one', 'one', 'two', 'three', + 'two', 'two', 'one', 'three'], + 'C' : np.random.randn(8), + 'D' : np.random.randn(8)}) df We could naturally group by either the ``A`` or ``B`` columns or both: @@ -142,7 +141,7 @@ output of aggregation functions will only contain unique index values: lst = [1, 2, 3, 1, 2, 3] - s = Series([1, 2, 3, 10, 20, 30], lst) + s = pd.Series([1, 2, 3, 10, 20, 30], lst) grouped = s.groupby(level=0) @@ -189,7 +188,7 @@ however pass ``sort=False`` for potential speedups: .. ipython:: python - df2 = DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]}) + df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]}) df2.groupby(['X'], sort=True).sum() df2.groupby(['X'], sort=False).sum() @@ -203,10 +202,10 @@ however pass ``sort=False`` for potential speedups: n = 10 weight = np.random.normal(166, 20, size=n) height = np.random.normal(60, 10, size=n) - time = date_range('1/1/2000', periods=n) + time = pd.date_range('1/1/2000', periods=n) gender = tm.choice(['male', 'female'], size=n) - df = DataFrame({'height': height, 'weight': weight, - 'gender': gender}, index=time) + df = pd.DataFrame({'height': height, 'weight': weight, + 'gender': gender}, index=time) .. ipython:: python @@ -226,11 +225,12 @@ however pass ``sort=False`` for potential speedups: .. ipython:: python :suppress: - df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', - 'foo', 'bar', 'foo', 'foo'], - 'B' : ['one', 'one', 'two', 'three', - 'two', 'two', 'one', 'three'], - 'C' : randn(8), 'D' : randn(8)}) + df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', + 'foo', 'bar', 'foo', 'foo'], + 'B' : ['one', 'one', 'two', 'three', + 'two', 'two', 'one', 'three'], + 'C' : np.random.randn(8), + 'D' : np.random.randn(8)}) .. _groupby.multiindex: @@ -248,8 +248,8 @@ natural to group by one of the levels of the hierarchy. ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] tuples = list(zip(*arrays)) tuples - index = MultiIndex.from_tuples(tuples, names=['first', 'second']) - s = Series(randn(8), index=index) + index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) + s = pd.Series(np.random.randn(8), index=index) .. ipython:: python @@ -281,13 +281,13 @@ Also as of v0.6, grouping with multiple levels is supported. ['doo', 'doo', 'bee', 'bee', 'bop', 'bop', 'bop', 'bop'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] tuples = list(zip(*arrays)) - index = MultiIndex.from_tuples(tuples, names=['first', 'second', 'third']) - s = Series(randn(8), index=index) + index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second', 'third']) + s = pd.Series(np.random.randn(8), index=index) .. ipython:: python s - s.groupby(level=['first','second']).sum() + s.groupby(level=['first', 'second']).sum() More on the ``sum`` function and aggregation later. @@ -499,9 +499,9 @@ to standardize the data within each group: .. ipython:: python - index = date_range('10/1/1999', periods=1100) - ts = Series(np.random.normal(0.5, 2, 1100), index) - ts = rolling_mean(ts, 100, 100).dropna() + index = pd.date_range('10/1/1999', periods=1100) + ts = pd.Series(np.random.normal(0.5, 2, 1100), index) + ts = pd.rolling_mean(ts, 100, 100).dropna() ts.head() ts.tail() @@ -528,7 +528,7 @@ We can also visually compare the original and transformed data sets. .. ipython:: python - compare = DataFrame({'Original': ts, 'Transformed': transformed}) + compare = pd.DataFrame({'Original': ts, 'Transformed': transformed}) @savefig groupby_transform_plot.png compare.plot() @@ -539,11 +539,11 @@ Another common data transform is to replace missing data with the group mean. :suppress: cols = ['A', 'B', 'C'] - values = randn(1000, 3) + values = np.random.randn(1000, 3) values[np.random.randint(0, 1000, 100), 0] = np.nan values[np.random.randint(0, 1000, 50), 1] = np.nan values[np.random.randint(0, 1000, 200), 2] = np.nan - data_df = DataFrame(values, columns=cols) + data_df = pd.DataFrame(values, columns=cols) .. ipython:: python @@ -599,7 +599,7 @@ than 2. .. ipython:: python - sf = Series([1, 1, 2, 3, 3, 3]) + sf = pd.Series([1, 1, 2, 3, 3, 3]) sf.groupby(sf).filter(lambda x: x.sum() > 2) The argument of ``filter`` must be a function that, applied to the group as a @@ -610,7 +610,7 @@ with only a couple members. .. ipython:: python - dff = DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) + dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) dff.groupby('B').filter(lambda x: len(x) > 2) Alternatively, instead of dropping the offending groups, we can return a @@ -672,9 +672,9 @@ next). This enables some operations to be carried out rather succinctly: .. ipython:: python - tsdf = DataFrame(randn(1000, 3), - index=date_range('1/1/2000', periods=1000), - columns=['A', 'B', 'C']) + tsdf = pd.DataFrame(np.random.randn(1000, 3), + index=pd.date_range('1/1/2000', periods=1000), + columns=['A', 'B', 'C']) tsdf.ix[::2] = np.nan grouped = tsdf.groupby(lambda x: x.year) grouped.fillna(method='pad') @@ -689,8 +689,8 @@ The ``nlargest`` and ``nsmallest`` methods work on ``Series`` style groupbys: .. ipython:: python - s = Series([9, 8, 7, 5, 19, 1, 4.2, 3.3]) - g = Series(list('abababab')) + s = pd.Series([9, 8, 7, 5, 19, 1, 4.2, 3.3]) + g = pd.Series(list('abababab')) gb = s.groupby(g) gb.nlargest(3) gb.nsmallest(3) @@ -721,8 +721,8 @@ The dimension of the returned result can also change: In [8]: grouped = df.groupby('A')['C'] In [10]: def f(group): - ....: return DataFrame({'original' : group, - ....: 'demeaned' : group - group.mean()}) + ....: return pd.DataFrame({'original' : group, + ....: 'demeaned' : group - group.mean()}) ....: In [11]: grouped.apply(f) @@ -732,8 +732,8 @@ The dimension of the returned result can also change: .. ipython:: python def f(x): - return Series([ x, x**2 ], index = ['x', 'x^s']) - s = Series(np.random.rand(5)) + return pd.Series([ x, x**2 ], index = ['x', 'x^s']) + s = pd.Series(np.random.rand(5)) s s.apply(f) @@ -754,7 +754,7 @@ The dimension of the returned result can also change: .. ipython:: python - d = DataFrame({"a":["x", "y"], "b":[1,2]}) + d = pd.DataFrame({"a":["x", "y"], "b":[1,2]}) def identity(df): print df return df @@ -784,6 +784,8 @@ will be (silently) dropped. Thus, this does not pose any problems: df.groupby('A').std() +.. _groupby.missing: + NA and NaT group handling ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -800,9 +802,9 @@ can be used as group keys. If so, the order of the levels will be preserved: .. ipython:: python - data = Series(np.random.randn(100)) + data = pd.Series(np.random.randn(100)) - factor = qcut(data, [0, .25, .5, .75, 1.]) + factor = pd.qcut(data, [0, .25, .5, .75, 1.]) data.groupby(factor).mean() @@ -811,27 +813,28 @@ can be used as group keys. If so, the order of the levels will be preserved: Grouping with a Grouper specification ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Your may need to specify a bit more data to properly group. You can +You may need to specify a bit more data to properly group. You can use the ``pd.Grouper`` to provide this local control. .. ipython:: python - import datetime as DT - - df = DataFrame({ - 'Branch' : 'A A A A A A A B'.split(), - 'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(), - 'Quantity': [1,3,5,1,8,1,9,3], - 'Date' : [ - DT.datetime(2013,1,1,13,0), - DT.datetime(2013,1,1,13,5), - DT.datetime(2013,10,1,20,0), - DT.datetime(2013,10,2,10,0), - DT.datetime(2013,10,1,20,0), - DT.datetime(2013,10,2,10,0), - DT.datetime(2013,12,2,12,0), - DT.datetime(2013,12,2,14,0), - ]}) + import datetime + + df = pd.DataFrame({ + 'Branch' : 'A A A A A A A B'.split(), + 'Buyer': 'Carl Mark Carl Carl Joe Joe Joe Carl'.split(), + 'Quantity': [1,3,5,1,8,1,9,3], + 'Date' : [ + datetime.datetime(2013,1,1,13,0), + datetime.datetime(2013,1,1,13,5), + datetime.datetime(2013,10,1,20,0), + datetime.datetime(2013,10,2,10,0), + datetime.datetime(2013,10,1,20,0), + datetime.datetime(2013,10,2,10,0), + datetime.datetime(2013,12,2,12,0), + datetime.datetime(2013,12,2,14,0), + ] + }) df @@ -860,7 +863,7 @@ Just like for a DataFrame or Series you can call head and tail on a groupby: .. ipython:: python - df = DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B']) + df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B']) df g = df.groupby('A') @@ -892,7 +895,7 @@ To select from a DataFrame or Series the nth item, use the nth method. This is a .. ipython:: python - df = DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B']) + df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B']) g = df.groupby('A') g.nth(0) @@ -917,7 +920,7 @@ As with other methods, passing ``as_index=False``, will achieve a filtration, wh .. ipython:: python - df = DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B']) + df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B']) g = df.groupby('A',as_index=False) g.nth(0) @@ -927,8 +930,8 @@ You can also select multiple rows from each group by specifying multiple nth val .. ipython:: python - business_dates = date_range(start='4/1/2014', end='6/30/2014', freq='B') - df = DataFrame(1, index=business_dates, columns=['a', 'b']) + business_dates = pd.date_range(start='4/1/2014', end='6/30/2014', freq='B') + df = pd.DataFrame(1, index=business_dates, columns=['a', 'b']) # get the first, 4th, and last date index for each month df.groupby((df.index.year, df.index.month)).nth([0, 3, -1]) @@ -959,7 +962,7 @@ the values in column 1 where the group is "B" are 3 higher on average. .. ipython:: python np.random.seed(1234) - df = DataFrame(np.random.randn(50, 2)) + df = pd.DataFrame(np.random.randn(50, 2)) df['g'] = np.random.choice(['A', 'B'], size=50) df.loc[df['g'] == 'B', 1] += 3 @@ -1008,11 +1011,11 @@ column index name will be used as the name of the inserted column: .. ipython:: python df = pd.DataFrame({ - 'a': [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], - 'b': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], - 'c': [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], - 'd': [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], - }) + 'a': [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], + 'b': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], + 'c': [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], + 'd': [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1], + }) def compute_metrics(x): result = {'b_sum': x['b'].sum(), 'c_mean': x['c'].mean()} diff --git a/doc/source/indexing.rst b/doc/source/indexing.rst index a1912032bc3bf..38629ee7baaea 100644 --- a/doc/source/indexing.rst +++ b/doc/source/indexing.rst @@ -6,15 +6,10 @@ :suppress: import numpy as np - import random np.random.seed(123456) - from pandas import * - options.display.max_rows=15 - import pandas as pd - randn = np.random.randn - randint = np.random.randint np.set_printoptions(precision=4, suppress=True) - from pandas.compat import range, zip + import pandas as pd + pd.options.display.max_rows=15 *************************** Indexing and Selecting Data @@ -126,18 +121,6 @@ the specification are assumed to be ``:``. (e.g. ``p.loc['a']`` is equiv to DataFrame; ``df.loc[row_indexer,column_indexer]`` Panel; ``p.loc[item_indexer,major_indexer,minor_indexer]`` -Deprecations ------------- - -Beginning with version 0.11.0, it's recommended that you transition away from -the following methods as they *may* be deprecated in future versions. - - - ``irow`` - - ``icol`` - - ``iget_value`` - -See the section :ref:`Selection by Position ` for substitutes. - .. _indexing.basics: Basics @@ -162,10 +145,10 @@ indexing functionality: .. ipython:: python - dates = date_range('1/1/2000', periods=8) - df = DataFrame(randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) + dates = pd.date_range('1/1/2000', periods=8) + df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) df - panel = Panel({'one' : df, 'two' : df - df.mean()}) + panel = pd.Panel({'one' : df, 'two' : df - df.mean()}) panel .. note:: @@ -208,7 +191,7 @@ as an attribute: .. ipython:: python - sa = Series([1,2,3],index=list('abc')) + sa = pd.Series([1,2,3],index=list('abc')) dfa = df.copy() .. ipython:: python @@ -307,7 +290,7 @@ Selection By Label .. ipython:: python - dfl = DataFrame(np.random.randn(5,4), columns=list('ABCD'), index=date_range('20130101',periods=5)) + dfl = pd.DataFrame(np.random.randn(5,4), columns=list('ABCD'), index=pd.date_range('20130101',periods=5)) dfl .. code-block:: python @@ -333,7 +316,7 @@ The ``.loc`` attribute is the primary access method. The following are valid inp .. ipython:: python - s1 = Series(np.random.randn(6),index=list('abcdef')) + s1 = pd.Series(np.random.randn(6),index=list('abcdef')) s1 s1.loc['c':] s1.loc['b'] @@ -349,9 +332,9 @@ With a DataFrame .. ipython:: python - df1 = DataFrame(np.random.randn(6,4), - index=list('abcdef'), - columns=list('ABCD')) + df1 = pd.DataFrame(np.random.randn(6,4), + index=list('abcdef'), + columns=list('ABCD')) df1 df1.loc[['a','b','d'],:] @@ -403,7 +386,7 @@ The ``.iloc`` attribute is the primary access method. The following are valid in .. ipython:: python - s1 = Series(np.random.randn(5),index=list(range(0,10,2))) + s1 = pd.Series(np.random.randn(5), index=list(range(0,10,2))) s1 s1.iloc[:3] s1.iloc[3] @@ -419,9 +402,9 @@ With a DataFrame .. ipython:: python - df1 = DataFrame(np.random.randn(6,4), - index=list(range(0,12,2)), - columns=list(range(0,8,2))) + df1 = pd.DataFrame(np.random.randn(6,4), + index=list(range(0,12,2)), + columns=list(range(0,8,2))) df1 Select via integer slicing @@ -437,20 +420,14 @@ Select via integer list df1.iloc[[1,3,5],[1,3]] -For slicing rows explicitly (equiv to deprecated ``df.irow(slice(1,3))``). - .. ipython:: python df1.iloc[1:3,:] -For slicing columns explicitly (equiv to deprecated ``df.icol(slice(1,3))``). - .. ipython:: python df1.iloc[:,1:3] -For getting a scalar via integer position (equiv to deprecated ``df.get_value(1,1)``) - .. ipython:: python # this is also equivalent to ``df1.iat[1,1]`` @@ -472,7 +449,7 @@ Out of range slice indexes are handled gracefully just as in Python/Numpy. x x[4:10] x[8:10] - s = Series(x) + s = pd.Series(x) s s.iloc[4:10] s.iloc[8:10] @@ -488,7 +465,7 @@ returned) .. ipython:: python - dfl = DataFrame(np.random.randn(5,2),columns=list('AB')) + dfl = pd.DataFrame(np.random.randn(5,2), columns=list('AB')) dfl dfl.iloc[:,2:3] dfl.iloc[:,1:3] @@ -516,7 +493,7 @@ A random selection of rows or columns from a Series, DataFrame, or Panel with th .. ipython :: python - s = Series([0,1,2,3,4,5]) + s = pd.Series([0,1,2,3,4,5]) # When no arguments are passed, returns 1 row. s.sample() @@ -532,7 +509,7 @@ using the ``replace`` option: .. ipython :: python - s = Series([0,1,2,3,4,5]) + s = pd.Series([0,1,2,3,4,5]) # Without replacement (default): s.sample(n=6, replace=False) @@ -547,7 +524,7 @@ to have different probabilities, you can pass the ``sample`` function sampling w .. ipython :: python - s = Series([0,1,2,3,4,5]) + s = pd.Series([0,1,2,3,4,5]) example_weights = [0, 0, 0.2, 0.2, 0.2, 0.4] s.sample(n=3, weights=example_weights) @@ -561,21 +538,21 @@ as a string. .. ipython :: python - df2 = DataFrame({'col1':[9,8,7,6], 'weight_column':[0.5, 0.4, 0.1, 0]}) + df2 = pd.DataFrame({'col1':[9,8,7,6], 'weight_column':[0.5, 0.4, 0.1, 0]}) df2.sample(n = 3, weights = 'weight_column') ``sample`` also allows users to sample columns instead of rows using the ``axis`` argument. .. ipython :: python - df3 = DataFrame({'col1':[1,2,3], 'col2':[2,3,4]}) + df3 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4]}) df3.sample(n=1, axis=1) Finally, one can also set a seed for ``sample``'s random number generator using the ``random_state`` argument, which will accept either an integer (as a seed) or a numpy RandomState object. .. ipython :: python - df4 = DataFrame({'col1':[1,2,3], 'col2':[2,3,4]}) + df4 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4]}) # With a given seed, the sample will always draw the same rows. df4.sample(n=2, random_state=2) @@ -594,7 +571,7 @@ In the ``Series`` case this is effectively an appending operation .. ipython:: python - se = Series([1,2,3]) + se = pd.Series([1,2,3]) se se[5] = 5. se @@ -603,7 +580,7 @@ A ``DataFrame`` can be enlarged on either axis via ``.loc`` .. ipython:: python - dfi = DataFrame(np.arange(6).reshape(3,2), + dfi = pd.DataFrame(np.arange(6).reshape(3,2), columns=['A','B']) dfi dfi.loc[:,'C'] = dfi.loc[:,'A'] @@ -661,7 +638,7 @@ Using a boolean vector to index a Series works exactly as in a numpy ndarray: .. ipython:: python - s = Series(range(-3, 4)) + s = pd.Series(range(-3, 4)) s s[s > 0] s[(s < -1) | (s > 0.5)] @@ -680,9 +657,9 @@ more complex criteria: .. ipython:: python - df2 = DataFrame({'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'], - 'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'], - 'c' : randn(7)}) + df2 = pd.DataFrame({'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'], + 'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'], + 'c' : np.random.randn(7)}) # only want 'two' or 'three' criterion = df2['a'].map(lambda x: x.startswith('t')) @@ -713,7 +690,7 @@ select rows where one or more columns have values you want: .. ipython:: python - s = Series(np.arange(5),index=np.arange(5)[::-1],dtype='int64') + s = pd.Series(np.arange(5), index=np.arange(5)[::-1], dtype='int64') s s.isin([2, 4, 6]) s[s.isin([2, 4, 6])] @@ -733,8 +710,8 @@ in the membership check: .. ipython:: python - s_mi = Series(np.arange(6), - index=pd.MultiIndex.from_product([[0, 1], ['a', 'b', 'c']])) + s_mi = pd.Series(np.arange(6), + index=pd.MultiIndex.from_product([[0, 1], ['a', 'b', 'c']])) s_mi s_mi.iloc[s_mi.index.isin([(1, 'a'), (2, 'b'), (0, 'c')])] s_mi.iloc[s_mi.index.isin(['a', 'c', 'e'], level=1)] @@ -746,8 +723,8 @@ wherever the element is in the sequence of values. .. ipython:: python - df = DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'n'], - 'ids2': ['a', 'n', 'c', 'n']}) + df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'n'], + 'ids2': ['a', 'n', 'c', 'n']}) values = ['a', 'b', 1, 3] @@ -801,8 +778,8 @@ Equivalent is ``df.where(df < 0)`` .. ipython:: python :suppress: - dates = date_range('1/1/2000', periods=8) - df = DataFrame(randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) + dates = pd.date_range('1/1/2000', periods=8) + df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) .. ipython:: python @@ -889,16 +866,10 @@ method that allows selection using an expression. You can get the value of the frame where column ``b`` has values between the values of columns ``a`` and ``c``. For example: -.. ipython:: python - :suppress: - - from numpy.random import randint, rand - np.random.seed(1234) - .. ipython:: python n = 10 - df = DataFrame(rand(n, 3), columns=list('abc')) + df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) df # pure python @@ -912,7 +883,7 @@ with the name ``a``. .. ipython:: python - df = DataFrame(randint(n / 2, size=(n, 2)), columns=list('bc')) + df = pd.DataFrame(np.random.randint(n / 2, size=(n, 2)), columns=list('bc')) df.index.name = 'a' df df.query('a < b and b < c') @@ -928,7 +899,7 @@ If instead you don't want to or cannot name your index, you can use the name .. ipython:: python - df = DataFrame(randint(n, size=(n, 2)), columns=list('bc')) + df = pd.DataFrame(np.random.randint(n, size=(n, 2)), columns=list('bc')) df df.query('index < b < c') @@ -946,7 +917,7 @@ If instead you don't want to or cannot name your index, you can use the name .. ipython:: python - df = DataFrame({'a': randint(5, size=5)}) + df = pd.DataFrame({'a': np.random.randint(5, size=5)}) df.index.name = 'a' df.query('a > 2') # uses the column 'a', not the index @@ -970,23 +941,20 @@ You can also use the levels of a ``DataFrame`` with a .. ipython:: python - import pandas.util.testing as tm - n = 10 - colors = tm.choice(['red', 'green'], size=n) - foods = tm.choice(['eggs', 'ham'], size=n) + colors = np.random.choice(['red', 'green'], size=n) + foods = np.random.choice(['eggs', 'ham'], size=n) colors foods - index = MultiIndex.from_arrays([colors, foods], names=['color', 'food']) - df = DataFrame(randn(n, 2), index=index) + index = pd.MultiIndex.from_arrays([colors, foods], names=['color', 'food']) + df = pd.DataFrame(np.random.randn(n, 2), index=index) df df.query('color == "red"') If the levels of the ``MultiIndex`` are unnamed, you can refer to them using special names: - .. ipython:: python df.index.names = [None, None] @@ -1008,9 +976,9 @@ having to specify which frame you're interested in querying .. ipython:: python - df = DataFrame(rand(n, 3), columns=list('abc')) + df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) df - df2 = DataFrame(rand(n + 2, 3), columns=df.columns) + df2 = pd.DataFrame(np.random.rand(n + 2, 3), columns=df.columns) df2 expr = '0.0 <= a <= c <= 0.5' map(lambda frame: frame.query(expr), [df, df2]) @@ -1022,7 +990,7 @@ Full numpy-like syntax .. ipython:: python - df = DataFrame(randint(n, size=(n, 3)), columns=list('abc')) + df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=list('abc')) df df.query('(a < b) & (b < c)') df[(df.a < df.b) & (df.b < df.c)] @@ -1065,8 +1033,9 @@ The ``in`` and ``not in`` operators .. ipython:: python # get all rows where columns "a" and "b" have overlapping values - df = DataFrame({'a': list('aabbccddeeff'), 'b': list('aaaabbbbcccc'), - 'c': randint(5, size=12), 'd': randint(9, size=12)}) + df = pd.DataFrame({'a': list('aabbccddeeff'), 'b': list('aaaabbbbcccc'), + 'c': np.random.randint(5, size=12), + 'd': np.random.randint(9, size=12)}) df df.query('a in b') @@ -1139,8 +1108,8 @@ You can negate boolean expressions with the word ``not`` or the ``~`` operator. .. ipython:: python - df = DataFrame(rand(n, 3), columns=list('abc')) - df['bools'] = rand(len(df)) > 0.5 + df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) + df['bools'] = np.random.rand(len(df)) > 0.5 df.query('~bools') df.query('not bools') df.query('not bools') == df[~df.bools] @@ -1192,7 +1161,7 @@ floating point values generated using ``numpy.random.randn()``. .. ipython:: python :suppress: - df = DataFrame(randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) + df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) df2 = df.copy() @@ -1209,28 +1178,45 @@ takes as an argument the columns to use to identify duplicated rows. - ``drop_duplicates`` removes duplicate rows. By default, the first observed row of a duplicate set is considered unique, but -each method has a ``take_last`` parameter that indicates the last observed row -should be taken instead. +each method has a ``keep`` parameter to specify targets to be kept. + +- ``keep='first'`` (default): mark / drop duplicates except for the first occurrence. +- ``keep='last'``: mark / drop duplicates except for the last occurrence. +- ``keep=False``: mark / drop all duplicates. .. ipython:: python - df2 = DataFrame({'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'], - 'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'], - 'c' : np.random.randn(7)}) - df2.duplicated(['a','b']) - df2.drop_duplicates(['a','b']) - df2.drop_duplicates(['a','b'], take_last=True) + df2 = pd.DataFrame({'a': ['one', 'one', 'two', 'two', 'two', 'three', 'four'], + 'b': ['x', 'y', 'x', 'y', 'x', 'x', 'x'], + 'c': np.random.randn(7)}) + df2 + df2.duplicated('a') + df2.duplicated('a', keep='last') + df2.duplicated('a', keep=False) + df2.drop_duplicates('a') + df2.drop_duplicates('a', keep='last') + df2.drop_duplicates('a', keep=False) -An alternative way to drop duplicates on the index is ``.groupby(level=0)`` combined with ``first()`` or ``last()``. +Also, you can pass a list of columns to identify duplications. .. ipython:: python - df3 = df2.set_index('b') - df3 - df3.groupby(level=0).first() + df2.duplicated(['a', 'b']) + df2.drop_duplicates(['a', 'b']) - # a bit more verbose - df3.reset_index().drop_duplicates(subset='b', take_last=False).set_index('b') +To drop duplicates by index value, use ``Index.duplicated`` then perform slicing. +Same options are available in ``keep`` parameter. + +.. ipython:: python + + df3 = pd.DataFrame({'a': np.arange(6), + 'b': np.random.randn(6)}, + index=['a', 'a', 'b', 'c', 'b', 'a']) + df3 + df3.index.duplicated() + df3[~df3.index.duplicated()] + df3[~df3.index.duplicated(keep='last')] + df3[~df3.index.duplicated(keep=False)] .. _indexing.dictionarylike: @@ -1242,7 +1228,7 @@ default value. .. ipython:: python - s = Series([1,2,3], index=['a','b','c']) + s = pd.Series([1,2,3], index=['a','b','c']) s.get('a') # equivalent to s['a'] s.get('x', default=-1) @@ -1267,7 +1253,7 @@ numpy array. For instance, .. ipython:: python - dflookup = DataFrame(np.random.rand(20,4), columns = ['A','B','C','D']) + dflookup = pd.DataFrame(np.random.rand(20,4), columns = ['A','B','C','D']) dflookup.lookup(list(range(0,10,2)), ['B','C','A','B','D']) .. _indexing.class: @@ -1287,7 +1273,7 @@ lookups, data alignment, and reindexing. The easiest way to create an .. ipython:: python - index = Index(['e', 'd', 'a', 'b']) + index = pd.Index(['e', 'd', 'a', 'b']) index 'd' in index @@ -1296,26 +1282,26 @@ You can also pass a ``name`` to be stored in the index: .. ipython:: python - index = Index(['e', 'd', 'a', 'b'], name='something') + index = pd.Index(['e', 'd', 'a', 'b'], name='something') index.name The name, if set, will be shown in the console display: .. ipython:: python - index = Index(list(range(5)), name='rows') - columns = Index(['A', 'B', 'C'], name='cols') - df = DataFrame(np.random.randn(5, 3), index=index, columns=columns) + index = pd.Index(list(range(5)), name='rows') + columns = pd.Index(['A', 'B', 'C'], name='cols') + df = pd.DataFrame(np.random.randn(5, 3), index=index, columns=columns) df df['A'] +.. _indexing.set_metadata: + Setting metadata ~~~~~~~~~~~~~~~~ .. versionadded:: 0.13.0 -.. _indexing.set_metadata: - Indexes are "mostly immutable", but it is possible to set and change their metadata, like the index ``name`` (or, for ``MultiIndex``, ``levels`` and ``labels``). @@ -1328,7 +1314,7 @@ See :ref:`Advanced Indexing ` for usage of MultiIndexes. .. ipython:: python - ind = Index([1, 2, 3]) + ind = pd.Index([1, 2, 3]) ind.rename("apple") ind ind.set_names(["apple"], inplace=True) @@ -1342,8 +1328,7 @@ See :ref:`Advanced Indexing ` for usage of MultiIndexes. .. ipython:: python - - index = MultiIndex.from_product([range(3), ['one', 'two']], names=['first', 'second']) + index = pd.MultiIndex.from_product([range(3), ['one', 'two']], names=['first', 'second']) index index.levels[1] index.set_levels(["a", "b"], level=1) @@ -1364,8 +1349,8 @@ operators. Difference is provided via the ``.difference()`` method. .. ipython:: python - a = Index(['c', 'b', 'a']) - b = Index(['c', 'e', 'd']) + a = pd.Index(['c', 'b', 'a']) + b = pd.Index(['c', 'e', 'd']) a | b a & b a.difference(b) @@ -1377,8 +1362,8 @@ with duplicates dropped. .. ipython:: python - idx1 = Index([1, 2, 3, 4]) - idx2 = Index([2, 3, 4, 5]) + idx1 = pd.Index([1, 2, 3, 4]) + idx2 = pd.Index([2, 3, 4, 5]) idx1.sym_diff(idx2) idx1 ^ idx2 @@ -1401,10 +1386,10 @@ indexed DataFrame: .. ipython:: python :suppress: - data = DataFrame({'a' : ['bar', 'bar', 'foo', 'foo'], - 'b' : ['one', 'two', 'one', 'two'], - 'c' : ['z', 'y', 'x', 'w'], - 'd' : [1., 2., 3, 4]}) + data = pd.DataFrame({'a' : ['bar', 'bar', 'foo', 'foo'], + 'b' : ['one', 'two', 'one', 'two'], + 'c' : ['z', 'y', 'x', 'w'], + 'd' : [1., 2., 3, 4]}) .. ipython:: python @@ -1482,12 +1467,12 @@ When setting values in a pandas object, care must be taken to avoid what is call .. ipython:: python - dfmi = DataFrame([list('abcd'), - list('efgh'), - list('ijkl'), - list('mnop')], - columns=MultiIndex.from_product([['one','two'], - ['first','second']])) + dfmi = pd.DataFrame([list('abcd'), + list('efgh'), + list('ijkl'), + list('mnop')], + columns=pd.MultiIndex.from_product([['one','two'], + ['first','second']])) dfmi Compare these two access methods: @@ -1543,9 +1528,9 @@ which can take the values ``['raise','warn',None]``, where showing a warning is .. ipython:: python :okwarning: - dfb = DataFrame({'a' : ['one', 'one', 'two', - 'three', 'two', 'one', 'six'], - 'c' : np.arange(7)}) + dfb = pd.DataFrame({'a' : ['one', 'one', 'two', + 'three', 'two', 'one', 'six'], + 'c' : np.arange(7)}) # This will show the SettingWithCopyWarning # but the frame values will be set @@ -1573,7 +1558,7 @@ This is the correct access method .. ipython:: python - dfc = DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]}) + dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]}) dfc.loc[0,'A'] = 11 dfc diff --git a/doc/source/install.rst b/doc/source/install.rst index b3f86db5e3e59..42cfd95becabb 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -18,7 +18,7 @@ Instructions for installing from source, Python version support ---------------------- -Officially Python 2.6, 2.7, 3.2, 3.3, and 3.4. +Officially Python 2.6, 2.7, 3.3, and 3.4. Installing pandas ----------------- @@ -153,7 +153,8 @@ and can take a few minutes to complete. Installing using your Linux distribution's package manager. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +The commands in this table will install pandas for Python 2 from your distribution. +To install pandas for Python 3 you may need to use the package ``python3-pandas``. .. csv-table:: :header: "Distribution", "Status", "Download / Repository Link", "Install method" @@ -212,6 +213,7 @@ installed), make sure you have `nose Dependencies ------------ +* `setuptools `__ * `NumPy `__: 1.7.0 or higher * `python-dateutil `__ 1.5 or higher * `pytz `__ @@ -249,10 +251,9 @@ Optional Dependencies * `statsmodels `__ * Needed for parts of :mod:`pandas.stats` * `openpyxl `__, `xlrd/xlwt `__ - * openpyxl version 1.6.1 or higher, but lower than 2.0.0 * Needed for Excel I/O * `XlsxWriter `__ - * Alternative Excel writer. + * Alternative Excel writer * `boto `__: necessary for Amazon S3 access. * `blosc `__: for msgpack compression using ``blosc`` @@ -267,11 +268,11 @@ Optional Dependencies installation. * Google's `python-gflags `__ and `google-api-python-client `__ - * Needed for :mod:`~pandas.io.gbq` + * Needed for :mod:`~pandas.io.gbq` * `setuptools `__ - * Needed for :mod:`~pandas.io.gbq` (specifically, it utilizes `pkg_resources`) + * Needed for :mod:`~pandas.io.gbq` (specifically, it utilizes `pkg_resources`) * `httplib2 `__ - * Needed for :mod:`~pandas.io.gbq` + * Needed for :mod:`~pandas.io.gbq` * One of the following combinations of libraries is needed to use the top-level :func:`~pandas.io.html.read_html` function: diff --git a/doc/source/internals.rst b/doc/source/internals.rst index 8b4f7360fc235..3d96b93de4cc9 100644 --- a/doc/source/internals.rst +++ b/doc/source/internals.rst @@ -6,15 +6,10 @@ :suppress: import numpy as np - import random np.random.seed(123456) - from pandas import * - options.display.max_rows=15 - import pandas as pd - randn = np.random.randn - randint = np.random.randint np.set_printoptions(precision=4, suppress=True) - from pandas.compat import range, zip + import pandas as pd + pd.options.display.max_rows = 15 ********* Internals @@ -40,7 +35,7 @@ containers for the axis labels: - ``TimedeltaIndex``: An Index object with ``Timedelta`` boxed elements (impl are the in64 values) - ``PeriodIndex``: An Index object with Period elements -These are range generates to make the creation of a regular index easy: +There are functions that make the creation of a regular index easy: - ``date_range``: fixed frequency date range generated from a time rule or DateOffset. An ndarray of Python datetime objects @@ -81,7 +76,7 @@ integer **labels**, and the level **names**: .. ipython:: python - index = MultiIndex.from_product([range(3), ['one', 'two']], names=['first', 'second']) + index = pd.MultiIndex.from_product([range(3), ['one', 'two']], names=['first', 'second']) index index.levels index.labels @@ -198,7 +193,7 @@ Below example shows how to define ``SubclassedSeries`` and ``SubclassedDataFrame Define Original Properties ~~~~~~~~~~~~~~~~~~~~~~~~~~ -To let original data structures have additional properties, you should let ``pandas`` knows what properties are added. ``pandas`` maps unknown properties to data names overriding ``__getattribute__``. Defining original properties can be done in one of 2 ways: +To let original data structures have additional properties, you should let ``pandas`` know what properties are added. ``pandas`` maps unknown properties to data names overriding ``__getattribute__``. Defining original properties can be done in one of 2 ways: 1. Define ``_internal_names`` and ``_internal_names_set`` for temporary properties which WILL NOT be passed to manipulation results. 2. Define ``_metadata`` for normal properties which will be passed to manipulation results. @@ -210,7 +205,7 @@ Below is an example to define 2 original properties, "internal_cache" as a tempo class SubclassedDataFrame2(DataFrame): # temporary properties - _internal_names = DataFrame._internal_names + ['internal_cache'] + _internal_names = pd.DataFrame._internal_names + ['internal_cache'] _internal_names_set = set(_internal_names) # normal properties @@ -244,5 +239,3 @@ Below is an example to define 2 original properties, "internal_cache" as a tempo # properties defined in _metadata are retained >>> df[['A', 'B']].added_property property - - diff --git a/doc/source/io.rst b/doc/source/io.rst index 73a2f2f1d3531..2f2c4c7566413 100644 --- a/doc/source/io.rst +++ b/doc/source/io.rst @@ -41,6 +41,7 @@ object. * :ref:`read_html` * :ref:`read_gbq` (experimental) * :ref:`read_stata` + * :ref:`read_sas` * :ref:`read_clipboard` * :ref:`read_pickle` @@ -115,7 +116,7 @@ They can take a number of arguments: as the index. - ``names``: List of column names to use as column names. To replace header existing in file, explicitly pass ``header=0``. - - ``na_values``: optional list of strings to recognize as NaN (missing + - ``na_values``: optional string or list of strings to recognize as NaN (missing values), either in addition to or in lieu of the default set. - ``true_values``: list of strings to recognize as ``True`` - ``false_values``: list of strings to recognize as ``False`` @@ -723,7 +724,8 @@ NA Values ~~~~~~~~~ To control which values are parsed as missing values (which are signified by ``NaN``), specifiy a -list of strings in ``na_values``. If you specify a number (a ``float``, like ``5.0`` or an ``integer`` like ``5``), +string in ``na_values``. If you specify a list of strings, then all values in +it are considered to be missing values. If you specify a number (a ``float``, like ``5.0`` or an ``integer`` like ``5``), the corresponding equivalent values will also imply a missing value (in this case effectively ``[5.0,5]`` are recognized as ``NaN``. @@ -2130,7 +2132,9 @@ one can pass an :class:`~pandas.io.excel.ExcelWriter`. df1.to_excel(writer, sheet_name='Sheet1') df2.to_excel(writer, sheet_name='Sheet2') -.. note:: Wringing a little more performance out of ``read_excel`` +.. note:: + + Wringing a little more performance out of ``read_excel`` Internally, Excel stores all numeric data as floats. Because this can produce unexpected behavior when reading in data, pandas defaults to trying to convert integers to floats if it doesn't lose information (``1.0 --> @@ -2182,6 +2186,45 @@ argument to ``to_excel`` and to ``ExcelWriter``. The built-in engines are: df.to_excel('path_to_file.xlsx', sheet_name='Sheet1') +.. _io.excel_writing_buffer: + +Writing Excel Files to Memory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 0.17 + +Pandas supports writing Excel files to buffer-like objects such as ``StringIO`` or +``BytesIO`` using :class:`~pandas.io.excel.ExcelWriter`. + +.. code-block:: python + + # Safe import for either Python 2.x or 3.x + try: + from io import BytesIO + except ImportError: + from cStringIO import StringIO as BytesIO + + bio = BytesIO() + + # By setting the 'engine' in the ExcelWriter constructor. + writer = ExcelWriter(bio, engine='xlsxwriter') + df.to_excel(writer, sheet_name='Sheet1') + + # Save the workbook + writer.save() + + # Seek to the beginning and read to copy the workbook to a variable in memory + bio.seek(0) + workbook = bio.read() + +.. note:: + + ``engine`` is optional but recommended. Setting the engine determines + the version of workbook produced. Setting ``engine='xlrd'`` will produce an + Excel 2003-format workbook (xls). Using either ``'openpyxl'`` or + ``'xlsxwriter'`` will produce an Excel 2007-format workbook (xlsx). If + omitted, an Excel 2007-formatted workbook is produced. + .. _io.clipboard: Clipboard @@ -2365,9 +2408,13 @@ for some advanced strategies As of version 0.15.0, pandas requires ``PyTables`` >= 3.0.0. Stores written with prior versions of pandas / ``PyTables`` >= 2.3 are fully compatible (this was the previous minimum ``PyTables`` required version). .. warning:: - + There is a ``PyTables`` indexing bug which may appear when querying stores using an index. If you see a subset of results being returned, upgrade to ``PyTables`` >= 3.2. Stores created previously will need to be rewritten using the updated version. +.. warning:: + + As of version 0.17.0, ``HDFStore`` will not drop rows that have all missing values by default. Previously, if all values (except the index) were missing, ``HDFStore`` would not write those rows to disk. + .. ipython:: python :suppress: :okexcept: @@ -2444,6 +2491,8 @@ Closing a Store, Context Manager import os os.remove('store.h5') + + Read/Write API ~~~~~~~~~~~~~~ @@ -2462,6 +2511,65 @@ similar to how ``read_csv`` and ``to_csv`` work. (new in 0.11.0) os.remove('store_tl.h5') + +As of version 0.17.0, HDFStore will no longer drop rows that are all missing by default. This behavior can be enabled by setting ``dropna=True``. + +.. ipython:: python + :suppress: + + import os + +.. ipython:: python + + df_with_missing = pd.DataFrame({'col1':[0, np.nan, 2], + 'col2':[1, np.nan, np.nan]}) + df_with_missing + + df_with_missing.to_hdf('file.h5', 'df_with_missing', + format = 'table', mode='w') + + pd.read_hdf('file.h5', 'df_with_missing') + + df_with_missing.to_hdf('file.h5', 'df_with_missing', + format = 'table', mode='w', dropna=True) + pd.read_hdf('file.h5', 'df_with_missing') + + +.. ipython:: python + :suppress: + + os.remove('file.h5') + +This is also true for the major axis of a ``Panel``: + +.. ipython:: python + + matrix = [[[np.nan, np.nan, np.nan],[1,np.nan,np.nan]], + [[np.nan, np.nan, np.nan], [np.nan,5,6]], + [[np.nan, np.nan, np.nan],[np.nan,3,np.nan]]] + + panel_with_major_axis_all_missing = Panel(matrix, + items=['Item1', 'Item2','Item3'], + major_axis=[1,2], + minor_axis=['A', 'B', 'C']) + + panel_with_major_axis_all_missing + + panel_with_major_axis_all_missing.to_hdf('file.h5', 'panel', + dropna = True, + format='table', + mode='w') + reloaded = read_hdf('file.h5', 'panel') + reloaded + + +.. ipython:: python + :suppress: + + os.remove('file.h5') + + + .. _io.hdf5-fixed: Fixed Format @@ -3117,8 +3225,7 @@ Notes & Caveats ``PyTables`` only supports concurrent reads (via threading or processes). If you need reading and writing *at the same time*, you need to serialize these operations in a single thread in a single - process. You will corrupt your data otherwise. See the issue - (:`2397`) for more information. + process. You will corrupt your data otherwise. See the (:issue:`2397`) for more information. - If you use locks to manage write access between multiple processes, you may want to use :py:func:`~os.fsync` before releasing write locks. For convenience you can use ``store.flush(fsync=True)`` to do this for you. @@ -3137,9 +3244,10 @@ Notes & Caveats .. warning:: ``PyTables`` will show a ``NaturalNameWarning`` if a column name - cannot be used as an attribute selector. Generally identifiers that - have spaces, start with numbers, or ``_``, or have ``-`` embedded are not considered - *natural*. These types of identifiers cannot be used in a ``where`` clause + cannot be used as an attribute selector. + *Natural* identifiers contain only letters, numbers, and underscores, + and may not begin with a number. + Other identifiers cannot be used in a ``where`` clause and are generally a bad idea. DataTypes @@ -3148,34 +3256,19 @@ DataTypes ``HDFStore`` will map an object dtype to the ``PyTables`` underlying dtype. This means the following types are known to work: - - floating : ``float64, float32, float16`` *(using* ``np.nan`` *to - represent invalid values)* - - integer : ``int64, int32, int8, uint64, uint32, uint8`` - - bool - - datetime64[ns] *(using* ``NaT`` *to represent invalid values)* - - object : ``strings`` *(using* ``np.nan`` *to represent invalid - values)* - -Currently, ``unicode`` and ``datetime`` columns (represented with a -dtype of ``object``), **WILL FAIL**. In addition, even though a column -may look like a ``datetime64[ns]``, if it contains ``np.nan``, this -**WILL FAIL**. You can try to convert datetimelike columns to proper -``datetime64[ns]`` columns, that possibly contain ``NaT`` to represent -invalid values. (Some of these issues have been addressed and these -conversion may not be necessary in future versions of pandas) - - .. ipython:: python - - import datetime - df = DataFrame(dict(datelike=Series([datetime.datetime(2001, 1, 1), - datetime.datetime(2001, 1, 2), np.nan]))) - df - df.dtypes - - # to convert - df['datelike'] = Series(df['datelike'].values, dtype='M8[ns]') - df - df.dtypes +====================================================== ========================= +Type Represents missing values +====================================================== ========================= +floating : ``float64, float32, float16`` ``np.nan`` +integer : ``int64, int32, int8, uint64,uint32, uint8`` +boolean +``datetime64[ns]`` ``NaT`` +``timedelta64[ns]`` ``NaT`` +categorical : see the section below +object : ``strings`` ``np.nan`` +====================================================== ========================= + +``unicode`` columns are not supported, and **WILL FAIL**. .. _io.hdf5-categorical: @@ -3513,9 +3606,16 @@ below and the SQLAlchemy `documentation / - # where is relative: - engine = create_engine('sqlite:///foo.db') + # sqlite:/// + # where is relative: + engine = create_engine('sqlite:///foo.db') - # or absolute, starting with a slash: - engine = create_engine('sqlite:////absolute/path/to/foo.db') + # or absolute, starting with a slash: + engine = create_engine('sqlite:////absolute/path/to/foo.db') For more information see the examples the SQLAlchemy `documentation `__ @@ -3824,8 +3924,8 @@ will produce the dictionary representation of the schema. .. code-block:: python - df = pandas.DataFrame({'A': [1.0]}) - gbq.generate_bq_schema(df, default_type='STRING') + df = pandas.DataFrame({'A': [1.0]}) + gbq.generate_bq_schema(df, default_type='STRING') .. warning:: @@ -3939,8 +4039,11 @@ missing values are represented as ``np.nan``. If ``True``, missing values are represented using ``StataMissingValue`` objects, and columns containing missing values will have ``object`` data type. -:func:`~pandas.read_stata` and :class:`~pandas.io.stata.StataReader` supports .dta -formats 104, 105, 108, 113-115 (Stata 10-12) and 117 (Stata 13+). +.. note:: + + :func:`~pandas.read_stata` and + :class:`~pandas.io.stata.StataReader` support .dta formats 113-115 + (Stata 10-12), 117 (Stata 13), and 118 (Stata 14). .. note:: @@ -4018,6 +4121,46 @@ easy conversion to and from pandas. .. _xray: http://xray.readthedocs.org/ +.. _io.sas: + +SAS Format +---------- + +.. versionadded:: 0.17.0 + +The top-level function :function:`read_sas` currently can read (but +not write) SAS xport (.XPT) format files. Pandas cannot currently +handle SAS7BDAT files. + +XPORT files only contain two value types: ASCII text and double +precision numeric values. There is no automatic type conversion to +integers, dates, or categoricals. By default the whole file is read +and returned as a ``DataFrame``. + +Specify a ``chunksize`` or use ``iterator=True`` to obtain an +``XportReader`` object for incrementally reading the file. The +``XportReader`` object also has attributes that contain additional +information about the file and its variables. + +Read a SAS XPORT file: + +.. code-block:: python + + df = pd.read_sas('sas_xport.xpt') + +Obtain an iterator and read an XPORT file 100,000 lines at a time: + +.. code-block:: python + + rdr = pd.read_sas('sas_xport.xpt', chunk=100000) + for chunk in rdr: + do_something(chunk) + +The specification_ for the xport file format is available from the SAS +web site. + +.. _specification: https://support.sas.com/techsup/technote/ts140.pdf + .. _io.perf: Performance Considerations @@ -4027,14 +4170,16 @@ This is an informal comparison of various IO methods, using pandas 0.13.1. .. code-block:: python - In [3]: df = DataFrame(randn(1000000,2),columns=list('AB')) + In [1]: df = DataFrame(randn(1000000,2),columns=list('AB')) + + In [2]: df.info() Int64Index: 1000000 entries, 0 to 999999 Data columns (total 2 columns): - A 1000000 non-null values - B 1000000 non-null values + A 1000000 non-null float64 + B 1000000 non-null float64 dtypes: float64(2) - + memory usage: 22.9 MB Writing diff --git a/doc/source/missing_data.rst b/doc/source/missing_data.rst index 04a6302f958a2..51293ca4240c6 100644 --- a/doc/source/missing_data.rst +++ b/doc/source/missing_data.rst @@ -68,26 +68,41 @@ detect this value with data of different types: floating point, integer, boolean, and general object. In many cases, however, the Python ``None`` will arise and we wish to also consider that "missing" or "null". -Prior to version v0.10.0 ``inf`` and ``-inf`` were also -considered to be "null" in computations. This is no longer the case by -default; use the ``mode.use_inf_as_null`` option to recover it. +.. note:: + + Prior to version v0.10.0 ``inf`` and ``-inf`` were also + considered to be "null" in computations. This is no longer the case by + default; use the ``mode.use_inf_as_null`` option to recover it. .. _missing.isnull: To make detecting missing values easier (and across different array dtypes), pandas provides the :func:`~pandas.core.common.isnull` and :func:`~pandas.core.common.notnull` functions, which are also methods on -``Series`` objects: +``Series`` and ``DataFrame`` objects: .. ipython:: python df2['one'] - isnull(df2['one']) + pd.isnull(df2['one']) df2['four'].notnull() + df2.isnull() + +.. warning:: + + One has to be mindful that in python (and numpy), the ``nan's`` don't compare equal, but ``None's`` **do**. + Note that Pandas/numpy uses the fact that ``np.nan != np.nan``, and treats ``None`` like ``np.nan``. + + .. ipython:: python -**Summary:** ``NaN`` and ``None`` (in object arrays) are considered -missing by the ``isnull`` and ``notnull`` functions. ``inf`` and -``-inf`` are no longer considered missing by default. + None == None + np.nan == np.nan + + So as compared to above, a scalar equality comparison versus a ``None/np.nan`` doesn't provide useful information. + + .. ipython:: python + + df2['one'] == np.nan Datetimes --------- @@ -99,7 +114,7 @@ pandas objects provide intercompatibility between ``NaT`` and ``NaN``. .. ipython:: python df2 = df.copy() - df2['timestamp'] = Timestamp('20120101') + df2['timestamp'] = pd.Timestamp('20120101') df2 df2.ix[['a','c','h'],['one','timestamp']] = np.nan df2 @@ -158,10 +173,10 @@ The descriptive statistics and computational methods discussed in the ` and :ref:`here `) are all written to account for missing data. For example: - * When summing data, NA (missing) values will be treated as zero - * If the data are all NA, the result will be NA - * Methods like **cumsum** and **cumprod** ignore NA values, but preserve them - in the resulting arrays +* When summing data, NA (missing) values will be treated as zero +* If the data are all NA, the result will be NA +* Methods like **cumsum** and **cumprod** ignore NA values, but preserve them + in the resulting arrays .. ipython:: python @@ -174,9 +189,14 @@ NA values in GroupBy ~~~~~~~~~~~~~~~~~~~~ NA groups in GroupBy are automatically excluded. This behavior is consistent -with R, for example. +with R, for example: + +.. ipython:: python + df + df.groupby('one').mean() +See the groupby section :ref:`here ` for more information. Cleaning / filling missing data -------------------------------- @@ -255,7 +275,7 @@ use case of this is to fill a DataFrame with the mean of that column. .. ipython:: python - dff = pd.DataFrame(np.random.randn(10,3),columns=list('ABC')) + dff = pd.DataFrame(np.random.randn(10,3), columns=list('ABC')) dff.iloc[3:5,0] = np.nan dff.iloc[4:6,1] = np.nan dff.iloc[5:8,2] = np.nan @@ -271,7 +291,7 @@ a Series in this case. .. ipython:: python - dff.where(notnull(dff),dff.mean(),axis='columns') + dff.where(pd.notnull(dff), dff.mean(), axis='columns') .. _missing_data.dropna: @@ -316,7 +336,7 @@ performs linear interpolation at missing datapoints. :suppress: np.random.seed(123456) - idx = date_range('1/1/2000', periods=100, freq='BM') + idx = pd.date_range('1/1/2000', periods=100, freq='BM') ts = pd.Series(np.random.randn(100), index=idx) ts[1:20] = np.nan ts[60:80] = np.nan @@ -363,7 +383,7 @@ You can also interpolate with a DataFrame: .. ipython:: python df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], - 'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]}) + 'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]}) df df.interpolate() @@ -420,7 +440,7 @@ at the new values. ser = pd.Series(np.sort(np.random.uniform(size=100))) # interpolate at new_index - new_index = ser.index | Index([49.25, 49.5, 49.75, 50.25, 50.5, 50.75]) + new_index = ser.index | pd.Index([49.25, 49.5, 49.75, 50.25, 50.5, 50.75]) interp_s = ser.reindex(new_index).interpolate(method='pchip') interp_s[49:51] diff --git a/doc/source/options.rst b/doc/source/options.rst index 9ede87422b21c..26871a11473de 100644 --- a/doc/source/options.rst +++ b/doc/source/options.rst @@ -154,7 +154,7 @@ lines are replaced by an ellipsis. .. ipython:: python - df=pd.DataFrame(np.random.randn(7,2)) + df = pd.DataFrame(np.random.randn(7,2)) pd.set_option('max_rows', 7) df pd.set_option('max_rows', 5) @@ -166,7 +166,7 @@ dataframes to stretch across pages, wrapped over the full column vs row-wise. .. ipython:: python - df=pd.DataFrame(np.random.randn(5,10)) + df = pd.DataFrame(np.random.randn(5,10)) pd.set_option('expand_frame_repr', True) df pd.set_option('expand_frame_repr', False) @@ -178,7 +178,7 @@ dataframes to stretch across pages, wrapped over the full column vs row-wise. .. ipython:: python - df=pd.DataFrame(np.random.randn(10,10)) + df = pd.DataFrame(np.random.randn(10,10)) pd.set_option('max_rows', 5) pd.set_option('large_repr', 'truncate') df @@ -192,8 +192,8 @@ of this length or longer will be truncated with an ellipsis. .. ipython:: python - df=pd.DataFrame(np.array([['foo', 'bar', 'bim', 'uncomfortably long string'], - ['horse', 'cow', 'banana', 'apple']])) + df = pd.DataFrame(np.array([['foo', 'bar', 'bim', 'uncomfortably long string'], + ['horse', 'cow', 'banana', 'apple']])) pd.set_option('max_colwidth',40) df pd.set_option('max_colwidth', 6) @@ -205,7 +205,7 @@ will be given. .. ipython:: python - df=pd.DataFrame(np.random.randn(10,10)) + df = pd.DataFrame(np.random.randn(10,10)) pd.set_option('max_info_columns', 11) df.info() pd.set_option('max_info_columns', 5) @@ -219,7 +219,7 @@ can specify the option ``df.info(null_counts=True)`` to override on showing a pa .. ipython:: python - df=pd.DataFrame(np.random.choice([0,1,np.nan],size=(10,10))) + df =pd.DataFrame(np.random.choice([0,1,np.nan], size=(10,10))) df pd.set_option('max_info_rows', 11) df.info() @@ -227,12 +227,12 @@ can specify the option ``df.info(null_counts=True)`` to override on showing a pa df.info() pd.reset_option('max_info_rows') -``display.precision`` sets the output display precision. This is only a +``display.precision`` sets the output display precision in terms of decimal places. This is only a suggestion. .. ipython:: python - df=pd.DataFrame(np.random.randn(5,5)) + df = pd.DataFrame(np.random.randn(5,5)) pd.set_option('precision',7) df pd.set_option('precision',4) @@ -244,7 +244,7 @@ precision at which the number is stored. .. ipython:: python - df=pd.DataFrame(np.random.randn(6,6)) + df = pd.DataFrame(np.random.randn(6,6)) pd.set_option('chop_threshold', 0) df pd.set_option('chop_threshold', .5) @@ -256,7 +256,8 @@ Options are 'right', and 'left'. .. ipython:: python - df=pd.DataFrame(np.array([np.random.randn(6), np.random.randint(1,9,6)*.1, np.zeros(6)]).T, columns=['A', 'B', 'C'], dtype='float') + df = pd.DataFrame(np.array([np.random.randn(6), np.random.randint(1,9,6)*.1, np.zeros(6)]).T, + columns=['A', 'B', 'C'], dtype='float') pd.set_option('colheader_justify', 'right') df pd.set_option('colheader_justify', 'left') @@ -367,9 +368,11 @@ display.notebook_repr_html True When True, IPython notebook will pandas objects (if it is available). display.pprint_nest_depth 3 Controls the number of nested levels to process when pretty-printing -display.precision 7 Floating point output precision - (number of significant digits). This is - only a suggestion +display.precision 6 Floating point output precision in + terms of number of places after the + decimal, for regular formatting as well + as scientific notation. Similar to + numpy's ``precision`` print option display.show_dimensions truncate Whether to print out dimensions at the end of DataFrame repr. If 'truncate' is specified, only diff --git a/doc/source/r_interface.rst b/doc/source/r_interface.rst index da37c92c88ecf..74cdc5a526585 100644 --- a/doc/source/r_interface.rst +++ b/doc/source/r_interface.rst @@ -5,8 +5,8 @@ .. ipython:: python :suppress: - from pandas import * - options.display.max_rows=15 + import pandas as pd + pd.options.display.max_rows = 15 ****************** @@ -136,10 +136,8 @@ DataFrames into the equivalent R object (that is, **data.frame**): .. ipython:: python - from pandas import DataFrame - - df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]}, - index=["one", "two", "three"]) + df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]}, + index=["one", "two", "three"]) r_dataframe = com.convert_to_r_dataframe(df) print(type(r_dataframe)) diff --git a/doc/source/timedeltas.rst b/doc/source/timedeltas.rst index 8215414e425fe..e62f4f9387526 100644 --- a/doc/source/timedeltas.rst +++ b/doc/source/timedeltas.rst @@ -97,6 +97,8 @@ It will construct Series if the input is a Series, a scalar if the input is scal to_timedelta(np.arange(5),unit='s') to_timedelta(np.arange(5),unit='d') +.. _timedeltas.operations: + Operations ---------- diff --git a/doc/source/timeseries.rst b/doc/source/timeseries.rst index ce1035e91391a..6f30ff3f51ad5 100644 --- a/doc/source/timeseries.rst +++ b/doc/source/timeseries.rst @@ -71,6 +71,23 @@ Resample: ts.resample('D', how='mean') +.. _timeseries.overview: + +Overview +-------- + +Following table shows the type of time-related classes pandas can handle and +how to create them. + +================= ============================== ================================================== +Class Remarks How to create +================= ============================== ================================================== +``Timestamp`` Represents a single time stamp ``to_datetime``, ``Timestamp`` +``DatetimeIndex`` Index of ``Timestamps`` ``to_datetime``, ``date_range``, ``DatetimeIndex`` +``Period`` Represents a single time span ``Period`` +``PeriodIndex`` Index of ``Period`` ``period_range``, ``PeriodIndex`` +================= ============================== ================================================== + .. _timeseries.representation: Time Stamps vs. Time Spans @@ -78,30 +95,45 @@ Time Stamps vs. Time Spans Time-stamped data is the most basic type of timeseries data that associates values with points in time. For pandas objects it means using the points in -time to create the index +time. .. ipython:: python - dates = [datetime(2012, 5, 1), datetime(2012, 5, 2), datetime(2012, 5, 3)] - ts = Series(np.random.randn(3), dates) - - type(ts.index) - - ts + Timestamp(datetime(2012, 5, 1)) + Timestamp('2012-05-01') However, in many cases it is more natural to associate things like change -variables with a time span instead. +variables with a time span instead. The span represented by ``Period`` can be +specified explicitly, or inferred from datetime string format. For example: .. ipython:: python - periods = PeriodIndex([Period('2012-01'), Period('2012-02'), - Period('2012-03')]) + Period('2011-01') + + Period('2012-05', freq='D') + +``Timestamp`` and ``Period`` can be the index. Lists of ``Timestamp`` and +``Period`` are automatically coerce to ``DatetimeIndex`` and ``PeriodIndex`` +respectively. + +.. ipython:: python + + dates = [Timestamp('2012-05-01'), Timestamp('2012-05-02'), Timestamp('2012-05-03')] + ts = Series(np.random.randn(3), dates) + + type(ts.index) + ts.index + + ts + + periods = [Period('2012-01'), Period('2012-02'), Period('2012-03')] ts = Series(np.random.randn(3), periods) type(ts.index) + ts.index ts @@ -150,24 +182,39 @@ you can pass the ``dayfirst`` flag: considerably and on versions later then 0.13.0 explicitly specifying a format string of '%Y%m%d' takes a faster path still. +If you pass a single string to ``to_datetime``, it returns single ``Timestamp``. +Also, ``Timestamp`` can accept the string input. +Note that ``Timestamp`` doesn't accept string parsing option like ``dayfirst`` +or ``format``, use ``to_datetime`` if these are required. -Invalid Data -~~~~~~~~~~~~ +.. ipython:: python -Pass ``coerce=True`` to convert invalid data to ``NaT`` (not a time): + to_datetime('2010/11/12') -.. ipython:: python + Timestamp('2010/11/12') - to_datetime(['2009-07-31', 'asd']) - to_datetime(['2009-07-31', 'asd'], coerce=True) +Invalid Data +~~~~~~~~~~~~ +.. note:: + + In version 0.17.0, the default for ``to_datetime`` is now ``errors='raise'``, rather than ``errors='ignore'``. This means + that invalid parsing will raise rather that return the original input as in previous versions. -Take care, ``to_datetime`` may not act as you expect on mixed data: +Pass ``errors='coerce'`` to convert invalid data to ``NaT`` (not a time): .. ipython:: python + :okexcept: - to_datetime([1, '1']) + # this is the default, raise when unparseable + to_datetime(['2009/07/31', 'asd'], errors='raise') + + # return the original input when unparseable + to_datetime(['2009/07/31', 'asd'], errors='ignore') + + # return NaT for input when unparseable + to_datetime(['2009/07/31', 'asd'], errors='coerce') Epoch Timestamps ~~~~~~~~~~~~~~~~ @@ -592,6 +639,46 @@ Another example is parameterizing ``YearEnd`` with the specific ending month: d + YearEnd() d + YearEnd(month=6) + +.. _timeseries.offsetseries: + +Using offsets with ``Series`` / ``DatetimeIndex`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Offsets can be used with either a ``Series`` or ``DatetimeIndex`` to +apply the offset to each element. + +.. ipython:: python + + rng = date_range('2012-01-01', '2012-01-03') + s = Series(rng) + rng + rng + DateOffset(months=2) + s + DateOffset(months=2) + s - DateOffset(months=2) + +If the offset class maps directly to a ``Timedelta`` (``Day``, ``Hour``, +``Minute``, ``Second``, ``Micro``, ``Milli``, ``Nano``) it can be +used exactly like a ``Timedelta`` - see the +:ref:`Timedelta section` for more examples. + +.. ipython:: python + + s - Day(2) + td = s - Series(date_range('2011-12-29', '2011-12-31')) + td + td + Minute(15) + +Note that some offsets (such as ``BQuarterEnd``) do not have a +vectorized implementation. They can still be used but may +calculate signficantly slower and will raise a ``PerformanceWarning`` + +.. ipython:: python + :okwarning: + + rng + BQuarterEnd() + + .. _timeseries.alias: Custom Business Days (Experimental) diff --git a/doc/source/visualization.rst b/doc/source/visualization.rst index 51912b5d6b106..4378d182b3128 100644 --- a/doc/source/visualization.rst +++ b/doc/source/visualization.rst @@ -1649,6 +1649,7 @@ values, the resulting grid has two columns and two rows. A histogram is displayed for each cell of the grid. .. ipython:: python + :okwarning: plt.figure() @@ -1680,6 +1681,7 @@ Example below is the same as previous except the plot is set to kernel density estimation. A ``seaborn`` example is included beneath. .. ipython:: python + :okwarning: plt.figure() @@ -1706,6 +1708,7 @@ The plot below shows that it is possible to have two or more plots for the same data displayed on the same Trellis grid cell. .. ipython:: python + :okwarning: plt.figure() @@ -1745,6 +1748,7 @@ Below is a similar plot but with 2D kernel density estimation plot superimposed, followed by a ``seaborn`` equivalent: .. ipython:: python + :okwarning: plt.figure() @@ -1774,6 +1778,7 @@ only uses 'sex' attribute. If the second grouping attribute is not specified, the plots will be arranged in a column. .. ipython:: python + :okwarning: plt.figure() @@ -1792,6 +1797,7 @@ the plots will be arranged in a column. If the first grouping attribute is not specified the plots will be arranged in a row. .. ipython:: python + :okwarning: plt.figure() @@ -1816,6 +1822,7 @@ scale objects to specify these mappings. The list of scale classes is given below with initialization arguments for quick reference. .. ipython:: python + :okwarning: plt.figure() diff --git a/doc/source/whatsnew/v0.11.0.txt b/doc/source/whatsnew/v0.11.0.txt index befdf848ad23b..50b74fc5af090 100644 --- a/doc/source/whatsnew/v0.11.0.txt +++ b/doc/source/whatsnew/v0.11.0.txt @@ -103,6 +103,7 @@ Conversion Mixed Conversion .. ipython:: python + :okwarning: df3['D'] = '1.' df3['E'] = '1' @@ -116,6 +117,7 @@ Mixed Conversion Forcing Date coercion (and setting ``NaT`` when not datelike) .. ipython:: python + :okwarning: from datetime import datetime s = Series([datetime(2001,1,1,0,0), 'foo', 1.0, 1, @@ -328,4 +330,3 @@ Enhancements See the :ref:`full release notes ` or issue tracker on GitHub for a complete list. - diff --git a/doc/source/whatsnew/v0.17.0.txt b/doc/source/whatsnew/v0.17.0.txt index 164ab73def894..039772f68ee85 100644 --- a/doc/source/whatsnew/v0.17.0.txt +++ b/doc/source/whatsnew/v0.17.0.txt @@ -1,14 +1,26 @@ .. _whatsnew_0170: -v0.17.0 (July 31, 2015) ------------------------ +v0.17.0 (???) +------------- This is a major release from 0.16.2 and includes a small number of API changes, several new features, enhancements, and performance improvements along with a large number of bug fixes. We recommend that all users upgrade to this version. +.. warning:: + + pandas >= 0.17.0 will no longer support compatibility with Python version 3.2 (:issue:`9118`) + Highlights include: +- Release the Global Interpreter Lock (GIL) on some cython operations, see :ref:`here ` +- The default for ``to_datetime`` will now be to ``raise`` when presented with unparseable formats, + previously this would return the original input, see :ref:`here ` +- The default for ``dropna`` in ``HDFStore`` has changed to ``False``, to store by default all rows even + if they are all ``NaN``, see :ref:`here ` +- Support for ``Series.dt.strftime`` to generate formatted strings for datetime-likes, see :ref:`here ` +- Development installed versions of pandas will now have ``PEP440`` compliant version strings (:issue:`9518`) +- Support for reading SAS xport files, see :ref:`here ` Check the :ref:`API Changes ` and :ref:`deprecations ` before updating. @@ -21,40 +33,668 @@ Check the :ref:`API Changes ` and :ref:`deprecations `_ + +.. _whatsnew_0170.enhancements.sas_xport: + +Support for SAS XPORT files +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +:meth:`~pandas.io.read_sas` provides support for reading *SAS XPORT* format files. (:issue:`4052`). + +.. code-block:: python + + df = pd.read_sas('sas_xport.xpt') + +It is also possible to obtain an iterator and read an XPORT file +incrementally. + +.. code-block:: python + + for df in pd.read_sas('sas_xport.xpt', chunksize=10000) + do_something(df) + +See the :ref:`docs ` for more details. .. _whatsnew_0170.enhancements.other: Other enhancements ^^^^^^^^^^^^^^^^^^ +- `read_sql` and `to_sql` can accept database URI as con parameter (:issue:`10214`) + +- Enable `read_hdf` to be used without specifying a key when the HDF file contains a single dataset (:issue:`10443`) + +- Added functionality to use the ``base`` argument when resampling a ``TimeDeltaIndex`` (:issue:`10530`) + +- ``DatetimeIndex`` can be instantiated using strings contains ``NaT`` (:issue:`7599`) +- The string parsing of ``to_datetime``, ``Timestamp`` and ``DatetimeIndex`` has been made consistent. (:issue:`7599`) + + Prior to v0.17.0, ``Timestamp`` and ``to_datetime`` may parse year-only datetime-string incorrectly using today's date, otherwise ``DatetimeIndex`` + uses the beginning of the year. ``Timestamp`` and ``to_datetime`` may raise ``ValueError`` in some types of datetime-string which ``DatetimeIndex`` + can parse, such as a quarterly string. + + Previous Behavior + + .. code-block:: python + + In [1]: Timestamp('2012Q2') + Traceback + ... + ValueError: Unable to parse 2012Q2 + + # Results in today's date. + In [2]: Timestamp('2014') + Out [2]: 2014-08-12 00:00:00 + + v0.17.0 can parse them as below. It works on ``DatetimeIndex`` also. + + New Behaviour + + .. ipython:: python + + Timestamp('2012Q2') + Timestamp('2014') + DatetimeIndex(['2012Q2', '2014']) + + .. note:: If you want to perform calculations based on today's date, use ``Timestamp.now()`` and ``pandas.tseries.offsets``. + + .. ipython:: python + + import pandas.tseries.offsets as offsets + Timestamp.now() + Timestamp.now() + offsets.DateOffset(years=1) + +- ``to_datetime`` can now accept ``yearfirst`` keyword (:issue:`7599`) + +- ``pandas.tseries.offsets`` larger than the ``Day`` offset can now be used with with ``Series`` for addition/subtraction (:issue:`10699`). See the :ref:`Documentation ` for more details. + +- ``.as_blocks`` will now take a ``copy`` optional argument to return a copy of the data, default is to copy (no change in behavior from prior versions), (:issue:`9607`) + +- ``regex`` argument to ``DataFrame.filter`` now handles numeric column names instead of raising ``ValueError`` (:issue:`10384`). +- ``pd.read_stata`` will now read Stata 118 type files. (:issue:`9882`) + +- ``pd.merge`` will now allow duplicate column names if they are not merged upon (:issue:`10639`). + +- ``pd.pivot`` will now allow passing index as ``None`` (:issue:`3962`). + +- ``read_sql_table`` will now allow reading from views (:issue:`10750`). + +- ``drop_duplicates`` and ``duplicated`` now accept ``keep`` keyword to target first, last, and all duplicates. ``take_last`` keyword is deprecated, see :ref:`deprecations ` (:issue:`6511`, :issue:`8505`) + +- ``msgpack`` submodule has been updated to 0.4.6 with backward compatibility (:issue:`10581`) + +.. ipython :: python + + s = pd.Series(['A', 'B', 'C', 'A', 'B', 'D']) + s.drop_duplicates() + s.drop_duplicates(keep='last') + s.drop_duplicates(keep=False) + + +- Reindex now has a ``tolerance`` argument that allows for finer control of :ref:`basics.limits_on_reindex_fill`: + + .. ipython:: python + + df = pd.DataFrame({'x': range(5), 't': pd.date_range('2000-01-01', periods=5)}) + df.reindex([0.1, 1.9, 3.5], method='nearest', tolerance=0.2) + + When used on a ``DatetimeIndex``, ``TimedeltaIndex`` or ``PeriodIndex``, ``tolerance`` will coerced into a ``Timedelta`` if possible. This allows you to specify tolerance with a string: + + .. ipython:: python + + df = df.set_index('t') + df.reindex(pd.to_datetime(['1999-12-31']), method='nearest', tolerance='1 day') + + ``tolerance`` is also exposed by the lower level ``Index.get_indexer`` and ``Index.get_loc`` methods. + .. _whatsnew_0170.api: +.. _whatsnew_0170.api_breaking: + Backwards incompatible API changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. _whatsnew_0170.api_breaking: +.. _whatsnew_0170.api_breaking.to_datetime: + +Changes to to_datetime and to_timedelta +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default for ``pd.to_datetime`` error handling has changed to ``errors='raise'``. In prior versions it was ``errors='ignore'``. +Furthermore, the ``coerce`` argument has been deprecated in favor of ``errors='coerce'``. This means that invalid parsing will raise rather that return the original +input as in previous versions. (:issue:`10636`) + +Previous Behavior: + +.. code-block:: python + + In [2]: pd.to_datetime(['2009-07-31', 'asd']) + Out[2]: array(['2009-07-31', 'asd'], dtype=object) + +New Behavior: + +.. code-block:: python + + In [3]: pd.to_datetime(['2009-07-31', 'asd']) + ValueError: Unknown string format + +.. ipython:: python + +Of course you can coerce this as well. + +.. ipython:: python + + to_datetime(['2009-07-31', 'asd'], errors='coerce') + +To keep the previous behaviour, you can use ``errors='ignore'``: + +.. ipython:: python + + to_datetime(['2009-07-31', 'asd'], errors='ignore') + +Furthermore, ``pd.to_timedelta`` has gained a similar API, of ``errors='raise'|'ignore'|'coerce'``, and the ``coerce`` keyword +has been deprecated in favor of ``errors='coerce'``. + +.. _whatsnew_0170.api_breaking.convert_objects: + +Changes to convert_objects +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``DataFrame.convert_objects`` keyword arguments have been shortened. (:issue:`10265`) + + ===================== ============= + Old New + ===================== ============= + ``convert_dates`` ``datetime`` + ``convert_numeric`` ``numeric`` + ``convert_timedelta`` ``timedelta`` + ===================== ============= + +Coercing types with ``DataFrame.convert_objects`` is now implemented using the +keyword argument ``coerce=True``. Previously types were coerced by setting a +keyword argument to ``'coerce'`` instead of ``True``, as in ``convert_dates='coerce'``. + +.. ipython:: python + + df = pd.DataFrame({'i': ['1','2'], + 'f': ['apple', '4.2'], + 's': ['apple','banana']}) + df + +The old usage of ``DataFrame.convert_objects`` used `'coerce'` along with the +type. + +.. code-block:: python + + In [2]: df.convert_objects(convert_numeric='coerce') + +Now the ``coerce`` keyword must be explicitly used. + +.. ipython:: python + + df.convert_objects(numeric=True, coerce=True) + +In earlier versions of pandas, ``DataFrame.convert_objects`` would not coerce +numeric types when there were no values convertible to a numeric type. This returns +the original DataFrame with no conversion. This change alters +this behavior so that converts all non-number-like strings to ``NaN``. + +.. code-block:: python + + In [1]: df = pd.DataFrame({'s': ['a','b']}) + In [2]: df.convert_objects(convert_numeric='coerce') + Out[2]: + s + 0 a + 1 b + +.. ipython:: python + + pd.DataFrame({'s': ['a','b']}) + df.convert_objects(numeric=True, coerce=True) + +In earlier versions of pandas, the default behavior was to try and convert +datetimes and timestamps. The new default is for ``DataFrame.convert_objects`` +to do nothing, and so it is necessary to pass at least one conversion target +in the method call. + +Changes to Index Comparisons +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Operator equal on Index should behavior similarly to Series (:issue:`9947`, :issue:`10637`) + +Starting in v0.17.0, comparing ``Index`` objects of different lengths will raise +a ``ValueError``. This is to be consistent with the behavior of ``Series``. + +Previous behavior: + +.. code-block:: python + + In [2]: pd.Index([1, 2, 3]) == pd.Index([1, 4, 5]) + Out[2]: array([ True, False, False], dtype=bool) + + In [3]: pd.Index([1, 2, 3]) == pd.Index([2]) + Out[3]: array([False, True, False], dtype=bool) + + In [4]: pd.Index([1, 2, 3]) == pd.Index([1, 2]) + Out[4]: False + + In [5]: pd.Series([1, 2, 3]) == pd.Series([1, 4, 5]) + Out[5]: + 0 True + 1 False + 2 False + dtype: bool + + In [6]: pd.Series([1, 2, 3]) == pd.Series([2]) + ValueError: Series lengths must match to compare + + In [7]: pd.Series([1, 2, 3]) == pd.Series([1, 2]) + ValueError: Series lengths must match to compare + +New behavior: + +.. code-block:: python + + In [8]: pd.Index([1, 2, 3]) == pd.Index([1, 4, 5]) + Out[8]: array([ True, False, False], dtype=bool) + + In [9]: pd.Index([1, 2, 3]) == pd.Index([2]) + ValueError: Lengths must match to compare + + In [10]: pd.Index([1, 2, 3]) == pd.Index([1, 2]) + ValueError: Lengths must match to compare + + In [11]: pd.Series([1, 2, 3]) == pd.Series([1, 4, 5]) + Out[11]: + 0 True + 1 False + 2 False + dtype: bool + + In [12]: pd.Series([1, 2, 3]) == pd.Series([2]) + ValueError: Series lengths must match to compare + + In [13]: pd.Series([1, 2, 3]) == pd.Series([1, 2]) + ValueError: Series lengths must match to compare + +Note that this is different from the ``numpy`` behavior where a comparison can +be broadcast: + +.. ipython:: python + + np.array([1, 2, 3]) == np.array([1]) + +or it can return False if broadcasting can not be done: + +.. ipython:: python + + np.array([1, 2, 3]) == np.array([1, 2]) + +Changes to Boolean Comparisons vs. None +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Boolean comparisons of a ``Series`` vs ``None`` will now be equivalent to comparing with ``np.nan``, rather than raise ``TypeError``. xref (:issue:`1079`). + +.. ipython:: python + + s = Series(range(3)) + s.iloc[1] = None + s + +Previous behavior: + +.. code-block:: python + + In [5]: s==None + TypeError: Could not compare type with Series + +New behavior: + +.. ipython:: python + + s==None + +Usually you simply want to know which values are null. + +.. ipython:: python + + s.isnull() + +.. warning:: + + You generally will want to use ``isnull/notnull`` for these types of comparisons, as ``isnull/notnull`` tells you which elements are null. One has to be + mindful that ``nan's`` don't compare equal, but ``None's`` do. Note that Pandas/numpy uses the fact that ``np.nan != np.nan``, and treats ``None`` like ``np.nan``. + + .. ipython:: python + + None == None + np.nan == np.nan + +.. _whatsnew_0170.api_breaking.hdf_dropna: + +HDFStore dropna behavior +^^^^^^^^^^^^^^^^^^^^^^^^ + +The default behavior for HDFStore write functions with ``format='table'`` is now to keep rows that are all missing. Previously, the behavior was to drop rows that were all missing save the index. The previous behavior can be replicated using the ``dropna=True`` option. (:issue:`9382`) + +Previously: + +.. ipython:: python + + df_with_missing = pd.DataFrame({'col1':[0, np.nan, 2], + 'col2':[1, np.nan, np.nan]}) + + df_with_missing + + +.. code-block:: python + + In [28]: + df_with_missing.to_hdf('file.h5', 'df_with_missing', format='table', mode='w') + + pd.read_hdf('file.h5', 'df_with_missing') + + Out [28]: + col1 col2 + 0 0 1 + 2 2 NaN + + +New behavior: + +.. ipython:: python + :suppress: + + import os + +.. ipython:: python + + df_with_missing.to_hdf('file.h5', 'df_with_missing', format = 'table', mode='w') + + pd.read_hdf('file.h5', 'df_with_missing') + +.. ipython:: python + :suppress: + + os.remove('file.h5') + +See :ref:`documentation ` for more details. + +Changes to ``display.precision`` option +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``display.precision`` option has been clarified to refer to decimal places (:issue:`10451`). + +Earlier versions of pandas would format floating point numbers to have one less decimal place than the value in +``display.precision``. + +.. code-block:: python + + In [1]: pd.set_option('display.precision', 2) + + In [2]: pd.DataFrame({'x': [123.456789]}) + Out[2]: + x + 0 123.5 + +If interpreting precision as "significant figures" this did work for scientific notation but that same interpretation +did not work for values with standard formatting. It was also out of step with how numpy handles formatting. + +Going forward the value of ``display.precision`` will directly control the number of places after the decimal, for +regular formatting as well as scientific notation, similar to how numpy's ``precision`` print option works. + +.. ipython:: python + + pd.set_option('display.precision', 2) + pd.DataFrame({'x': [123.456789]}) + +To preserve output behavior with prior versions the default value of ``display.precision`` has been reduced to ``6`` +from ``7``. + +.. ipython:: python + :suppress: + + pd.set_option('display.precision', 6) + .. _whatsnew_0170.api_breaking.other: Other API Changes ^^^^^^^^^^^^^^^^^ +- Line and kde plot with ``subplots=True`` now uses default colors, not all black. Specify ``color='k'`` to draw all lines in black (:issue:`9894`) +- Calling the ``.value_counts`` method on a Series with ``categorical`` dtype now returns a Series with a ``CategoricalIndex`` (:issue:`10704`) +- Enable writing Excel files in :ref:`memory <_io.excel_writing_buffer>` using StringIO/BytesIO (:issue:`7074`) +- Enable serialization of lists and dicts to strings in ExcelWriter (:issue:`8188`) +- Allow passing `kwargs` to the interpolation methods (:issue:`10378`). +- Serialize metadata properties of subclasses of pandas objects (:issue:`10553`). +- ``Categorical.unique`` now returns new ``Categorical`` which ``categories`` and ``codes`` are unique, rather than returning ``np.array`` (:issue:`10508`) + + - unordered category: values and categories are sorted by appearance order. + - ordered category: values are sorted by appearance order, categories keeps existing order. + + .. ipython :: python + + cat = pd.Categorical(['C', 'A', 'B', 'C'], categories=['A', 'B', 'C'], ordered=True) + cat + cat.unique() + + cat = pd.Categorical(['C', 'A', 'B', 'C'], categories=['A', 'B', 'C']) + cat + cat.unique() + +- ``groupby`` using ``Categorical`` follows the same rule as ``Categorical.unique`` described above (:issue:`10508`) +- ``NaT``'s methods now either raise ``ValueError``, or return ``np.nan`` or ``NaT`` (:issue:`9513`) + + =============================== =============================================================== + Behavior Methods + =============================== =============================================================== + ``return np.nan`` ``weekday``, ``isoweekday`` + ``return NaT`` ``date``, ``now``, ``replace``, ``to_datetime``, ``today`` + ``return np.datetime64('NaT')`` ``to_datetime64`` (unchanged) + ``raise ValueError`` All other public methods (names not beginning with underscores) + =============================== =============================================================== + +- Improved error message when concatenating an empty iterable of dataframes (:issue:`9157`) + .. _whatsnew_0170.deprecations: Deprecations ^^^^^^^^^^^^ +.. note:: These indexing function have been deprecated in the documentation since 0.11.0. + +- For ``Series`` the following indexing functions are deprecated (:issue:`10177`). + + ===================== ================================= + Deprecated Function Replacement + ===================== ================================= + ``.irow(i)`` ``.iloc[i]`` or ``.iat[i]`` + ``.iget(i)`` ``.iloc[i]`` + ``.iget_value(i)`` ``.iloc[i]`` or ``.iat[i]`` + ===================== ================================= + +- For ``DataFrame`` the following indexing functions are deprecated (:issue:`10177`). + + ===================== ================================= + Deprecated Function Replacement + ===================== ================================= + ``.irow(i)`` ``.iloc[i]`` + ``.iget_value(i, j)`` ``.iloc[i, j]`` or ``.iat[i, j]`` + ``.icol(j)`` ``.iloc[:, j]`` + ===================== ================================= + +- ``Categorical.name`` was deprecated to make ``Categorical`` more ``numpy.ndarray`` like. Use ``Series(cat, name="whatever")`` instead (:issue:`10482`). +- ``drop_duplicates`` and ``duplicated``'s ``take_last`` keyword was deprecated in favor of ``keep``. (:issue:`6511`, :issue:`8505`) +- ``DataFrame.combineAdd`` and ``DataFrame.combineMult`` are deprecated. They + can easily be replaced by using the ``add`` and ``mul`` methods: + ``DataFrame.add(other, fill_value=0)`` and ``DataFrame.mul(other, fill_value=1.)`` + (:issue:`10735`). + .. _whatsnew_0170.prior_deprecations: Removal of prior version deprecations/changes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Remove use of some deprecated numpy comparison operations, mainly in tests. (:issue:`10569`) + + .. _whatsnew_0170.performance: Performance Improvements ~~~~~~~~~~~~~~~~~~~~~~~~ +- Added vbench benchmarks for alternative ExcelWriter engines and reading Excel files (:issue:`7171`) + +- 4x improvement in ``timedelta`` string parsing (:issue:`6755`, :issue:`10426`) +- 8x improvement in ``timedelta64`` and ``datetime64`` ops (:issue:`6755`) +- Significantly improved performance of indexing ``MultiIndex`` with slicers (:issue:`10287`) +- 8x improvement in ``iloc`` using list-like input (:issue:`10791`) +- Improved performance of ``Series.isin`` for datetimelike/integer Series (:issue:`10287`) +- 20x improvement in ``concat`` of Categoricals when categories are identical (:issue:`10587`) +- Improved performance of ``to_datetime`` when specified format string is ISO8601 (:issue:`10178`) +- 2x improvement of ``Series.value_counts`` for float dtype (:issue:`10821`) .. _whatsnew_0170.bug_fixes: Bug Fixes ~~~~~~~~~ +- Bug in ``DataFrame.to_html(index=False)`` renders unnecessary ``name`` row (:issue:`10344`) +- Bug in ``DataFrame.apply`` when function returns categorical series. (:issue:`9573`) +- Bug in ``to_datetime`` with invalid dates and formats supplied (:issue:`10154`) +- Bug in ``Index.drop_duplicates`` dropping name(s) (:issue:`10115`) +- Bug in ``pd.Series`` when setting a value on an empty ``Series`` whose index has a frequency. (:issue:`10193`) +- Bug in ``DataFrame.plot`` raises ``ValueError`` when color name is specified by multiple characters (:issue:`10387`) +- Bug in ``Index`` construction with a mixed list of tuples (:issue:`10697`) +- Bug in ``DataFrame.reset_index`` when index contains `NaT`. (:issue:`10388`) +- Bug in ``ExcelReader`` when worksheet is empty (:issue:`6403`) + + +- Bug causing ``DataFrame.where`` to not respect the ``axis`` parameter when the frame has a symmetric shape. (:issue:`9736`) + +- Bug in ``Table.select_column`` where name is not preserved (:issue:`10392`) +- Bug in ``offsets.generate_range`` where ``start`` and ``end`` have finer precision than ``offset`` (:issue:`9907`) +- Bug in ``pd.rolling_*`` where ``Series.name`` would be lost in the output (:issue:`10565`) +- Bug in ``stack`` when index or columns are not unique. (:issue:`10417`) +- Bug in setting a Panel when an axis has a multi-index (:issue:`10360`) +- Bug in ``USFederalHolidayCalendar`` where ``USMemorialDay`` and ``USMartinLutherKingJr`` were incorrect (:issue:`10278` and :issue:`9760` ) +- Bug in ``.sample()`` where returned object, if set, gives unnecessary ``SettingWithCopyWarning`` (:issue:`10738`) +- Bug in ``.sample()`` where weights passed as Series were not aligned along axis before being treated positionally, potentially causing problems if weight indices were not aligned with sampled object. (:issue:`10738`) + + + +- Bug in ``DataFrame.interpolate`` with ``axis=1`` and ``inplace=True`` (:issue:`10395`) +- Bug in ``io.sql.get_schema`` when specifying multiple columns as primary + key (:issue:`10385`). + +- Bug in ``groupby(sort=False)`` with datetime-like ``Categorical`` raises ``ValueError`` (:issue:`10505`) + +- Bug in ``test_categorical`` on big-endian builds (:issue:`10425`) +- Bug in ``Series.shift`` and ``DataFrame.shift`` not supporting categorical data (:issue:`9416`) +- Bug in ``Series.map`` using categorical ``Series`` raises ``AttributeError`` (:issue:`10324`) +- Bug in ``MultiIndex.get_level_values`` including ``Categorical`` raises ``AttributeError`` (:issue:`10460`) +- Bug in ``pd.get_dummies`` with `sparse=True` not returning ``SparseDataFrame`` (:issue:`10531`) +- Bug in ``Index`` subtypes (such as ``PeriodIndex``) not returning their own type for ``.drop`` and ``.insert`` methods (:issue:`10620`) +- Bug in ``algos.outer_join_indexer`` when ``right`` array is empty (:issue:`10618`) + +- Bug in ``filter`` (regression from 0.16.0) and ``transform`` when grouping on multiple keys, one of which is datetime-like (:issue:`10114`) + + + + + +- Bug that caused segfault when resampling an empty Series (:issue:`10228`) +- Bug in ``DatetimeIndex`` and ``PeriodIndex.value_counts`` resets name from its result, but retains in result's ``Index``. (:issue:`10150`) +- Bug in ``pd.eval`` using ``numexpr`` engine coerces 1 element numpy array to scalar (:issue:`10546`) +- Bug in ``pd.concat`` with ``axis=0`` when column is of dtype ``category`` (:issue:`10177`) +- Bug in ``read_msgpack`` where input type is not always checked (:issue:`10369`, :issue:`10630`) +- Bug in ``pd.read_csv`` with kwargs ``index_col=False``, ``index_col=['a', 'b']`` or ``dtype`` + (:issue:`10413`, :issue:`10467`, :issue:`10577`) +- Bug in ``Series.from_csv`` with ``header`` kwarg not setting the ``Series.name`` or the ``Series.index.name`` (:issue:`10483`) +- Bug in ``groupby.var`` which caused variance to be inaccurate for small float values (:issue:`10448`) +- Bug in ``Series.plot(kind='hist')`` Y Label not informative (:issue:`10485`) +- Bug in ``read_csv`` when using a converter which generates a ``uint8`` type (:issue:`9266`) + +- Bug causes memory leak in time-series line and area plot (:issue:`9003`) + + +- Bug in line and kde plot cannot accept multiple colors when ``subplots=True`` (:issue:`9894`) +- Bug in ``DataFrame.plot`` raises ``ValueError`` when color name is specified by multiple characters (:issue:`10387`) + +- Bug in left and right ``align`` of ``Series`` with ``MultiIndex`` may be inverted (:issue:`10665`) +- Bug in left and right ``join`` of with ``MultiIndex`` may be inverted (:issue:`10741`) + +- Bug in ``read_stata`` when reading a file with a different order set in ``columns`` (:issue:`10757`) +- Bug in ``Categorical`` may not representing properly when category contains ``tz`` or ``Period`` (:issue:`10713`) +- Bug in ``Categorical.__iter__`` may not returning correct ``datetime`` and ``Period`` (:issue:`10713`) + +- Bug in ``read_csv`` with ``engine='c'``: EOF preceded by a comment, blank line, etc. was not handled correctly (:issue:`10728`, :issue:`10548`) + +- Reading "famafrench" data via ``DataReader`` results in HTTP 404 error because of the website url is changed (:issue:`10591`). +- Bug in ``read_msgpack`` where DataFrame to decode has duplicate column names (:issue:`9618`) +- Bug in ``io.common.get_filepath_or_buffer`` which caused reading of valid S3 files to fail if the bucket also contained keys for which the user does not have read permission (:issue:`10604`) +- Bug in vectorised setting of timestamp columns with python ``datetime.date`` and numpy ``datetime64`` (:issue:`10408`, :issue:`10412`) +- Bug in ``Index.take`` may add unnecessary ``freq`` attribute (:issue:`10791`) +- Bug in ``merge`` with empty ``DataFrame`` may raise ``IndexError`` (:issue:`10824`) + + +- Bug in ``read_csv`` when using the ``nrows`` or ``chunksize`` parameters if file contains only a header line (:issue:`9535`) + +- Bug in ``pd.DataFrame`` when constructing an empty DataFrame with a string dtype (:issue:`9428`) +- Bug in ``pd.unique`` for arrays with the ``datetime64`` or ``timedelta64`` dtype that meant an array with object dtype was returned instead the original dtype (:issue: `9431`) +- Bug in ``DatetimeIndex.take`` and ``TimedeltaIndex.take`` may not raise ``IndexError`` against invalid index (:issue:`10295`) +- Bug in ``Series([np.nan]).astype('M8[ms]')``, which now returns ``Series([pd.NaT])`` (:issue:`10747`) +- Bug in ``PeriodIndex.order`` reset freq (:issue:`10295`) +- Bug in ``iloc`` allowing memory outside bounds of a Series to be accessed with negative integers (:issue:`10779`) +- Bug in ``read_msgpack`` where encoding is not respected (:issue:`10580`) +- Bug preventing access to the first index when using ``iloc`` with a list containing the appropriate negative integer (:issue:`10547`, :issue:`10779`) diff --git a/ez_setup.py b/ez_setup.py deleted file mode 100644 index 6f63b856f06c9..0000000000000 --- a/ez_setup.py +++ /dev/null @@ -1,264 +0,0 @@ -#!python -"""Bootstrap setuptools installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from ez_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -from __future__ import print_function -import sys -DEFAULT_VERSION = "0.6c11" -DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[ - :3] - -md5_data = { - 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', - 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', - 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', - 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', - 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', - 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', - 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', - 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', - 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', - 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', - 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090', - 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4', - 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7', - 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5', - 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de', - 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b', - 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2', - 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086', - 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', - 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', - 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', - 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', - 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', - 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', - 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', - 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', - 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', - 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', - 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', - 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', - 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', - 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', - 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', - 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', - 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', - 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', - 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', - 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', - 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', - 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', - 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', - 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', -} - -import sys -import os -try: - from hashlib import md5 -except ImportError: - from md5 import md5 - - -def _validate_md5(egg_name, data): - if egg_name in md5_data: - digest = md5(data).hexdigest() - if digest != md5_data[egg_name]: - print(( - "md5 validation of %s failed! (Possible download problem?)" - % egg_name - ), file=sys.stderr) - sys.exit(2) - return data - - -def use_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - download_delay=15 -): - """Automatically find/download setuptools and make it available on sys.path - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end with - a '/'). `to_dir` is the directory where setuptools will be downloaded, if - it is not already available. If `download_delay` is specified, it should - be the number of seconds that will be paused before initiating a download, - should one be required. If an older version of setuptools is installed, - this routine will print a message to ``sys.stderr`` and raise SystemExit in - an attempt to abort the calling script. - """ - was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules - - def do_download(): - egg = download_setuptools( - version, download_base, to_dir, download_delay) - sys.path.insert(0, egg) - import setuptools - setuptools.bootstrap_install_from = egg - try: - import pkg_resources - except ImportError: - return do_download() - try: - pkg_resources.require("setuptools>=" + version) - return - except pkg_resources.VersionConflict as e: - if was_imported: - print(( - "The required version of setuptools (>=%s) is not available, and\n" - "can't be installed while this script is running. Please install\n" - " a more recent version first, using 'easy_install -U setuptools'." - "\n\n(Currently using %r)" - ) % (version, e.args[0]), file=sys.stderr) - sys.exit(2) - else: - del pkg_resources, sys.modules['pkg_resources'] # reload ok - return do_download() - except pkg_resources.DistributionNotFound: - return do_download() - - -def download_setuptools( - version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, - delay=15 -): - """Download setuptools from a specified location and return its filename - - `version` should be a valid setuptools version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download attempt. - """ - import urllib2 - import shutil - egg_name = "setuptools-%s-py%s.egg" % (version, sys.version[:3]) - url = download_base + egg_name - saveto = os.path.join(to_dir, egg_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - from distutils import log - if delay: - log.warn(""" ---------------------------------------------------------------------------- -This script requires setuptools version %s to run (even to display -help). I will attempt to download it for you (from -%s), but -you may need to enable firewall access for this script first. -I will start the download in %d seconds. - -(Note: if this machine does not have network access, please obtain the file - - %s - -and place it in this directory before rerunning this script.) ----------------------------------------------------------------------------""", - version, download_base, delay, url - ) - from time import sleep - sleep(delay) - log.warn("Downloading %s", url) - src = urllib2.urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = _validate_md5(egg_name, src.read()) - dst = open(saveto, "wb") - dst.write(data) - finally: - if src: - src.close() - if dst: - dst.close() - return os.path.realpath(saveto) - - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - try: - import setuptools - except ImportError: - egg = None - try: - egg = download_setuptools(version, delay=0) - sys.path.insert(0, egg) - from setuptools.command.easy_install import main - return main(list(argv) + [egg]) # we're done here - finally: - if egg and os.path.exists(egg): - os.unlink(egg) - else: - if setuptools.__version__ == '0.0.1': - print(( - "You have an obsolete version of setuptools installed. Please\n" - "remove it from your system entirely before rerunning this script." - ), file=sys.stderr) - sys.exit(2) - - req = "setuptools>=" + version - import pkg_resources - try: - pkg_resources.require(req) - except pkg_resources.VersionConflict: - try: - from setuptools.command.easy_install import main - except ImportError: - from easy_install import main - main(list(argv) + [download_setuptools(delay=0)]) - sys.exit(0) # try to force an exit - else: - if argv: - from setuptools.command.easy_install import main - main(argv) - else: - print("Setuptools version", version, "or greater has been installed.") - print('(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)') - - -def update_md5(filenames): - """Update our built-in md5 registry""" - - import re - - for name in filenames: - base = os.path.basename(name) - f = open(name, 'rb') - md5_data[base] = md5(f.read()).hexdigest() - f.close() - - data = sorted([" %r: %r,\n" % it for it in md5_data.items()]) - repl = "".join(data) - - import inspect - srcfile = inspect.getsourcefile(sys.modules[__name__]) - f = open(srcfile, 'rb') - src = f.read() - f.close() - - match = re.search("\nmd5_data = {\n([^}]+)}", src) - if not match: - print("Internal error!", file=sys.stderr) - sys.exit(2) - - src = src[:match.start(1)] + repl + src[match.end(1):] - f = open(srcfile, 'w') - f.write(src) - f.close() - - -if __name__ == '__main__': - if len(sys.argv) > 2 and sys.argv[1] == '--md5update': - update_md5(sys.argv[2:]) - else: - main(sys.argv[1:]) diff --git a/fake_pyrex/Pyrex/Distutils/__init__.py b/fake_pyrex/Pyrex/Distutils/__init__.py deleted file mode 100644 index 51c8e16b8e546..0000000000000 --- a/fake_pyrex/Pyrex/Distutils/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# work around broken setuptools monkey patching diff --git a/fake_pyrex/Pyrex/Distutils/build_ext.py b/fake_pyrex/Pyrex/Distutils/build_ext.py deleted file mode 100644 index 4f846f6282cbb..0000000000000 --- a/fake_pyrex/Pyrex/Distutils/build_ext.py +++ /dev/null @@ -1 +0,0 @@ -build_ext = "yes, it's there!" diff --git a/fake_pyrex/Pyrex/__init__.py b/fake_pyrex/Pyrex/__init__.py deleted file mode 100644 index 51c8e16b8e546..0000000000000 --- a/fake_pyrex/Pyrex/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# work around broken setuptools monkey patching diff --git a/pandas/__init__.py b/pandas/__init__.py index 0e7bc628fdb6a..dbc697410da80 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -29,7 +29,6 @@ _np_version_under1p9 = LooseVersion(_np_version) < '1.9' -from pandas.version import version as __version__ from pandas.info import __doc__ @@ -57,3 +56,8 @@ from pandas.util.print_versions import show_versions import pandas.util.testing +# use the closest tagged version if possible +from ._version import get_versions +v = get_versions() +__version__ = v.get('closest-tag',v['version']) +del get_versions, v diff --git a/pandas/_version.py b/pandas/_version.py new file mode 100644 index 0000000000000..61e9f3ff187ea --- /dev/null +++ b/pandas/_version.py @@ -0,0 +1,460 @@ + +# This file helps to compute a version number in source trees obtained from +# git-archive tarball (such as those provided by githubs download-from-tag +# feature). Distribution tarballs (built by setup.py sdist) and build +# directories (produced by setup.py build) will contain a much shorter file +# that just contains the computed version number. + +# This file is released into the public domain. Generated by +# versioneer-0.15 (https://github.com/warner/python-versioneer) + +import errno +import os +import re +import subprocess +import sys + + +def get_keywords(): + # these strings will be replaced by git during git-archive. + # setup.py/versioneer.py will grep for the variable names, so they must + # each be defined on a line of their own. _version.py will just call + # get_keywords(). + git_refnames = "$Format:%d$" + git_full = "$Format:%H$" + keywords = {"refnames": git_refnames, "full": git_full} + return keywords + + +class VersioneerConfig: + pass + + +def get_config(): + # these strings are filled in when 'setup.py versioneer' creates + # _version.py + cfg = VersioneerConfig() + cfg.VCS = "git" + cfg.style = "pep440" + cfg.tag_prefix = "v" + cfg.parentdir_prefix = "pandas-" + cfg.versionfile_source = "pandas/_version.py" + cfg.verbose = False + return cfg + + +class NotThisMethod(Exception): + pass + + +LONG_VERSION_PY = {} +HANDLERS = {} + + +def register_vcs_handler(vcs, method): # decorator + def decorate(f): + if vcs not in HANDLERS: + HANDLERS[vcs] = {} + HANDLERS[vcs][method] = f + return f + return decorate + + +def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): + assert isinstance(commands, list) + p = None + for c in commands: + try: + dispcmd = str([c] + args) + # remember shell=False, so use git.cmd on windows, not just git + p = subprocess.Popen([c] + args, cwd=cwd, stdout=subprocess.PIPE, + stderr=(subprocess.PIPE if hide_stderr + else None)) + break + except EnvironmentError: + e = sys.exc_info()[1] + if e.errno == errno.ENOENT: + continue + if verbose: + print("unable to run %s" % dispcmd) + print(e) + return None + else: + if verbose: + print("unable to find command, tried %s" % (commands,)) + return None + stdout = p.communicate()[0].strip() + if sys.version_info[0] >= 3: + stdout = stdout.decode() + if p.returncode != 0: + if verbose: + print("unable to run %s (error)" % dispcmd) + return None + return stdout + + +def versions_from_parentdir(parentdir_prefix, root, verbose): + # Source tarballs conventionally unpack into a directory that includes + # both the project name and a version string. + dirname = os.path.basename(root) + if not dirname.startswith(parentdir_prefix): + if verbose: + print("guessing rootdir is '%s', but '%s' doesn't start with " + "prefix '%s'" % (root, dirname, parentdir_prefix)) + raise NotThisMethod("rootdir doesn't start with parentdir_prefix") + return {"version": dirname[len(parentdir_prefix):], + "full-revisionid": None, + "dirty": False, "error": None} + + +@register_vcs_handler("git", "get_keywords") +def git_get_keywords(versionfile_abs): + # the code embedded in _version.py can just fetch the value of these + # keywords. When used from setup.py, we don't want to import _version.py, + # so we do it with a regexp instead. This function is not used from + # _version.py. + keywords = {} + try: + f = open(versionfile_abs, "r") + for line in f.readlines(): + if line.strip().startswith("git_refnames ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["refnames"] = mo.group(1) + if line.strip().startswith("git_full ="): + mo = re.search(r'=\s*"(.*)"', line) + if mo: + keywords["full"] = mo.group(1) + f.close() + except EnvironmentError: + pass + return keywords + + +@register_vcs_handler("git", "keywords") +def git_versions_from_keywords(keywords, tag_prefix, verbose): + if not keywords: + raise NotThisMethod("no keywords at all, weird") + refnames = keywords["refnames"].strip() + if refnames.startswith("$Format"): + if verbose: + print("keywords are unexpanded, not using") + raise NotThisMethod("unexpanded keywords, not a git-archive tarball") + refs = set([r.strip() for r in refnames.strip("()").split(",")]) + # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of + # just "foo-1.0". If we see a "tag: " prefix, prefer those. + TAG = "tag: " + tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) + if not tags: + # Either we're using git < 1.8.3, or there really are no tags. We use + # a heuristic: assume all version tags have a digit. The old git %d + # expansion behaves like git log --decorate=short and strips out the + # refs/heads/ and refs/tags/ prefixes that would let us distinguish + # between branches and tags. By ignoring refnames without digits, we + # filter out many common branch names like "release" and + # "stabilization", as well as "HEAD" and "master". + tags = set([r for r in refs if re.search(r'\d', r)]) + if verbose: + print("discarding '%s', no digits" % ",".join(refs-tags)) + if verbose: + print("likely tags: %s" % ",".join(sorted(tags))) + for ref in sorted(tags): + # sorting will prefer e.g. "2.0" over "2.0rc1" + if ref.startswith(tag_prefix): + r = ref[len(tag_prefix):] + if verbose: + print("picking %s" % r) + return {"version": r, + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": None + } + # no suitable tags, so version is "0+unknown", but full hex is still there + if verbose: + print("no suitable tags, using unknown + full revision id") + return {"version": "0+unknown", + "full-revisionid": keywords["full"].strip(), + "dirty": False, "error": "no suitable tags"} + + +@register_vcs_handler("git", "pieces_from_vcs") +def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): + # this runs 'git' from the root of the source tree. This only gets called + # if the git-archive 'subst' keywords were *not* expanded, and + # _version.py hasn't already been rewritten with a short version string, + # meaning we're inside a checked out source tree. + + if not os.path.exists(os.path.join(root, ".git")): + if verbose: + print("no .git in %s" % root) + raise NotThisMethod("no .git directory") + + GITS = ["git"] + if sys.platform == "win32": + GITS = ["git.cmd", "git.exe"] + # if there is a tag, this yields TAG-NUM-gHEX[-dirty] + # if there are no tags, this yields HEX[-dirty] (no NUM) + describe_out = run_command(GITS, ["describe", "--tags", "--dirty", + "--always", "--long"], + cwd=root) + # --long was added in git-1.5.5 + if describe_out is None: + raise NotThisMethod("'git describe' failed") + describe_out = describe_out.strip() + full_out = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) + if full_out is None: + raise NotThisMethod("'git rev-parse' failed") + full_out = full_out.strip() + + pieces = {} + pieces["long"] = full_out + pieces["short"] = full_out[:7] # maybe improved later + pieces["error"] = None + + # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] + # TAG might have hyphens. + git_describe = describe_out + + # look for -dirty suffix + dirty = git_describe.endswith("-dirty") + pieces["dirty"] = dirty + if dirty: + git_describe = git_describe[:git_describe.rindex("-dirty")] + + # now we have TAG-NUM-gHEX or HEX + + if "-" in git_describe: + # TAG-NUM-gHEX + mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) + if not mo: + # unparseable. Maybe git-describe is misbehaving? + pieces["error"] = ("unable to parse git-describe output: '%s'" + % describe_out) + return pieces + + # tag + full_tag = mo.group(1) + if not full_tag.startswith(tag_prefix): + if verbose: + fmt = "tag '%s' doesn't start with prefix '%s'" + print(fmt % (full_tag, tag_prefix)) + pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" + % (full_tag, tag_prefix)) + return pieces + pieces["closest-tag"] = full_tag[len(tag_prefix):] + + # distance: number of commits since tag + pieces["distance"] = int(mo.group(2)) + + # commit: short hex revision ID + pieces["short"] = mo.group(3) + + else: + # HEX: no tags + pieces["closest-tag"] = None + count_out = run_command(GITS, ["rev-list", "HEAD", "--count"], + cwd=root) + pieces["distance"] = int(count_out) # total number of commits + + return pieces + + +def plus_or_dot(pieces): + if "+" in pieces.get("closest-tag", ""): + return "." + return "+" + + +def render_pep440(pieces): + # now build up version string, with post-release "local version + # identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you + # get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty + + # exceptions: + # 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += plus_or_dot(pieces) + rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + else: + # exception #1 + rendered = "0+untagged.%d.g%s" % (pieces["distance"], + pieces["short"]) + if pieces["dirty"]: + rendered += ".dirty" + return rendered + + +def render_pep440_pre(pieces): + # TAG[.post.devDISTANCE] . No -dirty + + # exceptions: + # 1: no tags. 0.post.devDISTANCE + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += ".post.dev%d" % pieces["distance"] + else: + # exception #1 + rendered = "0.post.dev%d" % pieces["distance"] + return rendered + + +def render_pep440_post(pieces): + # TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that + # .dev0 sorts backwards (a dirty tree will appear "older" than the + # corresponding clean one), but you shouldn't be releasing software with + # -dirty anyways. + + # exceptions: + # 1: no tags. 0.postDISTANCE[.dev0] + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += plus_or_dot(pieces) + rendered += "g%s" % pieces["short"] + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + rendered += "+g%s" % pieces["short"] + return rendered + + +def render_pep440_old(pieces): + # TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. + + # exceptions: + # 1: no tags. 0.postDISTANCE[.dev0] + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"] or pieces["dirty"]: + rendered += ".post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + else: + # exception #1 + rendered = "0.post%d" % pieces["distance"] + if pieces["dirty"]: + rendered += ".dev0" + return rendered + + +def render_git_describe(pieces): + # TAG[-DISTANCE-gHEX][-dirty], like 'git describe --tags --dirty + # --always' + + # exceptions: + # 1: no tags. HEX[-dirty] (note: no 'g' prefix) + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + if pieces["distance"]: + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render_git_describe_long(pieces): + # TAG-DISTANCE-gHEX[-dirty], like 'git describe --tags --dirty + # --always -long'. The distance/hash is unconditional. + + # exceptions: + # 1: no tags. HEX[-dirty] (note: no 'g' prefix) + + if pieces["closest-tag"]: + rendered = pieces["closest-tag"] + rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) + else: + # exception #1 + rendered = pieces["short"] + if pieces["dirty"]: + rendered += "-dirty" + return rendered + + +def render(pieces, style): + if pieces["error"]: + return {"version": "unknown", + "full-revisionid": pieces.get("long"), + "dirty": None, + "error": pieces["error"]} + + if not style or style == "default": + style = "pep440" # the default + + if style == "pep440": + rendered = render_pep440(pieces) + elif style == "pep440-pre": + rendered = render_pep440_pre(pieces) + elif style == "pep440-post": + rendered = render_pep440_post(pieces) + elif style == "pep440-old": + rendered = render_pep440_old(pieces) + elif style == "git-describe": + rendered = render_git_describe(pieces) + elif style == "git-describe-long": + rendered = render_git_describe_long(pieces) + else: + raise ValueError("unknown style '%s'" % style) + + return {"version": rendered, "full-revisionid": pieces["long"], + "dirty": pieces["dirty"], "error": None} + + +def get_versions(): + # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have + # __file__, we can work backwards from there to the root. Some + # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which + # case we can only use expanded keywords. + + cfg = get_config() + verbose = cfg.verbose + + try: + return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, + verbose) + except NotThisMethod: + pass + + try: + root = os.path.realpath(__file__) + # versionfile_source is the relative path from the top of the source + # tree (where the .git directory might live) to this file. Invert + # this to find the root from __file__. + for i in cfg.versionfile_source.split('/'): + root = os.path.dirname(root) + except NameError: + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to find root of source tree"} + + try: + pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) + return render(pieces, cfg.style) + except NotThisMethod: + pass + + try: + if cfg.parentdir_prefix: + return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) + except NotThisMethod: + pass + + return {"version": "0+unknown", "full-revisionid": None, + "dirty": None, + "error": "unable to compute version"} diff --git a/pandas/algos.pyx b/pandas/algos.pyx index 5f68c1ee26e87..9b6bdf57d4509 100644 --- a/pandas/algos.pyx +++ b/pandas/algos.pyx @@ -2157,6 +2157,8 @@ def group_nth_bin_object(ndarray[object, ndim=2] out, nobs = np.zeros(( out).shape, dtype=np.float64) resx = np.empty(( out).shape, dtype=object) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -2247,6 +2249,8 @@ def group_last_bin_object(ndarray[object, ndim=2] out, nobs = np.zeros(( out).shape, dtype=np.float64) resx = np.empty(( out).shape, dtype=object) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index 2a273629544cb..2ac81f15a6d6c 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -14,7 +14,7 @@ * Uses the original method if available, otherwise uses items, keys, values. * types: * text_type: unicode in Python 2, str in Python 3 - * binary_type: str in Python 2, bythes in Python 3 + * binary_type: str in Python 2, bytes in Python 3 * string_types: basestring in Python 2, str in Python 3 * bind_method: binds functions to classes * add_metaclass(metaclass) - class decorator that recreates class with with the @@ -37,7 +37,6 @@ import types PY3 = (sys.version_info[0] >= 3) -PY3_2 = sys.version_info[:2] == (3, 2) PY2 = sys.version_info[0] == 2 diff --git a/pandas/computation/align.py b/pandas/computation/align.py index 2e0845bddf7e2..9834dd1a9e7fc 100644 --- a/pandas/computation/align.py +++ b/pandas/computation/align.py @@ -172,12 +172,11 @@ def _reconstruct_object(typ, obj, axes, dtype): ret_value = res_t.type(obj) else: ret_value = typ(obj).astype(res_t) - - try: - ret = ret_value.item() - except (ValueError, IndexError): - # XXX: we catch IndexError to absorb a - # regression in numpy 1.7.0 - # fixed by numpy/numpy@04b89c63 - ret = ret_value - return ret + # The condition is to distinguish 0-dim array (returned in case of scalar) + # and 1 element array + # e.g. np.array(0) and np.array([0]) + if len(obj.shape) == 1 and len(obj) == 1: + if not isinstance(ret_value, np.ndarray): + ret_value = np.array([ret_value]).astype(res_t) + + return ret_value diff --git a/pandas/computation/tests/test_eval.py b/pandas/computation/tests/test_eval.py index 8f82e2eaea711..4f998319d922d 100644 --- a/pandas/computation/tests/test_eval.py +++ b/pandas/computation/tests/test_eval.py @@ -10,7 +10,7 @@ from numpy.random import randn, rand, randint import numpy as np -from numpy.testing import assert_array_equal, assert_allclose +from numpy.testing import assert_allclose from numpy.testing.decorators import slow import pandas as pd @@ -163,9 +163,7 @@ def test_floor_division(self): self.check_floor_division(lhs, '//', rhs) def test_pow(self): - import platform - if platform.system() == 'Windows': - raise nose.SkipTest('not testing pow on Windows') + tm._skip_if_windows() # odd failure on win32 platform, so skip for lhs, rhs in product(self.lhses, self.rhses): @@ -222,7 +220,7 @@ def check_complex_cmp_op(self, lhs, cmp1, rhs, binop, cmp2): expected = _eval_single_bin( lhs_new, binop, rhs_new, self.engine) result = pd.eval(ex, engine=self.engine, parser=self.parser) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def check_chained_cmp_op(self, lhs, cmp1, mid, cmp2, rhs): skip_these = _scalar_skip @@ -242,7 +240,7 @@ def check_operands(left, right, cmp_op): for ex in (ex1, ex2, ex3): result = pd.eval(ex, engine=self.engine, parser=self.parser) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def check_simple_cmp_op(self, lhs, cmp1, rhs): ex = 'lhs {0} rhs'.format(cmp1) @@ -253,13 +251,13 @@ def check_simple_cmp_op(self, lhs, cmp1, rhs): else: expected = _eval_single_bin(lhs, cmp1, rhs, self.engine) result = pd.eval(ex, engine=self.engine, parser=self.parser) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def check_binary_arith_op(self, lhs, arith1, rhs): ex = 'lhs {0} rhs'.format(arith1) result = pd.eval(ex, engine=self.engine, parser=self.parser) expected = _eval_single_bin(lhs, arith1, rhs, self.engine) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) ex = 'lhs {0} rhs {0} rhs'.format(arith1) result = pd.eval(ex, engine=self.engine, parser=self.parser) nlhs = _eval_single_bin(lhs, arith1, rhs, @@ -275,7 +273,7 @@ def check_alignment(self, result, nlhs, ghs, op): pass else: expected = self.ne.evaluate('nlhs {0} ghs'.format(op)) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) # modulus, pow, and floor division require special casing @@ -293,7 +291,7 @@ def check_floor_division(self, lhs, arith1, rhs): if self.engine == 'python': res = pd.eval(ex, engine=self.engine, parser=self.parser) expected = lhs // rhs - assert_array_equal(res, expected) + tm.assert_numpy_array_equal(res, expected) else: self.assertRaises(TypeError, pd.eval, ex, local_dict={'lhs': lhs, 'rhs': rhs}, @@ -327,8 +325,8 @@ def check_pow(self, lhs, arith1, rhs): if (np.isscalar(lhs) and np.isscalar(rhs) and _is_py3_complex_incompat(result, expected)): - self.assertRaises(AssertionError, assert_array_equal, result, - expected) + self.assertRaises(AssertionError, tm.assert_numpy_array_equal, + result, expected) else: assert_allclose(result, expected) @@ -347,12 +345,12 @@ def check_single_invert_op(self, lhs, cmp1, rhs): elb = np.array([bool(el)]) expected = ~elb result = pd.eval('~elb', engine=self.engine, parser=self.parser) - assert_array_equal(expected, result) + tm.assert_numpy_array_equal(expected, result) for engine in self.current_engines: tm.skip_if_no_ne(engine) - assert_array_equal(result, pd.eval('~elb', engine=engine, - parser=self.parser)) + tm.assert_numpy_array_equal(result, pd.eval('~elb', engine=engine, + parser=self.parser)) def check_compound_invert_op(self, lhs, cmp1, rhs): skip_these = 'in', 'not in' @@ -372,13 +370,13 @@ def check_compound_invert_op(self, lhs, cmp1, rhs): else: expected = ~expected result = pd.eval(ex, engine=self.engine, parser=self.parser) - assert_array_equal(expected, result) + tm.assert_numpy_array_equal(expected, result) # make sure the other engines work the same as this one for engine in self.current_engines: tm.skip_if_no_ne(engine) ev = pd.eval(ex, engine=self.engine, parser=self.parser) - assert_array_equal(ev, result) + tm.assert_numpy_array_equal(ev, result) def ex(self, op, var_name='lhs'): return '{0}{1}'.format(op, var_name) @@ -622,6 +620,38 @@ def test_disallow_scalar_bool_ops(self): with tm.assertRaises(NotImplementedError): pd.eval(ex, engine=self.engine, parser=self.parser) + def test_identical(self): + # GH 10546 + x = 1 + result = pd.eval('x', engine=self.engine, parser=self.parser) + self.assertEqual(result, 1) + self.assertTrue(np.isscalar(result)) + + x = 1.5 + result = pd.eval('x', engine=self.engine, parser=self.parser) + self.assertEqual(result, 1.5) + self.assertTrue(np.isscalar(result)) + + x = False + result = pd.eval('x', engine=self.engine, parser=self.parser) + self.assertEqual(result, False) + self.assertTrue(np.isscalar(result)) + + x = np.array([1]) + result = pd.eval('x', engine=self.engine, parser=self.parser) + tm.assert_numpy_array_equal(result, np.array([1])) + self.assertEqual(result.shape, (1, )) + + x = np.array([1.5]) + result = pd.eval('x', engine=self.engine, parser=self.parser) + tm.assert_numpy_array_equal(result, np.array([1.5])) + self.assertEqual(result.shape, (1, )) + + x = np.array([False]) + result = pd.eval('x', engine=self.engine, parser=self.parser) + tm.assert_numpy_array_equal(result, np.array([False])) + self.assertEqual(result.shape, (1, )) + class TestEvalNumexprPython(TestEvalNumexprPandas): @@ -677,7 +707,7 @@ def check_alignment(self, result, nlhs, ghs, op): pass else: expected = eval('nlhs {0} ghs'.format(op)) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) class TestEvalPythonPandas(TestEvalPythonPython): @@ -1088,10 +1118,10 @@ def test_truediv(self): if PY3: res = self.eval(ex, truediv=False) - assert_array_equal(res, np.array([1.0])) + tm.assert_numpy_array_equal(res, np.array([1.0])) res = self.eval(ex, truediv=True) - assert_array_equal(res, np.array([1.0])) + tm.assert_numpy_array_equal(res, np.array([1.0])) res = self.eval('1 / 2', truediv=True) expec = 0.5 @@ -1110,10 +1140,10 @@ def test_truediv(self): self.assertEqual(res, expec) else: res = self.eval(ex, truediv=False) - assert_array_equal(res, np.array([1])) + tm.assert_numpy_array_equal(res, np.array([1])) res = self.eval(ex, truediv=True) - assert_array_equal(res, np.array([1.0])) + tm.assert_numpy_array_equal(res, np.array([1.0])) res = self.eval('1 / 2', truediv=True) expec = 0.5 @@ -1416,8 +1446,8 @@ class TestScope(object): def check_global_scope(self, e, engine, parser): tm.skip_if_no_ne(engine) - assert_array_equal(_var_s * 2, pd.eval(e, engine=engine, - parser=parser)) + tm.assert_numpy_array_equal(_var_s * 2, pd.eval(e, engine=engine, + parser=parser)) def test_global_scope(self): e = '_var_s * 2' diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index c97d459fb96df..0b11a2bae3973 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -36,7 +36,7 @@ def match(to_match, values, na_sentinel=-1): values = np.array(values, dtype='O') f = lambda htype, caster: _match_generic(to_match, values, htype, caster) - result = _hashtable_algo(f, values.dtype) + result = _hashtable_algo(f, values.dtype, np.int64) if na_sentinel != -1: @@ -66,7 +66,7 @@ def unique(values): return _hashtable_algo(f, values.dtype) -def _hashtable_algo(f, dtype): +def _hashtable_algo(f, dtype, return_dtype=None): """ f(HashTable, type_caster) -> result """ @@ -74,6 +74,12 @@ def _hashtable_algo(f, dtype): return f(htable.Float64HashTable, com._ensure_float64) elif com.is_integer_dtype(dtype): return f(htable.Int64HashTable, com._ensure_int64) + elif com.is_datetime64_dtype(dtype): + return_dtype = return_dtype or 'M8[ns]' + return f(htable.Int64HashTable, com._ensure_int64).view(return_dtype) + elif com.is_timedelta64_dtype(dtype): + return_dtype = return_dtype or 'm8[ns]' + return f(htable.Int64HashTable, com._ensure_int64).view(return_dtype) else: return f(htable.PyObjectHashTable, com._ensure_object) @@ -202,6 +208,7 @@ def value_counts(values, sort=True, ascending=False, normalize=False, from pandas.tools.tile import cut from pandas.tseries.period import PeriodIndex + name = getattr(values, 'name', None) values = Series(values).values if bins is not None: @@ -222,10 +229,10 @@ def value_counts(values, sort=True, ascending=False, normalize=False, if com.is_datetime_or_timedelta_dtype(dtype) or is_period: if is_period: - values = PeriodIndex(values) + values = PeriodIndex(values, name=name) values = values.view(np.int64) - keys, counts = htable.value_count_int64(values) + keys, counts = htable.value_count_scalar64(values, dropna) if dropna: from pandas.tslib import iNaT @@ -237,7 +244,10 @@ def value_counts(values, sort=True, ascending=False, normalize=False, elif com.is_integer_dtype(dtype): values = com._ensure_int64(values) - keys, counts = htable.value_count_int64(values) + keys, counts = htable.value_count_scalar64(values, dropna) + elif com.is_float_dtype(dtype): + values = com._ensure_float64(values) + keys, counts = htable.value_count_scalar64(values, dropna) else: values = com._ensure_object(values) @@ -247,7 +257,7 @@ def value_counts(values, sort=True, ascending=False, normalize=False, keys = np.insert(keys, 0, np.NaN) counts = np.insert(counts, 0, mask.sum()) - result = Series(counts, index=com._values_from_object(keys)) + result = Series(counts, index=com._values_from_object(keys), name=name) if bins is not None: # TODO: This next line should be more efficient diff --git a/pandas/core/base.py b/pandas/core/base.py index 540b900844a9e..6d1c89a7a2f89 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -6,7 +6,7 @@ from pandas.core import common as com import pandas.core.nanops as nanops import pandas.lib as lib -from pandas.util.decorators import Appender, cache_readonly +from pandas.util.decorators import Appender, cache_readonly, deprecate_kwarg from pandas.core.strings import StringMethods from pandas.core.common import AbstractMethodError @@ -431,10 +431,10 @@ def value_counts(self, normalize=False, sort=True, ascending=False, if isinstance(self, PeriodIndex): # preserve freq - result.index = self._simple_new(result.index.values, self.name, + result.index = self._simple_new(result.index.values, freq=self.freq) elif isinstance(self, DatetimeIndex): - result.index = self._simple_new(result.index.values, self.name, + result.index = self._simple_new(result.index.values, tz=getattr(self, 'tz', None)) return result @@ -543,8 +543,12 @@ def _dir_deletions(self): Parameters ---------- - take_last : boolean, default False - Take the last observed index in a group. Default first + + keep : {'first', 'last', False}, default 'first' + - ``first`` : Drop duplicates except for the first occurrence. + - ``last`` : Drop duplicates except for the last occurrence. + - False : Drop all duplicates. + take_last : deprecated %(inplace)s Returns @@ -552,9 +556,10 @@ def _dir_deletions(self): deduplicated : %(klass)s """) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['drop_duplicates'] % _indexops_doc_kwargs) - def drop_duplicates(self, take_last=False, inplace=False): - duplicated = self.duplicated(take_last=take_last) + def drop_duplicates(self, keep='first', inplace=False): + duplicated = self.duplicated(keep=keep) result = self[np.logical_not(duplicated)] if inplace: return self._update_inplace(result) @@ -566,18 +571,22 @@ def drop_duplicates(self, take_last=False, inplace=False): Parameters ---------- - take_last : boolean, default False - Take the last observed index in a group. Default first + keep : {'first', 'last', False}, default 'first' + - ``first`` : Mark duplicates as ``True`` except for the first occurrence. + - ``last`` : Mark duplicates as ``True`` except for the last occurrence. + - False : Mark all duplicates as ``True``. + take_last : deprecated Returns ------- duplicated : %(duplicated)s """) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['duplicated'] % _indexops_doc_kwargs) - def duplicated(self, take_last=False): + def duplicated(self, keep='first'): keys = com._ensure_object(self.values) - duplicated = lib.duplicated(keys, take_last=take_last) + duplicated = lib.duplicated(keys, keep=keep) try: return self._constructor(duplicated, index=self.index).__finalize__(self) diff --git a/pandas/core/categorical.py b/pandas/core/categorical.py index a9e5d1f3f0ebd..af3d13e1ec4a9 100644 --- a/pandas/core/categorical.py +++ b/pandas/core/categorical.py @@ -12,7 +12,7 @@ import pandas.core.common as com from pandas.util.decorators import cache_readonly, deprecate_kwarg -from pandas.core.common import (CategoricalDtype, ABCSeries, ABCIndexClass, ABCPeriodIndex, ABCCategoricalIndex, +from pandas.core.common import (CategoricalDtype, ABCSeries, ABCIndexClass, ABCCategoricalIndex, isnull, notnull, is_dtype_equal, is_categorical_dtype, is_integer_dtype, is_object_dtype, _possibly_infer_to_datetimelike, get_dtype_kinds, @@ -147,9 +147,6 @@ class Categorical(PandasObject): ordered : boolean, (default False) Whether or not this categorical is treated as a ordered categorical. If not given, the resulting categorical will not be ordered. - name : str, optional - Name for the Categorical variable. If name is None, will attempt - to infer from values. Attributes ---------- @@ -159,8 +156,6 @@ class Categorical(PandasObject): The codes (integer positions, which point to the categories) of this categorical, read only. ordered : boolean Whether or not this Categorical is ordered. - name : string - The name of this Categorical. Raises ------ @@ -182,7 +177,7 @@ class Categorical(PandasObject): [a, b, c, a, b, c] Categories (3, object): [a < b < c] - >>> a = Categorical(['a','b','c','a','b','c'], ['c', 'b', 'a']) + >>> a = Categorical(['a','b','c','a','b','c'], ['c', 'b', 'a'], ordered=True) >>> a.min() 'c' """ @@ -205,7 +200,6 @@ class Categorical(PandasObject): # For comparisons, so that numpy uses our implementation if the compare ops, which raise __array_priority__ = 1000 _typ = 'categorical' - name = None def __init__(self, values, categories=None, ordered=False, name=None, fastpath=False, levels=None): @@ -213,23 +207,24 @@ def __init__(self, values, categories=None, ordered=False, name=None, fastpath=F if fastpath: # fast path self._codes = _coerce_indexer_dtype(values, categories) - self.name = name self.categories = categories self._ordered = ordered return - if name is None: - name = getattr(values, 'name', None) + if not name is None: + msg = "the 'name' keyword is removed, use 'name' with consumers of the " \ + "categorical instead (e.g. 'Series(cat, name=\"something\")'" + warn(msg, UserWarning, stacklevel=2) # TODO: Remove after deprecation period in 2017/ after 0.18 if not levels is None: warn("Creating a 'Categorical' with 'levels' is deprecated, use 'categories' instead", - FutureWarning) + FutureWarning, stacklevel=2) if categories is None: categories = levels else: raise ValueError("Cannot pass in both 'categories' and (deprecated) 'levels', " - "use only 'categories'") + "use only 'categories'", stacklevel=2) # sanitize input if is_categorical_dtype(values): @@ -293,21 +288,20 @@ def __init__(self, values, categories=None, ordered=False, name=None, fastpath=F # TODO: check for old style usage. These warnings should be removes after 0.18/ in 2016 if is_integer_dtype(values) and not is_integer_dtype(categories): warn("Values and categories have different dtypes. Did you mean to use\n" - "'Categorical.from_codes(codes, categories)'?", RuntimeWarning) + "'Categorical.from_codes(codes, categories)'?", RuntimeWarning, stacklevel=2) if len(values) and is_integer_dtype(values) and (codes == -1).all(): warn("None of the categories were found in values. Did you mean to use\n" - "'Categorical.from_codes(codes, categories)'?", RuntimeWarning) + "'Categorical.from_codes(codes, categories)'?", RuntimeWarning, stacklevel=2) self.set_ordered(ordered or False, inplace=True) self.categories = categories - self.name = name self._codes = _coerce_indexer_dtype(codes, categories) def copy(self): """ Copy constructor. """ return Categorical(values=self._codes.copy(),categories=self.categories, - name=self.name, ordered=self.ordered, fastpath=True) + ordered=self.ordered, fastpath=True) def astype(self, dtype): """ coerce this type to another dtype """ @@ -373,9 +367,12 @@ def from_codes(cls, codes, categories, ordered=False, name=None): ordered : boolean, (default False) Whether or not this categorical is treated as a ordered categorical. If not given, the resulting categorical will be unordered. - name : str, optional - Name for the Categorical variable. """ + if not name is None: + msg = "the 'name' keyword is removed, use 'name' with consumers of the " \ + "categorical instead (e.g. 'Series(cat, name=\"something\")'" + warn(msg, UserWarning, stacklevel=2) + try: codes = np.asarray(codes, np.int64) except: @@ -386,7 +383,7 @@ def from_codes(cls, codes, categories, ordered=False, name=None): if len(codes) and (codes.max() >= len(categories) or codes.min() < -1): raise ValueError("codes need to be between -1 and len(categories)-1") - return Categorical(codes, categories=categories, ordered=ordered, name=name, fastpath=True) + return Categorical(codes, categories=categories, ordered=ordered, fastpath=True) _codes = None @@ -416,8 +413,7 @@ def _get_labels(self): Deprecated, use .codes! """ - import warnings - warnings.warn("'labels' is deprecated. Use 'codes' instead", FutureWarning) + warn("'labels' is deprecated. Use 'codes' instead", FutureWarning, stacklevel=3) return self.codes labels = property(fget=_get_labels, fset=_set_codes) @@ -464,12 +460,12 @@ def _get_categories(self): def _set_levels(self, levels): """ set new levels (deprecated, use "categories") """ - warn("Assigning to 'levels' is deprecated, use 'categories'", FutureWarning) + warn("Assigning to 'levels' is deprecated, use 'categories'", FutureWarning, stacklevel=3) self.categories = levels def _get_levels(self): """ Gets the levels (deprecated, use "categories") """ - warn("Accessing 'levels' is deprecated, use 'categories'", FutureWarning) + warn("Accessing 'levels' is deprecated, use 'categories'", FutureWarning, stacklevel=3) return self.categories # TODO: Remove after deprecation period in 2017/ after 0.18 @@ -479,7 +475,8 @@ def _get_levels(self): def _set_ordered(self, value): """ Sets the ordered attribute to the boolean value """ - warn("Setting 'ordered' directly is deprecated, use 'set_ordered'", FutureWarning) + warn("Setting 'ordered' directly is deprecated, use 'set_ordered'", FutureWarning, + stacklevel=3) self.set_ordered(value, inplace=True) def set_ordered(self, value, inplace=False): @@ -820,6 +817,35 @@ def shape(self): return tuple([len(self._codes)]) + def shift(self, periods): + """ + Shift Categorical by desired number of periods. + + Parameters + ---------- + periods : int + Number of periods to move, can be positive or negative + + Returns + ------- + shifted : Categorical + """ + # since categoricals always have ndim == 1, an axis parameter + # doesnt make any sense here. + codes = self.codes + if codes.ndim > 1: + raise NotImplementedError("Categorical with ndim > 1.") + if np.prod(codes.shape) and (periods != 0): + codes = np.roll(codes, com._ensure_platform_int(periods), axis=0) + if periods > 0: + codes[:periods] = -1 + else: + codes[periods:] = -1 + + return Categorical.from_codes(codes, + categories=self.categories, + ordered=self.ordered) + def __array__(self, dtype=None): """ The numpy array interface. @@ -1001,19 +1027,22 @@ def value_counts(self, dropna=True): """ import pandas.hashtable as htable from pandas.core.series import Series + from pandas.core.index import CategoricalIndex cat = self.dropna() if dropna else self - keys, counts = htable.value_count_int64(com._ensure_int64(cat._codes)) + keys, counts = htable.value_count_scalar64(com._ensure_int64(cat._codes), dropna) result = Series(counts, index=keys) ix = np.arange(len(cat.categories), dtype='int64') if not dropna and -1 in keys: ix = np.append(ix, -1) result = result.reindex(ix, fill_value=0) - result.index = (np.append(cat.categories, np.nan) + index = (np.append(cat.categories, np.nan) if not dropna and -1 in keys else cat.categories) + result.index = CategoricalIndex(index, self.categories, self.ordered) + return result def get_values(self): @@ -1024,15 +1053,12 @@ def get_values(self): Returns ------- values : numpy array - A numpy array of the same dtype as categorical.categories.dtype or dtype string if - periods + A numpy array of the same dtype as categorical.categories.dtype or + Index if datetime / periods """ - - # if we are a period index, return a string repr - if isinstance(self.categories, ABCPeriodIndex): - return take_1d(np.array(self.categories.to_native_types(), dtype=object), - self._codes) - + # if we are a datetime and period index, return Index to keep metadata + if com.is_datetimelike(self.categories): + return self.categories.take(self._codes) return np.array(self) def check_for_ordered(self, op): @@ -1111,7 +1137,7 @@ def order(self, inplace=False, ascending=True, na_position='last'): return else: return Categorical(values=codes,categories=self.categories, ordered=self.ordered, - name=self.name, fastpath=True) + fastpath=True) def sort(self, inplace=True, ascending=True, na_position='last'): @@ -1237,7 +1263,7 @@ def fillna(self, value=None, method=None, limit=None): values[mask] = self.categories.get_loc(value) return Categorical(values, categories=self.categories, ordered=self.ordered, - name=self.name, fastpath=True) + fastpath=True) def take_nd(self, indexer, allow_fill=True, fill_value=None): """ Take the codes by the indexer, fill with the fill_value. @@ -1251,7 +1277,7 @@ def take_nd(self, indexer, allow_fill=True, fill_value=None): codes = take_1d(self._codes, indexer, allow_fill=True, fill_value=-1) result = Categorical(codes, categories=self.categories, ordered=self.ordered, - name=self.name, fastpath=True) + fastpath=True) return result take = take_nd @@ -1271,7 +1297,7 @@ def _slice(self, slicer): _codes = self._codes[slicer] return Categorical(values=_codes,categories=self.categories, ordered=self.ordered, - name=self.name, fastpath=True) + fastpath=True) def __len__(self): """The length of this Categorical.""" @@ -1279,14 +1305,13 @@ def __len__(self): def __iter__(self): """Returns an Iterator over the values of this Categorical.""" - return iter(np.array(self)) + return iter(self.get_values()) def _tidy_repr(self, max_vals=10, footer=True): """ a short repr displaying only max_vals and an optional (but default footer) """ num = max_vals // 2 - head = self[:num]._get_repr(length=False, name=False, footer=False) + head = self[:num]._get_repr(length=False, footer=False) tail = self[-(max_vals - num):]._get_repr(length=False, - name=False, footer=False) result = '%s, ..., %s' % (head[:-1], tail[1:]) @@ -1300,7 +1325,7 @@ def _repr_categories(self): max_categories = (10 if get_option("display.max_categories") == 0 else get_option("display.max_categories")) from pandas.core import format as fmt - category_strs = fmt.format_array(self.categories.get_values(), None) + category_strs = fmt.format_array(self.categories, None) if len(category_strs) > max_categories: num = max_categories // 2 head = category_strs[:num] @@ -1315,8 +1340,9 @@ def _repr_categories_info(self): """ Returns a string representation of the footer.""" category_strs = self._repr_categories() - levheader = "Categories (%d, %s): " % (len(self.categories), - self.categories.dtype) + dtype = getattr(self.categories, 'dtype_str', str(self.categories.dtype)) + + levheader = "Categories (%d, %s): " % (len(self.categories), dtype) width, height = get_terminal_size() max_width = get_option("display.width") or width if com.in_ipython_frontend(): @@ -1324,13 +1350,14 @@ def _repr_categories_info(self): max_width = 0 levstring = "" start = True - cur_col_len = len(levheader) + cur_col_len = len(levheader) # header sep_len, sep = (3, " < ") if self.ordered else (2, ", ") + linesep = sep.rstrip() + "\n" # remove whitespace for val in category_strs: if max_width != 0 and cur_col_len + sep_len + len(val) > max_width: - levstring += "\n" + (" "* len(levheader)) - cur_col_len = len(levheader) - if not start: + levstring += linesep + (" " * (len(levheader) + 1)) + cur_col_len = len(levheader) + 1 # header + a whitespace + elif not start: levstring += sep cur_col_len += len(val) levstring += val @@ -1340,14 +1367,11 @@ def _repr_categories_info(self): def _repr_footer(self): - namestr = "Name: %s, " % self.name if self.name is not None else "" - return u('%sLength: %d\n%s') % (namestr, - len(self), self._repr_categories_info()) + return u('Length: %d\n%s') % (len(self), self._repr_categories_info()) - def _get_repr(self, name=False, length=True, na_rep='NaN', footer=True): + def _get_repr(self, length=True, na_rep='NaN', footer=True): from pandas.core import format as fmt formatter = fmt.CategoricalFormatter(self, - name=name, length=length, na_rep=na_rep, footer=footer) @@ -1360,11 +1384,9 @@ def __unicode__(self): if len(self._codes) > _maxlen: result = self._tidy_repr(_maxlen) elif len(self._codes) > 0: - result = self._get_repr(length=len(self) > _maxlen, - name=True) + result = self._get_repr(length=len(self) > _maxlen) else: - result = '[], %s' % self._get_repr(name=True, - length=False, + result = '[], %s' % self._get_repr(length=False, footer=True, ).replace("\n",", ") @@ -1533,32 +1555,40 @@ def mode(self): import pandas.hashtable as htable good = self._codes != -1 result = Categorical(sorted(htable.mode_int64(_ensure_int64(self._codes[good]))), - categories=self.categories,ordered=self.ordered, name=self.name, - fastpath=True) + categories=self.categories,ordered=self.ordered, fastpath=True) return result def unique(self): """ - Return the unique values. + Return the ``Categorical`` which ``categories`` and ``codes`` are unique. + Unused categories are NOT returned. - Unused categories are NOT returned. Unique values are returned in order - of appearance. + - unordered category: values and categories are sorted by appearance + order. + - ordered category: values are sorted by appearance order, categories + keeps existing order. Returns ------- - unique values : array + unique values : ``Categorical`` """ + from pandas.core.nanops import unique1d # unlike np.unique, unique1d does not sort unique_codes = unique1d(self.codes) - return take_1d(self.categories.values, unique_codes) + cat = self.copy() + # keep nan in codes + cat._codes = unique_codes + # exclude nan from indexer for categories + take_codes = unique_codes[unique_codes != -1] + if self.ordered: + take_codes = sorted(take_codes) + return cat.set_categories(cat.categories.take(take_codes)) def equals(self, other): """ Returns True if categorical arrays are equal. - The name of the `Categorical` is not compared! - Parameters ---------- other : `Categorical` @@ -1567,7 +1597,6 @@ def equals(self, other): ------- are_equal : boolean """ - # TODO: should this also test if name is equal? return self.is_dtype_equal(other) and np.array_equal(self._codes, other._codes) def is_dtype_equal(self, other): @@ -1618,7 +1647,7 @@ def repeat(self, repeats): """ codes = self._codes.repeat(repeats) return Categorical(values=codes, categories=self.categories, - ordered=self.ordered, name=self.name, fastpath=True) + ordered=self.ordered, fastpath=True) ##### The Series.cat accessor ##### @@ -1667,7 +1696,6 @@ def _delegate_method(self, name, *args, **kwargs): if not res is None: return Series(res, index=self.index) -# TODO: remove levels after the deprecation period CategoricalAccessor._add_delegate_accessors(delegate=Categorical, accessors=["categories", "ordered"], typ='property') @@ -1715,17 +1743,20 @@ def _convert_to_list_like(list_like): return [list_like] def _concat_compat(to_concat, axis=0): - """ - provide concatenation of an object/categorical array of arrays each of which is a single dtype + """Concatenate an object/categorical array of arrays, each of which is a + single dtype Parameters ---------- to_concat : array of arrays - axis : axis to provide concatenation + axis : int + Axis to provide concatenation in the current implementation this is + always 0, e.g. we only have 1D categoricals Returns ------- - a single array, preserving the combined dtypes + Categorical + A single array, preserving the combined dtypes """ def convert_categorical(x): @@ -1734,31 +1765,34 @@ def convert_categorical(x): return x.get_values() return x.ravel() - typs = get_dtype_kinds(to_concat) - if not len(typs-set(['object','category'])): - - # we only can deal with object & category types - pass - - else: - + if get_dtype_kinds(to_concat) - set(['object', 'category']): # convert to object type and perform a regular concat from pandas.core.common import _concat_compat - return _concat_compat([ np.array(x,copy=False).astype('object') for x in to_concat ],axis=axis) + return _concat_compat([np.array(x, copy=False, dtype=object) + for x in to_concat], axis=0) - # we could have object blocks and categorical's here - # if we only have a single cateogoricals then combine everything + # we could have object blocks and categoricals here + # if we only have a single categoricals then combine everything # else its a non-compat categorical - categoricals = [ x for x in to_concat if is_categorical_dtype(x.dtype) ] - objects = [ x for x in to_concat if is_object_dtype(x.dtype) ] + categoricals = [x for x in to_concat if is_categorical_dtype(x.dtype)] # validate the categories - categories = None - for x in categoricals: - if categories is None: - categories = x.categories - if not categories.equals(x.categories): + categories = categoricals[0] + rawcats = categories.categories + for x in categoricals[1:]: + if not categories.is_dtype_equal(x): raise ValueError("incompatible categories in categorical concat") - # concat them - return Categorical(np.concatenate([ convert_categorical(x) for x in to_concat ],axis=axis), categories=categories) + # we've already checked that all categoricals are the same, so if their + # length is equal to the input then we have all the same categories + if len(categoricals) == len(to_concat): + # concating numeric types is much faster than concating object types + # and fastpath takes a shorter path through the constructor + return Categorical(np.concatenate([x.codes for x in to_concat], axis=0), + rawcats, + ordered=categoricals[0].ordered, + fastpath=True) + else: + concatted = np.concatenate(list(map(convert_categorical, to_concat)), + axis=0) + return Categorical(concatted, rawcats) diff --git a/pandas/core/common.py b/pandas/core/common.py index 84ef421128cd0..aaa341240f538 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -47,7 +47,7 @@ def __init__(self, class_instance): self.class_instance = class_instance def __str__(self): - return "This method must be defined on the concrete class of " \ + return "This method must be defined in the concrete class of " \ + self.class_instance.__class__.__name__ _POSSIBLY_CAST_DTYPES = set([np.dtype(t).name @@ -113,30 +113,6 @@ def __instancecheck__(cls, inst): ABCGeneric = _ABCGeneric("ABCGeneric", tuple(), {}) -def bind_method(cls, name, func): - """Bind a method to class, python 2 and python 3 compatible. - - Parameters - ---------- - - cls : type - class to receive bound method - name : basestring - name of method on class instance - func : function - function to be bound as method - - - Returns - ------- - None - """ - # only python 2 has bound/unbound method issue - if not compat.PY3: - setattr(cls, name, types.MethodType(func, None, cls)) - else: - setattr(cls, name, func) - class CategoricalDtypeType(type): """ the type of CategoricalDtype, this metaclass determines subclass ability @@ -462,6 +438,10 @@ def array_equivalent(left, right, strict_nan=False): if issubclass(left.dtype.type, (np.floating, np.complexfloating)): return ((left == right) | (np.isnan(left) & np.isnan(right))).all() + # numpy will will not allow this type of datetimelike vs integer comparison + elif is_datetimelike_v_numeric(left, right): + return False + # NaNs cannot occur otherwise. return np.array_equal(left, right) @@ -782,6 +762,11 @@ def take_nd(arr, indexer, axis=0, out=None, fill_value=np.nan, will be done. This short-circuits computation of a mask. Result is undefined if allow_fill == False and -1 is present in indexer. """ + + if is_categorical(arr): + return arr.take_nd(indexer, fill_value=fill_value, + allow_fill=allow_fill) + if indexer is None: indexer = np.arange(arr.shape[axis], dtype=np.int64) dtype, fill_value = arr.dtype, arr.dtype.type() @@ -839,7 +824,6 @@ def take_nd(arr, indexer, axis=0, out=None, fill_value=np.nan, func = _get_take_nd_function(arr.ndim, arr.dtype, out.dtype, axis=axis, mask_info=mask_info) - indexer = _ensure_int64(indexer) func(arr, indexer, out, fill_value) @@ -1194,7 +1178,7 @@ def _maybe_upcast_putmask(result, mask, other): if result.dtype in _DATELIKE_DTYPES: if lib.isscalar(other): if isnull(other): - other = tslib.iNaT + other = result.dtype.type('nat') elif is_integer(other): other = np.array(other, dtype=result.dtype) elif is_integer_dtype(other): @@ -1588,7 +1572,8 @@ def backfill_2d(values, limit=None, mask=None, dtype=None): return values -def _clean_interp_method(method, order=None): +def _clean_interp_method(method, **kwargs): + order = kwargs.get('order') valid = ['linear', 'time', 'index', 'values', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial', 'krogh', 'piecewise_polynomial', @@ -1603,7 +1588,7 @@ def _clean_interp_method(method, order=None): def interpolate_1d(xvalues, yvalues, method='linear', limit=None, - fill_value=None, bounds_error=False, order=None): + fill_value=None, bounds_error=False, order=None, **kwargs): """ Logic for the 1-d interpolation. The result should be 1-d, inputs xvalues and yvalues will each be 1-d arrays of the same length. @@ -1682,18 +1667,17 @@ def _interp_limit(invalid, limit): 'piecewise_polynomial', 'pchip'] if method in sp_methods: new_x = new_x[firstIndex:] - xvalues = xvalues[firstIndex:] result[firstIndex:][invalid] = _interpolate_scipy_wrapper( valid_x, valid_y, new_x, method=method, fill_value=fill_value, - bounds_error=bounds_error, order=order) + bounds_error=bounds_error, order=order, **kwargs) if limit: result[violate_limit] = np.nan return result def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, - bounds_error=False, order=None): + bounds_error=False, order=None, **kwargs): """ passed off to scipy.interpolate.interp1d. method is scipy's kind. Returns an array interpolated at new_x. Add any new methods to @@ -1734,7 +1718,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, bounds_error=bounds_error) new_y = terp(new_x) elif method == 'spline': - terp = interpolate.UnivariateSpline(x, y, k=order) + terp = interpolate.UnivariateSpline(x, y, k=order, **kwargs) new_y = terp(new_x) else: # GH 7295: need to be able to write for some reason @@ -1746,7 +1730,7 @@ def _interpolate_scipy_wrapper(x, y, new_x, method, fill_value=None, if not new_x.flags.writeable: new_x = new_x.copy() method = alt_methods[method] - new_y = method(x, y, new_x) + new_y = method(x, y, new_x, **kwargs) return new_y @@ -1883,65 +1867,68 @@ def _maybe_box_datetimelike(value): _values_from_object = lib.values_from_object -def _possibly_convert_objects(values, convert_dates=True, - convert_numeric=True, - convert_timedeltas=True): + +def _possibly_convert_objects(values, + datetime=True, + numeric=True, + timedelta=True, + coerce=False, + copy=True): """ if we have an object dtype, try to coerce dates and/or numbers """ - # if we have passed in a list or scalar + conversion_count = sum((datetime, numeric, timedelta)) + if conversion_count == 0: + import warnings + warnings.warn('Must explicitly pass type for conversion. Defaulting to ' + 'pre-0.17 behavior where datetime=True, numeric=True, ' + 'timedelta=True and coerce=False', DeprecationWarning) + datetime = numeric = timedelta = True + coerce = False + if isinstance(values, (list, tuple)): + # List or scalar values = np.array(values, dtype=np.object_) - if not hasattr(values, 'dtype'): + elif not hasattr(values, 'dtype'): values = np.array([values], dtype=np.object_) - - # convert dates - if convert_dates and values.dtype == np.object_: - - # we take an aggressive stance and convert to datetime64[ns] - if convert_dates == 'coerce': - new_values = _possibly_cast_to_datetime( - values, 'M8[ns]', coerce=True) - - # if we are all nans then leave me alone - if not isnull(new_values).all(): - values = new_values - - else: - values = lib.maybe_convert_objects( - values, convert_datetime=convert_dates) - - # convert timedeltas - if convert_timedeltas and values.dtype == np.object_: - - if convert_timedeltas == 'coerce': - from pandas.tseries.timedeltas import to_timedelta - values = to_timedelta(values, coerce=True) - - # if we are all nans then leave me alone - if not isnull(new_values).all(): - values = new_values - - else: - values = lib.maybe_convert_objects( - values, convert_timedelta=convert_timedeltas) - - # convert to numeric - if values.dtype == np.object_: - if convert_numeric: - try: - new_values = lib.maybe_convert_numeric( - values, set(), coerce_numeric=True) - - # if we are all nans then leave me alone - if not isnull(new_values).all(): - values = new_values - - except: - pass - else: - - # soft-conversion - values = lib.maybe_convert_objects(values) + elif not is_object_dtype(values.dtype): + # If not object, do not attempt conversion + values = values.copy() if copy else values + return values + + # If 1 flag is coerce, ensure 2 others are False + if coerce: + if conversion_count > 1: + raise ValueError("Only one of 'datetime', 'numeric' or " + "'timedelta' can be True when when coerce=True.") + + # Immediate return if coerce + if datetime: + return pd.to_datetime(values, errors='coerce', box=False) + elif timedelta: + return pd.to_timedelta(values, errors='coerce', box=False) + elif numeric: + return lib.maybe_convert_numeric(values, set(), coerce_numeric=True) + + # Soft conversions + if datetime: + values = lib.maybe_convert_objects(values, + convert_datetime=datetime) + + if timedelta and is_object_dtype(values.dtype): + # Object check to ensure only run if previous did not convert + values = lib.maybe_convert_objects(values, + convert_timedelta=timedelta) + + if numeric and is_object_dtype(values.dtype): + try: + converted = lib.maybe_convert_numeric(values, + set(), + coerce_numeric=True) + # If all NaNs, then do not-alter + values = converted if not isnull(converted).all() else values + values = values.copy() if copy else values + except: + pass return values @@ -1971,7 +1958,7 @@ def _possibly_convert_platform(values): return values -def _possibly_cast_to_datetime(value, dtype, coerce=False): +def _possibly_cast_to_datetime(value, dtype, errors='raise'): """ try to cast the array/value to a datetimelike dtype, converting float nan to iNaT """ @@ -2015,9 +2002,9 @@ def _possibly_cast_to_datetime(value, dtype, coerce=False): elif np.prod(value.shape) and value.dtype != dtype: try: if is_datetime64: - value = to_datetime(value, coerce=coerce).values + value = to_datetime(value, errors=errors).values elif is_timedelta64: - value = to_timedelta(value, coerce=coerce).values + value = to_timedelta(value, errors=errors).values except (AttributeError, ValueError): pass @@ -2079,7 +2066,7 @@ def _possibly_infer_to_datetimelike(value, convert_dates=False): def _try_datetime(v): # safe coerce to datetime64 try: - return tslib.array_to_datetime(v, raise_=True).reshape(shape) + return tslib.array_to_datetime(v, errors='raise').reshape(shape) except: return v @@ -2497,6 +2484,10 @@ def is_integer_dtype(arr_or_dtype): return (issubclass(tipo, np.integer) and not issubclass(tipo, (np.datetime64, np.timedelta64))) +def is_int64_dtype(arr_or_dtype): + tipo = _get_dtype_type(arr_or_dtype) + return issubclass(tipo, np.int64) + def is_int_or_datetime_dtype(arr_or_dtype): tipo = _get_dtype_type(arr_or_dtype) @@ -2528,6 +2519,26 @@ def is_datetime_or_timedelta_dtype(arr_or_dtype): return issubclass(tipo, (np.datetime64, np.timedelta64)) +def is_datetimelike_v_numeric(a, b): + # return if we have an i8 convertible and numeric comparision + if not hasattr(a,'dtype'): + a = np.asarray(a) + if not hasattr(b, 'dtype'): + b = np.asarray(b) + f = lambda x: is_integer_dtype(x) or is_float_dtype(x) + return (needs_i8_conversion(a) and f(b)) or ( + needs_i8_conversion(b) and f(a)) + +def is_datetimelike_v_object(a, b): + # return if we have an i8 convertible and object comparision + if not hasattr(a,'dtype'): + a = np.asarray(a) + if not hasattr(b, 'dtype'): + b = np.asarray(b) + f = lambda x: is_object_dtype(x) + return (needs_i8_conversion(a) and f(b)) or ( + needs_i8_conversion(b) and f(a)) + needs_i8_conversion = is_datetime_or_timedelta_dtype def i8_boxer(arr_or_dtype): @@ -2605,9 +2616,14 @@ def is_list_like(arg): not isinstance(arg, compat.string_and_binary_types)) def is_null_slice(obj): + """ we have a null slice """ return (isinstance(obj, slice) and obj.start is None and obj.stop is None and obj.step is None) +def is_full_slice(obj, l): + """ we have a full length slice """ + return (isinstance(obj, slice) and obj.start == 0 and + obj.stop == l and obj.step is None) def is_hashable(arg): """Return True if hash(arg) will succeed, False otherwise. @@ -2813,11 +2829,7 @@ def _get_handle(path, mode, encoding=None, compression=None): else: raise ValueError('Unrecognized compression type: %s' % compression) - if compat.PY3_2: - # gzip and bz2 don't work with TextIOWrapper in 3.2 - encoding = encoding or get_option('display.encoding') - f = StringIO(f.read().decode(encoding)) - elif compat.PY3: + if compat.PY3: from io import TextIOWrapper f = TextIOWrapper(f, encoding=encoding) return f diff --git a/pandas/core/config_init.py b/pandas/core/config_init.py index a56d3b93d87da..03eaa45582bef 100644 --- a/pandas/core/config_init.py +++ b/pandas/core/config_init.py @@ -236,7 +236,7 @@ def mpl_style_cb(key): return val with cf.config_prefix('display'): - cf.register_option('precision', 7, pc_precision_doc, validator=is_int) + cf.register_option('precision', 6, pc_precision_doc, validator=is_int) cf.register_option('float_format', None, float_format_doc) cf.register_option('column_space', 12, validator=is_int) cf.register_option('max_info_rows', 1690785, pc_max_info_rows_doc, diff --git a/pandas/core/format.py b/pandas/core/format.py index 4f0e57130006b..4ec4375349764 100644 --- a/pandas/core/format.py +++ b/pandas/core/format.py @@ -68,10 +68,9 @@ class CategoricalFormatter(object): def __init__(self, categorical, buf=None, length=True, - na_rep='NaN', name=False, footer=True): + na_rep='NaN', footer=True): self.categorical = categorical self.buf = buf if buf is not None else StringIO(u("")) - self.name = name self.na_rep = na_rep self.length = length self.footer = footer @@ -79,12 +78,6 @@ def __init__(self, categorical, buf=None, length=True, def _get_footer(self): footer = '' - if self.name: - name = com.pprint_thing(self.categorical.name, - escape_chars=('\t', '\r', '\n')) - footer += ('Name: %s' % name if self.categorical.name is not None - else '') - if self.length: if footer: footer += ', ' @@ -214,7 +207,7 @@ def _get_formatted_index(self): return fmt_index, have_header def _get_formatted_values(self): - return format_array(self.tr_series.get_values(), None, + return format_array(self.tr_series.values, None, float_format=self.float_format, na_rep=self.na_rep) @@ -688,7 +681,7 @@ def _format_col(self, i): frame = self.tr_frame formatter = self._get_formatter(i) return format_array( - (frame.iloc[:, i]).get_values(), + frame.iloc[:, i].values, formatter, float_format=self.float_format, na_rep=self.na_rep, space=self.col_space ) @@ -1044,7 +1037,7 @@ def _column_header(): self.write_tr(col_row, indent, self.indent_delta, header=True, align=align) - if self.fmt.has_index_names: + if self.fmt.has_index_names and self.fmt.index: row = [ x if x is not None else '' for x in self.frame.index.names ] + [''] * min(len(self.columns), self.max_cols) @@ -1902,8 +1895,13 @@ def get_formatted_cells(self): def format_array(values, formatter, float_format=None, na_rep='NaN', digits=None, space=None, justify='right'): - if com.is_float_dtype(values.dtype): + + if com.is_categorical_dtype(values): + fmt_klass = CategoricalArrayFormatter + elif com.is_float_dtype(values.dtype): fmt_klass = FloatArrayFormatter + elif com.is_period_arraylike(values): + fmt_klass = PeriodArrayFormatter elif com.is_integer_dtype(values.dtype): fmt_klass = IntArrayFormatter elif com.is_datetime64_dtype(values.dtype): @@ -1970,6 +1968,8 @@ def _format(x): return '%s' % formatter(x) vals = self.values + if isinstance(vals, Index): + vals = vals.values is_float = lib.map_infer(vals, com.is_float) & notnull(vals) leading_space = is_float.any() @@ -2021,7 +2021,7 @@ def _format_strings(self): if self.formatter is not None: fmt_values = [self.formatter(x) for x in self.values] else: - fmt_str = '%% .%df' % (self.digits - 1) + fmt_str = '%% .%df' % self.digits fmt_values = self._format_with(fmt_str) if len(fmt_values) > 0: @@ -2029,20 +2029,20 @@ def _format_strings(self): else: maxlen = 0 - too_long = maxlen > self.digits + 5 + too_long = maxlen > self.digits + 6 abs_vals = np.abs(self.values) # this is pretty arbitrary for now has_large_values = (abs_vals > 1e8).any() - has_small_values = ((abs_vals < 10 ** (-self.digits+1)) & + has_small_values = ((abs_vals < 10 ** (-self.digits)) & (abs_vals > 0)).any() if too_long and has_large_values: - fmt_str = '%% .%de' % (self.digits - 1) + fmt_str = '%% .%de' % self.digits fmt_values = self._format_with(fmt_str) elif has_small_values: - fmt_str = '%% .%de' % (self.digits - 1) + fmt_str = '%% .%de' % self.digits fmt_values = self._format_with(fmt_str) return fmt_values @@ -2083,8 +2083,30 @@ def _format_strings(self): values = values.asobject is_dates_only = _is_dates_only(values) formatter = (self.formatter or _get_format_datetime64(is_dates_only, values, date_format=self.date_format)) - fmt_values = [ formatter(x) for x in self.values ] + fmt_values = [ formatter(x) for x in values ] + + return fmt_values + +class PeriodArrayFormatter(IntArrayFormatter): + + def _format_strings(self): + values = np.array(self.values.to_native_types(), dtype=object) + formatter = self.formatter or (lambda x: '%s' % x) + fmt_values = [formatter(x) for x in values] + return fmt_values + + +class CategoricalArrayFormatter(GenericArrayFormatter): + + def __init__(self, values, *args, **kwargs): + GenericArrayFormatter.__init__(self, values, *args, **kwargs) + + def _format_strings(self): + fmt_values = format_array(self.values.get_values(), self.formatter, + float_format=self.float_format, + na_rep=self.na_rep, digits=self.digits, + space=self.space, justify=self.justify) return fmt_values diff --git a/pandas/core/frame.py b/pandas/core/frame.py index cf7f1fa033f6e..8f7aee0cb6f15 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -184,7 +184,6 @@ class DataFrame(NDFrame): DataFrame.from_items : from sequence of (key, value) pairs pandas.read_csv, pandas.read_table, pandas.read_clipboard """ - _auto_consolidate = True @property def _constructor(self): @@ -322,6 +321,8 @@ def _init_dict(self, data, index, columns, dtype=None): if dtype is None: # 1783 v = np.empty(len(index), dtype=object) + elif np.issubdtype(dtype, np.flexible): + v = np.empty(len(index), dtype=object) else: v = np.empty(len(index), dtype=dtype) @@ -545,35 +546,63 @@ def _repr_html_(self): return None def iteritems(self): - """Iterator over (column, series) pairs""" + """ + Iterator over (column name, Series) pairs. + + See also + -------- + iterrows : Iterate over the rows of a DataFrame as (index, Series) pairs. + itertuples : Iterate over the rows of a DataFrame as tuples of the values. + + """ if self.columns.is_unique and hasattr(self, '_item_cache'): for k in self.columns: yield k, self._get_item_cache(k) else: for i, k in enumerate(self.columns): - yield k, self.icol(i) + yield k, self._ixs(i,axis=1) def iterrows(self): """ - Iterate over rows of DataFrame as (index, Series) pairs. + Iterate over the rows of a DataFrame as (index, Series) pairs. Notes ----- - * ``iterrows`` does **not** preserve dtypes across the rows (dtypes - are preserved across columns for DataFrames). For example, - - >>> df = DataFrame([[1, 1.0]], columns=['x', 'y']) - >>> row = next(df.iterrows())[1] - >>> print(row['x'].dtype) - float64 - >>> print(df['x'].dtype) - int64 + 1. Because ``iterrows` returns a Series for each row, + it does **not** preserve dtypes across the rows (dtypes are + preserved across columns for DataFrames). For example, + + >>> df = pd.DataFrame([[1, 1.5]], columns=['int', 'float']) + >>> row = next(df.iterrows())[1] + >>> row + int 1.0 + float 1.5 + Name: 0, dtype: float64 + >>> print(row['int'].dtype) + float64 + >>> print(df['int'].dtype) + int64 + + To preserve dtypes while iterating over the rows, it is better + to use :meth:`itertuples` which returns tuples of the values + and which is generally faster as ``iterrows``. + + 2. You should **never modify** something you are iterating over. + This is not guaranteed to work in all cases. Depending on the + data types, the iterator returns a copy and not a view, and writing + to it will have no effect. Returns ------- it : generator A generator that iterates over the rows of the frame. + + See also + -------- + itertuples : Iterate over the rows of a DataFrame as tuples of the values. + iteritems : Iterate over (column name, Series) pairs. + """ columns = self.columns for k, v in zip(self.index, self.values): @@ -582,8 +611,32 @@ def iterrows(self): def itertuples(self, index=True): """ - Iterate over rows of DataFrame as tuples, with index value - as first element of the tuple + Iterate over the rows of DataFrame as tuples, with index value + as first element of the tuple. + + Parameters + ---------- + index : boolean, default True + If True, return the index as the first element of the tuple. + + See also + -------- + iterrows : Iterate over the rows of a DataFrame as (index, Series) pairs. + iteritems : Iterate over (column name, Series) pairs. + + Examples + -------- + + >>> df = pd.DataFrame({'col1': [1, 2], 'col2': [0.1, 0.2]}, index=['a', 'b']) + >>> df + col1 col2 + a 1 0.1 + b 2 0.2 + >>> for row in df.itertuples(): + ... print(row) + ('a', 1, 0.10000000000000001) + ('b', 2, 0.20000000000000001) + """ arrays = [] if index: @@ -1114,14 +1167,14 @@ def to_csv(self, path_or_buf=None, sep=",", na_rep='', float_format=None, quotechar='"', line_terminator='\n', chunksize=None, tupleize_cols=False, date_format=None, doublequote=True, escapechar=None, decimal='.', **kwds): - r"""Write DataFrame to a comma-separated values (csv) file + """Write DataFrame to a comma-separated values (csv) file Parameters ---------- path_or_buf : string or file handle, default None File path or object, if None is provided the result is returned as a string. - sep : character, default "," + sep : character, default ',' Field delimiter for the output file. na_rep : string, default '' Missing data representation @@ -1152,7 +1205,7 @@ def to_csv(self, path_or_buf=None, sep=",", na_rep='', float_format=None, file quoting : optional constant from csv module defaults to csv.QUOTE_MINIMAL - quotechar : string (length 1), default '"' + quotechar : string (length 1), default '\"' character used to quote fields doublequote : boolean, default True Control quoting of `quotechar` inside a field @@ -1246,6 +1299,9 @@ def to_excel(self, excel_writer, sheet_name='Sheet1', na_rep='', >>> df1.to_excel(writer,'Sheet1') >>> df2.to_excel(writer,'Sheet2') >>> writer.save() + + For compatibility with to_csv, to_excel serializes lists and dicts to + strings before writing. """ from pandas.io.excel import ExcelWriter if self.columns.nlevels > 1: @@ -1693,9 +1749,20 @@ def set_value(self, index, col, value, takeable=False): return self def irow(self, i, copy=False): + """ + DEPRECATED. Use ``.iloc[i]`` instead + """ + + warnings.warn("irow(i) is deprecated. Please use .iloc[i]", + FutureWarning, stacklevel=2) return self._ixs(i, axis=0) def icol(self, i): + """ + DEPRECATED. Use ``.iloc[:, i]`` instead + """ + warnings.warn("icol(i) is deprecated. Please use .iloc[:,i]", + FutureWarning, stacklevel=2) return self._ixs(i, axis=1) def _ixs(self, i, axis=0): @@ -1769,6 +1836,11 @@ def _ixs(self, i, axis=0): return result def iget_value(self, i, j): + """ + DEPRECATED. Use ``.iat[i, j]`` instead + """ + warnings.warn("iget_value(i, j) is deprecated. Please use .iat[i, j]", + FutureWarning, stacklevel=2) return self.iat[i, j] def __getitem__(self, key): @@ -2166,16 +2238,11 @@ def _ensure_valid_index(self, value): ensure that if we don't have an index, that we can create one from the passed value """ - if not len(self.index): - - # GH5632, make sure that we are a Series convertible - if is_list_like(value): + # GH5632, make sure that we are a Series convertible + if not len(self.index) and is_list_like(value): try: value = Series(value) except: - pass - - if not isinstance(value, Series): raise ValueError('Cannot set a frame with no defined index ' 'and a value that cannot be converted to a ' 'Series') @@ -2183,11 +2250,6 @@ def _ensure_valid_index(self, value): self._data = self._data.reindex_axis(value.index.copy(), axis=1, fill_value=np.nan) - # we are a scalar - # noop - else: - - pass def _set_item(self, key, value): """ @@ -2456,33 +2518,36 @@ def lookup(self, row_labels, col_labels): #---------------------------------------------------------------------- # Reindexing and alignment - def _reindex_axes(self, axes, level, limit, method, fill_value, copy): + def _reindex_axes(self, axes, level, limit, tolerance, method, + fill_value, copy): frame = self columns = axes['columns'] if columns is not None: frame = frame._reindex_columns(columns, copy, level, fill_value, - limit) + limit, tolerance) index = axes['index'] if index is not None: frame = frame._reindex_index(index, method, copy, level, - fill_value, limit) + fill_value, limit, tolerance) return frame def _reindex_index(self, new_index, method, copy, level, fill_value=NA, - limit=None): + limit=None, tolerance=None): new_index, indexer = self.index.reindex(new_index, method, level, - limit=limit) + limit=limit, + tolerance=tolerance) return self._reindex_with_indexers({0: [new_index, indexer]}, copy=copy, fill_value=fill_value, allow_dups=False) def _reindex_columns(self, new_columns, copy, level, fill_value=NA, - limit=None): + limit=None, tolerance=None): new_columns, indexer = self.columns.reindex(new_columns, level=level, - limit=limit) + limit=limit, + tolerance=tolerance) return self._reindex_with_indexers({1: [new_columns, indexer]}, copy=copy, fill_value=fill_value, allow_dups=False) @@ -2804,8 +2869,9 @@ def dropna(self, axis=0, how='any', thresh=None, subset=None, else: return result + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @deprecate_kwarg(old_arg_name='cols', new_arg_name='subset') - def drop_duplicates(self, subset=None, take_last=False, inplace=False): + def drop_duplicates(self, subset=None, keep='first', inplace=False): """ Return DataFrame with duplicate rows removed, optionally only considering certain columns @@ -2815,8 +2881,11 @@ def drop_duplicates(self, subset=None, take_last=False, inplace=False): subset : column label or sequence of labels, optional Only consider certain columns for identifying duplicates, by default use all of the columns - take_last : boolean, default False - Take the last observed row in a row. Defaults to the first row + keep : {'first', 'last', False}, default 'first' + - ``first`` : Drop duplicates except for the first occurrence. + - ``last`` : Drop duplicates except for the last occurrence. + - False : Drop all duplicates. + take_last : deprecated inplace : boolean, default False Whether to drop duplicates in place or to return a copy cols : kwargs only argument of subset [deprecated] @@ -2825,7 +2894,7 @@ def drop_duplicates(self, subset=None, take_last=False, inplace=False): ------- deduplicated : DataFrame """ - duplicated = self.duplicated(subset, take_last=take_last) + duplicated = self.duplicated(subset, keep=keep) if inplace: inds, = (-duplicated).nonzero() @@ -2834,8 +2903,9 @@ def drop_duplicates(self, subset=None, take_last=False, inplace=False): else: return self[-duplicated] + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @deprecate_kwarg(old_arg_name='cols', new_arg_name='subset') - def duplicated(self, subset=None, take_last=False): + def duplicated(self, subset=None, keep='first'): """ Return boolean Series denoting duplicate rows, optionally only considering certain columns @@ -2845,9 +2915,13 @@ def duplicated(self, subset=None, take_last=False): subset : column label or sequence of labels, optional Only consider certain columns for identifying duplicates, by default use all of the columns - take_last : boolean, default False - For a set of distinct duplicate rows, flag all but the last row as - duplicated. Default is for all but the first row to be flagged + keep : {'first', 'last', False}, default 'first' + - ``first`` : Mark duplicates as ``True`` except for the + first occurrence. + - ``last`` : Mark duplicates as ``True`` except for the + last occurrence. + - False : Mark all duplicates as ``True``. + take_last : deprecated cols : kwargs only argument of subset [deprecated] Returns @@ -2873,7 +2947,7 @@ def f(vals): labels, shape = map(list, zip( * map(f, vals))) ids = get_group_index(labels, shape, sort=False, xnull=False) - return Series(duplicated_int64(ids, take_last), index=self.index) + return Series(duplicated_int64(ids, keep), index=self.index) #---------------------------------------------------------------------- # Sorting @@ -3065,6 +3139,79 @@ def sortlevel(self, level=0, axis=0, ascending=True, else: return self._constructor(new_data).__finalize__(self) + def _nsorted(self, columns, n, method, take_last): + if not com.is_list_like(columns): + columns = [columns] + columns = list(columns) + ser = getattr(self[columns[0]], method)(n, take_last=take_last) + ascending = dict(nlargest=False, nsmallest=True)[method] + return self.loc[ser.index].sort(columns, ascending=ascending, + kind='mergesort') + + def nlargest(self, n, columns, take_last=False): + """Get the rows of a DataFrame sorted by the `n` largest + values of `columns`. + + .. versionadded:: 0.17.0 + + Parameters + ---------- + n : int + Number of items to retrieve + columns : list or str + Column name or names to order by + take_last : bool, optional + Where there are duplicate values, take the last duplicate + + Returns + ------- + DataFrame + + Examples + -------- + >>> df = DataFrame({'a': [1, 10, 8, 11, -1], + ... 'b': list('abdce'), + ... 'c': [1.0, 2.0, np.nan, 3.0, 4.0]}) + >>> df.nlargest(3, 'a') + a b c + 3 11 c 3 + 1 10 b 2 + 2 8 d NaN + """ + return self._nsorted(columns, n, 'nlargest', take_last) + + def nsmallest(self, n, columns, take_last=False): + """Get the rows of a DataFrame sorted by the `n` smallest + values of `columns`. + + .. versionadded:: 0.17.0 + + Parameters + ---------- + n : int + Number of items to retrieve + columns : list or str + Column name or names to order by + take_last : bool, optional + Where there are duplicate values, take the last duplicate + + Returns + ------- + DataFrame + + Examples + -------- + >>> df = DataFrame({'a': [1, 10, 8, 11, -1], + ... 'b': list('abdce'), + ... 'c': [1.0, 2.0, np.nan, 3.0, 4.0]}) + >>> df.nsmallest(3, 'a') + a b c + 4 -1 e 4 + 0 1 a 1 + 2 8 d NaN + """ + return self._nsorted(columns, n, 'nsmallest', take_last) + def swaplevel(self, i, j, axis=0): """ Swap levels i and j in a MultiIndex on a particular axis @@ -3348,7 +3495,7 @@ def combine(self, other, func, fill_value=None, overwrite=True): return self._constructor(result, index=new_index, columns=new_columns).convert_objects( - convert_dates=True, + datetime=True, copy=False) def combine_first(self, other): @@ -3466,8 +3613,9 @@ def pivot(self, index=None, columns=None, values=None): Parameters ---------- - index : string or object - Column name to use to make new frame's index + index : string or object, optional + Column name to use to make new frame's index. If None, uses + existing index. columns : string or object Column name to use to make new frame's columns values : string or object, optional @@ -3774,7 +3922,7 @@ def _apply_standard(self, func, axis, ignore_failures=False, reduce=True): dtype = object if self._is_mixed_type else None if axis == 0: - series_gen = (self.icol(i) for i in range(len(self.columns))) + series_gen = (self._ixs(i,axis=1) for i in range(len(self.columns))) res_index = self.columns res_columns = self.index elif axis == 1: @@ -3827,7 +3975,9 @@ def _apply_standard(self, func, axis, ignore_failures=False, reduce=True): if axis == 1: result = result.T - result = result.convert_objects(copy=False) + result = result.convert_objects(datetime=True, + timedelta=True, + copy=False) else: @@ -3955,7 +4105,10 @@ def append(self, other, ignore_index=False, verify_integrity=False): combined_columns = self.columns.tolist() + self.columns.union(other.index).difference(self.columns).tolist() other = other.reindex(combined_columns, copy=False) other = DataFrame(other.values.reshape((1, len(other))), - index=index, columns=combined_columns).convert_objects() + index=index, + columns=combined_columns) + other = other.convert_objects(datetime=True, timedelta=True) + if not self.columns.equals(combined_columns): self = self.reindex(columns=combined_columns) elif isinstance(other, list) and not isinstance(other[0], DataFrame): @@ -4484,7 +4637,7 @@ def quantile(self, q=0.5, axis=0, numeric_only=True): q : float or array-like, default 0.5 (50% quantile) 0 <= q <= 1, the quantile(s) to compute axis : {0, 1, 'index', 'columns'} (default 0) - 0 or 'index' for row-wise, 1 or 'columns' for column-wise + 0 or 'index' for row-wise, 1 or 'columns' for column-wise Returns @@ -4750,6 +4903,8 @@ def isin(self, values): def combineAdd(self, other): """ + DEPRECATED. Use ``DataFrame.add(other, fill_value=0.)`` instead. + Add two DataFrame objects and do not propagate NaN values, so if for a (column, time) one frame is missing a value, it will default to the other frame's value (which might @@ -4762,11 +4917,21 @@ def combineAdd(self, other): Returns ------- DataFrame + + See also + -------- + DataFrame.add + """ + warnings.warn("'combineAdd' is deprecated. Use " + "'DataFrame.add(other, fill_value=0.)' instead", + FutureWarning, stacklevel=2) return self.add(other, fill_value=0.) def combineMult(self, other): """ + DEPRECATED. Use ``DataFrame.mul(other, fill_value=1.)`` instead. + Multiply two DataFrame objects and do not propagate NaN values, so if for a (column, time) one frame is missing a value, it will default to the other frame's value (which might be NaN as well) @@ -4778,7 +4943,15 @@ def combineMult(self, other): Returns ------- DataFrame + + See also + -------- + DataFrame.mul + """ + warnings.warn("'combineMult' is deprecated. Use " + "'DataFrame.mul(other, fill_value=1.)' instead", + FutureWarning, stacklevel=2) return self.mul(other, fill_value=1.) @@ -4900,11 +5073,11 @@ def _to_arrays(data, columns, coerce_float=False, dtype=None): """ if isinstance(data, DataFrame): if columns is not None: - arrays = [data.icol(i).values for i, col in enumerate(data.columns) + arrays = [data._ixs(i,axis=1).values for i, col in enumerate(data.columns) if col in columns] else: columns = data.columns - arrays = [data.icol(i).values for i in range(len(columns))] + arrays = [data._ixs(i,axis=1).values for i in range(len(columns))] return arrays, columns diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 35db4051c60c8..0e8afbdafb866 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -80,8 +80,8 @@ class NDFrame(PandasObject): """ _internal_names = ['_data', '_cacher', '_item_cache', '_cache', 'is_copy', '_subtyp', '_index', - '_default_kind', '_default_fill_value', - '__array_struct__','__array_interface__'] + '_default_kind', '_default_fill_value', '_metadata', + '__array_struct__', '__array_interface__'] _internal_names_set = set(_internal_names) _accessors = frozenset([]) _metadata = [] @@ -138,6 +138,9 @@ def _init_mgr(self, mgr, axes=None, dtype=None, copy=False): @property def _constructor(self): + """Used when a manipulation result has the same dimesions as the + original. + """ raise AbstractMethodError(self) def __unicode__(self): @@ -153,10 +156,16 @@ def _dir_additions(self): @property def _constructor_sliced(self): + """Used when a manipulation result has one lower dimension(s) as the + original, such as DataFrame single columns slicing. + """ raise AbstractMethodError(self) @property def _constructor_expanddim(self): + """Used when a manipulation result has one higher dimension as the + original, such as Series.to_frame() and DataFrame.to_panel() + """ raise NotImplementedError #---------------------------------------------------------------------- @@ -760,7 +769,9 @@ def to_dense(self): # Picklability def __getstate__(self): - return self._data + meta = dict((k, getattr(self, k, None)) for k in self._metadata) + return dict(_data=self._data, _typ=self._typ, + _metadata=self._metadata, **meta) def __setstate__(self, state): @@ -879,7 +890,7 @@ def to_hdf(self, path_or_buf, key, **kwargs): Parameters ---------- - path_or_buf : the path (string) or buffer to put the store + path_or_buf : the path (string) or HDFStore object key : string indentifier for the group in the store mode : optional, {'a', 'w', 'r', 'r+'}, default 'a' @@ -911,6 +922,8 @@ def to_hdf(self, path_or_buf, key, **kwargs): in the store wherever possible fletcher32 : bool, default False If applying compression use the fletcher32 checksum + dropna : boolean, default False. + If true, ALL nan rows will not be written to store. """ @@ -1287,7 +1300,7 @@ def _check_setitem_copy(self, stacklevel=4, t='setting', force=False): t = ("\n" "A value is trying to be set on a copy of a slice from a " "DataFrame\n\n" - "See the the caveats in the documentation: " + "See the caveats in the documentation: " "http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy") else: @@ -1295,7 +1308,7 @@ def _check_setitem_copy(self, stacklevel=4, t='setting', force=False): "A value is trying to be set on a copy of a slice from a " "DataFrame.\n" "Try using .loc[row_indexer,col_indexer] = value instead\n\n" - "See the the caveats in the documentation: " + "See the caveats in the documentation: " "http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy") if value == 'raise': @@ -1538,7 +1551,8 @@ def select(self, crit, axis=0): return self.reindex(**{axis_name: new_axis}) - def reindex_like(self, other, method=None, copy=True, limit=None): + def reindex_like(self, other, method=None, copy=True, limit=None, + tolerance=None): """ return an object with matching indicies to myself Parameters @@ -1547,7 +1561,12 @@ def reindex_like(self, other, method=None, copy=True, limit=None): method : string or None copy : boolean, default True limit : int, default None - Maximum size gap to forward or backward fill + Maximum number of consecutive labels to fill for inexact matches. + tolerance : optional + Maximum distance between labels of the other object and this + object for inexact matches. + + .. versionadded:: 0.17.0 Notes ----- @@ -1559,7 +1578,8 @@ def reindex_like(self, other, method=None, copy=True, limit=None): reindexed : same as input """ d = other._construct_axes_dict(axes=self._AXIS_ORDERS, - method=method, copy=copy, limit=limit) + method=method, copy=copy, limit=limit, + tolerance=tolerance) return self.reindex(**d) @@ -1723,7 +1743,13 @@ def sort_index(self, axis=0, ascending=True): Value to use for missing values. Defaults to NaN, but can be any "compatible" value limit : int, default None - Maximum size gap to forward or backward fill + Maximum number of consecutive elements to forward or backward fill + tolerance : optional + Maximum distance between original and new labels for inexact + matches. The values of the index at the matching locations most + satisfy the equation ``abs(index[indexer] - target) <= tolerance``. + + .. versionadded:: 0.17.0 Examples -------- @@ -1745,6 +1771,7 @@ def reindex(self, *args, **kwargs): level = kwargs.pop('level', None) copy = kwargs.pop('copy', True) limit = kwargs.pop('limit', None) + tolerance = kwargs.pop('tolerance', None) fill_value = kwargs.pop('fill_value', np.nan) if kwargs: @@ -1769,10 +1796,11 @@ def reindex(self, *args, **kwargs): pass # perform the reindex on the axes - return self._reindex_axes(axes, level, limit, + return self._reindex_axes(axes, level, limit, tolerance, method, fill_value, copy).__finalize__(self) - def _reindex_axes(self, axes, level, limit, method, fill_value, copy): + def _reindex_axes(self, axes, level, limit, tolerance, method, + fill_value, copy): """ perform the reinxed for all the axes """ obj = self for a in self._AXIS_ORDERS: @@ -1782,7 +1810,8 @@ def _reindex_axes(self, axes, level, limit, method, fill_value, copy): ax = self._get_axis(a) new_index, indexer = ax.reindex( - labels, level=level, limit=limit, method=method) + labels, level=level, limit=limit, tolerance=tolerance, + method=method) axis = self._get_axis_number(a) obj = obj._reindex_with_indexers( @@ -1823,7 +1852,13 @@ def _reindex_multi(self, axes, copy, fill_value): Broadcast across a level, matching Index values on the passed MultiIndex level limit : int, default None - Maximum size gap to forward or backward fill + Maximum number of consecutive elements to forward or backward fill + tolerance : optional + Maximum distance between original and new labels for inexact + matches. The values of the index at the matching locations most + satisfy the equation ``abs(index[indexer] - target) <= tolerance``. + + .. versionadded:: 0.17.0 Examples -------- @@ -1928,7 +1963,7 @@ def filter(self, items=None, like=None, regex=None, axis=None): return self.select(matchf, axis=axis_name) elif regex: matcher = re.compile(regex) - return self.select(lambda x: matcher.search(x) is not None, + return self.select(lambda x: matcher.search(str(x)) is not None, axis=axis_name) else: raise TypeError('Must pass either `items`, `like`, or `regex`') @@ -1969,9 +2004,14 @@ def sample(self, n=None, frac=None, replace=False, weights=None, random_state=No Sample with or without replacement. Default = False. weights : str or ndarray-like, optional Default 'None' results in equal probability weighting. + If passed a Series, will align with target object on index. Index + values in weights not found in sampled object will be ignored and + index values in sampled object not in weights will be assigned + weights of zero. If called on a DataFrame, will accept the name of a column when axis = 0. - Weights must be same length as axis being sampled. + Unless weights are a Series, weights must be same length as axis + being sampled. If weights do not sum to 1, they will be normalized to sum to 1. Missing values in the weights column will be treated as zero. inf and -inf values not allowed. @@ -1984,7 +2024,7 @@ def sample(self, n=None, frac=None, replace=False, weights=None, random_state=No Returns ------- - Same type as caller. + A new object of same type as caller. """ if axis is None: @@ -1999,6 +2039,10 @@ def sample(self, n=None, frac=None, replace=False, weights=None, random_state=No # Check weights for compliance if weights is not None: + # If a series, align with frame + if isinstance(weights, pd.Series): + weights = weights.reindex(self.axes[axis]) + # Strings acceptable if a dataframe and axis = 0 if isinstance(weights, string_types): if isinstance(self, pd.DataFrame): @@ -2028,7 +2072,10 @@ def sample(self, n=None, frac=None, replace=False, weights=None, random_state=No # Renormalize if don't sum to 1 if weights.sum() != 1: - weights = weights / weights.sum() + if weights.sum() != 0: + weights = weights / weights.sum() + else: + raise ValueError("Invalid weights: weights sum to zero") weights = weights.values @@ -2047,7 +2094,8 @@ def sample(self, n=None, frac=None, replace=False, weights=None, random_state=No raise ValueError("A negative number of rows requested. Please provide positive value.") locs = rs.choice(axis_length, size=n, replace=replace, p=weights) - return self.take(locs, axis=axis) + return self.take(locs, axis=axis, is_copy=False) + _shared_docs['pipe'] = (""" Apply func(self, \*args, \*\*kwargs) @@ -2359,7 +2407,7 @@ def ftypes(self): return Series(self._data.get_ftypes(), index=self._info_axis, dtype=np.object_) - def as_blocks(self): + def as_blocks(self, copy=True): """ Convert the frame to a dict of dtype -> Constructor Types that each has a homogeneous dtype. @@ -2367,6 +2415,10 @@ def as_blocks(self): NOTE: the dtypes of the blocks WILL BE PRESERVED HERE (unlike in as_matrix) + Parameters + ---------- + copy : boolean, default True + Returns ------- values : a dict of dtype -> Constructor Types @@ -2381,7 +2433,7 @@ def as_blocks(self): for dtype, blocks in bd.items(): # Must combine even after consolidation, because there may be # sparse items which are never consolidated into one block. - combined = self._data.combine(blocks, copy=True) + combined = self._data.combine(blocks, copy=copy) result[dtype] = self._constructor(combined).__finalize__(self) return result @@ -2427,22 +2479,26 @@ def copy(self, deep=True): data = self._data.copy(deep=deep) return self._constructor(data).__finalize__(self) - def convert_objects(self, convert_dates=True, convert_numeric=False, - convert_timedeltas=True, copy=True): + @deprecate_kwarg(old_arg_name='convert_dates', new_arg_name='datetime') + @deprecate_kwarg(old_arg_name='convert_numeric', new_arg_name='numeric') + @deprecate_kwarg(old_arg_name='convert_timedeltas', new_arg_name='timedelta') + def convert_objects(self, datetime=False, numeric=False, + timedelta=False, coerce=False, copy=True): """ Attempt to infer better dtype for object columns Parameters ---------- - convert_dates : boolean, default True - If True, convert to date where possible. If 'coerce', force - conversion, with unconvertible values becoming NaT. - convert_numeric : boolean, default False - If True, attempt to coerce to numbers (including strings), with + datetime : boolean, default False + If True, convert to date where possible. + numeric : boolean, default False + If True, attempt to convert to numbers (including strings), with unconvertible values becoming NaN. - convert_timedeltas : boolean, default True - If True, convert to timedelta where possible. If 'coerce', force - conversion, with unconvertible values becoming NaT. + timedelta : boolean, default False + If True, convert to timedelta where possible. + coerce : boolean, default False + If True, force conversion with unconvertible values converted to + nulls (NaN or NaT) copy : boolean, default True If True, return a copy even if no copy is necessary (e.g. no conversion was done). Note: This is meant for internal use, and @@ -2453,9 +2509,10 @@ def convert_objects(self, convert_dates=True, convert_numeric=False, converted : same as input object """ return self._constructor( - self._data.convert(convert_dates=convert_dates, - convert_numeric=convert_numeric, - convert_timedeltas=convert_timedeltas, + self._data.convert(datetime=datetime, + numeric=numeric, + timedelta=timedelta, + coerce=coerce, copy=copy)).__finalize__(self) #---------------------------------------------------------------------- @@ -2853,7 +2910,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None, '{0!r}').format(type(to_replace).__name__) raise TypeError(msg) # pragma: no cover - new_data = new_data.convert(copy=not inplace, convert_numeric=False) + new_data = new_data.convert(copy=not inplace, numeric=False) if inplace: self._update_inplace(new_data) @@ -2865,6 +2922,9 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, """ Interpolate values according to different methods. + Please note that only ``method='linear'`` is supported for DataFrames/Series + with a MultiIndex. + Parameters ---------- method : {'linear', 'time', 'index', 'values', 'nearest', 'zero', @@ -2872,18 +2932,21 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, 'polynomial', 'spline' 'piecewise_polynomial', 'pchip'} * 'linear': ignore the index and treat the values as equally - spaced. default + spaced. This is the only method supported on MultiIndexes. + default * 'time': interpolation works on daily and higher resolution data to interpolate given length of interval * 'index', 'values': use the actual numerical values of the index * 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'polynomial' is passed to - `scipy.interpolate.interp1d` with the order given both + `scipy.interpolate.interp1d` with the order given. Both 'polynomial' and 'spline' requre that you also specify and order - (int) e.g. df.interpolate(method='polynomial', order=4) + (int) e.g. df.interpolate(method='polynomial', order=4). These + use the actual numerical values of the index * 'krogh', 'piecewise_polynomial', 'spline', and 'pchip' are all wrappers around the scipy interpolation methods of similar - names. See the scipy documentation for more on their behavior: + names. These use the actual numerical values of the index. See + the scipy documentation for more on their behavior: http://docs.scipy.org/doc/scipy/reference/interpolate.html#univariate-interpolation http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html @@ -2896,6 +2959,7 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, Update the NDFrame in place if possible. downcast : optional, 'infer' or None, defaults to None Downcast dtypes if possible. + kwargs : keyword arguments to pass on to the interpolating function. Returns ------- @@ -2925,47 +2989,50 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False, if axis == 0: ax = self._info_axis_name + _maybe_transposed_self = self elif axis == 1: - self = self.T + _maybe_transposed_self = self.T ax = 1 - ax = self._get_axis_number(ax) + else: + _maybe_transposed_self = self + ax = _maybe_transposed_self._get_axis_number(ax) - if self.ndim == 2: + if _maybe_transposed_self.ndim == 2: alt_ax = 1 - ax else: alt_ax = ax - if isinstance(self.index, MultiIndex) and method != 'linear': + if isinstance(_maybe_transposed_self.index, MultiIndex) and method != 'linear': raise ValueError("Only `method=linear` interpolation is supported " "on MultiIndexes.") - if self._data.get_dtype_counts().get('object') == len(self.T): + if _maybe_transposed_self._data.get_dtype_counts().get('object') == len(_maybe_transposed_self.T): raise TypeError("Cannot interpolate with all NaNs.") # create/use the index if method == 'linear': - index = np.arange(len(self._get_axis(alt_ax))) # prior default + index = np.arange(len(_maybe_transposed_self._get_axis(alt_ax))) # prior default else: - index = self._get_axis(alt_ax) + index = _maybe_transposed_self._get_axis(alt_ax) if pd.isnull(index).any(): raise NotImplementedError("Interpolation with NaNs in the index " "has not been implemented. Try filling " "those NaNs before interpolating.") - new_data = self._data.interpolate(method=method, - axis=ax, - index=index, - values=self, - limit=limit, - inplace=inplace, - downcast=downcast, - **kwargs) + new_data = _maybe_transposed_self._data.interpolate( + method=method, + axis=ax, + index=index, + values=_maybe_transposed_self, + limit=limit, + inplace=inplace, + downcast=downcast, + **kwargs + ) if inplace: if axis == 1: - self._update_inplace(new_data) - self = self.T - else: - self._update_inplace(new_data) + new_data = self._constructor(new_data).T._data + self._update_inplace(new_data) else: res = self._constructor(new_data).__finalize__(self) if axis == 1: @@ -3556,7 +3623,14 @@ def where(self, cond, other=np.nan, inplace=False, axis=None, level=None, except ValueError: new_other = np.array(other) - matches = (new_other == np.array(other)) + # we can end up comparing integers and m8[ns] + # which is a numpy no no + is_i8 = com.needs_i8_conversion(self.dtype) + if is_i8: + matches = False + else: + matches = (new_other == np.array(other)) + if matches is False or not matches.all(): # coerce other to a common dtype if we can @@ -3626,19 +3700,31 @@ def where(self, cond, other=np.nan, inplace=False, axis=None, level=None, else: other = self._constructor(other, **self._construct_axes_dict()) + if axis is None: + axis = 0 + + if self.ndim == getattr(other, 'ndim', 0): + align = True + else: + align = (self._get_axis_number(axis) == 1) + + block_axis = self._get_block_manager_axis(axis) + if inplace: # we may have different type blocks come out of putmask, so # reconstruct the block manager self._check_inplace_setting(other) - new_data = self._data.putmask(mask=cond, new=other, align=axis is None, - inplace=True) + new_data = self._data.putmask(mask=cond, new=other, align=align, + inplace=True, axis=block_axis, + transpose=self._AXIS_REVERSED) self._update_inplace(new_data) else: - new_data = self._data.where(other=other, cond=cond, align=axis is None, + new_data = self._data.where(other=other, cond=cond, align=align, raise_on_error=raise_on_error, - try_cast=try_cast) + try_cast=try_cast, axis=block_axis, + transpose=self._AXIS_REVERSED) return self._constructor(new_data).__finalize__(self) diff --git a/pandas/core/groupby.py b/pandas/core/groupby.py index 4abdd1112c721..d23cb39c15548 100644 --- a/pandas/core/groupby.py +++ b/pandas/core/groupby.py @@ -3,6 +3,7 @@ import numpy as np import datetime import collections +import warnings from pandas.compat import( zip, builtins, range, long, lzip, @@ -71,7 +72,7 @@ 'fillna', 'mad', 'any', 'all', - 'irow', 'take', + 'take', 'idxmax', 'idxmin', 'shift', 'tshift', 'ffill', 'bfill', @@ -111,7 +112,7 @@ def f(self): except Exception: result = self.aggregate(lambda x: npfunc(x, axis=self.axis)) if _convert: - result = result.convert_objects() + result = result.convert_objects(datetime=True) return result f.__doc__ = "Compute %s of group values" % name @@ -167,9 +168,10 @@ class Grouper(object): groupby key, which selects the grouping column of the target level : name/number, defaults to None the level for the target index - freq : string / freqency object, defaults to None + freq : string / frequency object, defaults to None This will groupby the specified frequency if the target selection (via key or level) is - a datetime-like object + a datetime-like object. For full specification of available frequencies, please see + `here `_. axis : number/name of the axis, defaults to 0 sort : boolean, default to False whether to sort the resulting labels @@ -187,11 +189,19 @@ class Grouper(object): Examples -------- - >>> df.groupby(Grouper(key='A')) : syntactic sugar for df.groupby('A') - >>> df.groupby(Grouper(key='date',freq='60s')) : specify a resample on the column 'date' - >>> df.groupby(Grouper(level='date',freq='60s',axis=1)) : - specify a resample on the level 'date' on the columns axis with a frequency of 60s + Syntactic sugar for ``df.groupby('A')`` + + >>> df.groupby(Grouper(key='A')) + + Specify a resample operation on the column 'date' + + >>> df.groupby(Grouper(key='date', freq='60s')) + + Specify a resample operation on the level 'date' on the columns axis + with a frequency of 60s + + >>> df.groupby(Grouper(level='date', freq='60s', axis=1)) """ def __new__(cls, *args, **kwargs): @@ -413,46 +423,55 @@ def indices(self): """ dict {group name -> group indices} """ return self.grouper.indices - def _get_index(self, name): - """ safe get index, translate keys for datelike to underlying repr """ + def _get_indices(self, names): + """ safe get multiple indices, translate keys for datelike to underlying repr """ - def convert(key, s): + def get_converter(s): # possibly convert to they actual key types # in the indices, could be a Timestamp or a np.datetime64 - if isinstance(s, (Timestamp,datetime.datetime)): - return Timestamp(key) + return lambda key: Timestamp(key) elif isinstance(s, np.datetime64): - return Timestamp(key).asm8 - return key + return lambda key: Timestamp(key).asm8 + else: + return lambda key: key + + if len(names) == 0: + return [] if len(self.indices) > 0: - sample = next(iter(self.indices)) + index_sample = next(iter(self.indices)) else: - sample = None # Dummy sample + index_sample = None # Dummy sample - if isinstance(sample, tuple): - if not isinstance(name, tuple): + name_sample = names[0] + if isinstance(index_sample, tuple): + if not isinstance(name_sample, tuple): msg = ("must supply a tuple to get_group with multiple" " grouping keys") raise ValueError(msg) - if not len(name) == len(sample): + if not len(name_sample) == len(index_sample): try: # If the original grouper was a tuple - return self.indices[name] + return [self.indices[name] for name in names] except KeyError: # turns out it wasn't a tuple msg = ("must supply a a same-length tuple to get_group" " with multiple grouping keys") raise ValueError(msg) - name = tuple([ convert(n, k) for n, k in zip(name,sample) ]) + converters = [get_converter(s) for s in index_sample] + names = [tuple([f(n) for f, n in zip(converters, name)]) for name in names] else: + converter = get_converter(index_sample) + names = [converter(name) for name in names] - name = convert(name, sample) + return [self.indices.get(name, []) for name in names] - return self.indices[name] + def _get_index(self, name): + """ safe get index, translate keys for datelike to underlying repr """ + return self._get_indices([name])[0] @property def name(self): @@ -498,7 +517,7 @@ def _set_result_index_ordered(self, result): # shortcut of we have an already ordered grouper if not self.grouper.is_monotonic: - index = Index(np.concatenate([ indices.get(v, []) for v in self.grouper.result_index])) + index = Index(np.concatenate(self._get_indices(self.grouper.result_index))) result.index = index result = result.sort_index() @@ -603,6 +622,9 @@ def get_group(self, name, obj=None): obj = self._selected_obj inds = self._get_index(name) + if not len(inds): + raise KeyError(name) + return obj.take(inds, axis=self.axis, convert=False) def __iter__(self): @@ -690,6 +712,16 @@ def _iterate_slices(self): def transform(self, func, *args, **kwargs): raise AbstractMethodError(self) + def irow(self, i): + """ + DEPRECATED. Use ``.nth(i)`` instead + """ + + # 10177 + warnings.warn("irow(i) is deprecated. Please use .nth(i)", + FutureWarning, stacklevel=2) + return self.nth(i) + def mean(self): """ Compute mean of groups, excluding missing values @@ -1950,7 +1982,8 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None, # fix bug #GH8868 sort=False being ignored in categorical groupby else: - self.grouper = self.grouper.reorder_categories(self.grouper.unique()) + cat = self.grouper.unique() + self.grouper = self.grouper.reorder_categories(cat.categories) # we make a CategoricalIndex out of the cat grouper # preserving the categories / ordered attributes @@ -1960,8 +1993,6 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None, self._group_index = CategoricalIndex(Categorical.from_codes(np.arange(len(c)), categories=c, ordered=self.grouper.ordered)) - if self.name is None: - self.name = self.grouper.name # a passed Grouper like elif isinstance(self.grouper, Grouper): @@ -2449,9 +2480,6 @@ def transform(self, func, *args, **kwargs): wrapper = lambda x: func(x, *args, **kwargs) for i, (name, group) in enumerate(self): - if name not in self.indices: - continue - object.__setattr__(group, 'name', name) res = wrapper(group) @@ -2466,7 +2494,7 @@ def transform(self, func, *args, **kwargs): except: pass - indexer = self.indices[name] + indexer = self._get_index(name) result[indexer] = res result = _possibly_downcast_to_dtype(result, dtype) @@ -2520,11 +2548,8 @@ def true_and_notnull(x, *args, **kwargs): return b and notnull(b) try: - indices = [] - for name, group in self: - if true_and_notnull(group) and name in self.indices: - indices.append(self.indices[name]) - + indices = [self._get_index(name) for name, group in self + if true_and_notnull(group)] except ValueError: raise TypeError("the filter must return a boolean result") except TypeError: @@ -2700,7 +2725,7 @@ def aggregate(self, arg, *args, **kwargs): self._insert_inaxis_grouper_inplace(result) result.index = np.arange(len(result)) - return result.convert_objects() + return result.convert_objects(datetime=True) def _aggregate_multiple_funcs(self, arg): from pandas.tools.merge import concat @@ -2939,18 +2964,25 @@ def _wrap_applied_output(self, keys, values, not_indexed_same=False): # if we have date/time like in the original, then coerce dates # as we are stacking can easily have object dtypes here - if (self._selected_obj.ndim == 2 - and self._selected_obj.dtypes.isin(_DATELIKE_DTYPES).any()): - cd = 'coerce' + if (self._selected_obj.ndim == 2 and + self._selected_obj.dtypes.isin(_DATELIKE_DTYPES).any()): + result = result.convert_objects(numeric=True) + date_cols = self._selected_obj.select_dtypes( + include=list(_DATELIKE_DTYPES)).columns + result[date_cols] = (result[date_cols] + .convert_objects(datetime=True, + coerce=True)) else: - cd = True - result = result.convert_objects(convert_dates=cd) + result = result.convert_objects(datetime=True) + return self._reindex_output(result) else: # only coerce dates if we find at least 1 datetime - cd = 'coerce' if any([ isinstance(v,Timestamp) for v in values ]) else False - return Series(values, index=key_index).convert_objects(convert_dates=cd) + coerce = True if any([ isinstance(v,Timestamp) for v in values ]) else False + return (Series(values, index=key_index) + .convert_objects(datetime=True, + coerce=coerce)) else: # Handle cases like BinGrouper @@ -3045,15 +3077,16 @@ def transform(self, func, *args, **kwargs): results = np.empty_like(obj.values, result.values.dtype) indices = self.indices for (name, group), (i, row) in zip(self, result.iterrows()): - if name in indices: - indexer = indices[name] + indexer = self._get_index(name) + if len(indexer) > 0: results[indexer] = np.tile(row.values,len(indexer)).reshape(len(indexer),-1) counts = self.size().fillna(0).values if any(counts == 0): results = self._try_cast(results, obj[result.columns]) - return DataFrame(results,columns=result.columns,index=obj.index).convert_objects() + return (DataFrame(results,columns=result.columns,index=obj.index) + .convert_objects(datetime=True)) def _define_paths(self, func, *args, **kwargs): if isinstance(func, compat.string_types): @@ -3146,8 +3179,8 @@ def filter(self, func, dropna=True, *args, **kwargs): # interpret the result of the filter if is_bool(res) or (lib.isscalar(res) and isnull(res)): - if res and notnull(res) and name in self.indices: - indices.append(self.indices[name]) + if res and notnull(res): + indices.append(self._get_index(name)) else: # non scalars aren't allowed raise TypeError("filter function returned a %s, " @@ -3246,7 +3279,7 @@ def _wrap_aggregated_output(self, output, names=None): if self.axis == 1: result = result.T - return self._reindex_output(result).convert_objects() + return self._reindex_output(result).convert_objects(datetime=True) def _wrap_agged_blocks(self, items, blocks): if not self.as_index: @@ -3264,7 +3297,7 @@ def _wrap_agged_blocks(self, items, blocks): if self.axis == 1: result = result.T - return self._reindex_output(result).convert_objects() + return self._reindex_output(result).convert_objects(datetime=True) def _reindex_output(self, result): """ diff --git a/pandas/core/index.py b/pandas/core/index.py index fad71c94cc417..7b5a6b199bc1b 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -16,7 +16,7 @@ from pandas.lib import Timestamp, Timedelta, is_datetime_array from pandas.core.base import PandasObject, FrozenList, FrozenNDArray, IndexOpsMixin, _shared_docs, PandasDelegate from pandas.util.decorators import (Appender, Substitution, cache_readonly, - deprecate) + deprecate, deprecate_kwarg) import pandas.core.common as com from pandas.core.common import (isnull, array_equivalent, is_dtype_equal, is_object_dtype, _values_from_object, is_float, is_integer, is_iterator, is_categorical_dtype, @@ -89,7 +89,6 @@ class Index(IndexOpsMixin, PandasObject): _left_indexer = _algos.left_join_indexer_object _inner_indexer = _algos.inner_join_indexer_object _outer_indexer = _algos.outer_join_indexer_object - _box_scalars = False _typ = 'index' @@ -105,6 +104,7 @@ class Index(IndexOpsMixin, PandasObject): _is_numeric_dtype = False _engine_type = _index.ObjectEngine + _isin_type = lib.ismember def __new__(cls, data=None, dtype=None, copy=False, name=None, fastpath=False, tupleize_cols=True, **kwargs): @@ -163,18 +163,23 @@ def __new__(cls, data=None, dtype=None, copy=False, name=None, fastpath=False, elif data is None or np.isscalar(data): cls._scalar_data_error(data) else: - if tupleize_cols and isinstance(data, list) and data: - try: - sorted(data) - has_mixed_types = False - except (TypeError, UnicodeDecodeError): - has_mixed_types = True # python3 only - if isinstance(data[0], tuple) and not has_mixed_types: + if tupleize_cols and isinstance(data, list) and data and isinstance(data[0], tuple): + + # we must be all tuples, otherwise don't construct + # 10697 + if all( isinstance(e, tuple) for e in data ): + try: + + # must be orderable in py3 + if compat.PY3: + sorted(data) return MultiIndex.from_tuples( data, names=name or kwargs.get('names')) except (TypeError, KeyError): - pass # python2 - MultiIndex fails on mixed types + # python2 - MultiIndex fails on mixed types + pass + # other iterable of some kind subarr = com._asarray_tuplesafe(data, dtype=object) @@ -203,6 +208,17 @@ def __new__(cls, data=None, dtype=None, copy=False, name=None, fastpath=False, @classmethod def _simple_new(cls, values, name=None, **kwargs): + """ + we require the we have a dtype compat for the values + if we are passed a non-dtype compat, then coerce using the constructor + + Must be careful not to recurse. + """ + if not hasattr(values, 'dtype'): + values = np.array(values,copy=False) + if is_object_dtype(values): + values = cls(values, name=name, **kwargs).values + result = object.__new__(cls) result._data = values result.name = name @@ -260,6 +276,11 @@ def dtype(self): """ return the dtype object of the underlying data """ return self._data.dtype + @cache_readonly + def dtype_str(self): + """ return the dtype str of the underlying data """ + return str(self.dtype) + @property def values(self): """ return the underlying data as an ndarray """ @@ -340,15 +361,41 @@ def view(self, cls=None): result._id = self._id return result - def _shallow_copy(self, values=None, **kwargs): - """ create a new Index, don't copy the data, use the same object attributes - with passed in attributes taking precedence """ + def _shallow_copy(self, values=None, infer=False, **kwargs): + """ + create a new Index, don't copy the data, use the same object attributes + with passed in attributes taking precedence + + *this is an internal non-public method* + + Parameters + ---------- + values : the values to create the new Index, optional + infer : boolean, default False + if True, infer the new type of the passed values + kwargs : updates the default attributes for this Index + """ if values is None: values = self.values attributes = self._get_attributes_dict() attributes.update(kwargs) + + if infer: + attributes['copy'] = False + return Index(values, **attributes) + return self.__class__._simple_new(values,**attributes) + def _coerce_scalar_to_index(self, item): + """ + we need to coerce a scalar to a compat for our index type + + Parameters + ---------- + item : scalar item to coerce + """ + return Index([item], dtype=self.dtype, **self._get_attributes_dict()) + def copy(self, names=None, name=None, dtype=None, deep=False): """ Make a copy of this object. Name and dtype sets those attributes on @@ -1054,7 +1101,7 @@ def __hash__(self): raise TypeError("unhashable type: %r" % type(self).__name__) def __setitem__(self, key, value): - raise TypeError("Indexes does not support mutable operations") + raise TypeError("Index does not support mutable operations") def __getitem__(self, key): """ @@ -1131,7 +1178,9 @@ def append(self, other): appended : Index """ to_concat, name = self._ensure_compat_append(other) - return Index(np.concatenate(to_concat), name=name) + attribs = self._get_attributes_dict() + attribs['name'] = name + return self._shallow_copy(np.concatenate(to_concat), infer=True, **attribs) @staticmethod def _ensure_compat_concat(indexes): @@ -1145,7 +1194,7 @@ def _ensure_compat_concat(indexes): return indexes - def take(self, indexer, axis=0): + def take(self, indices, axis=0): """ return a new Index of the values selected by the indexer @@ -1154,11 +1203,9 @@ def take(self, indexer, axis=0): numpy.ndarray.take """ - indexer = com._ensure_platform_int(indexer) - taken = np.array(self).take(indexer) - - # by definition cannot propogate freq - return self._shallow_copy(taken, freq=None) + indices = com._ensure_platform_int(indices) + taken = self.values.take(indices) + return self._shallow_copy(taken) def putmask(self, mask, value): """ @@ -1547,31 +1594,46 @@ def sym_diff(self, other, result_name=None): other, result_name_update = self._convert_can_do_setop(other) if result_name is None: result_name = result_name_update + the_diff = sorted(set((self.difference(other)).union(other.difference(self)))) - return Index(the_diff, name=result_name) + attribs = self._get_attributes_dict() + attribs['name'] = result_name + if 'freq' in attribs: + attribs['freq'] = None + return self._shallow_copy(the_diff, infer=True, **attribs) - def get_loc(self, key, method=None): + def get_loc(self, key, method=None, tolerance=None): """ Get integer location for requested label Parameters ---------- key : label - method : {None, 'pad'/'ffill', 'backfill'/'bfill', 'nearest'} + method : {None, 'pad'/'ffill', 'backfill'/'bfill', 'nearest'}, optional * default: exact matches only. * pad / ffill: find the PREVIOUS index value if no exact match. * backfill / bfill: use NEXT index value if no exact match * nearest: use the NEAREST index value if no exact match. Tied distances are broken by preferring the larger index value. + tolerance : optional + Maximum distance from index value for inexact matches. The value of + the index at the matching location most satisfy the equation + ``abs(index[loc] - key) <= tolerance``. + + .. versionadded:: 0.17.0 Returns ------- loc : int if unique index, possibly slice or mask if not """ if method is None: + if tolerance is not None: + raise ValueError('tolerance argument only valid if using pad, ' + 'backfill or nearest lookups') return self._engine.get_loc(_values_from_object(key)) - indexer = self.get_indexer([key], method=method) + indexer = self.get_indexer([key], method=method, + tolerance=tolerance) if indexer.ndim > 1 or indexer.size > 1: raise TypeError('get_loc requires scalar valued input') loc = indexer.item() @@ -1640,7 +1702,7 @@ def get_level_values(self, level): self._validate_index_level(level) return self - def get_indexer(self, target, method=None, limit=None): + def get_indexer(self, target, method=None, limit=None, tolerance=None): """ Compute indexer and mask for new index given the current index. The indexer should be then used as an input to ndarray.take to align the @@ -1649,15 +1711,21 @@ def get_indexer(self, target, method=None, limit=None): Parameters ---------- target : Index - method : {None, 'pad'/'ffill', 'backfill'/'bfill', 'nearest'} + method : {None, 'pad'/'ffill', 'backfill'/'bfill', 'nearest'}, optional * default: exact matches only. * pad / ffill: find the PREVIOUS index value if no exact match. * backfill / bfill: use NEXT index value if no exact match * nearest: use the NEAREST index value if no exact match. Tied distances are broken by preferring the larger index value. - limit : int - Maximum number of consecuctive labels in ``target`` to match for + limit : int, optional + Maximum number of consecutive labels in ``target`` to match for inexact matches. + tolerance : optional + Maximum distance between original and new labels for inexact + matches. The values of the index at the matching locations most + satisfy the equation ``abs(index[indexer] - target) <= tolerance``. + + .. versionadded:: 0.17.0 Examples -------- @@ -1673,36 +1741,54 @@ def get_indexer(self, target, method=None, limit=None): """ method = com._clean_reindex_fill_method(method) target = _ensure_index(target) + if tolerance is not None: + tolerance = self._convert_tolerance(tolerance) pself, ptarget = self._possibly_promote(target) if pself is not self or ptarget is not target: - return pself.get_indexer(ptarget, method=method, limit=limit) + return pself.get_indexer(ptarget, method=method, limit=limit, + tolerance=tolerance) - if not is_dtype_equal(self.dtype,target.dtype): + if not is_dtype_equal(self.dtype, target.dtype): this = self.astype(object) target = target.astype(object) - return this.get_indexer(target, method=method, limit=limit) + return this.get_indexer(target, method=method, limit=limit, + tolerance=tolerance) if not self.is_unique: raise InvalidIndexError('Reindexing only valid with uniquely' ' valued Index objects') if method == 'pad' or method == 'backfill': - indexer = self._get_fill_indexer(target, method, limit) + indexer = self._get_fill_indexer(target, method, limit, tolerance) elif method == 'nearest': - indexer = self._get_nearest_indexer(target, limit) + indexer = self._get_nearest_indexer(target, limit, tolerance) else: + if tolerance is not None: + raise ValueError('tolerance argument only valid if doing pad, ' + 'backfill or nearest reindexing') + if limit is not None: + raise ValueError('limit argument only valid if doing pad, ' + 'backfill or nearest reindexing') + indexer = self._engine.get_indexer(target.values) return com._ensure_platform_int(indexer) - def _get_fill_indexer(self, target, method, limit=None): + def _convert_tolerance(self, tolerance): + # override this method on subclasses + return tolerance + + def _get_fill_indexer(self, target, method, limit=None, tolerance=None): if self.is_monotonic_increasing and target.is_monotonic_increasing: method = (self._engine.get_pad_indexer if method == 'pad' else self._engine.get_backfill_indexer) indexer = method(target.values, limit) else: indexer = self._get_fill_indexer_searchsorted(target, method, limit) + if tolerance is not None: + indexer = self._filter_indexer_tolerance( + target.values, indexer, tolerance) return indexer def _get_fill_indexer_searchsorted(self, target, method, limit=None): @@ -1735,7 +1821,7 @@ def _get_fill_indexer_searchsorted(self, target, method, limit=None): indexer[indexer == len(self)] = -1 return indexer - def _get_nearest_indexer(self, target, limit): + def _get_nearest_indexer(self, target, limit, tolerance): """ Get the indexer for the nearest index labels; requires an index with values that can be subtracted from each other (e.g., not strings or @@ -1752,6 +1838,14 @@ def _get_nearest_indexer(self, target, limit): indexer = np.where(op(left_distances, right_distances) | (right_indexer == -1), left_indexer, right_indexer) + if tolerance is not None: + indexer = self._filter_indexer_tolerance( + target, indexer, tolerance) + return indexer + + def _filter_indexer_tolerance(self, target, indexer, tolerance): + distance = abs(self.values[indexer] - target) + indexer = np.where(distance <= tolerance, indexer, -1) return indexer def get_indexer_non_unique(self, target): @@ -1838,7 +1932,7 @@ def isin(self, values, level=None): value_set = set(values) if level is not None: self._validate_index_level(level) - return lib.ismember(np.array(self), value_set) + return self._isin_type(np.array(self), value_set) def _can_reindex(self, indexer): """ @@ -1859,7 +1953,8 @@ def _can_reindex(self, indexer): if not self.is_unique and len(indexer): raise ValueError("cannot reindex from a duplicate axis") - def reindex(self, target, method=None, level=None, limit=None): + def reindex(self, target, method=None, level=None, limit=None, + tolerance=None): """ Create index with target's values (move/add/delete values as necessary) @@ -1899,7 +1994,8 @@ def reindex(self, target, method=None, level=None, limit=None): else: if self.is_unique: indexer = self.get_indexer(target, method=method, - limit=limit) + limit=limit, + tolerance=tolerance) else: if method is not None or limit is not None: raise ValueError("cannot reindex a non-unique index " @@ -2107,6 +2203,8 @@ def _join_multi(self, other, how, return_indexers=True): if self_is_mi: self, other = other, self flip_order = True + # flip if join method is right or left + how = {'right': 'left', 'left': 'right'}.get(how, how) level = other.names.index(jl) result = self._join_level(other, level, how=how, @@ -2437,7 +2535,7 @@ def get_slice_bound(self, label, side, kind): if is_bool_dtype(slc): slc = lib.maybe_booleans_to_slice(slc.view('u1')) else: - slc = lib.maybe_indices_to_slice(slc.astype('i8')) + slc = lib.maybe_indices_to_slice(slc.astype('i8'), len(self)) if isinstance(slc, np.ndarray): raise KeyError( "Cannot get %s slice bound for non-unique label:" @@ -2526,7 +2624,8 @@ def delete(self, loc): ------- new_index : Index """ - return Index(np.delete(self._data, loc), name=self.name) + attribs = self._get_attributes_dict() + return self._shallow_copy(np.delete(self._data, loc), **attribs) def insert(self, loc, item): """ @@ -2543,10 +2642,12 @@ def insert(self, loc, item): new_index : Index """ _self = np.asarray(self) - item_idx = Index([item], dtype=self.dtype).values + item = self._coerce_scalar_to_index(item).values + idx = np.concatenate( - (_self[:loc], item_idx, _self[loc:])) - return Index(idx, name=self.name) + (_self[:loc], item, _self[loc:])) + attribs = self._get_attributes_dict() + return self._shallow_copy(idx, infer=True, **attribs) def drop(self, labels, errors='raise'): """ @@ -2571,15 +2672,15 @@ def drop(self, labels, errors='raise'): indexer = indexer[~mask] return self.delete(indexer) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['drop_duplicates'] % _index_doc_kwargs) - def drop_duplicates(self, take_last=False): - result = super(Index, self).drop_duplicates(take_last=take_last) - return self._constructor(result) + def drop_duplicates(self, keep='first'): + return super(Index, self).drop_duplicates(keep=keep) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['duplicated'] % _index_doc_kwargs) - def duplicated(self, take_last=False): - return super(Index, self).duplicated(take_last=take_last) - + def duplicated(self, keep='first'): + return super(Index, self).duplicated(keep=keep) def _evaluate_with_timedelta_like(self, other, op, opstr): raise TypeError("can only perform ops with timedelta like values") @@ -2594,6 +2695,9 @@ def _add_comparison_methods(cls): def _make_compare(op): def _evaluate_compare(self, other): + if isinstance(other, (np.ndarray, Index, ABCSeries)): + if other.ndim > 0 and len(self) != len(other): + raise ValueError('Lengths must match to compare') func = getattr(self.values, op) result = func(np.asarray(other)) @@ -2806,7 +2910,7 @@ class CategoricalIndex(Index, PandasDelegate): _typ = 'categoricalindex' _engine_type = _index.Int64Engine - _attributes = ['name','categories','ordered'] + _attributes = ['name'] def __new__(cls, data=None, categories=None, ordered=None, dtype=None, copy=False, name=None, fastpath=False, **kwargs): @@ -2941,6 +3045,10 @@ def equals(self, other): return False + @property + def _formatter_func(self): + return self.categories._formatter_func + def _format_attrs(self): """ Return a list of tuples of the (attr,formatted_value) @@ -3003,10 +3111,11 @@ def _engine(self): def is_unique(self): return not self.duplicated().any() + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['duplicated'] % _index_doc_kwargs) - def duplicated(self, take_last=False): + def duplicated(self, keep='first'): from pandas.hashtable import duplicated_int64 - return duplicated_int64(self.codes.astype('i8'), take_last) + return duplicated_int64(self.codes.astype('i8'), keep) def get_loc(self, key, method=None): """ @@ -3035,7 +3144,8 @@ def _can_reindex(self, indexer): """ always allow reindexing """ pass - def reindex(self, target, method=None, level=None, limit=None): + def reindex(self, target, method=None, level=None, limit=None, + tolerance=None): """ Create index with target's values (move/add/delete values as necessary) @@ -3104,7 +3214,7 @@ def _reindex_non_unique(self, target): return new_target, indexer, new_indexer - def get_indexer(self, target, method=None, limit=None): + def get_indexer(self, target, method=None, limit=None, tolerance=None): """ Compute indexer and mask for new index given the current index. The indexer should be then used as an input to ndarray.take to align the @@ -3258,8 +3368,12 @@ def _evaluate_compare(self, other): elif isinstance(other, Index): other = self._create_categorical(self, other.values, categories=self.categories, ordered=self.ordered) + if isinstance(other, (ABCCategorical, np.ndarray, ABCSeries)): + if len(self.values) != len(other): + raise ValueError("Lengths must match to compare") + if isinstance(other, ABCCategorical): - if not (self.values.is_dtype_equal(other) and len(self.values) == len(other)): + if not self.values.is_dtype_equal(other): raise TypeError("categorical index comparisions must have the same categories and ordered attributes") return getattr(self.values, op)(other) @@ -3349,6 +3463,14 @@ def _maybe_cast_slice_bound(self, label, side, kind): return label + def _convert_tolerance(self, tolerance): + try: + return float(tolerance) + except ValueError: + raise ValueError('tolerance argument for %s must be numeric: %r' + % (type(self).__name__, tolerance)) + + class Int64Index(NumericIndex): """ @@ -3381,6 +3503,7 @@ class Int64Index(NumericIndex): _outer_indexer = _algos.outer_join_indexer_int64 _engine_type = _index.Int64Engine + _isin_type = lib.ismember_int64 def __new__(cls, data=None, dtype=None, copy=False, name=None, fastpath=False, **kwargs): @@ -3604,7 +3727,7 @@ def __contains__(self, other): except: return False - def get_loc(self, key, method=None): + def get_loc(self, key, method=None, tolerance=None): try: if np.all(np.isnan(key)): nan_idxs = self._nan_idxs @@ -3616,7 +3739,8 @@ def get_loc(self, key, method=None): return nan_idxs except (TypeError, NotImplementedError): pass - return super(Float64Index, self).get_loc(key, method=method) + return super(Float64Index, self).get_loc(key, method=method, + tolerance=tolerance) @property def is_all_dates(self): @@ -3671,7 +3795,7 @@ class MultiIndex(Index): Level of sortedness (must be lexicographically sorted by that level) names : optional sequence of objects - Names for each of the index levels. + Names for each of the index levels. (name is accepted for compat) copy : boolean, default False Copy the meta-data verify_integrity : boolean, default True @@ -3687,8 +3811,11 @@ class MultiIndex(Index): rename = Index.set_names def __new__(cls, levels=None, labels=None, sortorder=None, names=None, - copy=False, verify_integrity=True, _set_identity=True, **kwargs): + copy=False, verify_integrity=True, _set_identity=True, name=None, **kwargs): + # compat with Index + if name is not None: + names = name if levels is None or labels is None: raise TypeError("Must pass both levels and labels") if len(levels) != len(labels): @@ -3997,7 +4124,12 @@ def view(self, cls=None): result._id = self._id return result - _shallow_copy = view + def _shallow_copy(self, values=None, infer=False, **kwargs): + if values is not None: + if 'name' in kwargs: + kwargs['names'] = kwargs.pop('name',None) + return MultiIndex.from_tuples(values, **kwargs) + return self.view() @cache_readonly def dtype(self): @@ -4153,15 +4285,16 @@ def _has_complex_internals(self): def is_unique(self): return not self.duplicated().any() + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(_shared_docs['duplicated'] % _index_doc_kwargs) - def duplicated(self, take_last=False): + def duplicated(self, keep='first'): from pandas.core.groupby import get_group_index from pandas.hashtable import duplicated_int64 shape = map(len, self.levels) ids = get_group_index(self.labels, shape, sort=False, xnull=False) - return duplicated_int64(ids, take_last) + return duplicated_int64(ids, keep) def get_value(self, series, key): # somewhat broken encapsulation @@ -4411,7 +4544,7 @@ def from_arrays(cls, arrays, sortorder=None, names=None): levels = [c.categories for c in cats] labels = [c.codes for c in cats] if names is None: - names = [c.name for c in cats] + names = [getattr(arr, "name", None) for arr in arrays] return MultiIndex(levels=levels, labels=labels, sortorder=sortorder, names=names, @@ -4829,7 +4962,7 @@ def sortlevel(self, level=0, ascending=True, sort_remaining=True): return new_index, indexer - def get_indexer(self, target, method=None, limit=None): + def get_indexer(self, target, method=None, limit=None, tolerance=None): """ Compute indexer and mask for new index given the current index. The indexer should be then used as an input to ndarray.take to align the @@ -4875,6 +5008,9 @@ def get_indexer(self, target, method=None, limit=None): self_index = self._tuple_index if method == 'pad' or method == 'backfill': + if tolerance is not None: + raise NotImplementedError("tolerance not implemented yet " + 'for MultiIndex') indexer = self_index._get_fill_indexer(target, method, limit) elif method == 'nearest': raise NotImplementedError("method='nearest' not implemented yet " @@ -4884,7 +5020,8 @@ def get_indexer(self, target, method=None, limit=None): return com._ensure_platform_int(indexer) - def reindex(self, target, method=None, level=None, limit=None): + def reindex(self, target, method=None, level=None, limit=None, + tolerance=None): """ Create index with target's values (move/add/delete values as necessary) @@ -4923,7 +5060,8 @@ def reindex(self, target, method=None, level=None, limit=None): else: if self.is_unique: indexer = self.get_indexer(target, method=method, - limit=limit) + limit=limit, + tolerance=tolerance) else: raise Exception( "cannot handle a non-unique multi-index!") @@ -5042,7 +5180,7 @@ def _maybe_to_slice(loc): if not isinstance(loc, np.ndarray) or loc.dtype != 'int64': return loc - loc = lib.maybe_indices_to_slice(loc) + loc = lib.maybe_indices_to_slice(loc, len(self)) if isinstance(loc, slice): return loc @@ -5237,13 +5375,40 @@ def partial_selection(key, indexer=None): indexer = self._get_level_indexer(key, level=level) return indexer, maybe_droplevels(indexer, [level], drop_level) - def _get_level_indexer(self, key, level=0): - # return a boolean indexer or a slice showing where the key is + def _get_level_indexer(self, key, level=0, indexer=None): + # return an indexer, boolean array or a slice showing where the key is # in the totality of values + # if the indexer is provided, then use this level_index = self.levels[level] labels = self.labels[level] + def convert_indexer(start, stop, step, indexer=indexer, labels=labels): + # given the inputs and the labels/indexer, compute an indexer set + # if we have a provided indexer, then this need not consider + # the entire labels set + + r = np.arange(start,stop,step) + if indexer is not None and len(indexer) != len(labels): + + # we have an indexer which maps the locations in the labels that we + # have already selected (and is not an indexer for the entire set) + # otherwise this is wasteful + # so we only need to examine locations that are in this set + # the only magic here is that the result are the mappings to the + # set that we have selected + from pandas import Series + mapper = Series(indexer) + indexer = labels.take(com._ensure_platform_int(indexer)) + result = Series(Index(indexer).isin(r).nonzero()[0]) + m = result.map(mapper).values + + else: + m = np.zeros(len(labels),dtype=bool) + m[np.in1d(labels,r,assume_unique=True)] = True + + return m + if isinstance(key, slice): # handle a slice, returnig a slice if we can # otherwise a boolean indexer @@ -5269,17 +5434,13 @@ def _get_level_indexer(self, key, level=0): # a partial date slicer on a DatetimeIndex generates a slice # note that the stop ALREADY includes the stopped point (if # it was a string sliced) - m = np.zeros(len(labels),dtype=bool) - m[np.in1d(labels,np.arange(start.start,stop.stop,step))] = True - return m + return convert_indexer(start.start,stop.stop,step) elif level > 0 or self.lexsort_depth == 0 or step is not None: # need to have like semantics here to right # searching as when we are using a slice # so include the stop+1 (so we include stop) - m = np.zeros(len(labels),dtype=bool) - m[np.in1d(labels,np.arange(start,stop+1,step))] = True - return m + return convert_indexer(start,stop+1,step) else: # sorted, so can return slice object -> view i = labels.searchsorted(start, side='left') @@ -5317,59 +5478,73 @@ def get_locs(self, tup): raise KeyError('MultiIndex Slicing requires the index to be fully lexsorted' ' tuple len ({0}), lexsort depth ({1})'.format(len(tup), self.lexsort_depth)) - def _convert_indexer(r): + # indexer + # this is the list of all values that we want to select + n = len(self) + indexer = None + + def _convert_to_indexer(r): + # return an indexer if isinstance(r, slice): - m = np.zeros(len(self),dtype=bool) + m = np.zeros(n,dtype=bool) m[r] = True - return m - return r + r = m.nonzero()[0] + elif is_bool_indexer(r): + if len(r) != n: + raise ValueError("cannot index with a boolean indexer that is" + " not the same length as the index") + r = r.nonzero()[0] + return Int64Index(r) + + def _update_indexer(idxr, indexer=indexer): + if indexer is None: + indexer = Index(np.arange(n)) + if idxr is None: + return indexer + return indexer & idxr - ranges = [] for i,k in enumerate(tup): if is_bool_indexer(k): # a boolean indexer, must be the same length! k = np.asarray(k) - if len(k) != len(self): - raise ValueError("cannot index with a boolean indexer that is" - " not the same length as the index") - ranges.append(k) + indexer = _update_indexer(_convert_to_indexer(k), indexer=indexer) + elif is_list_like(k): # a collection of labels to include from this level (these are or'd) - indexers = [] + indexers = None for x in k: try: - indexers.append(_convert_indexer(self._get_level_indexer(x, level=i))) + idxrs = _convert_to_indexer(self._get_level_indexer(x, level=i, indexer=indexer)) + indexers = idxrs if indexers is None else indexers | idxrs except (KeyError): # ignore not founds continue - if len(k): - ranges.append(reduce(np.logical_or, indexers)) + + if indexers is not None: + indexer = _update_indexer(indexers, indexer=indexer) else: - ranges.append(np.zeros(self.labels[i].shape, dtype=bool)) + + # no matches we are done + return Int64Index([]).values elif is_null_slice(k): # empty slice - pass + indexer = _update_indexer(None, indexer=indexer) elif isinstance(k,slice): # a slice, include BOTH of the labels - ranges.append(self._get_level_indexer(k,level=i)) + indexer = _update_indexer(_convert_to_indexer(self._get_level_indexer(k,level=i,indexer=indexer)), indexer=indexer) else: # a single label - ranges.append(self.get_loc_level(k,level=i,drop_level=False)[0]) - - # identity - if len(ranges) == 0: - return slice(0,len(self)) - - elif len(ranges) == 1: - return ranges[0] + indexer = _update_indexer(_convert_to_indexer(self.get_loc_level(k,level=i,drop_level=False)[0]), indexer=indexer) - # construct a boolean indexer if we have a slice or boolean indexer - return reduce(np.logical_and,[ _convert_indexer(r) for r in ranges ]) + # empty indexer + if indexer is None: + return Int64Index([]).values + return indexer.values def truncate(self, before=None, after=None): """ diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 02309e6e4e3b5..b8ee831cdc12c 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -6,7 +6,7 @@ import pandas.core.common as com from pandas.core.common import (is_bool_indexer, is_integer_dtype, _asarray_tuplesafe, is_list_like, isnull, - is_null_slice, + is_null_slice, is_full_slice, ABCSeries, ABCDataFrame, ABCPanel, is_float, _values_from_object, _infer_fill_value, is_integer) import numpy as np @@ -201,6 +201,7 @@ def _setitem_with_indexer(self, indexer, value): # also has the side effect of consolidating in-place from pandas import Panel, DataFrame, Series + info_axis = self.obj._info_axis_number # maybe partial set take_split_path = self.obj._is_mixed_type @@ -213,6 +214,16 @@ def _setitem_with_indexer(self, indexer, value): val = list(value.values()) if isinstance(value,dict) else value take_split_path = not blk._can_hold_element(val) + if isinstance(indexer, tuple) and len(indexer) == len(self.obj.axes): + + for i, ax in zip(indexer, self.obj.axes): + + # if we have any multi-indexes that have non-trivial slices (not null slices) + # then we must take the split path, xref GH 10360 + if isinstance(ax, MultiIndex) and not (is_integer(i) or is_null_slice(i)): + take_split_path = True + break + if isinstance(indexer, tuple): nindexer = [] for i, idx in enumerate(indexer): @@ -328,14 +339,8 @@ def _setitem_with_indexer(self, indexer, value): return self.obj.__setitem__(indexer, value) # set - info_axis = self.obj._info_axis_number item_labels = self.obj._get_axis(info_axis) - # if we have a complicated setup, take the split path - if (isinstance(indexer, tuple) and - any([isinstance(ax, MultiIndex) for ax in self.obj.axes])): - take_split_path = True - # align and set the values if take_split_path: @@ -399,10 +404,10 @@ def setter(item, v): pi = plane_indexer[0] if lplane_indexer == 1 else plane_indexer # perform the equivalent of a setitem on the info axis - # as we have a null slice which means essentially reassign to the columns - # of a multi-dim object - # GH6149 - if isinstance(pi, tuple) and all(is_null_slice(idx) for idx in pi): + # as we have a null slice or a slice with full bounds + # which means essentially reassign to the columns of a multi-dim object + # GH6149 (null slice), GH10408 (full bounds) + if isinstance(pi, tuple) and all(is_null_slice(idx) or is_full_slice(idx, len(self.obj)) for idx in pi): s = v else: # set the item, possibly having a dtype change @@ -431,8 +436,8 @@ def can_do_equal_len(): return False - # we need an interable, with a ndim of at least 1 - # eg. don't pass thru np.array(0) + # we need an iterable, with a ndim of at least 1 + # eg. don't pass through np.array(0) if is_list_like_indexer(value) and getattr(value,'ndim',1) > 0: # we have an equal len Frame @@ -509,7 +514,7 @@ def can_do_equal_len(): def _align_series(self, indexer, ser): # indexer to assign Series can be tuple, slice, scalar - if isinstance(indexer, (slice, np.ndarray, list)): + if isinstance(indexer, (slice, np.ndarray, list, Index)): indexer = tuple([indexer]) if isinstance(indexer, tuple): @@ -1388,7 +1393,8 @@ def _is_valid_integer(self, key, axis): # return a boolean if we have a valid integer indexer ax = self.obj._get_axis(axis) - if key > len(ax): + l = len(ax) + if key >= l or key < -l: raise IndexError("single positional indexer is out-of-bounds") return True @@ -1400,7 +1406,7 @@ def _is_valid_list_like(self, key, axis): arr = np.array(key) ax = self.obj._get_axis(axis) l = len(ax) - if len(arr) and (arr.max() >= l or arr.min() <= -l): + if len(arr) and (arr.max() >= l or arr.min() < -l): raise IndexError("positional indexers are out-of-bounds") return True @@ -1719,7 +1725,7 @@ def maybe_convert_ix(*args): ixify = True for arg in args: - if not isinstance(arg, (np.ndarray, list, ABCSeries)): + if not isinstance(arg, (np.ndarray, list, ABCSeries, Index)): ixify = False if ixify: diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 7d83e45098ae1..1d6269ae904d2 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -2,7 +2,7 @@ import itertools import re import operator -from datetime import datetime, timedelta +from datetime import datetime, timedelta, date from collections import defaultdict import numpy as np @@ -14,7 +14,7 @@ is_null_datelike_scalar, _maybe_promote, is_timedelta64_dtype, is_datetime64_dtype, array_equivalent, _maybe_convert_string_to_object, - is_categorical) + is_categorical, needs_i8_conversion, is_datetimelike_v_numeric) from pandas.core.index import Index, MultiIndex, _ensure_index from pandas.core.indexing import maybe_convert_indices, length_of_indexer from pandas.core.categorical import Categorical, maybe_to_categorical @@ -622,7 +622,7 @@ def _is_empty_indexer(indexer): # may have to soft convert_objects here if block.is_object and not self.is_object: - block = block.convert(convert_numeric=False) + block = block.convert(numeric=False) return block except (ValueError, TypeError) as detail: @@ -632,7 +632,8 @@ def _is_empty_indexer(indexer): return [self] - def putmask(self, mask, new, align=True, inplace=False): + def putmask(self, mask, new, align=True, inplace=False, + axis=0, transpose=False): """ putmask the data to the block; it is possible that we may create a new dtype of block @@ -644,37 +645,57 @@ def putmask(self, mask, new, align=True, inplace=False): new : a ndarray/object align : boolean, perform alignment on other/cond, default is True inplace : perform inplace modification, default is False + axis : int + transpose : boolean + Set to True if self is stored with axes reversed Returns ------- - a new block(s), the result of the putmask + a list of new blocks, the result of the putmask """ new_values = self.values if inplace else self.values.copy() - # may need to align the new if hasattr(new, 'reindex_axis'): - new = new.values.T + new = new.values - # may need to align the mask if hasattr(mask, 'reindex_axis'): - mask = mask.values.T + mask = mask.values # if we are passed a scalar None, convert it here if not is_list_like(new) and isnull(new) and not self.is_object: new = self.fill_value if self._can_hold_element(new): + if transpose: + new_values = new_values.T + new = self._try_cast(new) - # pseudo-broadcast - if isinstance(new, np.ndarray) and new.ndim == self.ndim - 1: - new = np.repeat(new, self.shape[-1]).reshape(self.shape) + # If the default repeat behavior in np.putmask would go in the wrong + # direction, then explictly repeat and reshape new instead + if getattr(new, 'ndim', 0) >= 1: + if self.ndim - 1 == new.ndim and axis == 1: + new = np.repeat(new, new_values.shape[-1]).reshape( + self.shape) + new = new.astype(new_values.dtype) np.putmask(new_values, mask, new) # maybe upcast me elif mask.any(): + if transpose: + mask = mask.T + if isinstance(new, np.ndarray): + new = new.T + axis = new_values.ndim - axis - 1 + + # Pseudo-broadcast + if getattr(new, 'ndim', 0) >= 1: + if self.ndim - 1 == new.ndim: + new_shape = list(new.shape) + new_shape.insert(axis, 1) + new = new.reshape(tuple(new_shape)) # need to go column by column new_blocks = [] @@ -685,14 +706,15 @@ def putmask(self, mask, new, align=True, inplace=False): # need a new block if m.any(): - - n = new[i] if isinstance( - new, np.ndarray) else np.array(new) + if isinstance(new, np.ndarray): + n = np.squeeze(new[i % new.shape[0]]) + else: + n = np.array(new) # type of the new block dtype, _ = com._maybe_promote(n.dtype) - # we need to exiplicty astype here to make a copy + # we need to explicitly astype here to make a copy n = n.astype(dtype) nv = _putmask_smart(v, m, n) @@ -718,8 +740,10 @@ def putmask(self, mask, new, align=True, inplace=False): if inplace: return [self] - return [make_block(new_values, - placement=self.mgr_locs, fastpath=True)] + if transpose: + new_values = new_values.T + + return [make_block(new_values, placement=self.mgr_locs, fastpath=True)] def interpolate(self, method='pad', axis=0, index=None, values=None, inplace=False, limit=None, @@ -1003,7 +1027,7 @@ def handle_error(): fastpath=True, placement=self.mgr_locs)] def where(self, other, cond, align=True, raise_on_error=True, - try_cast=False): + try_cast=False, axis=0, transpose=False): """ evaluate the block; return result block(s) from the result @@ -1014,6 +1038,9 @@ def where(self, other, cond, align=True, raise_on_error=True, align : boolean, perform alignment on other/cond raise_on_error : if True, raise when I can't perform the function, False by default (and just return the data that we had coming in) + axis : int + transpose : boolean + Set to True if self is stored with axes reversed Returns ------- @@ -1021,43 +1048,23 @@ def where(self, other, cond, align=True, raise_on_error=True, """ values = self.values + if transpose: + values = values.T - # see if we can align other if hasattr(other, 'reindex_axis'): other = other.values - # make sure that we can broadcast - is_transposed = False - if hasattr(other, 'ndim') and hasattr(values, 'ndim'): - if values.ndim != other.ndim or values.shape == other.shape[::-1]: - - # if its symmetric are ok, no reshaping needed (GH 7506) - if (values.shape[0] == np.array(values.shape)).all(): - pass - - # pseodo broadcast (its a 2d vs 1d say and where needs it in a - # specific direction) - elif (other.ndim >= 1 and values.ndim - 1 == other.ndim and - values.shape[0] != other.shape[0]): - other = _block_shape(other).T - else: - values = values.T - is_transposed = True - - # see if we can align cond - if not hasattr(cond, 'shape'): - raise ValueError( - "where must have a condition that is ndarray like") - if hasattr(cond, 'reindex_axis'): cond = cond.values - # may need to undo transpose of values - if hasattr(values, 'ndim'): - if values.ndim != cond.ndim or values.shape == cond.shape[::-1]: + # If the default broadcasting would go in the wrong direction, then + # explictly reshape other instead + if getattr(other, 'ndim', 0) >= 1: + if values.ndim - 1 == other.ndim and axis == 1: + other = other.reshape(tuple(other.shape + (1,))) - values = values.T - is_transposed = not is_transposed + if not hasattr(cond, 'shape'): + raise ValueError("where must have a condition that is ndarray like") other = _maybe_convert_string_to_object(other) @@ -1090,15 +1097,14 @@ def func(c, v, o): raise TypeError('Could not compare [%s] with block values' % repr(other)) - if is_transposed: + if transpose: result = result.T # try to cast if requested if try_cast: result = self._try_cast_result(result) - return make_block(result, - ndim=self.ndim, placement=self.mgr_locs) + return make_block(result, ndim=self.ndim, placement=self.mgr_locs) # might need to separate out blocks axis = cond.ndim - 1 @@ -1455,7 +1461,7 @@ def is_bool(self): """ return lib.is_bool_array(self.values.ravel()) - def convert(self, convert_dates=True, convert_numeric=True, convert_timedeltas=True, + def convert(self, datetime=True, numeric=True, timedelta=True, coerce=False, copy=True, by_item=True): """ attempt to coerce any object types to better types return a copy of the block (if copy = True) @@ -1472,9 +1478,12 @@ def convert(self, convert_dates=True, convert_numeric=True, convert_timedeltas=T values = self.iget(i) values = com._possibly_convert_objects( - values.ravel(), convert_dates=convert_dates, - convert_numeric=convert_numeric, - convert_timedeltas=convert_timedeltas, + values.ravel(), + datetime=datetime, + numeric=numeric, + timedelta=timedelta, + coerce=coerce, + copy=copy ).reshape(values.shape) values = _block_shape(values, ndim=self.ndim) newb = make_block(values, @@ -1484,8 +1493,12 @@ def convert(self, convert_dates=True, convert_numeric=True, convert_timedeltas=T else: values = com._possibly_convert_objects( - self.values.ravel(), convert_dates=convert_dates, - convert_numeric=convert_numeric + self.values.ravel(), + datetime=datetime, + numeric=numeric, + timedelta=timedelta, + coerce=coerce, + copy=copy ).reshape(self.values.shape) blocks.append(make_block(values, ndim=self.ndim, placement=self.mgr_locs)) @@ -1529,8 +1542,8 @@ def _maybe_downcast(self, blocks, downcast=None): # split and convert the blocks result_blocks = [] for blk in blocks: - result_blocks.extend(blk.convert(convert_dates=True, - convert_numeric=False)) + result_blocks.extend(blk.convert(datetime=True, + numeric=False)) return result_blocks def _can_hold_element(self, element): @@ -1670,6 +1683,9 @@ def is_view(self): def to_dense(self): return self.values.to_dense().view() + def convert(self, copy=True, **kwargs): + return [self.copy() if copy else self] + @property def shape(self): return (len(self.mgr_locs), len(self.values)) @@ -1706,6 +1722,10 @@ def interpolate(self, method='pad', axis=0, inplace=False, limit=limit), placement=self.mgr_locs) + def shift(self, periods, axis=0): + return self.make_block_same_class(values=self.values.shift(periods), + placement=self.mgr_locs) + def take_nd(self, indexer, axis=0, new_mgr_locs=None, fill_tuple=None): """ Take values according to indexer and return them as a block.bb @@ -1730,7 +1750,8 @@ def take_nd(self, indexer, axis=0, new_mgr_locs=None, fill_tuple=None): return self.make_block_same_class(new_values, new_mgr_locs) - def putmask(self, mask, new, align=True, inplace=False): + def putmask(self, mask, new, align=True, inplace=False, + axis=0, transpose=False): """ putmask the data to the block; it is possible that we may create a new dtype of block @@ -1825,7 +1846,7 @@ def _try_coerce_args(self, values, other): if is_null_datelike_scalar(other): other = tslib.iNaT - elif isinstance(other, datetime): + elif isinstance(other, (datetime, np.datetime64, date)): other = lib.Timestamp(other).asm8.view('i8') elif hasattr(other, 'dtype') and com.is_integer_dtype(other): other = other.view('i8') @@ -2107,7 +2128,7 @@ def make_block(values, placement, klass=None, ndim=None, class BlockManager(PandasObject): """ - Core internal data structure to implement DataFrame + Core internal data structure to implement DataFrame, Series, Panel, etc. Manage a bunch of labeled 2D mixed-type ndarrays. Essentially it's a lightweight blocked set of labeled data to be manipulated by the DataFrame @@ -2422,12 +2443,18 @@ def apply(self, f, axes=None, filter=None, do_integrity_check=False, **kwargs): else: kwargs['filter'] = filter_locs - if f == 'where' and kwargs.get('align', True): + if f == 'where': align_copy = True - align_keys = ['other', 'cond'] - elif f == 'putmask' and kwargs.get('align', True): + if kwargs.get('align', True): + align_keys = ['other', 'cond'] + else: + align_keys = ['cond'] + elif f == 'putmask': align_copy = False - align_keys = ['new', 'mask'] + if kwargs.get('align', True): + align_keys = ['new', 'mask'] + else: + align_keys = ['mask'] elif f == 'eval': align_copy = False align_keys = ['other'] @@ -3875,9 +3902,16 @@ def _vstack(to_stack, dtype): def _possibly_compare(a, b, op): - res = op(a, b) + is_a_array = isinstance(a, np.ndarray) is_b_array = isinstance(b, np.ndarray) + + # numpy deprecation warning to have i8 vs integer comparisions + if is_datetimelike_v_numeric(a, b): + res = False + else: + res = op(a, b) + if np.isscalar(res) and (is_a_array or is_b_array): type_names = [type(a).__name__, type(b).__name__] @@ -4130,7 +4164,7 @@ def get_empty_dtype_and_na(join_units): else: return np.dtype(np.bool_), None elif 'category' in upcast_classes: - return com.CategoricalDtype(), np.nan + return np.dtype(np.object_), np.nan elif 'float' in upcast_classes: return np.dtype(np.float64), np.nan elif 'datetime' in upcast_classes: @@ -4378,7 +4412,11 @@ def is_null(self): # Usually it's enough to check but a small fraction of values to see if # a block is NOT null, chunks should help in such cases. 1000 value # was chosen rather arbitrarily. - values_flat = self.block.values.ravel() + values = self.block.values + if self.block.is_categorical: + values_flat = values.categories + else: + values_flat = values.ravel() total_len = values_flat.shape[0] chunk_len = max(total_len // 40, 1000) for i in range(0, total_len, chunk_len): diff --git a/pandas/core/ops.py b/pandas/core/ops.py index 0b62eb1e53ddb..8e3dd3836855c 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -6,6 +6,7 @@ # necessary to enforce truediv in Python 2.X from __future__ import division import operator +import warnings import numpy as np import pandas as pd from pandas import compat, lib, tslib @@ -13,9 +14,15 @@ from pandas.util.decorators import Appender import pandas.core.common as com import pandas.computation.expressions as expressions -from pandas.core.common import(bind_method, is_list_like, notnull, isnull, - _values_from_object, _maybe_match_name) - +from pandas.lib import isscalar +from pandas.tslib import iNaT +from pandas.compat import bind_method +from pandas.core.common import(is_list_like, notnull, isnull, + _values_from_object, _maybe_match_name, + needs_i8_conversion, is_datetimelike_v_numeric, + is_integer_dtype, is_categorical_dtype, is_object_dtype, + is_timedelta64_dtype, is_datetime64_dtype, is_bool_dtype) +from pandas.io.common import PerformanceWarning # ----------------------------------------------------------------------------- # Functions that add arithmetic methods to objects, given arithmetic factory # methods @@ -257,7 +264,7 @@ class _TimeOp(object): Generally, you should use classmethod ``maybe_convert_for_time_op`` as an entry point. """ - fill_value = tslib.iNaT + fill_value = iNaT wrap_results = staticmethod(lambda x: x) dtype = None @@ -270,14 +277,18 @@ def __init__(self, left, right, name): self.left = left self.right = right - lvalues = self._convert_to_array(left, name=name) - rvalues = self._convert_to_array(right, name=name, other=lvalues) - self.is_timedelta_lhs = com.is_timedelta64_dtype(left) - self.is_datetime_lhs = com.is_datetime64_dtype(left) + self.is_offset_lhs = self._is_offset(left) + self.is_offset_rhs = self._is_offset(right) + + lvalues = self._convert_to_array(left, name=name) + self.is_timedelta_lhs = is_timedelta64_dtype(left) + self.is_datetime_lhs = is_datetime64_dtype(left) self.is_integer_lhs = left.dtype.kind in ['i', 'u'] - self.is_datetime_rhs = com.is_datetime64_dtype(rvalues) - self.is_timedelta_rhs = com.is_timedelta64_dtype(rvalues) + + rvalues = self._convert_to_array(right, name=name, other=lvalues) + self.is_datetime_rhs = is_datetime64_dtype(rvalues) + self.is_timedelta_rhs = is_timedelta64_dtype(rvalues) self.is_integer_rhs = rvalues.dtype.kind in ('i', 'u') self._validate() @@ -303,7 +314,10 @@ def _validate(self): " passed" % self.name) # 2 timedeltas - elif self.is_timedelta_lhs and self.is_timedelta_rhs: + elif ((self.is_timedelta_lhs and + (self.is_timedelta_rhs or self.is_offset_rhs)) or + (self.is_timedelta_rhs and + (self.is_timedelta_lhs or self.is_offset_lhs))): if self.name not in ('__div__', '__truediv__', '__add__', '__sub__'): @@ -311,19 +325,21 @@ def _validate(self): "addition, subtraction, and division, but the" " operator [%s] was passed" % self.name) - # datetime and timedelta - elif self.is_datetime_lhs and self.is_timedelta_rhs: + # datetime and timedelta/DateOffset + elif (self.is_datetime_lhs and + (self.is_timedelta_rhs or self.is_offset_rhs)): if self.name not in ('__add__', '__sub__'): raise TypeError("can only operate on a datetime with a rhs of" - " a timedelta for addition and subtraction, " + " a timedelta/DateOffset for addition and subtraction," " but the operator [%s] was passed" % self.name) - elif self.is_timedelta_lhs and self.is_datetime_rhs: + elif ((self.is_timedelta_lhs or self.is_offset_lhs) + and self.is_datetime_rhs): if self.name != '__add__': - raise TypeError("can only operate on a timedelta and" + raise TypeError("can only operate on a timedelta/DateOffset and" " a datetime for addition, but the operator" " [%s] was passed" % self.name) else: @@ -335,7 +351,6 @@ def _convert_to_array(self, values, name=None, other=None): """converts values to ndarray""" from pandas.tseries.timedeltas import to_timedelta - coerce = True if not is_list_like(values): values = np.array([values]) inferred_type = lib.infer_dtype(values) @@ -346,17 +361,17 @@ def _convert_to_array(self, values, name=None, other=None): if (other is not None and other.dtype == 'timedelta64[ns]' and all(isnull(v) for v in values)): values = np.empty(values.shape, dtype=other.dtype) - values[:] = tslib.iNaT + values[:] = iNaT # a datelike elif isinstance(values, pd.DatetimeIndex): values = values.to_series() elif not (isinstance(values, (np.ndarray, pd.Series)) and - com.is_datetime64_dtype(values)): + is_datetime64_dtype(values)): values = tslib.array_to_datetime(values) elif inferred_type in ('timedelta', 'timedelta64'): # have a timedelta, convert to to ns here - values = to_timedelta(values, coerce=coerce) + values = to_timedelta(values, errors='coerce') elif inferred_type == 'integer': # py3 compat where dtype is 'm' but is an integer if values.dtype.kind == 'm': @@ -366,26 +381,17 @@ def _convert_to_array(self, values, name=None, other=None): elif name not in ('__truediv__', '__div__', '__mul__'): raise TypeError("incompatible type for a datetime/timedelta " "operation [{0}]".format(name)) - elif isinstance(values[0], pd.DateOffset): - # handle DateOffsets - os = np.array([getattr(v, 'delta', None) for v in values]) - mask = isnull(os) - if mask.any(): - raise TypeError("cannot use a non-absolute DateOffset in " - "datetime/timedelta operations [{0}]".format( - ', '.join([com.pprint_thing(v) - for v in values[mask]]))) - values = to_timedelta(os, coerce=coerce) elif inferred_type == 'floating': - # all nan, so ok, use the other dtype (e.g. timedelta or datetime) if isnull(values).all(): values = np.empty(values.shape, dtype=other.dtype) - values[:] = tslib.iNaT + values[:] = iNaT else: raise TypeError( 'incompatible type [{0}] for a datetime/timedelta ' 'operation'.format(np.array(values).dtype)) + elif self._is_offset(values): + return values else: raise TypeError("incompatible type [{0}] for a datetime/timedelta" " operation".format(np.array(values).dtype)) @@ -393,6 +399,7 @@ def _convert_to_array(self, values, name=None, other=None): return values def _convert_for_datetime(self, lvalues, rvalues): + from pandas.tseries.timedeltas import to_timedelta mask = None # datetimes require views if self.is_datetime_lhs or self.is_datetime_rhs: @@ -402,13 +409,40 @@ def _convert_for_datetime(self, lvalues, rvalues): else: self.dtype = 'datetime64[ns]' mask = isnull(lvalues) | isnull(rvalues) - lvalues = lvalues.view(np.int64) - rvalues = rvalues.view(np.int64) + + # if adding single offset try vectorized path + # in DatetimeIndex; otherwise elementwise apply + if self.is_offset_lhs: + if len(lvalues) == 1: + rvalues = pd.DatetimeIndex(rvalues) + lvalues = lvalues[0] + else: + warnings.warn("Adding/subtracting array of DateOffsets to Series not vectorized", + PerformanceWarning) + rvalues = rvalues.astype('O') + elif self.is_offset_rhs: + if len(rvalues) == 1: + lvalues = pd.DatetimeIndex(lvalues) + rvalues = rvalues[0] + else: + warnings.warn("Adding/subtracting array of DateOffsets to Series not vectorized", + PerformanceWarning) + lvalues = lvalues.astype('O') + else: + lvalues = lvalues.view(np.int64) + rvalues = rvalues.view(np.int64) # otherwise it's a timedelta else: self.dtype = 'timedelta64[ns]' mask = isnull(lvalues) | isnull(rvalues) + + # convert Tick DateOffset to underlying delta + if self.is_offset_lhs: + lvalues = to_timedelta(lvalues) + if self.is_offset_rhs: + rvalues = to_timedelta(rvalues) + lvalues = lvalues.astype(np.int64) rvalues = rvalues.astype(np.int64) @@ -434,6 +468,16 @@ def f(x): self.lvalues = lvalues self.rvalues = rvalues + + def _is_offset(self, arr_or_obj): + """ check if obj or all elements of list-like is DateOffset """ + if isinstance(arr_or_obj, pd.DateOffset): + return True + elif is_list_like(arr_or_obj): + return all(isinstance(x, pd.DateOffset) for x in arr_or_obj) + else: + return False + @classmethod def maybe_convert_for_time_op(cls, left, right, name): """ @@ -445,8 +489,8 @@ def maybe_convert_for_time_op(cls, left, right, name): that the data is not the right type for time ops. """ # decide if we can do it - is_timedelta_lhs = com.is_timedelta64_dtype(left) - is_datetime_lhs = com.is_datetime64_dtype(left) + is_timedelta_lhs = is_timedelta64_dtype(left) + is_datetime_lhs = is_datetime64_dtype(left) if not (is_datetime_lhs or is_timedelta_lhs): return None @@ -527,8 +571,8 @@ def wrapper(left, right, name=name): name=name, dtype=dtype) else: # scalars - if hasattr(lvalues, 'values'): - lvalues = lvalues.values + if hasattr(lvalues, 'values') and not isinstance(lvalues, pd.DatetimeIndex): + lvalues = lvalues.values return left._constructor(wrap_results(na_op(lvalues, rvalues)), index=left.index, name=left.name, dtype=dtype) @@ -544,17 +588,17 @@ def na_op(x, y): # dispatch to the categorical if we have a categorical # in either operand - if com.is_categorical_dtype(x): + if is_categorical_dtype(x): return op(x,y) - elif com.is_categorical_dtype(y) and not lib.isscalar(y): + elif is_categorical_dtype(y) and not isscalar(y): return op(y,x) - if x.dtype == np.object_: + if is_object_dtype(x.dtype): if isinstance(y, list): y = lib.list_to_object_array(y) if isinstance(y, (np.ndarray, pd.Series)): - if y.dtype != np.object_: + if not is_object_dtype(y.dtype): result = lib.vec_compare(x, y.astype(np.object_), op) else: result = lib.vec_compare(x, y, op) @@ -562,13 +606,44 @@ def na_op(x, y): result = lib.scalar_compare(x, y, op) else: + # we want to compare like types + # we only want to convert to integer like if + # we are not NotImplemented, otherwise + # we would allow datetime64 (but viewed as i8) against + # integer comparisons + if is_datetimelike_v_numeric(x, y): + raise TypeError("invalid type comparison") + + # numpy does not like comparisons vs None + if isscalar(y) and isnull(y): + y = np.nan + + # we have a datetime/timedelta and may need to convert + mask = None + if needs_i8_conversion(x) or (not isscalar(y) and needs_i8_conversion(y)): + + if isscalar(y): + y = _index.convert_scalar(x,_values_from_object(y)) + else: + y = y.view('i8') + + if name == '__ne__': + mask = notnull(x) + else: + mask = isnull(x) + + x = x.view('i8') + try: result = getattr(x, name)(y) if result is NotImplemented: raise TypeError("invalid type comparison") - except (AttributeError): + except AttributeError: result = op(x, y) + if mask is not None and mask.any(): + result[mask] = False + return result def wrapper(self, other, axis=None): @@ -590,29 +665,24 @@ def wrapper(self, other, axis=None): return self._constructor(na_op(self.values, np.asarray(other)), index=self.index).__finalize__(self) elif isinstance(other, pd.Categorical): - if not com.is_categorical_dtype(self): + if not is_categorical_dtype(self): msg = "Cannot compare a Categorical for op {op} with Series of dtype {typ}.\n"\ "If you want to compare values, use 'series np.asarray(other)'." raise TypeError(msg.format(op=op,typ=self.dtype)) - mask = isnull(self) - - if com.is_categorical_dtype(self): + if is_categorical_dtype(self): # cats are a special case as get_values() would return an ndarray, which would then # not take categories ordering into account # we can go directly to op, as the na_op would just test again and dispatch to it. res = op(self.values, other) else: values = self.get_values() - other = _index.convert_scalar(values,_values_from_object(other)) + if is_list_like(other): + other = np.asarray(other) - if issubclass(values.dtype.type, (np.datetime64, np.timedelta64)): - values = values.view('i8') - - # scalars res = na_op(values, other) - if np.isscalar(res): + if isscalar(res): raise TypeError('Could not compare %s type with Series' % type(other)) @@ -621,11 +691,6 @@ def wrapper(self, other, axis=None): res = pd.Series(res, index=self.index, name=self.name, dtype='bool') - - # mask out the invalids - if mask.any(): - res[mask] = masker - return res return wrapper @@ -643,8 +708,7 @@ def na_op(x, y): y = lib.list_to_object_array(y) if isinstance(y, (np.ndarray, pd.Series)): - if (x.dtype == np.bool_ and - y.dtype == np.bool_): # pragma: no cover + if (is_bool_dtype(x.dtype) and is_bool_dtype(y.dtype)): result = op(x, y) # when would this be hit? else: x = com._ensure_object(x) @@ -665,7 +729,7 @@ def na_op(x, y): return result def wrapper(self, other): - is_self_int_dtype = com.is_integer_dtype(self.dtype) + is_self_int_dtype = is_integer_dtype(self.dtype) fill_int = lambda x: x.fillna(0) fill_bool = lambda x: x.fillna(False).astype(bool) @@ -673,7 +737,7 @@ def wrapper(self, other): if isinstance(other, pd.Series): name = _maybe_match_name(self, other) other = other.reindex_like(self) - is_other_int_dtype = com.is_integer_dtype(other.dtype) + is_other_int_dtype = is_integer_dtype(other.dtype) other = fill_int(other) if is_other_int_dtype else fill_bool(other) filler = fill_int if is_self_int_dtype and is_other_int_dtype else fill_bool @@ -686,7 +750,7 @@ def wrapper(self, other): else: # scalars, list, tuple, np.array - filler = fill_int if is_self_int_dtype and com.is_integer_dtype(np.asarray(other)) else fill_bool + filler = fill_int if is_self_int_dtype and is_integer_dtype(np.asarray(other)) else fill_bool return filler(self._constructor(na_op(self.values, other), index=self.index)).__finalize__(self) @@ -1046,7 +1110,7 @@ def na_op(x, y): # work only for scalars def f(self, other): - if not np.isscalar(other): + if not isscalar(other): raise ValueError('Simple arithmetic with %s can only be ' 'done with scalar values' % self._constructor.__name__) diff --git a/pandas/core/panel4d.py b/pandas/core/panel4d.py index 3d480464388c8..7fafbd0eaa2b5 100644 --- a/pandas/core/panel4d.py +++ b/pandas/core/panel4d.py @@ -12,7 +12,9 @@ aliases={'major': 'major_axis', 'minor': 'minor_axis'}, stat_axis=2, ns=dict(__doc__=""" - Represents a 4 dimensional structured + Panel4D is a 4-Dimensional named container very much like a Panel, but + having 4 named dimensions. It is intended as a test bed for more + N-Dimensional named containers. Parameters ---------- diff --git a/pandas/core/reshape.py b/pandas/core/reshape.py index fd786fa30f842..fecfe5cd82c6d 100644 --- a/pandas/core/reshape.py +++ b/pandas/core/reshape.py @@ -319,11 +319,17 @@ def pivot(self, index=None, columns=None, values=None): See DataFrame.pivot """ if values is None: - indexed = self.set_index([index, columns]) + cols = [columns] if index is None else [index, columns] + append = index is None + indexed = self.set_index(cols, append=append) return indexed.unstack(columns) else: + if index is None: + index = self.index + else: + index = self[index] indexed = Series(self[values].values, - index=MultiIndex.from_arrays([self[index], + index=MultiIndex.from_arrays([index, self[columns]])) return indexed.unstack(columns) @@ -455,6 +461,12 @@ def stack(frame, level=-1, dropna=True): ------- stacked : Series """ + def factorize(index): + if index.is_unique: + return index, np.arange(len(index)) + cat = Categorical(index, ordered=True) + return cat.categories, cat.codes + N, K = frame.shape if isinstance(frame.columns, MultiIndex): if frame.columns._reference_duplicate_name(level): @@ -469,20 +481,22 @@ def stack(frame, level=-1, dropna=True): return _stack_multi_columns(frame, level_num=level_num, dropna=dropna) elif isinstance(frame.index, MultiIndex): new_levels = list(frame.index.levels) - new_levels.append(frame.columns) - new_labels = [lab.repeat(K) for lab in frame.index.labels] - new_labels.append(np.tile(np.arange(K), N).ravel()) + + clev, clab = factorize(frame.columns) + new_levels.append(clev) + new_labels.append(np.tile(clab, N).ravel()) new_names = list(frame.index.names) new_names.append(frame.columns.name) new_index = MultiIndex(levels=new_levels, labels=new_labels, names=new_names, verify_integrity=False) else: - ilabels = np.arange(N).repeat(K) - clabels = np.tile(np.arange(K), N).ravel() - new_index = MultiIndex(levels=[frame.index, frame.columns], - labels=[ilabels, clabels], + levels, (ilab, clab) = \ + zip(*map(factorize, (frame.index, frame.columns))) + labels = ilab.repeat(K), np.tile(clab, N).ravel() + new_index = MultiIndex(levels=levels, + labels=labels, names=[frame.index.name, frame.columns.name], verify_integrity=False) @@ -957,13 +971,15 @@ def get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, If `columns` is None then all the columns with `object` or `category` dtype will be converted. sparse : bool, default False - Whether the returned DataFrame should be sparse or not. + Whether the dummy columns should be sparse or not. Returns + SparseDataFrame if `data` is a Series or if all columns are included. + Otherwise returns a DataFrame with some SparseBlocks. .. versionadded:: 0.16.1 Returns ------- - dummies : DataFrame + dummies : DataFrame or SparseDataFrame Examples -------- @@ -1042,8 +1058,11 @@ def check_len(item, name): elif isinstance(prefix_sep, dict): prefix_sep = [prefix_sep[col] for col in columns_to_encode] - result = data.drop(columns_to_encode, axis=1) - with_dummies = [result] + if set(columns_to_encode) == set(data.columns): + with_dummies = [] + else: + with_dummies = [data.drop(columns_to_encode, axis=1)] + for (col, pre, sep) in zip(columns_to_encode, prefix, prefix_sep): dummy = _get_dummies_1d(data[col], prefix=pre, prefix_sep=sep, diff --git a/pandas/core/series.py b/pandas/core/series.py index dfbc5dbf84572..87fde996aaa67 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -19,6 +19,7 @@ is_list_like, _values_from_object, _possibly_cast_to_datetime, _possibly_castable, _possibly_convert_platform, _try_sort, + is_int64_dtype, ABCSparseArray, _maybe_match_name, _coerce_to_dtype, SettingWithCopyError, _maybe_box_datetimelike, ABCDataFrame, @@ -45,7 +46,7 @@ import pandas.core.datetools as datetools import pandas.core.format as fmt import pandas.core.nanops as nanops -from pandas.util.decorators import Appender, cache_readonly +from pandas.util.decorators import Appender, cache_readonly, deprecate_kwarg import pandas.lib as lib import pandas.tslib as tslib @@ -188,8 +189,6 @@ def __init__(self, data=None, index=None, dtype=None, name=None, elif isinstance(data, Categorical): if dtype is not None: raise ValueError("cannot specify a dtype with a Categorical") - if name is None: - name = data.name elif (isinstance(data, types.GeneratorType) or (compat.PY3 and isinstance(data, map))): data = list(data) @@ -437,10 +436,6 @@ def imag(self, v): __long__ = _coerce_method(int) __int__ = _coerce_method(int) - # we are preserving name here - def __getstate__(self): - return dict(_data=self._data, name=self.name) - def _unpickle_series_compat(self, state): if isinstance(state, dict): self._data = state['_data'] @@ -786,9 +781,30 @@ def reshape(self, *args, **kwargs): return self.values.reshape(shape, **kwargs) - iget_value = _ixs - iget = _ixs - irow = _ixs + def iget_value(self, i, axis=0): + """ + DEPRECATED. Use ``.iloc[i]`` or ``.iat[i]`` instead + """ + warnings.warn("iget_value(i) is deprecated. Please use .iloc[i] or .iat[i]", + FutureWarning, stacklevel=2) + return self._ixs(i) + + def iget(self, i, axis=0): + """ + DEPRECATED. Use ``.iloc[i]`` or ``.iat[i]`` instead + """ + + warnings.warn("iget(i) is deprecated. Please use .iloc[i]", + FutureWarning, stacklevel=2) + return self._ixs(i) + + def irow(self, i, axis=0): + """ + DEPRECATED. Use ``.iloc[i]`` or ``.iat[i]`` instead + """ + warnings.warn("irow(i) is deprecated. Please use .iloc[i] or iat[i]", + FutureWarning, stacklevel=2) + return self._ixs(i) def get_value(self, label, takeable=False): """ @@ -1139,14 +1155,15 @@ def mode(self): from pandas.core.algorithms import mode return mode(self) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(base._shared_docs['drop_duplicates'] % _shared_doc_kwargs) - def drop_duplicates(self, take_last=False, inplace=False): - return super(Series, self).drop_duplicates(take_last=take_last, - inplace=inplace) + def drop_duplicates(self, keep='first', inplace=False): + return super(Series, self).drop_duplicates(keep=keep, inplace=inplace) + @deprecate_kwarg('take_last', 'keep', mapping={True: 'last', False: 'first'}) @Appender(base._shared_docs['duplicated'] % _shared_doc_kwargs) - def duplicated(self, take_last=False): - return super(Series, self).duplicated(take_last=take_last) + def duplicated(self, keep='first'): + return super(Series, self).duplicated(keep=keep) def idxmin(self, axis=None, out=None, skipna=True): """ @@ -2250,17 +2267,22 @@ def isin(self, values): # may need i8 conversion for proper membership testing comps = _values_from_object(self) + f = lib.ismember if com.is_datetime64_dtype(self): from pandas.tseries.tools import to_datetime values = Series(to_datetime(values)).values.view('i8') comps = comps.view('i8') + f = lib.ismember_int64 elif com.is_timedelta64_dtype(self): from pandas.tseries.timedeltas import to_timedelta values = Series(to_timedelta(values)).values.view('i8') comps = comps.view('i8') + f = lib.ismember_int64 + elif is_int64_dtype(self): + f = lib.ismember_int64 value_set = set(values) - result = lib.ismember(comps, value_set) + result = f(comps, value_set) return self._constructor(result, index=self.index).__finalize__(self) def between(self, left, right, inclusive=True): @@ -2323,8 +2345,10 @@ def from_csv(cls, path, sep=',', parse_dates=True, header=None, sep=sep, parse_dates=parse_dates, encoding=encoding, infer_datetime_format=infer_datetime_format) - result = df.icol(0) - result.index.name = result.name = None + result = df.iloc[:,0] + if header is None: + result.index.name = result.name = None + return result def to_csv(self, path, index=True, sep=",", na_rep='', diff --git a/pandas/core/strings.py b/pandas/core/strings.py index db14e2b487415..7837fb60da9d6 100644 --- a/pandas/core/strings.py +++ b/pandas/core/strings.py @@ -193,7 +193,7 @@ def str_contains(arr, pat, case=True, flags=0, na=np.nan, regex=True): See Also -------- - match : analagous, but stricter, relying on re.match instead of re.search + match : analogous, but stricter, relying on re.match instead of re.search """ if regex: @@ -1270,11 +1270,11 @@ def pad(self, width, side='left', fillchar=' '): def center(self, width, fillchar=' '): return self.pad(width, side='both', fillchar=fillchar) - @Appender(_shared_docs['str_pad'] % dict(side='right', method='right')) + @Appender(_shared_docs['str_pad'] % dict(side='right', method='ljust')) def ljust(self, width, fillchar=' '): return self.pad(width, side='right', fillchar=fillchar) - @Appender(_shared_docs['str_pad'] % dict(side='left', method='left')) + @Appender(_shared_docs['str_pad'] % dict(side='left', method='rjust')) def rjust(self, width, fillchar=' '): return self.pad(width, side='left', fillchar=fillchar) diff --git a/pandas/hashtable.pyx b/pandas/hashtable.pyx index c4cd788216018..dfa7930ada62f 100644 --- a/pandas/hashtable.pyx +++ b/pandas/hashtable.pyx @@ -1,14 +1,19 @@ +# cython: profile=False + from cpython cimport PyObject, Py_INCREF, PyList_Check, PyTuple_Check from khash cimport * from numpy cimport * +from cpython cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free from util cimport _checknan cimport util import numpy as np +nan = np.nan -ONAN = np.nan +cdef extern from "numpy/npy_math.h": + double NAN "NPY_NAN" cimport cython cimport numpy as cnp @@ -28,33 +33,14 @@ PyDateTime_IMPORT cdef extern from "Python.h": int PySlice_Check(object) - -def list_to_object_array(list obj): - ''' - Convert list to object ndarray. Seriously can't believe I had to write this - function - ''' - cdef: - Py_ssize_t i, n - ndarray[object] arr - - n = len(obj) - arr = np.empty(n, dtype=object) - - for i from 0 <= i < n: - arr[i] = obj[i] - - return arr - - cdef size_t _INIT_VEC_CAP = 32 cdef class ObjectVector: cdef: + PyObject **data size_t n, m ndarray ao - PyObject **data def __cinit__(self): self.n = 0 @@ -65,11 +51,6 @@ cdef class ObjectVector: def __len__(self): return self.n - def to_array(self): - self.ao.resize(self.n) - self.m = self.n - return self.ao - cdef inline append(self, object o): if self.n == self.m: self.m = max(self.m * 2, _INIT_VEC_CAP) @@ -80,72 +61,120 @@ cdef class ObjectVector: self.data[self.n] = o self.n += 1 + def to_array(self): + self.ao.resize(self.n) + self.m = self.n + return self.ao + +ctypedef struct Int64VectorData: + int64_t *data + size_t n, m + +ctypedef struct Float64VectorData: + float64_t *data + size_t n, m + +ctypedef fused vector_data: + Int64VectorData + Float64VectorData + +ctypedef fused sixty_four_bit_scalar: + int64_t + float64_t + +cdef bint needs_resize(vector_data *data) nogil: + return data.n == data.m + +cdef void append_data(vector_data *data, sixty_four_bit_scalar x) nogil: + + # compile time specilization of the fused types + # as the cross-product is generated, but we cannot assign float->int + # the types that don't pass are pruned + if (vector_data is Int64VectorData and sixty_four_bit_scalar is int64_t) or ( + vector_data is Float64VectorData and sixty_four_bit_scalar is float64_t): + + data.data[data.n] = x + data.n += 1 cdef class Int64Vector: cdef: - size_t n, m + Int64VectorData *data ndarray ao - int64_t *data def __cinit__(self): - self.n = 0 - self.m = _INIT_VEC_CAP - self.ao = np.empty(_INIT_VEC_CAP, dtype=np.int64) - self.data = self.ao.data + self.data = PyMem_Malloc(sizeof(Int64VectorData)) + if not self.data: + raise MemoryError() + self.data.n = 0 + self.data.m = _INIT_VEC_CAP + self.ao = np.empty(self.data.m, dtype=np.int64) + self.data.data = self.ao.data + + cdef resize(self): + self.data.m = max(self.data.m * 4, _INIT_VEC_CAP) + self.ao.resize(self.data.m) + self.data.data = self.ao.data + + def __dealloc__(self): + PyMem_Free(self.data) def __len__(self): - return self.n + return self.data.n def to_array(self): - self.ao.resize(self.n) - self.m = self.n + self.ao.resize(self.data.n) + self.data.m = self.data.n return self.ao - cdef inline append(self, int64_t x): - if self.n == self.m: - self.m = max(self.m * 2, _INIT_VEC_CAP) - self.ao.resize(self.m) - self.data = self.ao.data + cdef inline void append(self, int64_t x): - self.data[self.n] = x - self.n += 1 + if needs_resize(self.data): + self.resize() + + append_data(self.data, x) cdef class Float64Vector: cdef: - size_t n, m + Float64VectorData *data ndarray ao - float64_t *data def __cinit__(self): - self.n = 0 - self.m = _INIT_VEC_CAP - self.ao = np.empty(_INIT_VEC_CAP, dtype=np.float64) - self.data = self.ao.data + self.data = PyMem_Malloc(sizeof(Float64VectorData)) + if not self.data: + raise MemoryError() + self.data.n = 0 + self.data.m = _INIT_VEC_CAP + self.ao = np.empty(self.data.m, dtype=np.float64) + self.data.data = self.ao.data + + cdef resize(self): + self.data.m = max(self.data.m * 4, _INIT_VEC_CAP) + self.ao.resize(self.data.m) + self.data.data = self.ao.data + + def __dealloc__(self): + PyMem_Free(self.data) def __len__(self): - return self.n + return self.data.n def to_array(self): - self.ao.resize(self.n) - self.m = self.n + self.ao.resize(self.data.n) + self.data.m = self.data.n return self.ao - cdef inline append(self, float64_t x): - if self.n == self.m: - self.m = max(self.m * 2, _INIT_VEC_CAP) - self.ao.resize(self.m) - self.data = self.ao.data + cdef inline void append(self, float64_t x): - self.data[self.n] = x - self.n += 1 + if needs_resize(self.data): + self.resize() + append_data(self.data, x) cdef class HashTable: pass - cdef class StringHashTable(HashTable): cdef kh_str_t *table @@ -157,9 +186,6 @@ cdef class StringHashTable(HashTable): def __dealloc__(self): kh_destroy_str(self.table) - cdef inline int check_type(self, object val): - return util.is_string_object(val) - cpdef get_item(self, object val): cdef khiter_t k k = kh_get_str(self.table, util.get_c_string(val)) @@ -256,111 +282,16 @@ cdef class StringHashTable(HashTable): return reverse, labels -cdef class Int32HashTable(HashTable): - cdef kh_int32_t *table - - def __init__(self, size_hint=1): - if size_hint is not None: - kh_resize_int32(self.table, size_hint) - - def __cinit__(self): - self.table = kh_init_int32() - - def __dealloc__(self): - kh_destroy_int32(self.table) - - cdef inline int check_type(self, object val): - return util.is_string_object(val) - - cpdef get_item(self, int32_t val): - cdef khiter_t k - k = kh_get_int32(self.table, val) - if k != self.table.n_buckets: - return self.table.vals[k] - else: - raise KeyError(val) - - def get_iter_test(self, int32_t key, Py_ssize_t iterations): - cdef Py_ssize_t i, val=0 - for i in range(iterations): - k = kh_get_int32(self.table, val) - if k != self.table.n_buckets: - val = self.table.vals[k] - - cpdef set_item(self, int32_t key, Py_ssize_t val): - cdef: - khiter_t k - int ret = 0 - - k = kh_put_int32(self.table, key, &ret) - self.table.keys[k] = key - if kh_exist_int32(self.table, k): - self.table.vals[k] = val - else: - raise KeyError(key) - - def map_locations(self, ndarray[int32_t] values): - cdef: - Py_ssize_t i, n = len(values) - int ret = 0 - int32_t val - khiter_t k - - for i in range(n): - val = values[i] - k = kh_put_int32(self.table, val, &ret) - self.table.vals[k] = i - - def lookup(self, ndarray[int32_t] values): - cdef: - Py_ssize_t i, n = len(values) - int32_t val - khiter_t k - ndarray[int32_t] locs = np.empty(n, dtype=np.int64) - - for i in range(n): - val = values[i] - k = kh_get_int32(self.table, val) - if k != self.table.n_buckets: - locs[i] = self.table.vals[k] - else: - locs[i] = -1 - - return locs - - def factorize(self, ndarray[int32_t] values): - cdef: - Py_ssize_t i, n = len(values) - ndarray[int64_t] labels = np.empty(n, dtype=np.int64) - dict reverse = {} - Py_ssize_t idx, count = 0 - int ret = 0 - int32_t val - khiter_t k - - for i in range(n): - val = values[i] - k = kh_get_int32(self.table, val) - if k != self.table.n_buckets: - idx = self.table.vals[k] - labels[i] = idx - else: - k = kh_put_int32(self.table, val, &ret) - self.table.vals[k] = count - reverse[count] = val - labels[i] = count - count += 1 - - return reverse, labels - -cdef class Int64HashTable: #(HashTable): - # cdef kh_int64_t *table +cdef class Int64HashTable(HashTable): def __cinit__(self, size_hint=1): self.table = kh_init_int64() if size_hint is not None: kh_resize_int64(self.table, size_hint) + def __len__(self): + return self.table.size + def __dealloc__(self): kh_destroy_int64(self.table) @@ -369,9 +300,6 @@ cdef class Int64HashTable: #(HashTable): k = kh_get_int64(self.table, key) return k != self.table.n_buckets - def __len__(self): - return self.table.size - cpdef get_item(self, int64_t val): cdef khiter_t k k = kh_get_int64(self.table, val) @@ -399,137 +327,166 @@ cdef class Int64HashTable: #(HashTable): else: raise KeyError(key) - def map(self, ndarray[int64_t] keys, ndarray[int64_t] values): + @cython.boundscheck(False) + def map(self, int64_t[:] keys, int64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 int64_t key khiter_t k - for i in range(n): - key = keys[i] - k = kh_put_int64(self.table, key, &ret) - self.table.vals[k] = values[i] + with nogil: + for i in range(n): + key = keys[i] + k = kh_put_int64(self.table, key, &ret) + self.table.vals[k] = values[i] - def map_locations(self, ndarray[int64_t] values): + @cython.boundscheck(False) + def map_locations(self, int64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 int64_t val khiter_t k - for i in range(n): - val = values[i] - k = kh_put_int64(self.table, val, &ret) - self.table.vals[k] = i + with nogil: + for i in range(n): + val = values[i] + k = kh_put_int64(self.table, val, &ret) + self.table.vals[k] = i - def lookup(self, ndarray[int64_t] values): + @cython.boundscheck(False) + def lookup(self, int64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 int64_t val khiter_t k - ndarray[int64_t] locs = np.empty(n, dtype=np.int64) + int64_t[:] locs = np.empty(n, dtype=np.int64) - for i in range(n): - val = values[i] - k = kh_get_int64(self.table, val) - if k != self.table.n_buckets: - locs[i] = self.table.vals[k] - else: - locs[i] = -1 + with nogil: + for i in range(n): + val = values[i] + k = kh_get_int64(self.table, val) + if k != self.table.n_buckets: + locs[i] = self.table.vals[k] + else: + locs[i] = -1 - return locs + return np.asarray(locs) def factorize(self, ndarray[object] values): reverse = {} labels = self.get_labels(values, reverse, 0) return reverse, labels - def get_labels(self, ndarray[int64_t] values, Int64Vector uniques, + @cython.boundscheck(False) + def get_labels(self, int64_t[:] values, Int64Vector uniques, Py_ssize_t count_prior, Py_ssize_t na_sentinel): cdef: Py_ssize_t i, n = len(values) - ndarray[int64_t] labels + int64_t[:] labels Py_ssize_t idx, count = count_prior int ret = 0 int64_t val khiter_t k + Int64VectorData *ud labels = np.empty(n, dtype=np.int64) - - for i in range(n): - val = values[i] - k = kh_get_int64(self.table, val) - if k != self.table.n_buckets: - idx = self.table.vals[k] - labels[i] = idx - else: - k = kh_put_int64(self.table, val, &ret) - self.table.vals[k] = count - uniques.append(val) - labels[i] = count - count += 1 - - return labels - - def get_labels_groupby(self, ndarray[int64_t] values): + ud = uniques.data + + with nogil: + for i in range(n): + val = values[i] + k = kh_get_int64(self.table, val) + if k != self.table.n_buckets: + idx = self.table.vals[k] + labels[i] = idx + else: + k = kh_put_int64(self.table, val, &ret) + self.table.vals[k] = count + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, val) + labels[i] = count + count += 1 + + return np.asarray(labels) + + @cython.boundscheck(False) + def get_labels_groupby(self, int64_t[:] values): cdef: Py_ssize_t i, n = len(values) - ndarray[int64_t] labels + int64_t[:] labels Py_ssize_t idx, count = 0 int ret = 0 int64_t val khiter_t k Int64Vector uniques = Int64Vector() + Int64VectorData *ud labels = np.empty(n, dtype=np.int64) - - for i in range(n): - val = values[i] - - # specific for groupby - if val < 0: - labels[i] = -1 - continue - - k = kh_get_int64(self.table, val) - if k != self.table.n_buckets: - idx = self.table.vals[k] - labels[i] = idx - else: - k = kh_put_int64(self.table, val, &ret) - self.table.vals[k] = count - uniques.append(val) - labels[i] = count - count += 1 + ud = uniques.data + + with nogil: + for i in range(n): + val = values[i] + + # specific for groupby + if val < 0: + labels[i] = -1 + continue + + k = kh_get_int64(self.table, val) + if k != self.table.n_buckets: + idx = self.table.vals[k] + labels[i] = idx + else: + k = kh_put_int64(self.table, val, &ret) + self.table.vals[k] = count + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, val) + labels[i] = count + count += 1 arr_uniques = uniques.to_array() - return labels, arr_uniques + return np.asarray(labels), arr_uniques - def unique(self, ndarray[int64_t] values): + @cython.boundscheck(False) + def unique(self, int64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 - ndarray result int64_t val khiter_t k Int64Vector uniques = Int64Vector() + Int64VectorData *ud - for i in range(n): - val = values[i] - k = kh_get_int64(self.table, val) - if k == self.table.n_buckets: - kh_put_int64(self.table, val, &ret) - uniques.append(val) + ud = uniques.data - result = uniques.to_array() + with nogil: + for i in range(n): + val = values[i] + k = kh_get_int64(self.table, val) + if k == self.table.n_buckets: + kh_put_int64(self.table, val, &ret) + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, val) - return result + return uniques.to_array() cdef class Float64HashTable(HashTable): + def __cinit__(self, size_hint=1): self.table = kh_init_float64() if size_hint is not None: @@ -566,99 +523,124 @@ cdef class Float64HashTable(HashTable): k = kh_get_float64(self.table, key) return k != self.table.n_buckets - def factorize(self, ndarray[float64_t] values): + def factorize(self, float64_t[:] values): uniques = Float64Vector() labels = self.get_labels(values, uniques, 0, -1) return uniques.to_array(), labels - def get_labels(self, ndarray[float64_t] values, + @cython.boundscheck(False) + def get_labels(self, float64_t[:] values, Float64Vector uniques, Py_ssize_t count_prior, int64_t na_sentinel): cdef: Py_ssize_t i, n = len(values) - ndarray[int64_t] labels + int64_t[:] labels Py_ssize_t idx, count = count_prior int ret = 0 float64_t val khiter_t k + Float64VectorData *ud labels = np.empty(n, dtype=np.int64) + ud = uniques.data - for i in range(n): - val = values[i] - - if val != val: - labels[i] = na_sentinel - continue - - k = kh_get_float64(self.table, val) - if k != self.table.n_buckets: - idx = self.table.vals[k] - labels[i] = idx - else: - k = kh_put_float64(self.table, val, &ret) - self.table.vals[k] = count - uniques.append(val) - labels[i] = count - count += 1 + with nogil: + for i in range(n): + val = values[i] - return labels + if val != val: + labels[i] = na_sentinel + continue - def map_locations(self, ndarray[float64_t] values): + k = kh_get_float64(self.table, val) + if k != self.table.n_buckets: + idx = self.table.vals[k] + labels[i] = idx + else: + k = kh_put_float64(self.table, val, &ret) + self.table.vals[k] = count + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, val) + labels[i] = count + count += 1 + + return np.asarray(labels) + + @cython.boundscheck(False) + def map_locations(self, float64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 khiter_t k - for i in range(n): - k = kh_put_float64(self.table, values[i], &ret) - self.table.vals[k] = i + with nogil: + for i in range(n): + k = kh_put_float64(self.table, values[i], &ret) + self.table.vals[k] = i - def lookup(self, ndarray[float64_t] values): + @cython.boundscheck(False) + def lookup(self, float64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 float64_t val khiter_t k - ndarray[int64_t] locs = np.empty(n, dtype=np.int64) + int64_t[:] locs = np.empty(n, dtype=np.int64) - for i in range(n): - val = values[i] - k = kh_get_float64(self.table, val) - if k != self.table.n_buckets: - locs[i] = self.table.vals[k] - else: - locs[i] = -1 + with nogil: + for i in range(n): + val = values[i] + k = kh_get_float64(self.table, val) + if k != self.table.n_buckets: + locs[i] = self.table.vals[k] + else: + locs[i] = -1 - return locs + return np.asarray(locs) - def unique(self, ndarray[float64_t] values): + @cython.boundscheck(False) + def unique(self, float64_t[:] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 float64_t val khiter_t k - Float64Vector uniques = Float64Vector() bint seen_na = 0 + Float64Vector uniques = Float64Vector() + Float64VectorData *ud - for i in range(n): - val = values[i] + ud = uniques.data - if val == val: - k = kh_get_float64(self.table, val) - if k == self.table.n_buckets: - kh_put_float64(self.table, val, &ret) - uniques.append(val) - elif not seen_na: - seen_na = 1 - uniques.append(ONAN) + with nogil: + for i in range(n): + val = values[i] + + if val == val: + k = kh_get_float64(self.table, val) + if k == self.table.n_buckets: + kh_put_float64(self.table, val, &ret) + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, val) + + elif not seen_na: + seen_na = 1 + + if needs_resize(ud): + with gil: + uniques.resize() + append_data(ud, NAN) return uniques.to_array() na_sentinel = object cdef class PyObjectHashTable(HashTable): - # cdef kh_pymap_t *table def __init__(self, size_hint=1): self.table = kh_init_pymap() @@ -740,7 +722,7 @@ cdef class PyObjectHashTable(HashTable): int ret = 0 object val khiter_t k - ndarray[int64_t] locs = np.empty(n, dtype=np.int64) + int64_t[:] locs = np.empty(n, dtype=np.int64) for i in range(n): val = values[i] @@ -754,30 +736,13 @@ cdef class PyObjectHashTable(HashTable): else: locs[i] = -1 - return locs - - def lookup2(self, ndarray[object] values): - cdef: - Py_ssize_t i, n = len(values) - int ret = 0 - object val - khiter_t k - long hval - ndarray[int64_t] locs = np.empty(n, dtype=np.int64) - - # for i in range(n): - # val = values[i] - # hval = PyObject_Hash(val) - # k = kh_get_pymap(self.table, val) - - return locs + return np.asarray(locs) def unique(self, ndarray[object] values): cdef: Py_ssize_t i, n = len(values) int ret = 0 object val - ndarray result khiter_t k ObjectVector uniques = ObjectVector() bint seen_na = 0 @@ -792,17 +757,15 @@ cdef class PyObjectHashTable(HashTable): uniques.append(val) elif not seen_na: seen_na = 1 - uniques.append(ONAN) - - result = uniques.to_array() + uniques.append(nan) - return result + return uniques.to_array() def get_labels(self, ndarray[object] values, ObjectVector uniques, Py_ssize_t count_prior, int64_t na_sentinel): cdef: Py_ssize_t i, n = len(values) - ndarray[int64_t] labels + int64_t[:] labels Py_ssize_t idx, count = count_prior int ret = 0 object val @@ -829,7 +792,7 @@ cdef class PyObjectHashTable(HashTable): labels[i] = count count += 1 - return labels + return np.asarray(labels) cdef class Factorizer: @@ -884,7 +847,7 @@ cdef class Int64Factorizer: def get_count(self): return self.count - def factorize(self, ndarray[int64_t] values, sort=False, + def factorize(self, int64_t[:] values, sort=False, na_sentinel=-1): labels = self.table.get_labels(values, self.uniques, self.count, na_sentinel) @@ -903,45 +866,92 @@ cdef class Int64Factorizer: self.count = len(self.uniques) return labels +ctypedef fused kh_scalar64: + kh_int64_t + kh_float64_t -cdef build_count_table_int64(ndarray[int64_t] values, kh_int64_t *table): +@cython.boundscheck(False) +cdef build_count_table_scalar64(sixty_four_bit_scalar[:] values, + kh_scalar64 *table, bint dropna): cdef: khiter_t k Py_ssize_t i, n = len(values) + sixty_four_bit_scalar val int ret = 0 - kh_resize_int64(table, n) + if sixty_four_bit_scalar is float64_t and kh_scalar64 is kh_float64_t: + with nogil: + kh_resize_float64(table, n) + + for i in range(n): + val = values[i] + if val == val or not dropna: + k = kh_get_float64(table, val) + if k != table.n_buckets: + table.vals[k] += 1 + else: + k = kh_put_float64(table, val, &ret) + table.vals[k] = 1 + elif sixty_four_bit_scalar is int64_t and kh_scalar64 is kh_int64_t: + with nogil: + kh_resize_int64(table, n) + + for i in range(n): + val = values[i] + k = kh_get_int64(table, val) + if k != table.n_buckets: + table.vals[k] += 1 + else: + k = kh_put_int64(table, val, &ret) + table.vals[k] = 1 + else: + raise ValueError("Table type must match scalar type.") - for i in range(n): - val = values[i] - k = kh_get_int64(table, val) - if k != table.n_buckets: - table.vals[k] += 1 - else: - k = kh_put_int64(table, val, &ret) - table.vals[k] = 1 -cpdef value_count_int64(ndarray[int64_t] values): +@cython.boundscheck(False) +cpdef value_count_scalar64(sixty_four_bit_scalar[:] values, bint dropna): cdef: Py_ssize_t i - kh_int64_t *table + kh_float64_t *ftable + kh_int64_t *itable + sixty_four_bit_scalar[:] result_keys + int64_t[:] result_counts int k - table = kh_init_int64() - build_count_table_int64(values, table) - i = 0 - result_keys = np.empty(table.n_occupied, dtype=np.int64) - result_counts = np.zeros(table.n_occupied, dtype=np.int64) - for k in range(table.n_buckets): - if kh_exist_int64(table, k): - result_keys[i] = table.keys[k] - result_counts[i] = table.vals[k] - i += 1 - kh_destroy_int64(table) - return result_keys, result_counts + if sixty_four_bit_scalar is float64_t: + ftable = kh_init_float64() + build_count_table_scalar64(values, ftable, dropna) + + result_keys = np.empty(ftable.n_occupied, dtype=np.float64) + result_counts = np.zeros(ftable.n_occupied, dtype=np.int64) + + with nogil: + for k in range(ftable.n_buckets): + if kh_exist_float64(ftable, k): + result_keys[i] = ftable.keys[k] + result_counts[i] = ftable.vals[k] + i += 1 + kh_destroy_float64(ftable) + + elif sixty_four_bit_scalar is int64_t: + itable = kh_init_int64() + build_count_table_scalar64(values, itable, dropna) + + result_keys = np.empty(itable.n_occupied, dtype=np.int64) + result_counts = np.zeros(itable.n_occupied, dtype=np.int64) + + with nogil: + for k in range(itable.n_buckets): + if kh_exist_int64(itable, k): + result_keys[i] = itable.keys[k] + result_counts[i] = itable.vals[k] + i += 1 + kh_destroy_int64(itable) + + return np.asarray(result_keys), np.asarray(result_counts) cdef build_count_table_object(ndarray[object] values, @@ -968,7 +978,7 @@ cdef build_count_table_object(ndarray[object] values, cpdef value_count_object(ndarray[object] values, - ndarray[uint8_t, cast=True] mask): + ndarray[uint8_t, cast=True] mask): cdef: Py_ssize_t i kh_pymap_t *table @@ -995,6 +1005,7 @@ def mode_object(ndarray[object] values, ndarray[uint8_t, cast=True] mask): int count, max_count = 2 int j = -1 # so you can do += int k + ndarray[object] modes kh_pymap_t *table table = kh_init_pymap() @@ -1019,56 +1030,76 @@ def mode_object(ndarray[object] values, ndarray[uint8_t, cast=True] mask): return modes[:j+1] -def mode_int64(ndarray[int64_t] values): +@cython.boundscheck(False) +def mode_int64(int64_t[:] values): cdef: int count, max_count = 2 int j = -1 # so you can do += int k kh_int64_t *table + ndarray[int64_t] modes table = kh_init_int64() - build_count_table_int64(values, table) + build_count_table_scalar64(values, table, 0) modes = np.empty(table.n_buckets, dtype=np.int64) - for k in range(table.n_buckets): - if kh_exist_int64(table, k): - count = table.vals[k] - if count == max_count: - j += 1 - elif count > max_count: - max_count = count - j = 0 - else: - continue - modes[j] = table.keys[k] + with nogil: + for k in range(table.n_buckets): + if kh_exist_int64(table, k): + count = table.vals[k] + + if count == max_count: + j += 1 + elif count > max_count: + max_count = count + j = 0 + else: + continue + modes[j] = table.keys[k] kh_destroy_int64(table) return modes[:j+1] - @cython.wraparound(False) @cython.boundscheck(False) -def duplicated_int64(ndarray[int64_t, ndim=1] values, int take_last): +def duplicated_int64(ndarray[int64_t, ndim=1] values, object keep='first'): cdef: - int ret = 0 + int ret = 0, value, k Py_ssize_t i, n = len(values) kh_int64_t * table = kh_init_int64() ndarray[uint8_t, ndim=1, cast=True] out = np.empty(n, dtype='bool') kh_resize_int64(table, min(n, _SIZE_HINT_LIMIT)) - if take_last: - for i from n > i >=0: - kh_put_int64(table, values[i], &ret) - out[i] = ret == 0 + if keep not in ('last', 'first', False): + raise ValueError('keep must be either "first", "last" or False') + + if keep == 'last': + with nogil: + for i from n > i >=0: + kh_put_int64(table, values[i], &ret) + out[i] = ret == 0 + elif keep == 'first': + with nogil: + for i from 0 <= i < n: + kh_put_int64(table, values[i], &ret) + out[i] = ret == 0 else: - for i from 0 <= i < n: - kh_put_int64(table, values[i], &ret) - out[i] = ret == 0 - + with nogil: + for i from 0 <= i < n: + value = values[i] + k = kh_get_int64(table, value) + if k != table.n_buckets: + out[table.vals[k]] = 1 + out[i] = 1 + else: + k = kh_put_int64(table, value, &ret) + table.keys[k] = value + table.vals[k] = i + out[i] = 0 kh_destroy_int64(table) return out @@ -1087,13 +1118,18 @@ def unique_label_indices(ndarray[int64_t, ndim=1] labels): kh_int64_t * table = kh_init_int64() Int64Vector idx = Int64Vector() ndarray[int64_t, ndim=1] arr + Int64VectorData *ud = idx.data kh_resize_int64(table, min(n, _SIZE_HINT_LIMIT)) - for i in range(n): - kh_put_int64(table, labels[i], &ret) - if ret != 0: - idx.append(i) + with nogil: + for i in range(n): + kh_put_int64(table, labels[i], &ret) + if ret != 0: + if needs_resize(ud): + with gil: + idx.resize() + append_data(ud, i) kh_destroy_int64(table) diff --git a/pandas/index.pyx b/pandas/index.pyx index 9be7e7404f3fe..1678e3b280ee5 100644 --- a/pandas/index.pyx +++ b/pandas/index.pyx @@ -1,3 +1,5 @@ +# cython: profile=False + from numpy cimport ndarray from numpy cimport (float64_t, int32_t, int64_t, uint8_t, @@ -89,6 +91,7 @@ cdef class IndexEngine: self.monotonic_check = 0 self.unique = 0 + self.unique_check = 0 self.monotonic_inc = 0 self.monotonic_dec = 0 @@ -230,16 +233,12 @@ cdef class IndexEngine: cdef inline _do_monotonic_check(self): try: values = self._get_index_values() - self.monotonic_inc, self.monotonic_dec, unique = \ + self.monotonic_inc, self.monotonic_dec = \ self._call_monotonic(values) - - if unique is not None: - self.unique = unique - self.unique_check = 1 - except TypeError: self.monotonic_inc = 0 self.monotonic_dec = 0 + self.monotonic_check = 1 cdef _get_index_values(self): diff --git a/pandas/io/api.py b/pandas/io/api.py index 5fa8c7ef60074..fedde462c74b7 100644 --- a/pandas/io/api.py +++ b/pandas/io/api.py @@ -9,6 +9,7 @@ from pandas.io.json import read_json from pandas.io.html import read_html from pandas.io.sql import read_sql, read_sql_table, read_sql_query +from pandas.io.sas import read_sas from pandas.io.stata import read_stata from pandas.io.pickle import read_pickle, to_pickle from pandas.io.packers import read_msgpack, to_msgpack diff --git a/pandas/io/common.py b/pandas/io/common.py index 65cfdff1df14b..c6ece61f05a01 100644 --- a/pandas/io/common.py +++ b/pandas/io/common.py @@ -73,7 +73,7 @@ def _is_s3_url(url): return False -def maybe_read_encoded_stream(reader, encoding=None): +def maybe_read_encoded_stream(reader, encoding=None, compression=None): """read an encoded stream from the reader and transform the bytes to unicode if required based on the encoding @@ -94,8 +94,14 @@ def maybe_read_encoded_stream(reader, encoding=None): else: errors = 'replace' encoding = 'utf-8' - reader = StringIO(reader.read().decode(encoding, errors)) + + if compression == 'gzip': + reader = BytesIO(reader.read()) + else: + reader = StringIO(reader.read().decode(encoding, errors)) else: + if compression == 'gzip': + reader = BytesIO(reader.read()) encoding = None return reader, encoding @@ -118,7 +124,8 @@ def _expand_user(filepath_or_buffer): return filepath_or_buffer -def get_filepath_or_buffer(filepath_or_buffer, encoding=None): +def get_filepath_or_buffer(filepath_or_buffer, encoding=None, + compression=None): """ If the filepath_or_buffer is a url, translate and return the buffer passthru otherwise. @@ -130,12 +137,19 @@ def get_filepath_or_buffer(filepath_or_buffer, encoding=None): Returns ------- - a filepath_or_buffer, the encoding + a filepath_or_buffer, the encoding, the compression """ if _is_url(filepath_or_buffer): req = _urlopen(str(filepath_or_buffer)) - return maybe_read_encoded_stream(req, encoding) + if compression == 'infer': + content_encoding = req.headers.get('Content-Encoding', None) + if content_encoding == 'gzip': + compression = 'gzip' + # cat on the compression to the tuple returned by the function + to_return = list(maybe_read_encoded_stream(req, encoding, compression)) + \ + [compression] + return tuple(to_return) if _is_s3_url(filepath_or_buffer): try: @@ -151,15 +165,14 @@ def get_filepath_or_buffer(filepath_or_buffer, encoding=None): except boto.exception.NoAuthHandlerFound: conn = boto.connect_s3(anon=True) - b = conn.get_bucket(parsed_url.netloc) + b = conn.get_bucket(parsed_url.netloc, validate=False) k = boto.s3.key.Key(b) k.key = parsed_url.path filepath_or_buffer = BytesIO(k.get_contents_as_string( encoding=encoding)) - return filepath_or_buffer, None - + return filepath_or_buffer, None, compression - return _expand_user(filepath_or_buffer), None + return _expand_user(filepath_or_buffer), None, compression def file_path_to_url(path): diff --git a/pandas/io/data.py b/pandas/io/data.py index 3e077bf526ab9..1556f6b00e981 100644 --- a/pandas/io/data.py +++ b/pandas/io/data.py @@ -504,7 +504,7 @@ def fetch_data(url, name): def get_data_famafrench(name): # path of zip files - zip_file_path = '{0}/{1}.zip'.format(_FAMAFRENCH_URL, name) + zip_file_path = '{0}/{1}_TXT.zip'.format(_FAMAFRENCH_URL, name) with urlopen(zip_file_path) as url: raw = url.read() diff --git a/pandas/io/excel.py b/pandas/io/excel.py index cab342dc339f4..d58d6590b96c0 100644 --- a/pandas/io/excel.py +++ b/pandas/io/excel.py @@ -9,11 +9,13 @@ import abc import numpy as np +from pandas.core.frame import DataFrame from pandas.io.parsers import TextParser from pandas.io.common import _is_url, _urlopen from pandas.tseries.period import Period from pandas import json -from pandas.compat import map, zip, reduce, range, lrange, u, add_metaclass +from pandas.compat import (map, zip, reduce, range, lrange, u, add_metaclass, + BytesIO, string_types) from pandas.core import config from pandas.core.common import pprint_thing import pandas.compat as compat @@ -417,10 +419,13 @@ def _parse_cell(cell_contents,cell_typ): if parse_cols is None or should_parse[j]: row.append(_parse_cell(value,typ)) data.append(row) - + + if sheet.nrows == 0: + return DataFrame() + if header is not None: data[header] = _trim_excel_header(data[header]) - + parser = TextParser(data, header=header, index_col=index_col, has_index_names=has_index_names, na_values=na_values, @@ -474,6 +479,8 @@ def _conv_value(val): val = bool(val) elif isinstance(val, Period): val = "%s" % val + elif com.is_list_like(val): + val = str(val) return val @@ -497,6 +504,11 @@ class ExcelWriter(object): datetime_format : string, default None Format string for datetime objects written into Excel files (e.g. 'YYYY-MM-DD HH:MM:SS') + + Notes + ----- + For compatibility with CSV writers, ExcelWriter serializes lists + and dicts to strings before writing. """ # Defining an ExcelWriter implementation (see abstract methods for more...) @@ -521,9 +533,13 @@ class ExcelWriter(object): # ExcelWriter. def __new__(cls, path, engine=None, **kwargs): # only switch class if generic(ExcelWriter) - if cls == ExcelWriter: + if issubclass(cls, ExcelWriter): if engine is None: - ext = os.path.splitext(path)[-1][1:] + if isinstance(path, string_types): + ext = os.path.splitext(path)[-1][1:] + else: + ext = 'xlsx' + try: engine = config.get_option('io.excel.%s.writer' % ext) except KeyError: @@ -574,7 +590,11 @@ def save(self): def __init__(self, path, engine=None, date_format=None, datetime_format=None, **engine_kwargs): # validate that this engine can handle the extension - ext = os.path.splitext(path)[-1] + if isinstance(path, string_types): + ext = os.path.splitext(path)[-1] + else: + ext = 'xls' if engine == 'xlwt' else 'xlsx' + self.check_extension(ext) self.path = path @@ -1159,7 +1179,7 @@ class _XlwtWriter(ExcelWriter): def __init__(self, path, engine=None, encoding=None, **engine_kwargs): # Use the xlwt module as the Excel writer. import xlwt - + engine_kwargs['engine'] = engine super(_XlwtWriter, self).__init__(path, **engine_kwargs) if encoding is None: @@ -1311,6 +1331,8 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): style_dict = {} for cell in cells: + val = _conv_value(cell.val) + num_format_str = None if isinstance(cell.val, datetime.datetime): num_format_str = self.datetime_format @@ -1336,7 +1358,7 @@ def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0): else: wks.write(startrow + cell.row, startcol + cell.col, - cell.val, style) + val, style) def _convert_to_style(self, style_dict, num_format_str=None): """ diff --git a/pandas/io/gbq.py b/pandas/io/gbq.py index f1fcc822adeaf..06ad8827a5642 100644 --- a/pandas/io/gbq.py +++ b/pandas/io/gbq.py @@ -294,7 +294,7 @@ def _parse_entry(field_value, field_type): return field_value -def read_gbq(query, project_id = None, index_col=None, col_order=None, reauth=False): +def read_gbq(query, project_id=None, index_col=None, col_order=None, reauth=False): """Load data from Google BigQuery. THIS IS AN EXPERIMENTAL LIBRARY diff --git a/pandas/io/json.py b/pandas/io/json.py index 2c1333326b701..81a916e058b3d 100644 --- a/pandas/io/json.py +++ b/pandas/io/json.py @@ -172,7 +172,7 @@ def read_json(path_or_buf=None, orient=None, typ='frame', dtype=True, result : Series or DataFrame """ - filepath_or_buffer, _ = get_filepath_or_buffer(path_or_buf) + filepath_or_buffer, _, _ = get_filepath_or_buffer(path_or_buf) if isinstance(filepath_or_buffer, compat.string_types): try: exists = os.path.exists(filepath_or_buffer) diff --git a/pandas/io/packers.py b/pandas/io/packers.py index 75ca44fd1ef3e..d5c02736a1cf5 100644 --- a/pandas/io/packers.py +++ b/pandas/io/packers.py @@ -60,7 +60,7 @@ from pandas.core.internals import BlockManager, make_block import pandas.core.internals as internals -from pandas.msgpack import Unpacker as _Unpacker, Packer as _Packer +from pandas.msgpack import Unpacker as _Unpacker, Packer as _Packer, ExtType # until we can pass this into our conversion functions, # this is pretty hacky @@ -126,12 +126,12 @@ def read_msgpack(path_or_buf, iterator=False, **kwargs): obj : type of object stored in file """ - path_or_buf, _ = get_filepath_or_buffer(path_or_buf) + path_or_buf, _, _ = get_filepath_or_buffer(path_or_buf) if iterator: return Iterator(path_or_buf) def read(fh): - l = list(unpack(fh)) + l = list(unpack(fh, **kwargs)) if len(l) == 1: return l[0] return l @@ -141,34 +141,44 @@ def read(fh): try: exists = os.path.exists(path_or_buf) - except (TypeError,ValueError): + except (TypeError, ValueError): exists = False if exists: with open(path_or_buf, 'rb') as fh: return read(fh) - # treat as a string-like - if not hasattr(path_or_buf, 'read'): - + # treat as a binary-like + if isinstance(path_or_buf, compat.binary_type): + fh = None try: fh = compat.BytesIO(path_or_buf) return read(fh) finally: - fh.close() + if fh is not None: + fh.close() # a buffer like - return read(path_or_buf) + if hasattr(path_or_buf, 'read') and compat.callable(path_or_buf.read): + return read(path_or_buf) + + raise ValueError('path_or_buf needs to be a string file path or file-like') dtype_dict = {21: np.dtype('M8[ns]'), u('datetime64[ns]'): np.dtype('M8[ns]'), u('datetime64[us]'): np.dtype('M8[us]'), 22: np.dtype('m8[ns]'), u('timedelta64[ns]'): np.dtype('m8[ns]'), - u('timedelta64[us]'): np.dtype('m8[us]')} + u('timedelta64[us]'): np.dtype('m8[us]'), + + # this is platform int, which we need to remap to np.int64 + # for compat on windows platforms + 7: np.dtype('int64'), +} def dtype_for(t): + """ return my dtype mapping, whether number or name """ if t in dtype_dict: return dtype_dict[t] return np.typeDict[t] @@ -212,7 +222,7 @@ def convert(values): # convert to a bytes array v = v.tostring() import zlib - return zlib.compress(v) + return ExtType(0, zlib.compress(v)) elif compressor == 'blosc': @@ -223,18 +233,24 @@ def convert(values): # convert to a bytes array v = v.tostring() import blosc - return blosc.compress(v, typesize=dtype.itemsize) + return ExtType(0, blosc.compress(v, typesize=dtype.itemsize)) # ndarray (on original dtype) - return v.tostring() + return ExtType(0, v.tostring()) def unconvert(values, dtype, compress=None): + as_is_ext = isinstance(values, ExtType) and values.code == 0 + + if as_is_ext: + values = values.data + if dtype == np.object_: return np.array(values, dtype=object) - values = values.encode('latin1') + if not as_is_ext: + values = values.encode('latin1') if compress == 'zlib': import zlib @@ -262,7 +278,7 @@ def encode(obj): 'klass': obj.__class__.__name__, 'name': getattr(obj, 'name', None), 'freq': getattr(obj, 'freqstr', None), - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj.asi8), 'compress': compressor} elif isinstance(obj, DatetimeIndex): @@ -275,7 +291,7 @@ def encode(obj): return {'typ': 'datetime_index', 'klass': obj.__class__.__name__, 'name': getattr(obj, 'name', None), - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj.asi8), 'freq': getattr(obj, 'freqstr', None), 'tz': tz, @@ -284,14 +300,14 @@ def encode(obj): return {'typ': 'multi_index', 'klass': obj.__class__.__name__, 'names': getattr(obj, 'names', None), - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj.values), 'compress': compressor} else: return {'typ': 'index', 'klass': obj.__class__.__name__, 'name': getattr(obj, 'name', None), - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj.values), 'compress': compressor} elif isinstance(obj, Series): @@ -301,7 +317,7 @@ def encode(obj): ) #d = {'typ': 'sparse_series', # 'klass': obj.__class__.__name__, - # 'dtype': obj.dtype.num, + # 'dtype': obj.dtype.name, # 'index': obj.index, # 'sp_index': obj.sp_index, # 'sp_values': convert(obj.sp_values), @@ -314,7 +330,7 @@ def encode(obj): 'klass': obj.__class__.__name__, 'name': getattr(obj, 'name', None), 'index': obj.index, - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj.values), 'compress': compressor} elif issubclass(tobj, NDFrame): @@ -353,9 +369,10 @@ def encode(obj): 'klass': obj.__class__.__name__, 'axes': data.axes, 'blocks': [{'items': data.items.take(b.mgr_locs), + 'locs': b.mgr_locs.as_array, 'values': convert(b.values), 'shape': b.values.shape, - 'dtype': b.dtype.num, + 'dtype': b.dtype.name, 'klass': b.__class__.__name__, 'compress': compressor } for b in data.blocks]} @@ -408,7 +425,7 @@ def encode(obj): return {'typ': 'ndarray', 'shape': obj.shape, 'ndim': obj.ndim, - 'dtype': obj.dtype.num, + 'dtype': obj.dtype.name, 'data': convert(obj), 'compress': compressor} elif isinstance(obj, np.number): @@ -444,11 +461,12 @@ def decode(obj): return Period(ordinal=obj['ordinal'], freq=obj['freq']) elif typ == 'index': dtype = dtype_for(obj['dtype']) - data = unconvert(obj['data'], np.typeDict[obj['dtype']], + data = unconvert(obj['data'], dtype, obj.get('compress')) return globals()[obj['klass']](data, dtype=dtype, name=obj['name']) elif typ == 'multi_index': - data = unconvert(obj['data'], np.typeDict[obj['dtype']], + dtype = dtype_for(obj['dtype']) + data = unconvert(obj['data'], dtype, obj.get('compress')) data = [tuple(x) for x in data] return globals()[obj['klass']].from_tuples(data, names=obj['names']) @@ -481,9 +499,15 @@ def decode(obj): def create_block(b): values = unconvert(b['values'], dtype_for(b['dtype']), b['compress']).reshape(b['shape']) + + # locs handles duplicate column names, and should be used instead of items; see GH 9618 + if 'locs' in b: + placement = b['locs'] + else: + placement = axes[0].get_indexer(b['items']) return make_block(values=values, klass=getattr(internals, b['klass']), - placement=axes[0].get_indexer(b['items'])) + placement=placement) blocks = [create_block(b) for b in obj['blocks']] return globals()[obj['klass']](BlockManager(blocks, axes)) @@ -540,19 +564,23 @@ def create_block(b): def pack(o, default=encode, - encoding='latin1', unicode_errors='strict', use_single_float=False): + encoding='latin1', unicode_errors='strict', use_single_float=False, + autoreset=1, use_bin_type=1): """ Pack an object and return the packed bytes. """ return Packer(default=default, encoding=encoding, unicode_errors=unicode_errors, - use_single_float=use_single_float).pack(o) + use_single_float=use_single_float, + autoreset=autoreset, + use_bin_type=use_bin_type).pack(o) def unpack(packed, object_hook=decode, list_hook=None, use_list=False, encoding='latin1', - unicode_errors='strict', object_pairs_hook=None): + unicode_errors='strict', object_pairs_hook=None, + max_buffer_size=0, ext_hook=ExtType): """ Unpack a packed object, return an iterator Note: packed lists will be returned as tuples @@ -562,7 +590,9 @@ def unpack(packed, object_hook=decode, list_hook=list_hook, use_list=use_list, encoding=encoding, unicode_errors=unicode_errors, - object_pairs_hook=object_pairs_hook) + object_pairs_hook=object_pairs_hook, + max_buffer_size=max_buffer_size, + ext_hook=ext_hook) class Packer(_Packer): @@ -570,11 +600,15 @@ class Packer(_Packer): def __init__(self, default=encode, encoding='latin1', unicode_errors='strict', - use_single_float=False): + use_single_float=False, + autoreset=1, + use_bin_type=1): super(Packer, self).__init__(default=default, encoding=encoding, unicode_errors=unicode_errors, - use_single_float=use_single_float) + use_single_float=use_single_float, + autoreset=autoreset, + use_bin_type=use_bin_type) class Unpacker(_Unpacker): @@ -582,7 +616,7 @@ class Unpacker(_Unpacker): def __init__(self, file_like=None, read_size=0, use_list=False, object_hook=decode, object_pairs_hook=None, list_hook=None, encoding='latin1', - unicode_errors='strict', max_buffer_size=0): + unicode_errors='strict', max_buffer_size=0, ext_hook=ExtType): super(Unpacker, self).__init__(file_like=file_like, read_size=read_size, use_list=use_list, @@ -591,7 +625,8 @@ def __init__(self, file_like=None, read_size=0, use_list=False, list_hook=list_hook, encoding=encoding, unicode_errors=unicode_errors, - max_buffer_size=max_buffer_size) + max_buffer_size=max_buffer_size, + ext_hook=ext_hook) class Iterator(object): diff --git a/pandas/io/parsers.py b/pandas/io/parsers.py index 508cf1103cee5..9ad992c434984 100755 --- a/pandas/io/parsers.py +++ b/pandas/io/parsers.py @@ -26,6 +26,7 @@ import pandas.tslib as tslib import pandas.parser as _parser + class ParserWarning(Warning): pass @@ -86,7 +87,7 @@ class ParserWarning(Warning): should explicitly pass header=None prefix : string, default None Prefix to add to column numbers when no header, e.g 'X' for X0, X1, ... -na_values : list-like or dict, default None +na_values : str, list-like or dict, default None Additional strings to recognize as NA/NaN. If dict passed, specific per-column NA values true_values : list @@ -234,8 +235,10 @@ def _read(filepath_or_buffer, kwds): if skipfooter is not None: kwds['skip_footer'] = skipfooter - filepath_or_buffer, _ = get_filepath_or_buffer(filepath_or_buffer, - encoding) + filepath_or_buffer, _, compression = get_filepath_or_buffer(filepath_or_buffer, + encoding, + compression=kwds.get('compression', None)) + kwds['compression'] = compression if kwds.get('date_parser', None) is not None: if isinstance(kwds['parse_dates'], bool): @@ -355,7 +358,6 @@ def parser_f(filepath_or_buffer, skipfooter=None, skip_footer=0, na_values=None, - na_fvalues=None, true_values=None, false_values=None, delimiter=None, @@ -403,8 +405,9 @@ def parser_f(filepath_or_buffer, delimiter = sep if delim_whitespace and delimiter is not default_sep: - raise ValueError("Specified a delimiter with both sep and"\ - " delim_whitespace=True; you can only specify one.") + raise ValueError("Specified a delimiter with both sep and" + " delim_whitespace=True; you can only" + " specify one.") if engine is not None: engine_specified = True @@ -431,7 +434,6 @@ def parser_f(filepath_or_buffer, prefix=prefix, skiprows=skiprows, na_values=na_values, - na_fvalues=na_fvalues, true_values=true_values, false_values=false_values, keep_default_na=keep_default_na, @@ -800,6 +802,8 @@ def __init__(self, kwds): self._name_processed = False + self._first_chunk = True + @property def _has_complex_date_col(self): return (isinstance(self.parse_dates, dict) or @@ -997,7 +1001,7 @@ def _convert_to_ndarrays(self, dct, na_values, na_fvalues, verbose=False, try: values = lib.map_infer(values, conv_f) except ValueError: - mask = lib.ismember(values, na_values).view(np.uin8) + mask = lib.ismember(values, na_values).view(np.uint8) values = lib.map_infer_mask(values, conv_f, mask) coerce_type = False @@ -1162,20 +1166,25 @@ def set_error_bad_lines(self, status): self._reader.set_error_bad_lines(int(status)) def read(self, nrows=None): - if self.as_recarray: - # what to do if there are leading columns? - return self._reader.read(nrows) - try: data = self._reader.read(nrows) except StopIteration: - if nrows is None: + if self._first_chunk: + self._first_chunk = False return _get_empty_meta(self.orig_names, self.index_col, - self.index_names) + self.index_names, + dtype=self.kwds.get('dtype')) else: raise + # Done with first read, next time raise StopIteration + self._first_chunk = False + + if self.as_recarray: + # what to do if there are leading columns? + return data + names = self.names if self._reader.leading_cols: @@ -1327,10 +1336,7 @@ def _wrap_compressed(f, compression, encoding=None): import gzip f = gzip.GzipFile(fileobj=f) - if compat.PY3_2: - # 3.2's gzip doesn't support read1 - f = StringIO(f.read().decode(encoding)) - elif compat.PY3: + if compat.PY3: from io import TextIOWrapper f = TextIOWrapper(f) @@ -1454,7 +1460,6 @@ def __init__(self, f, **kwds): self._name_processed = True if self.index_names is None: self.index_names = index_names - self._first_chunk = True if self.parse_dates: self._no_thousands_columns = self._set_no_thousands_columns() @@ -1715,7 +1720,7 @@ def _infer_columns(self): num_original_columns = ncols if not names: if self.prefix: - columns = [['%s%d' % (self.prefix,i) for i in range(ncols)]] + columns = [['%s%d' % (self.prefix, i) for i in range(ncols)]] else: columns = [lrange(ncols)] columns = self._handle_usecols(columns, columns[0]) @@ -2050,12 +2055,14 @@ def _make_date_converter(date_parser=None, dayfirst=False, def converter(*date_cols): if date_parser is None: strs = _concat_date_cols(date_cols) + try: - return tools.to_datetime( + return tools._to_datetime( com._ensure_object(strs), utc=None, box=False, dayfirst=dayfirst, + errors='ignore', infer_datetime_format=infer_datetime_format ) except: @@ -2063,7 +2070,7 @@ def converter(*date_cols): lib.try_parse_dates(strs, dayfirst=dayfirst)) else: try: - result = tools.to_datetime(date_parser(*date_cols)) + result = tools.to_datetime(date_parser(*date_cols), errors='ignore') if isinstance(result, datetime.datetime): raise Exception('scalar parser') return result @@ -2072,7 +2079,8 @@ def converter(*date_cols): return tools.to_datetime( lib.try_parse_dates(_concat_date_cols(date_cols), parser=date_parser, - dayfirst=dayfirst)) + dayfirst=dayfirst), + errors='ignore') except Exception: return generic_parser(date_parser, *date_cols) @@ -2223,18 +2231,30 @@ def _clean_index_names(columns, index_col): return index_names, columns, index_col -def _get_empty_meta(columns, index_col, index_names): +def _get_empty_meta(columns, index_col, index_names, dtype=None): columns = list(columns) - if index_col is not None: - index = MultiIndex.from_arrays([[]] * len(index_col), - names=index_names) - for n in index_col: - columns.pop(n) + if dtype is None: + dtype = {} else: + # Convert column indexes to column names. + dtype = dict((columns[k] if com.is_integer(k) else k, v) + for k, v in compat.iteritems(dtype)) + + if index_col is None or index_col is False: index = Index([]) + else: + index = [np.empty(0, dtype=dtype.get(index_name, np.object)) + for index_name in index_names] + index = MultiIndex.from_arrays(index, names=index_names) + index_col.sort() + for i, n in enumerate(index_col): + columns.pop(n-i) + + col_dict = dict((col_name, np.empty(0, dtype=dtype.get(col_name, np.object))) + for col_name in columns) - return index, columns, {} + return index, columns, col_dict def _floatify_na_values(na_values): diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 31f649c498c14..2c9ffe6b74536 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -220,7 +220,7 @@ class DuplicateWarning(Warning): """ with config.config_prefix('io.hdf'): - config.register_option('dropna_table', True, dropna_doc, + config.register_option('dropna_table', False, dropna_doc, validator=config.is_bool) config.register_option( 'default_format', None, format_doc, @@ -271,7 +271,7 @@ def to_hdf(path_or_buf, key, value, mode=None, complevel=None, complib=None, f(path_or_buf) -def read_hdf(path_or_buf, key, **kwargs): +def read_hdf(path_or_buf, key=None, **kwargs): """ read from the store, close it if we opened it Retrieve pandas object stored in file, optionally based on where @@ -280,7 +280,8 @@ def read_hdf(path_or_buf, key, **kwargs): Parameters ---------- path_or_buf : path (string), or buffer to read from - key : group identifier in the store + key : group identifier in the store. Can be omitted a HDF file contains + a single pandas object. where : list of Term (or convertable) objects, optional start : optional, integer (defaults to None), row number to start selection @@ -329,6 +330,12 @@ def read_hdf(path_or_buf, key, **kwargs): 'implemented.') try: + if key is None: + keys = store.keys() + if len(keys) != 1: + raise ValueError('key must be provided when HDF file contains ' + 'multiple datasets.') + key = keys[0] return store.select(key, auto_close=auto_close, **kwargs) except: # if there is an error, close the store @@ -810,7 +817,7 @@ def put(self, key, value, format=None, append=False, **kwargs): This will force Table format, append the input data to the existing. encoding : default None, provide an encoding for strings - dropna : boolean, default True, do not write an ALL nan row to + dropna : boolean, default False, do not write an ALL nan row to the store settable by the option 'io.hdf.dropna_table' """ if format is None: @@ -892,7 +899,7 @@ def append(self, key, value, format=None, append=True, columns=None, chunksize : size to chunk the writing expectedrows : expected TOTAL row size of this table encoding : default None, provide an encoding for strings - dropna : boolean, default True, do not write an ALL nan row to + dropna : boolean, default False, do not write an ALL nan row to the store settable by the option 'io.hdf.dropna_table' Notes ----- @@ -912,7 +919,7 @@ def append(self, key, value, format=None, append=True, columns=None, **kwargs) def append_to_multiple(self, d, value, selector, data_columns=None, - axes=None, dropna=True, **kwargs): + axes=None, dropna=False, **kwargs): """ Append to multiple tables @@ -927,7 +934,7 @@ def append_to_multiple(self, d, value, selector, data_columns=None, data_columns : list of columns to create as data columns, or True to use all columns dropna : if evaluates to True, drop rows from all tables if any single - row in each table has all NaN + row in each table has all NaN. Default False. Notes ----- @@ -1766,6 +1773,8 @@ def set_kind(self): self.kind = 'string' elif dtype.startswith(u('float')): self.kind = 'float' + elif dtype.startswith(u('complex')): + self.kind = 'complex' elif dtype.startswith(u('int')) or dtype.startswith(u('uint')): self.kind = 'integer' elif dtype.startswith(u('date')): @@ -1795,6 +1804,8 @@ def set_atom(self, block, block_items, existing_col, min_itemsize, return self.set_atom_datetime64(block) elif block.is_timedelta: return self.set_atom_timedelta64(block) + elif block.is_complex: + return self.set_atom_complex(block) dtype = block.dtype.name inferred_type = lib.infer_dtype(block.values) @@ -1929,6 +1940,12 @@ def get_atom_coltype(self, kind=None): def get_atom_data(self, block, kind=None): return self.get_atom_coltype(kind=kind)(shape=block.shape[0]) + def set_atom_complex(self, block): + self.kind = block.dtype.name + itemsize = int(self.kind.split('complex')[-1]) // 8 + self.typ = _tables().ComplexCol(itemsize=itemsize, shape=block.shape[0]) + self.set_data(block.values.astype(self.typ.type, copy=False)) + def set_atom_data(self, block): self.kind = block.dtype.name self.typ = self.get_atom_data(block) @@ -3140,8 +3157,8 @@ def f(i, c): def create_index(self, columns=None, optlevel=None, kind=None): """ Create a pytables index on the specified columns - note: cannot index Time64Col() currently; PyTables must be >= 2.3 - + note: cannot index Time64Col() or ComplexCol currently; + PyTables must be >= 3.0 Paramaters ---------- @@ -3196,6 +3213,12 @@ def create_index(self, columns=None, optlevel=None, kind=None): # create the index if not v.is_indexed: + if v.type.startswith('complex'): + raise TypeError('Columns containing complex values can be stored but cannot' + ' be indexed when using table format. Either use fixed ' + 'format, set index=False, or do not include the columns ' + 'containing complex values to data_columns when ' + 'initializing the table.') v.create_index(**kw) def read_axes(self, where, **kwargs): @@ -3608,7 +3631,7 @@ def read_column(self, column, where=None, start=None, stop=None, **kwargs): nan_rep=self.nan_rep, encoding=self.encoding ).take_data(), - a.tz, True)) + a.tz, True), name=column) raise KeyError("column [%s] not found in the table" % column) @@ -3764,7 +3787,7 @@ class AppendableTable(LegacyTable): def write(self, obj, axes=None, append=False, complib=None, complevel=None, fletcher32=None, min_itemsize=None, - chunksize=None, expectedrows=None, dropna=True, **kwargs): + chunksize=None, expectedrows=None, dropna=False, **kwargs): if not append and self.is_exists: self._handle.remove_node(self.group, 'table') @@ -3804,7 +3827,7 @@ def write(self, obj, axes=None, append=False, complib=None, # add the rows self.write_data(chunksize, dropna=dropna) - def write_data(self, chunksize, dropna=True): + def write_data(self, chunksize, dropna=False): """ we form the data into a 2-d including indexes,values,mask write chunk-by-chunk """ diff --git a/pandas/io/sas.py b/pandas/io/sas.py new file mode 100644 index 0000000000000..5f55f861afb72 --- /dev/null +++ b/pandas/io/sas.py @@ -0,0 +1,459 @@ +""" +Tools for reading SAS XPort files into Pandas objects. + +Based on code from Jack Cushman (github.com/jcushman/xport). + +The file format is defined here: + +https://support.sas.com/techsup/technote/ts140.pdf +""" + +from datetime import datetime +import pandas as pd +from pandas.io.common import get_filepath_or_buffer +from pandas import compat +import struct +import numpy as np +from pandas.util.decorators import Appender + +_correct_line1 = "HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!000000000000000000000000000000 " +_correct_header1 = "HEADER RECORD*******MEMBER HEADER RECORD!!!!!!!000000000000000001600000000" +_correct_header2 = "HEADER RECORD*******DSCRPTR HEADER RECORD!!!!!!!000000000000000000000000000000 " +_correct_obs_header = "HEADER RECORD*******OBS HEADER RECORD!!!!!!!000000000000000000000000000000 " +_fieldkeys = ['ntype', 'nhfun', 'field_length', 'nvar0', 'name', 'label', + 'nform', 'nfl', 'num_decimals', 'nfj', 'nfill', 'niform', + 'nifl', 'nifd', 'npos', '_'] + + +# TODO: Support for 4 byte floats, see https://github.com/jcushman/xport/pull/3 +# Need a test file + + +_base_params_doc = """\ +Parameters +---------- +filepath_or_buffer : string or file-like object + Path to SAS file or object implementing binary read method.""" + +_params2_doc = """\ +index : identifier of index column + Identifier of column that should be used as index of the DataFrame. +encoding : string + Encoding for text data. +chunksize : int + Read file `chunksize` lines at a time, returns iterator.""" + +_format_params_doc = """\ +format : string + File format, only `xport` is currently supported.""" + +_iterator_doc = """\ +iterator : boolean, default False + Return XportReader object for reading file incrementally.""" + + +_read_sas_doc = """Read a SAS file into a DataFrame. + +%(_base_params_doc)s +%(_format_params_doc)s +%(_params2_doc)s +%(_iterator_doc)s + +Returns +------- +DataFrame or XportReader + +Examples +-------- +Read a SAS Xport file: + +>>> df = pandas.read_sas('filename.XPT') + +Read a Xport file in 10,000 line chunks: + +>>> itr = pandas.read_sas('filename.XPT', chunksize=10000) +>>> for chunk in itr: +>>> do_something(chunk) + +.. versionadded:: 0.17.0 +""" % {"_base_params_doc": _base_params_doc, + "_format_params_doc": _format_params_doc, + "_params2_doc": _params2_doc, + "_iterator_doc": _iterator_doc} + + +_xport_reader_doc = """\ +Class for reading SAS Xport files. + +%(_base_params_doc)s +%(_params2_doc)s + +Attributes +---------- +member_info : list + Contains information about the file +fields : list + Contains information about the variables in the file +""" % {"_base_params_doc": _base_params_doc, + "_params2_doc": _params2_doc} + + +_read_method_doc = """\ +Read observations from SAS Xport file, returning as data frame. + +Parameters +---------- +nrows : int + Number of rows to read from data file; if None, read whole + file. + +Returns +------- +A DataFrame. +""" + + +@Appender(_read_sas_doc) +def read_sas(filepath_or_buffer, format='xport', index=None, encoding='ISO-8859-1', + chunksize=None, iterator=False): + + format = format.lower() + + if format == 'xport': + reader = XportReader(filepath_or_buffer, index=index, encoding=encoding, + chunksize=chunksize) + else: + raise ValueError('only xport format is supported') + + if iterator or chunksize: + return reader + + return reader.read() + + +def _parse_date(datestr): + """ Given a date in xport format, return Python date. """ + try: + return datetime.strptime(datestr, "%d%b%y:%H:%M:%S") # e.g. "16FEB11:10:07:55" + except ValueError: + return pd.NaT + + +def _split_line(s, parts): + """ + Parameters + ---------- + s: string + Fixed-length string to split + parts: list of (name, length) pairs + Used to break up string, name '_' will be filtered from output. + + Returns + ------- + Dict of name:contents of string at given location. + """ + out = {} + start = 0 + for name, length in parts: + out[name] = s[start:start+length].strip() + start += length + del out['_'] + return out + + +def _parse_float_vec(vec): + """ + Parse a vector of 8-byte values representing IBM 8 byte floats + into native 8 byte floats. + """ + + dtype = np.dtype('>u4,>u4') + vec1 = vec.view(dtype=dtype) + + xport1 = vec1['f0'] + xport2 = vec1['f1'] + + # Start by setting first half of ieee number to first half of IBM + # number sans exponent + ieee1 = xport1 & 0x00ffffff + + # Get the second half of the ibm number into the second half of + # the ieee number + ieee2 = xport2 + + # The fraction bit to the left of the binary point in the ieee + # format was set and the number was shifted 0, 1, 2, or 3 + # places. This will tell us how to adjust the ibm exponent to be a + # power of 2 ieee exponent and how to shift the fraction bits to + # restore the correct magnitude. + shift = np.zeros(len(vec), dtype=np.uint8) + shift[np.where(xport1 & 0x00200000)] = 1 + shift[np.where(xport1 & 0x00400000)] = 2 + shift[np.where(xport1 & 0x00800000)] = 3 + + # shift the ieee number down the correct number of places then + # set the second half of the ieee number to be the second half + # of the ibm number shifted appropriately, ored with the bits + # from the first half that would have been shifted in if we + # could shift a double. All we are worried about are the low + # order 3 bits of the first half since we're only shifting by + # 1, 2, or 3. + ieee1 >>= shift + ieee2 = (xport2 >> shift) | ((xport1 & 0x00000007) << (29 + (3 - shift))) + + # clear the 1 bit to the left of the binary point + ieee1 &= 0xffefffff + + # set the exponent of the ieee number to be the actual exponent + # plus the shift count + 1023. Or this into the first half of the + # ieee number. The ibm exponent is excess 64 but is adjusted by 65 + # since during conversion to ibm format the exponent is + # incremented by 1 and the fraction bits left 4 positions to the + # right of the radix point. (had to add >> 24 because C treats & + # 0x7f as 0x7f000000 and Python doesn't) + ieee1 |= ((((((xport1 >> 24) & 0x7f) - 65) << 2) + shift + 1023) << 20) | (xport1 & 0x80000000) + + ieee = np.empty((len(ieee1),), dtype='>u4,>u4') + ieee['f0'] = ieee1 + ieee['f1'] = ieee2 + ieee = ieee.view(dtype='>f8') + ieee = ieee.astype('f8') + + return ieee + + + +class XportReader(object): + __doc__ = _xport_reader_doc + + + def __init__(self, filepath_or_buffer, index=None, encoding='ISO-8859-1', + chunksize=None): + + self._encoding = encoding + self._lines_read = 0 + self._index = index + self._chunksize = chunksize + + if isinstance(filepath_or_buffer, str): + filepath_or_buffer, encoding, compression = get_filepath_or_buffer( + filepath_or_buffer, encoding=encoding) + + if isinstance(filepath_or_buffer, (str, compat.text_type, bytes)): + self.filepath_or_buffer = open(filepath_or_buffer, 'rb') + else: + # Copy to BytesIO, and ensure no encoding + contents = filepath_or_buffer.read() + try: + contents = contents.encode(self._encoding) + except: + pass + self.filepath_or_buffer = compat.BytesIO(contents) + + self._read_header() + + + def _get_row(self): + return self.filepath_or_buffer.read(80).decode() + + + def _read_header(self): + self.filepath_or_buffer.seek(0) + + # read file header + line1 = self._get_row() + if line1 != _correct_line1: + raise ValueError("Header record is not an XPORT file.") + + line2 = self._get_row() + file_info = _split_line(line2, [ ['prefix',24], ['version',8], ['OS',8], ['_',24], ['created',16]]) + if file_info['prefix'] != "SAS SAS SASLIB": + raise ValueError("Header record has invalid prefix.") + file_info['created'] = _parse_date(file_info['created']) + self.file_info = file_info + + line3 = self._get_row() + file_info['modified'] = _parse_date(line3[:16]) + + # read member header + header1 = self._get_row() + header2 = self._get_row() + if not header1.startswith(_correct_header1) or not header2 == _correct_header2: + raise ValueError("Member header not found.") + fieldnamelength = int(header1[-5:-2]) # usually 140, could be 135 + + # member info + member_info = _split_line(self._get_row(), [['prefix',8], ['set_name',8], + ['sasdata',8],['version',8], + ['OS',8],['_',24],['created',16]]) + member_info.update( _split_line(self._get_row(), [['modified',16], ['_',16], + ['label',40],['type',8]])) + member_info['modified'] = _parse_date(member_info['modified']) + member_info['created'] = _parse_date(member_info['created']) + self.member_info = member_info + + # read field names + types = {1: 'numeric', 2: 'char'} + fieldcount = int(self._get_row()[54:58]) + datalength = fieldnamelength*fieldcount + if datalength % 80: # round up to nearest 80 + datalength += 80 - datalength%80 + fielddata = self.filepath_or_buffer.read(datalength) + fields = [] + obs_length = 0 + while len(fielddata) >= fieldnamelength: + # pull data for one field + field, fielddata = (fielddata[:fieldnamelength], fielddata[fieldnamelength:]) + + # rest at end gets ignored, so if field is short, pad out + # to match struct pattern below + field = field.ljust(140) + + fieldstruct = struct.unpack('>hhhh8s40s8shhh2s8shhl52s', field) + field = dict(zip(_fieldkeys, fieldstruct)) + del field['_'] + field['ntype'] = types[field['ntype']] + if field['ntype'] == 'numeric' and field['field_length'] != 8: + raise TypeError("Only 8-byte floats are currently implemented. Can't read field %s." % field) + + for k, v in field.items(): + try: + field[k] = v.strip() + except AttributeError: + pass + + obs_length += field['field_length'] + fields += [field] + + header = self._get_row() + if not header == _correct_obs_header: + raise ValueError("Observation header not found.") + + self.fields = fields + self.record_length = obs_length + self.record_start = self.filepath_or_buffer.tell() + + self.nobs = self._record_count() + self.columns = [x['name'].decode() for x in self.fields] + + # Setup the dtype. + dtypel = [] + for i,field in enumerate(self.fields): + ntype = field['ntype'] + if ntype == "numeric": + dtypel.append(('s' + str(i), ">u8")) + elif ntype == "char": + dtypel.append(('s' + str(i), "S" + str(field['field_length']))) + dtype = np.dtype(dtypel) + self._dtype = dtype + + + def __iter__(self): + try: + if self._chunksize: + while True: + yield self.read(self._chunksize) + else: + yield self.read() + except StopIteration: + pass + + + def _record_count(self): + """ + Get number of records in file. + + This is maybe suboptimal because we have to seek to the end of the file. + + Side effect: returns file position to record_start. + """ + + self.filepath_or_buffer.seek(0, 2) + total_records_length = self.filepath_or_buffer.tell() - self.record_start + + if total_records_length % 80 != 0: + warnings.warn("xport file may be corrupted") + + if self.record_length > 80: + self.filepath_or_buffer.seek(self.record_start) + return total_records_length // self.record_length + + self.filepath_or_buffer.seek(-80, 2) + last_card = self.filepath_or_buffer.read(80) + last_card = np.frombuffer(last_card, dtype=np.uint64) + + # 8 byte blank + ix = np.flatnonzero(last_card == 2314885530818453536) + + if len(ix) == 0: + tail_pad = 0 + else: + tail_pad = 8 * len(ix) + + self.filepath_or_buffer.seek(self.record_start) + + return (total_records_length - tail_pad) // self.record_length + + + def get_chunk(self, size=None): + """ + Reads lines from Xport file and returns as dataframe + + Parameters + ---------- + size : int, defaults to None + Number of lines to read. If None, reads whole file. + + Returns + ------- + DataFrame + """ + if size is None: + size = self._chunksize + return self.read(nrows=size) + + + def _missing_double(self, vec): + v = vec.view(dtype='u1,u1,u2,u4') + miss = (v['f1'] == 0) & (v['f2'] == 0) & (v['f3'] == 0) + miss1 = ((v['f0'] >= 0x41) & (v['f0'] <= 0x5a)) |\ + (v['f0'] == 0x5f) | (v['f0'] == 0x2e) + miss &= miss1 + return miss + + + @Appender(_read_method_doc) + def read(self, nrows=None): + + if nrows is None: + nrows = self.nobs + + read_lines = min(nrows, self.nobs - self._lines_read) + read_len = read_lines * self.record_length + if read_len <= 0: + raise StopIteration + raw = self.filepath_or_buffer.read(read_len) + data = np.frombuffer(raw, dtype=self._dtype, count=read_lines) + + df = pd.DataFrame(index=range(read_lines)) + for j,x in enumerate(self.columns): + vec = data['s%d' % j] + ntype = self.fields[j]['ntype'] + if ntype == "numeric": + miss = self._missing_double(vec) + v = _parse_float_vec(vec) + v[miss] = np.nan + elif self.fields[j]['ntype'] == 'char': + v = [y.rstrip() for y in vec] + if compat.PY3: + v = [y.decode(self._encoding) for y in v] + df[x] = v + + if self._index is None: + df.index = range(self._lines_read, self._lines_read + read_lines) + else: + df = df.set_index(self._index) + + self._lines_read += read_lines + + return df diff --git a/pandas/io/sql.py b/pandas/io/sql.py index b4e8c7de2b4e1..b587ec128c016 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -38,7 +38,7 @@ class DatabaseError(IOError): _SQLALCHEMY_INSTALLED = None -def _is_sqlalchemy_engine(con): +def _is_sqlalchemy_connectable(con): global _SQLALCHEMY_INSTALLED if _SQLALCHEMY_INSTALLED is None: try: @@ -62,7 +62,7 @@ def compile_big_int_sqlite(type_, compiler, **kw): if _SQLALCHEMY_INSTALLED: import sqlalchemy - return isinstance(con, sqlalchemy.engine.Engine) + return isinstance(con, sqlalchemy.engine.Connectable) else: return False @@ -80,17 +80,17 @@ def _convert_params(sql, params): def _handle_date_column(col, format=None): if isinstance(format, dict): - return to_datetime(col, **format) + return to_datetime(col, errors='ignore', **format) else: if format in ['D', 's', 'ms', 'us', 'ns']: - return to_datetime(col, coerce=True, unit=format, utc=True) + return to_datetime(col, errors='coerce', unit=format, utc=True) elif (issubclass(col.dtype.type, np.floating) or issubclass(col.dtype.type, np.integer)): # parse dates as timestamp format = 's' if format is None else format - return to_datetime(col, coerce=True, unit=format, utc=True) + return to_datetime(col, errors='coerce', unit=format, utc=True) else: - return to_datetime(col, coerce=True, format=format, utc=True) + return to_datetime(col, errors='coerce', format=format, utc=True) def _parse_date_columns(data_frame, parse_dates): @@ -139,7 +139,7 @@ def execute(sql, con, cur=None, params=None): ---------- sql : string Query to be executed - con : SQLAlchemy engine or sqlite3 DBAPI2 connection + con : SQLAlchemy connectable(engine/connection) or sqlite3 DBAPI2 connection Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. @@ -282,14 +282,14 @@ def read_sql_table(table_name, con, schema=None, index_col=None, chunksize=None): """Read SQL database table into a DataFrame. - Given a table name and an SQLAlchemy engine, returns a DataFrame. + Given a table name and an SQLAlchemy connectable, returns a DataFrame. This function does not support DBAPI connections. Parameters ---------- table_name : string Name of SQL table in database - con : SQLAlchemy engine + con : SQLAlchemy connectable (or database string URI) Sqlite DBAPI connection mode not supported schema : string, default None Name of SQL schema in database to query (if database flavor @@ -328,14 +328,16 @@ def read_sql_table(table_name, con, schema=None, index_col=None, read_sql """ - if not _is_sqlalchemy_engine(con): + + con = _engine_builder(con) + if not _is_sqlalchemy_connectable(con): raise NotImplementedError("read_sql_table only supported for " - "SQLAlchemy engines.") + "SQLAlchemy connectable.") import sqlalchemy from sqlalchemy.schema import MetaData meta = MetaData(con, schema=schema) try: - meta.reflect(only=[table_name]) + meta.reflect(only=[table_name], views=True) except sqlalchemy.exc.InvalidRequestError: raise ValueError("Table %s not found" % table_name) @@ -362,7 +364,8 @@ def read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, ---------- sql : string SQL query to be executed - con : SQLAlchemy engine or sqlite3 DBAPI2 connection + con : SQLAlchemy connectable(engine/connection) or database string URI + or sqlite3 DBAPI2 connection Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. @@ -420,7 +423,8 @@ def read_sql(sql, con, index_col=None, coerce_float=True, params=None, ---------- sql : string SQL query to be executed or database table name. - con : SQLAlchemy engine or DBAPI2 connection (fallback mode) + con : SQLAlchemy connectable(engine/connection) or database string URI + or DBAPI2 connection (fallback mode) Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. @@ -504,14 +508,15 @@ def to_sql(frame, name, con, flavor='sqlite', schema=None, if_exists='fail', frame : DataFrame name : string Name of SQL table - con : SQLAlchemy engine or sqlite3 DBAPI2 connection + con : SQLAlchemy connectable(engine/connection) or database string URI + or sqlite3 DBAPI2 connection Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. flavor : {'sqlite', 'mysql'}, default 'sqlite' - The flavor of SQL to use. Ignored when using SQLAlchemy engine. + The flavor of SQL to use. Ignored when using SQLAlchemy connectable. 'mysql' is deprecated and will be removed in future versions, but it - will be further supported through SQLAlchemy engines. + will be further supported through SQLAlchemy connectables. schema : string, default None Name of SQL schema in database to write to (if database flavor supports this). If None, use default schema (default). @@ -557,14 +562,14 @@ def has_table(table_name, con, flavor='sqlite', schema=None): ---------- table_name: string Name of SQL table - con: SQLAlchemy engine or sqlite3 DBAPI2 connection + con: SQLAlchemy connectable(engine/connection) or sqlite3 DBAPI2 connection Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. flavor: {'sqlite', 'mysql'}, default 'sqlite' - The flavor of SQL to use. Ignored when using SQLAlchemy engine. + The flavor of SQL to use. Ignored when using SQLAlchemy connectable. 'mysql' is deprecated and will be removed in future versions, but it - will be further supported through SQLAlchemy engines. + will be further supported through SQLAlchemy connectables. schema : string, default None Name of SQL schema in database to write to (if database flavor supports this). If None, use default schema (default). @@ -581,9 +586,25 @@ def has_table(table_name, con, flavor='sqlite', schema=None): _MYSQL_WARNING = ("The 'mysql' flavor with DBAPI connection is deprecated " "and will be removed in future versions. " - "MySQL will be further supported with SQLAlchemy engines.") + "MySQL will be further supported with SQLAlchemy connectables.") +def _engine_builder(con): + """ + Returns a SQLAlchemy engine from a URI (if con is a string) + else it just return con without modifying it + """ + if isinstance(con, string_types): + try: + import sqlalchemy + con = sqlalchemy.create_engine(con) + return con + + except ImportError: + _SQLALCHEMY_INSTALLED = False + + return con + def pandasSQL_builder(con, flavor=None, schema=None, meta=None, is_cursor=False): """ @@ -592,7 +613,8 @@ def pandasSQL_builder(con, flavor=None, schema=None, meta=None, """ # When support for DBAPI connections is removed, # is_cursor should not be necessary. - if _is_sqlalchemy_engine(con): + con = _engine_builder(con) + if _is_sqlalchemy_connectable(con): return SQLDatabase(con, schema=schema, meta=meta) else: if flavor == 'mysql': @@ -637,7 +659,7 @@ def exists(self): def sql_schema(self): from sqlalchemy.schema import CreateTable - return str(CreateTable(self.table).compile(self.pd_sql.engine)) + return str(CreateTable(self.table).compile(self.pd_sql.connectable)) def _execute_create(self): # Inserting table into database, add to MetaData object @@ -834,7 +856,11 @@ def _create_table_setup(self): for name, typ, is_index in column_names_and_types] if self.keys is not None: - pkc = PrimaryKeyConstraint(self.keys, name=self.name + '_pk') + if not com.is_list_like(self.keys): + keys = [self.keys] + else: + keys = self.keys + pkc = PrimaryKeyConstraint(*keys, name=self.name + '_pk') columns.append(pkc) schema = self.schema or self.pd_sql.meta.schema @@ -899,8 +925,8 @@ def _harmonize_columns(self, parse_dates=None): def _get_notnull_col_dtype(self, col): """ - Infer datatype of the Series col. In case the dtype of col is 'object' - and it contains NA values, this infers the datatype of the not-NA + Infer datatype of the Series col. In case the dtype of col is 'object' + and it contains NA values, this infers the datatype of the not-NA values. Needed for inserting typed data containing NULLs, GH8778. """ col_for_inference = col @@ -978,11 +1004,11 @@ class PandasSQL(PandasObject): """ def read_sql(self, *args, **kwargs): - raise ValueError("PandasSQL must be created with an SQLAlchemy engine" + raise ValueError("PandasSQL must be created with an SQLAlchemy connectable" " or connection+sql flavor") def to_sql(self, *args, **kwargs): - raise ValueError("PandasSQL must be created with an SQLAlchemy engine" + raise ValueError("PandasSQL must be created with an SQLAlchemy connectable" " or connection+sql flavor") @@ -993,8 +1019,8 @@ class SQLDatabase(PandasSQL): Parameters ---------- - engine : SQLAlchemy engine - Engine to connect with the database. Using SQLAlchemy makes it + engine : SQLAlchemy connectable + Connectable to connect with the database. Using SQLAlchemy makes it possible to use any DB supported by that library. schema : string, default None Name of SQL schema in database to write to (if database flavor @@ -1007,19 +1033,24 @@ class SQLDatabase(PandasSQL): """ def __init__(self, engine, schema=None, meta=None): - self.engine = engine + self.connectable = engine if not meta: from sqlalchemy.schema import MetaData - meta = MetaData(self.engine, schema=schema) + meta = MetaData(self.connectable, schema=schema) self.meta = meta + @contextmanager def run_transaction(self): - return self.engine.begin() + with self.connectable.begin() as tx: + if hasattr(tx, 'execute'): + yield tx + else: + yield self.connectable def execute(self, *args, **kwargs): - """Simple passthrough to SQLAlchemy engine""" - return self.engine.execute(*args, **kwargs) + """Simple passthrough to SQLAlchemy connectable""" + return self.connectable.execute(*args, **kwargs) def read_table(self, table_name, index_col=None, coerce_float=True, parse_dates=None, columns=None, schema=None, @@ -1187,7 +1218,13 @@ def to_sql(self, frame, name, if_exists='fail', index=True, table.create() table.insert(chunksize) # check for potentially case sensitivity issues (GH7815) - if name not in self.engine.table_names(schema=schema or self.meta.schema): + engine = self.connectable.engine + with self.connectable.connect() as conn: + table_names = engine.table_names( + schema=schema or self.meta.schema, + connection=conn, + ) + if name not in table_names: warnings.warn("The provided table name '{0}' is not found exactly " "as such in the database after writing the table, " "possibly due to case sensitivity issues. Consider " @@ -1198,7 +1235,11 @@ def tables(self): return self.meta.tables def has_table(self, name, schema=None): - return self.engine.has_table(name, schema or self.meta.schema) + return self.connectable.run_callable( + self.connectable.dialect.has_table, + name, + schema or self.meta.schema, + ) def get_table(self, table_name, schema=None): schema = schema or self.meta.schema @@ -1217,7 +1258,7 @@ def get_table(self, table_name, schema=None): def drop_table(self, table_name, schema=None): schema = schema or self.meta.schema - if self.engine.has_table(table_name, schema): + if self.has_table(table_name, schema): self.meta.reflect(only=[table_name], schema=schema) self.get_table(table_name, schema).drop() self.meta.clear() @@ -1272,7 +1313,7 @@ def _get_unicode_name(name): return uname def _get_valid_mysql_name(name): - # Filter for unquoted identifiers + # Filter for unquoted identifiers # See http://dev.mysql.com/doc/refman/5.0/en/identifiers.html uname = _get_unicode_name(name) if not len(uname): @@ -1293,7 +1334,7 @@ def _get_valid_sqlite_name(name): # Ensure the string does not include any NUL characters. # Replace all " with "". # Wrap the entire thing in double quotes. - + uname = _get_unicode_name(name) if not len(uname): raise ValueError("Empty table or column name specified") @@ -1377,7 +1418,11 @@ def _create_table_setup(self): for cname, ctype, _ in column_names_and_types] if self.keys is not None and len(self.keys): - cnames_br = ",".join([escape(c) for c in self.keys]) + if not com.is_list_like(self.keys): + keys = [self.keys] + else: + keys = self.keys + cnames_br = ", ".join([escape(c) for c in keys]) create_tbl_stmts.append( "CONSTRAINT {tbl}_pk PRIMARY KEY ({cnames_br})".format( tbl=self.name, cnames_br=cnames_br)) @@ -1391,7 +1436,7 @@ def _create_table_setup(self): cnames = "_".join(ix_cols) cnames_br = ",".join([escape(c) for c in ix_cols]) create_stmts.append( - "CREATE INDEX " + escape("ix_"+self.name+"_"+cnames) + + "CREATE INDEX " + escape("ix_"+self.name+"_"+cnames) + "ON " + escape(self.name) + " (" + cnames_br + ")") return create_stmts @@ -1416,7 +1461,7 @@ def _sql_type_name(self, col): elif col_type == "complex": raise ValueError('Complex datatypes not supported') - + if col_type not in _SQL_TYPES: col_type = "string" @@ -1602,12 +1647,12 @@ def get_schema(frame, name, flavor='sqlite', keys=None, con=None, dtype=None): name : string name of SQL table flavor : {'sqlite', 'mysql'}, default 'sqlite' - The flavor of SQL to use. Ignored when using SQLAlchemy engine. + The flavor of SQL to use. Ignored when using SQLAlchemy connectable. 'mysql' is deprecated and will be removed in future versions, but it will be further supported through SQLAlchemy engines. keys : string or sequence columns to use a primary key - con: an open SQL database connection object or an SQLAlchemy engine + con: an open SQL database connection object or a SQLAlchemy connectable Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported. @@ -1665,8 +1710,8 @@ def write_frame(frame, name, con, flavor='sqlite', if_exists='fail', **kwargs): - With ``to_sql`` the index is written to the sql database by default. To keep the behaviour this function you need to specify ``index=False``. - - The new ``to_sql`` function supports sqlalchemy engines to work with - different sql flavors. + - The new ``to_sql`` function supports sqlalchemy connectables to work + with different sql flavors. See also -------- diff --git a/pandas/io/stata.py b/pandas/io/stata.py index eecc225d06beb..5afbc2671e3a7 100644 --- a/pandas/io/stata.py +++ b/pandas/io/stata.py @@ -4,7 +4,7 @@ The StataReader below was originally written by Joe Presbrey as part of PyDTA. It has been extended and improved by Skipper Seabold from the Statsmodels project who also developed the StataWriter and was finally added to pandas in -an once again improved version. +a once again improved version. You can find more information on http://presbrey.mit.edu/PyDTA and http://statsmodels.sourceforge.net/devel/ @@ -23,11 +23,14 @@ from pandas.compat import lrange, lmap, lzip, text_type, string_types, range, \ zip, BytesIO from pandas.util.decorators import Appender +import pandas as pd import pandas.core.common as com from pandas.io.common import get_filepath_or_buffer from pandas.lib import max_len_string_array, infer_dtype from pandas.tslib import NaT, Timestamp +_version_error = "Version of given Stata file is not 104, 105, 108, 113 (Stata 8/9), 114 (Stata 10/11), 115 (Stata 12), 117 (Stata 13), or 118 (Stata 14)" + _statafile_processing_params1 = """\ convert_dates : boolean, defaults to True Convert date variables to DataFrame time values @@ -291,7 +294,7 @@ def convert_delta_safe(base, deltas, unit): warn("Encountered %tC format. Leaving in Stata Internal Format.") conv_dates = Series(dates, dtype=np.object) if has_bad_values: - conv_dates[bad_locs] = np.nan + conv_dates[bad_locs] = pd.NaT return conv_dates elif fmt in ["%td", "td", "%d", "d"]: # Delta days relative to base base = stata_epoch @@ -826,7 +829,7 @@ def __init__(self, encoding): self.TYPE_MAP_XML = \ dict( [ - (32768, 'L'), + (32768, 'Q'), # Not really a Q, unclear how to handle byteswap (65526, 'd'), (65527, 'f'), (65528, 'l'), @@ -875,7 +878,7 @@ def __init__(self, encoding): 'l': 'i4', 'f': 'f4', 'd': 'f8', - 'L': 'u8' + 'Q': 'u8' } # Reserved words cannot be used as variable names @@ -931,7 +934,7 @@ def __init__(self, path_or_buf, convert_dates=True, self._native_byteorder = _set_endianness(sys.byteorder) if isinstance(path_or_buf, str): - path_or_buf, encoding = get_filepath_or_buffer( + path_or_buf, encoding, _ = get_filepath_or_buffer( path_or_buf, encoding=self._default_encoding ) @@ -948,225 +951,324 @@ def __init__(self, path_or_buf, convert_dates=True, self._read_header() + + def __enter__(self): + """ enter context manager """ + return self + + def __exit__(self, exc_type, exc_value, traceback): + """ exit context manager """ + self.close() + + def close(self): + """ close the handle if its open """ + try: + self.path_or_buf.close() + except IOError: + pass + + def _read_header(self): first_char = self.path_or_buf.read(1) if struct.unpack('c', first_char)[0] == b'<': - # format 117 or higher (XML like) - self.path_or_buf.read(27) # stata_dta>
- self.format_version = int(self.path_or_buf.read(3)) - if self.format_version not in [117]: - raise ValueError("Version of given Stata file is not 104, " - "105, 108, 113 (Stata 8/9), 114 (Stata " - "10/11), 115 (Stata 12) or 117 (Stata 13)") - self.path_or_buf.read(21) # - self.byteorder = self.path_or_buf.read(3) == "MSF" and '>' or '<' - self.path_or_buf.read(15) # - self.nvar = struct.unpack(self.byteorder + 'H', - self.path_or_buf.read(2))[0] - self.path_or_buf.read(7) # - self.nobs = struct.unpack(self.byteorder + 'I', - self.path_or_buf.read(4))[0] - self.path_or_buf.read(11) # + return self._null_terminate(self.path_or_buf.read(strlen)) + elif self.format_version > 105: + return self._null_terminate(self.path_or_buf.read(81)) + else: + return self._null_terminate(self.path_or_buf.read(32)) + + + def _get_time_stamp(self): + if self.format_version == 118: strlen = struct.unpack('b', self.path_or_buf.read(1))[0] - self.time_stamp = self._null_terminate(self.path_or_buf.read(strlen)) - self.path_or_buf.read(26) #
- self.path_or_buf.read(8) # 0x0000000000000000 - self.path_or_buf.read(8) # position of - seek_vartypes = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 16 - seek_varnames = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 10 - seek_sortlist = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 10 - seek_formats = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 9 - seek_value_label_names = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 19 + return self.path_or_buf.read(strlen).decode("utf-8") + elif self.format_version == 117: + strlen = struct.unpack('b', self.path_or_buf.read(1))[0] + return self._null_terminate(self.path_or_buf.read(strlen)) + elif self.format_version > 104: + return self._null_terminate(self.path_or_buf.read(18)) + else: + raise ValueError() + + + def _get_seek_variable_labels(self): + if self.format_version == 117: + self.path_or_buf.read(8) # , throw away # Stata 117 data files do not follow the described format. This is # a work around that uses the previous label, 33 bytes for each # variable, 20 for the closing tag and 17 for the opening tag - self.path_or_buf.read(8) # , throw away - seek_variable_labels = seek_value_label_names + (33*self.nvar) + 20 + 17 - # Below is the original, correct code (per Stata sta format doc, - # although this is not followed in actual 117 dtas) - #seek_variable_labels = struct.unpack( - # self.byteorder + 'q', self.path_or_buf.read(8))[0] + 17 - self.path_or_buf.read(8) # - self.data_location = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 6 - self.seek_strls = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 7 - self.seek_value_labels = struct.unpack( - self.byteorder + 'q', self.path_or_buf.read(8))[0] + 14 - #self.path_or_buf.read(8) # - #self.path_or_buf.read(8) # EOF - self.path_or_buf.seek(seek_vartypes) - typlist = [struct.unpack(self.byteorder + 'H', - self.path_or_buf.read(2))[0] - for i in range(self.nvar)] - self.typlist = [None]*self.nvar - try: - i = 0 - for typ in typlist: - if typ <= 2045: - self.typlist[i] = typ - #elif typ == 32768: - # raise ValueError("Long strings are not supported") - else: - self.typlist[i] = self.TYPE_MAP_XML[typ] - i += 1 - except: - raise ValueError("cannot convert stata types [{0}]" - .format(','.join(typlist))) - self.dtyplist = [None]*self.nvar - try: - i = 0 - for typ in typlist: - if typ <= 2045: - self.dtyplist[i] = str(typ) - else: - self.dtyplist[i] = self.DTYPE_MAP_XML[typ] - i += 1 - except: - raise ValueError("cannot convert stata dtypes [{0}]" - .format(','.join(typlist))) + return self._seek_value_label_names + (33*self.nvar) + 20 + 17 + elif self.format_version == 118: + return struct.unpack(self.byteorder + 'q', self.path_or_buf.read(8))[0] + 17 + else: + raise ValueError() - self.path_or_buf.seek(seek_varnames) - self.varlist = [self._null_terminate(self.path_or_buf.read(33)) - for i in range(self.nvar)] - self.path_or_buf.seek(seek_sortlist) - self.srtlist = struct.unpack( - self.byteorder + ('h' * (self.nvar + 1)), - self.path_or_buf.read(2 * (self.nvar + 1)) - )[:-1] + def _read_old_header(self, first_char): + self.format_version = struct.unpack('b', first_char)[0] + if self.format_version not in [104, 105, 108, 113, 114, 115]: + raise ValueError(_version_error) + self.byteorder = struct.unpack('b', self.path_or_buf.read(1))[0] == 0x1 and '>' or '<' + self.filetype = struct.unpack('b', self.path_or_buf.read(1))[0] + self.path_or_buf.read(1) # unused - self.path_or_buf.seek(seek_formats) - self.fmtlist = [self._null_terminate(self.path_or_buf.read(49)) - for i in range(self.nvar)] + self.nvar = struct.unpack(self.byteorder + 'H', + self.path_or_buf.read(2))[0] + self.nobs = self._get_nobs() - self.path_or_buf.seek(seek_value_label_names) - self.lbllist = [self._null_terminate(self.path_or_buf.read(33)) - for i in range(self.nvar)] + self.data_label = self._get_data_label() - self.path_or_buf.seek(seek_variable_labels) - self.vlblist = [self._null_terminate(self.path_or_buf.read(81)) - for i in range(self.nvar)] + self.time_stamp = self._get_time_stamp() + + # descriptors + if self.format_version > 108: + typlist = [ord(self.path_or_buf.read(1)) + for i in range(self.nvar)] else: - # header - self.format_version = struct.unpack('b', first_char)[0] - if self.format_version not in [104, 105, 108, 113, 114, 115]: - raise ValueError("Version of given Stata file is not 104, " - "105, 108, 113 (Stata 8/9), 114 (Stata " - "10/11), 115 (Stata 12) or 117 (Stata 13)") - self.byteorder = struct.unpack('b', self.path_or_buf.read(1))[0] == 0x1 and '>' or '<' - self.filetype = struct.unpack('b', self.path_or_buf.read(1))[0] - self.path_or_buf.read(1) # unused - - self.nvar = struct.unpack(self.byteorder + 'H', - self.path_or_buf.read(2))[0] - self.nobs = struct.unpack(self.byteorder + 'I', - self.path_or_buf.read(4))[0] - if self.format_version > 105: - self.data_label = self._null_terminate(self.path_or_buf.read(81)) - else: - self.data_label = self._null_terminate(self.path_or_buf.read(32)) - if self.format_version > 104: - self.time_stamp = self._null_terminate(self.path_or_buf.read(18)) - - # descriptors - if self.format_version > 108: - typlist = [ord(self.path_or_buf.read(1)) - for i in range(self.nvar)] - else: - typlist = [ - self.OLD_TYPE_MAPPING[ - self._decode_bytes(self.path_or_buf.read(1)) - ] for i in range(self.nvar) - ] + typlist = [ + self.OLD_TYPE_MAPPING[ + self._decode_bytes(self.path_or_buf.read(1)) + ] for i in range(self.nvar) + ] - try: - self.typlist = [self.TYPE_MAP[typ] for typ in typlist] - except: - raise ValueError("cannot convert stata types [{0}]" - .format(','.join(typlist))) - try: - self.dtyplist = [self.DTYPE_MAP[typ] for typ in typlist] - except: - raise ValueError("cannot convert stata dtypes [{0}]" - .format(','.join(typlist))) + try: + self.typlist = [self.TYPE_MAP[typ] for typ in typlist] + except: + raise ValueError("cannot convert stata types [{0}]" + .format(','.join(typlist))) + try: + self.dtyplist = [self.DTYPE_MAP[typ] for typ in typlist] + except: + raise ValueError("cannot convert stata dtypes [{0}]" + .format(','.join(typlist))) - if self.format_version > 108: - self.varlist = [self._null_terminate(self.path_or_buf.read(33)) - for i in range(self.nvar)] - else: - self.varlist = [self._null_terminate(self.path_or_buf.read(9)) - for i in range(self.nvar)] - self.srtlist = struct.unpack( - self.byteorder + ('h' * (self.nvar + 1)), - self.path_or_buf.read(2 * (self.nvar + 1)) - )[:-1] - if self.format_version > 113: - self.fmtlist = [self._null_terminate(self.path_or_buf.read(49)) - for i in range(self.nvar)] - elif self.format_version > 104: - self.fmtlist = [self._null_terminate(self.path_or_buf.read(12)) - for i in range(self.nvar)] - else: - self.fmtlist = [self._null_terminate(self.path_or_buf.read(7)) - for i in range(self.nvar)] - if self.format_version > 108: - self.lbllist = [self._null_terminate(self.path_or_buf.read(33)) - for i in range(self.nvar)] - else: - self.lbllist = [self._null_terminate(self.path_or_buf.read(9)) - for i in range(self.nvar)] - if self.format_version > 105: - self.vlblist = [self._null_terminate(self.path_or_buf.read(81)) - for i in range(self.nvar)] - else: - self.vlblist = [self._null_terminate(self.path_or_buf.read(32)) - for i in range(self.nvar)] + if self.format_version > 108: + self.varlist = [self._null_terminate(self.path_or_buf.read(33)) + for i in range(self.nvar)] + else: + self.varlist = [self._null_terminate(self.path_or_buf.read(9)) + for i in range(self.nvar)] + self.srtlist = struct.unpack( + self.byteorder + ('h' * (self.nvar + 1)), + self.path_or_buf.read(2 * (self.nvar + 1)) + )[:-1] - # ignore expansion fields (Format 105 and later) - # When reading, read five bytes; the last four bytes now tell you - # the size of the next read, which you discard. You then continue - # like this until you read 5 bytes of zeros. + self.fmtlist = self._get_fmtlist() - if self.format_version > 104: - while True: - data_type = struct.unpack(self.byteorder + 'b', - self.path_or_buf.read(1))[0] - if self.format_version > 108: - data_len = struct.unpack(self.byteorder + 'i', - self.path_or_buf.read(4))[0] - else: - data_len = struct.unpack(self.byteorder + 'h', - self.path_or_buf.read(2))[0] - if data_type == 0: - break - self.path_or_buf.read(data_len) + self.lbllist = self._get_lbllist() - # necessary data to continue parsing - self.data_location = self.path_or_buf.tell() + self.vlblist = self._get_vlblist() - self.has_string_data = len([x for x in self.typlist - if type(x) is int]) > 0 + # ignore expansion fields (Format 105 and later) + # When reading, read five bytes; the last four bytes now tell you + # the size of the next read, which you discard. You then continue + # like this until you read 5 bytes of zeros. - # calculate size of a data record - self.col_sizes = lmap(lambda x: self._calcsize(x), self.typlist) + if self.format_version > 104: + while True: + data_type = struct.unpack(self.byteorder + 'b', + self.path_or_buf.read(1))[0] + if self.format_version > 108: + data_len = struct.unpack(self.byteorder + 'i', + self.path_or_buf.read(4))[0] + else: + data_len = struct.unpack(self.byteorder + 'h', + self.path_or_buf.read(2))[0] + if data_type == 0: + break + self.path_or_buf.read(data_len) - # remove format details from %td - self.fmtlist = ["%td" if x.startswith("%td") else x for x in self.fmtlist] + # necessary data to continue parsing + self.data_location = self.path_or_buf.tell() def _calcsize(self, fmt): return (type(fmt) is int and fmt or struct.calcsize(self.byteorder + fmt)) + + def _decode(self, s): + s = s.partition(b"\0")[0] + return s.decode('utf-8') + + def _null_terminate(self, s): if compat.PY3 or self._encoding is not None: # have bytes not strings, # so must decode @@ -1204,7 +1306,10 @@ def _read_value_labels(self): slength = self.path_or_buf.read(4) if not slength: break # end of variable label table (format < 117) - labname = self._null_terminate(self.path_or_buf.read(33)) + if self.format_version <= 117: + labname = self._null_terminate(self.path_or_buf.read(33)) + else: + labname = self._decode(self.path_or_buf.read(129)) self.path_or_buf.read(3) # padding n = struct.unpack(self.byteorder + 'I', @@ -1222,28 +1327,45 @@ def _read_value_labels(self): txt = self.path_or_buf.read(txtlen) self.value_label_dict[labname] = dict() for i in range(n): - self.value_label_dict[labname][val[i]] = ( - self._null_terminate(txt[off[i]:]) - ) - + if self.format_version <= 117: + self.value_label_dict[labname][val[i]] = ( + self._null_terminate(txt[off[i]:]) + ) + else: + self.value_label_dict[labname][val[i]] = ( + self._decode(txt[off[i]:]) + ) if self.format_version >= 117: self.path_or_buf.read(6) # self._value_labels_read = True + def _read_strls(self): self.path_or_buf.seek(self.seek_strls) - self.GSO = dict() + self.GSO = {0 : ''} while True: if self.path_or_buf.read(3) != b'GSO': break - v_o = struct.unpack(self.byteorder + 'Q', self.path_or_buf.read(8))[0] + if self.format_version == 117: + v_o = struct.unpack(self.byteorder + 'Q', self.path_or_buf.read(8))[0] + else: + buf = self.path_or_buf.read(12) + # Only tested on little endian file on little endian machine. + if self.byteorder == '<': + buf = buf[0:2] + buf[4:10] + else: + buf = buf[0:2] + buf[6:] + v_o = struct.unpack('Q', buf)[0] typ = struct.unpack('B', self.path_or_buf.read(1))[0] length = struct.unpack(self.byteorder + 'I', self.path_or_buf.read(4))[0] va = self.path_or_buf.read(length) if typ == 130: - va = va[0:-1].decode(self._encoding or self._default_encoding) + encoding = 'utf-8' + if self.format_version == 117: + encoding = self._encoding or self._default_encoding + va = va[0:-1].decode(encoding) self.GSO[v_o] = va # legacy @@ -1350,6 +1472,7 @@ def read(self, nrows=None, convert_dates=None, read_lines = min(nrows, self.nobs - self._lines_read) data = np.frombuffer(self.path_or_buf.read(read_len), dtype=dtype, count=read_lines) + self._lines_read += read_lines if self._lines_read == self.nobs: self._can_read_value_labels = True @@ -1470,7 +1593,7 @@ def _insert_strls(self, data): if not hasattr(self, 'GSO') or len(self.GSO) == 0: return data for i, typ in enumerate(self.typlist): - if typ != 'L': + if typ != 'Q': continue data.iloc[:, i] = [self.GSO[k] for k in data.iloc[:, i]] return data @@ -1491,14 +1614,12 @@ def _do_select_columns(self, data, columns): typlist = [] fmtlist = [] lbllist = [] - matched = set() - for i, col in enumerate(data.columns): - if col in column_set: - matched.update([col]) - dtyplist.append(self.dtyplist[i]) - typlist.append(self.typlist[i]) - fmtlist.append(self.fmtlist[i]) - lbllist.append(self.lbllist[i]) + for col in columns: + i = data.columns.get_loc(col) + dtyplist.append(self.dtyplist[i]) + typlist.append(self.typlist[i]) + fmtlist.append(self.fmtlist[i]) + lbllist.append(self.lbllist[i]) self.dtyplist = dtyplist self.typlist = typlist @@ -1756,7 +1877,7 @@ def _write(self, to_write): self._file.write(to_write) def _prepare_categoricals(self, data): - """Check for categorigal columns, retain categorical information for + """Check for categorical columns, retain categorical information for Stata file and convert categorical data to int""" is_cat = [com.is_categorical_dtype(data[col]) for col in data] diff --git a/pandas/io/tests/data/DEMO_G.XPT b/pandas/io/tests/data/DEMO_G.XPT new file mode 100644 index 0000000000000..587bc3c4eb649 Binary files /dev/null and b/pandas/io/tests/data/DEMO_G.XPT differ diff --git a/pandas/io/tests/data/DEMO_G.csv b/pandas/io/tests/data/DEMO_G.csv new file mode 100644 index 0000000000000..db2158a532100 --- /dev/null +++ b/pandas/io/tests/data/DEMO_G.csv @@ -0,0 +1,9757 @@ +"SEQN","SDDSRVYR","RIDSTATR","RIAGENDR","RIDAGEYR","RIDAGEMN","RIDRETH1","RIDRETH3","RIDEXMON","RIDEXAGY","RIDEXAGM","DMQMILIZ","DMQADFC","DMDBORN4","DMDCITZN","DMDYRSUS","DMDEDUC3","DMDEDUC2","DMDMARTL","RIDEXPRG","SIALANG","SIAPROXY","SIAINTRP","FIALANG","FIAPROXY","FIAINTRP","MIALANG","MIAPROXY","MIAINTRP","AIALANGA","WTINT2YR","WTMEC2YR","SDMVPSU","SDMVSTRA","INDHHIN2","INDFMIN2","INDFMPIR","DMDHHSIZ","DMDFMSIZ","DMDHHSZA","DMDHHSZB","DMDHHSZE","DMDHRGND","DMDHRAGE","DMDHRBR4","DMDHREDU","DMDHRMAR","DMDHSEDU" +62161,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,1,2,1,2,2,1,2,2,1,102641.406474,104236.582554,1,91,14,14,3.15,5,5,0,1,0,2,50,1,5,1,5 +62162,7,2,2,3,NA,1,1,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16116.35401,3,92,4,4,0.6,6,6,2,2,0,2,24,1,3,6,NA +62163,7,2,1,14,NA,5,6,2,14,177,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7397.684828,7869.485117,3,90,15,15,4.07,5,5,0,2,1,1,42,1,5,1,4 +62164,7,2,2,44,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,127351.373299,127965.226204,1,94,8,8,1.67,5,5,1,2,0,1,52,1,4,1,4 +62165,7,2,2,14,NA,4,4,2,14,179,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12209.74498,13384.042162,2,90,4,4,0.57,5,5,1,2,0,2,33,2,2,77,NA +62166,7,2,1,9,NA,3,3,2,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,60593.636684,64068.123183,1,91,77,77,NA,6,6,0,4,0,1,44,1,5,1,5 +62167,7,2,1,0,11,5,6,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5024.464768,5303.683185,2,92,99,77,NA,7,4,3,3,1,1,61,2,1,1,3 +62168,7,2,1,6,NA,5,7,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5897.024603,6245.043868,2,103,14,14,3.48,5,5,0,2,1,1,43,1,4,1,5 +62169,7,2,1,21,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,1,NA,NA,NA,1,2,2,1,14391.77847,14783.600953,1,92,2,2,0.33,5,5,0,1,0,1,51,2,1,4,NA +62170,7,2,1,15,NA,5,7,1,15,181,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7794.52699,8291.636582,3,91,15,15,5,4,4,0,2,0,1,38,2,5,1,5 +62171,7,2,1,14,NA,1,1,1,14,175,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,22768.423624,22886.980387,3,92,9,9,2.46,4,4,0,2,0,1,43,2,3,1,4 +62172,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,26960.774346,27122.911908,2,96,5,5,2.02,1,1,0,0,0,2,43,1,3,5,NA +62173,7,2,2,2,NA,1,1,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11401.934012,12203.058423,1,95,13,13,NA,5,5,3,0,0,2,33,2,1,1,2 +62174,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,24912.668432,27335.895242,3,90,10,10,4.3,2,2,0,0,2,2,80,1,4,1,5 +62175,7,2,1,5,NA,3,3,1,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26980.605125,30440.534478,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +62176,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,53830.599426,54203.155016,1,99,15,15,5,5,5,3,0,0,2,34,1,5,1,5 +62177,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,7879.750437,7851.284287,2,92,99,77,NA,7,4,3,3,1,1,61,2,1,1,3 +62178,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,12291.154515,13189.875012,1,95,1,1,0.05,1,1,0,0,1,1,80,1,3,2,NA +62179,7,2,1,55,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16590.074977,17115.36835,1,92,15,15,5,4,4,0,2,0,1,55,1,5,1,5 +62180,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20457.614917,22616.494827,1,97,5,5,0.87,4,4,2,0,0,1,35,1,5,1,5 +62181,7,2,1,9,NA,1,1,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,13822.148996,14860.201344,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +62182,7,1,1,75,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,63069.107216,0,1,90,12,12,NA,2,2,0,0,2,1,75,1,5,1,4 +62183,7,2,1,6,NA,4,4,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10138.00454,10211.52145,1,100,14,14,3.6,4,4,1,1,0,1,41,1,4,1,5 +62184,7,2,1,26,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15600.678771,15236.26157,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +62185,7,2,1,16,NA,1,1,1,16,201,NA,NA,1,1,NA,10,NA,NA,NA,2,2,2,2,2,2,NA,NA,NA,NA,18635.323223,19040.145288,2,103,77,77,NA,5,5,0,2,0,2,45,2,4,5,NA +62186,7,2,2,17,NA,4,4,1,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11224.041366,11682.365019,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +62187,7,2,2,9,NA,1,1,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,10118.363218,11093.371216,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +62188,7,2,1,2,NA,2,2,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11793.948458,12167.27893,1,100,5,5,0.78,6,5,1,2,0,2,40,2,1,5,NA +62189,7,2,2,30,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,17983.231494,18657.922524,1,94,10,10,3.04,4,4,2,0,0,2,30,1,4,1,5 +62190,7,2,2,15,NA,1,1,1,15,189,NA,NA,2,2,4,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20419.465237,21192.774678,2,102,6,3,0.54,6,4,0,4,0,2,43,2,1,5,NA +62191,7,2,1,70,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,8661.769277,9105.621464,1,96,14,3,0.9,2,1,0,0,2,2,71,NA,NA,3,NA +62192,7,2,2,11,NA,1,1,2,11,141,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14087.469432,14372.406512,2,97,7,7,2.05,3,3,0,2,0,2,45,1,5,2,NA +62193,7,2,1,17,NA,4,4,2,17,209,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11386.695644,11908.648036,2,99,6,6,1.18,5,5,0,3,0,2,38,1,2,5,NA +62194,7,2,2,9,NA,3,3,2,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,36778.822436,37956.900598,1,99,15,15,5,5,5,0,3,0,2,43,1,5,1,5 +62195,7,2,1,35,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,15842.100091,16468.990083,2,90,8,6,2.39,4,1,1,1,0,2,21,1,5,6,NA +62196,7,2,1,1,17,3,3,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,35830.680775,40425.523018,2,95,9,9,2.22,5,5,1,0,0,1,55,1,4,1,5 +62197,7,2,2,16,NA,4,4,1,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20015.720245,20424.69013,2,102,15,15,5,4,4,0,2,0,1,44,1,3,1,1 +62198,7,2,1,7,NA,3,3,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30754.608672,32212.772113,1,98,3,3,0.61,4,4,0,2,0,2,32,1,3,6,NA +62199,7,2,1,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,127000.852889,130891.431194,2,92,15,15,5,2,1,0,0,0,1,57,1,5,6,NA +62200,7,2,1,42,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,20543.822351,1,97,15,15,4.07,5,5,0,3,0,1,42,2,5,1,5 +62201,7,1,2,58,NA,5,6,NA,NA,NA,2,NA,2,2,2,NA,2,2,NA,1,2,1,1,2,2,NA,NA,NA,NA,19442.276314,0,1,95,6,6,1.34,4,4,0,2,0,2,32,2,3,2,NA +62202,7,2,1,36,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,41155.167164,40844.556107,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +62203,7,2,1,8,NA,4,4,2,8,99,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,11324.954668,11525.075349,1,93,12,12,NA,3,3,0,1,0,2,49,2,3,1,3 +62204,7,1,2,9,NA,5,6,NA,NA,NA,NA,NA,2,1,3,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5585.02957,0,2,103,15,15,5,4,4,0,2,0,1,48,2,5,1,5 +62205,7,2,1,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,103663.693967,105583.964573,1,90,15,15,5,4,4,0,1,0,2,53,1,5,1,5 +62206,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,67177.369911,67642.297015,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +62207,7,2,1,0,0,4,4,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6988.613752,7730.080563,1,100,5,5,1.05,3,3,1,0,0,2,35,1,4,6,NA +62208,7,2,1,38,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,4,1,NA,2,2,2,1,2,2,1,2,2,2,41241.224595,41216.943466,2,102,7,7,1.53,5,5,1,2,0,2,37,2,4,1,4 +62209,7,2,2,62,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,13473.304889,14578.166065,2,96,6,6,1.11,6,6,0,2,1,1,40,2,2,1,2 +62210,7,2,1,15,NA,3,3,2,15,188,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,100370.520459,102294.664852,1,90,15,15,5,4,4,0,2,1,2,52,1,5,1,NA +62211,7,1,2,63,NA,1,1,NA,NA,NA,2,NA,2,2,77,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,16352.915834,0,3,92,9,9,2.22,5,5,1,0,2,1,66,2,1,1,1 +62212,7,1,2,8,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9465.598219,0,2,91,12,12,NA,3,3,0,1,0,1,56,1,4,1,4 +62213,7,2,1,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5422.375171,5488.513785,2,99,4,4,0.94,3,3,1,0,0,1,48,2,3,6,NA +62214,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,2,1,2,2,1,2,2,1,2,2,1,18723.98095,21433.166124,2,95,7,7,1.41,5,5,2,0,0,2,53,1,3,3,NA +62215,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,129559.2554,1,98,13,13,NA,2,2,0,0,2,2,80,1,2,2,NA +62216,7,2,1,0,6,3,3,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19442.488468,19106.370101,2,92,15,15,5,3,3,1,0,0,2,31,2,5,1,5 +62217,7,2,2,77,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,NA,15730.58404,17568.357111,2,98,4,4,0.97,3,3,0,1,1,2,77,1,1,5,NA +62218,7,2,2,38,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,1,2,2,1,39534.635218,41046.564195,2,102,14,14,4.05,3,3,0,1,0,1,18,1,2,NA,NA +62219,7,2,2,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11582.174418,11621.723611,2,102,4,4,0.44,7,7,1,3,0,1,48,1,9,1,9 +62220,7,2,2,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,33193.038733,33538.564898,1,96,9,9,4.92,1,1,0,0,0,2,31,1,5,5,NA +62221,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,25818.768393,25697.012112,1,100,14,14,3.6,4,4,1,1,0,1,41,1,4,1,5 +62222,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,89973.129052,97483.088567,1,93,15,15,5,2,2,0,0,0,2,30,1,5,1,5 +62223,7,2,1,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10133.862484,12107.78442,3,90,77,77,NA,3,3,0,1,0,1,54,2,3,1,3 +62224,7,2,2,29,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,1,2,2,2,2,1,2,2,2,2,2,2,43986.779369,46449.619953,1,93,9,9,2.46,4,4,0,2,0,1,35,2,1,1,1 +62225,7,2,2,13,NA,1,1,1,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24481.187693,25761.611656,1,92,15,15,4.99,4,4,0,2,0,2,43,1,4,1,4 +62226,7,2,1,80,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,1,NA,2,2,2,2,2,2,2,2,1,NA,13654.270555,13892.295449,2,93,9,9,3.64,2,2,0,0,2,2,79,2,2,1,4 +62227,7,2,1,19,NA,3,3,2,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,68701.580401,72973.564721,2,94,15,15,5,5,5,0,2,0,1,53,1,5,1,5 +62228,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,144353.133634,144729.952645,1,91,14,14,3.15,5,5,0,1,0,2,50,1,5,1,5 +62229,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,72426.980535,75980.145152,1,98,6,6,1.31,3,3,1,0,0,1,30,1,5,1,5 +62230,7,2,1,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,12946.818038,13703.92145,1,101,5,3,1.07,2,1,0,0,2,2,70,1,4,2,NA +62231,7,2,2,48,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,43535.993088,52686.708499,2,102,15,15,3.92,5,5,0,0,0,1,19,1,4,NA,NA +62232,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,115926.402585,118970.086068,1,101,14,14,3.3,4,4,0,2,0,2,42,1,4,1,3 +62233,7,2,2,63,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,10999.00871,11900.968385,2,98,6,6,0.78,7,7,1,3,1,2,63,1,2,4,NA +62234,7,2,1,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14860.312419,14555.816778,3,90,15,15,4.89,5,5,0,0,0,2,57,2,3,1,3 +62235,7,2,2,2,NA,3,3,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49862.013993,55032.245455,2,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +62236,7,2,1,61,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9048.959172,9513.611982,1,93,15,15,5,5,5,1,0,1,1,61,2,4,1,4 +62237,7,2,2,58,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140431.173819,139253.659476,1,91,7,7,2.64,2,2,0,0,1,2,58,1,5,1,4 +62238,7,2,2,0,4,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20786.668002,20803.881706,1,101,8,8,1.85,5,5,3,0,0,2,31,1,2,1,2 +62239,7,2,2,22,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,3,6,2,2,2,2,2,2,2,2,2,2,2,39426.061521,39254.343691,2,94,14,1,0.09,5,1,0,0,0,1,24,2,4,5,NA +62240,7,2,2,14,NA,2,2,2,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26657.121865,28092.602686,1,97,14,14,3.25,4,4,0,2,0,1,45,1,3,6,NA +62241,7,2,1,2,NA,2,2,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9237.934626,9897.780242,2,90,14,14,3.45,4,4,1,1,0,2,34,2,5,6,NA +62242,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,129608.716834,132839.525748,1,100,6,6,1.98,2,2,0,0,0,1,50,1,5,4,NA +62243,7,2,2,1,16,3,3,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49862.013993,51432.868823,2,91,15,15,5,4,4,2,0,0,1,34,1,5,1,5 +62244,7,2,1,1,17,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14505.670599,14525.271178,2,102,15,15,5,4,4,2,0,0,1,32,1,5,1,5 +62245,7,2,1,8,NA,5,6,2,8,97,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10810.913614,11522.32071,1,97,15,15,5,4,4,1,1,0,1,44,2,5,1,5 +62246,7,2,2,0,1,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7210.38482,7501.352858,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +62247,7,1,2,0,6,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5158.857524,0,1,97,7,7,1.74,4,4,2,0,0,1,34,1,5,1,5 +62248,7,2,1,65,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,9048.959172,9881.360452,1,93,8,8,1.2,7,7,1,1,1,1,24,2,2,5,NA +62249,7,2,2,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,59001.303336,59528.815212,2,101,4,4,1.38,1,1,0,0,0,2,26,1,5,5,NA +62250,7,2,1,34,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,51543.062078,52965.08671,3,92,15,15,5,3,3,1,0,0,1,34,1,5,1,5 +62251,7,2,2,51,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16672.82247,17074.238333,1,92,12,12,NA,4,4,0,0,0,1,59,2,3,1,4 +62252,7,2,2,11,NA,1,1,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17053.854294,17379.519997,3,92,15,8,2.62,4,3,1,1,0,1,30,1,2,6,NA +62253,7,2,1,18,NA,3,3,2,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,68701.580401,72973.564721,2,94,14,14,5,3,3,0,0,0,1,42,1,5,1,5 +62254,7,2,1,14,NA,4,4,2,14,179,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15381.581315,15476.088016,1,93,12,12,NA,5,4,0,2,0,1,32,1,2,5,NA +62255,7,2,1,65,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,29731.886612,29889.869541,1,95,3,3,0.87,2,2,0,0,2,2,65,1,2,1,3 +62256,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,7911.357817,9487.389486,2,94,5,5,1.63,2,2,0,0,2,2,79,1,3,1,1 +62257,7,2,2,2,NA,1,1,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,NA,NA,NA,NA,NA,NA,NA,9469.751474,10135.116584,1,102,NA,NA,NA,5,5,1,2,0,1,39,NA,NA,1,NA +62258,7,2,1,47,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,43470.92932,42833.060444,1,92,6,6,0.93,5,5,0,2,0,1,47,2,1,1,1 +62259,7,2,1,61,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,7736.56115,7645.782314,1,99,4,2,0.87,2,1,0,0,1,2,59,1,3,3,NA +62260,7,2,1,10,NA,3,3,2,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,57305.501166,60591.443404,1,94,15,15,5,5,5,0,3,0,1,46,1,3,1,5 +62261,7,2,1,47,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,2,2,2,2,33029.272844,33366.323953,2,93,14,14,3.25,4,4,0,2,0,2,46,2,5,1,4 +62262,7,2,2,0,10,2,2,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7367.430495,7616.752822,2,91,5,5,0.74,5,5,1,1,0,1,35,2,1,1,2 +62263,7,2,1,2,NA,3,3,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,28617.223132,33531.791823,1,101,3,3,0.61,4,4,1,2,0,1,38,1,2,4,NA +62264,7,2,1,77,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,52448.388619,55291.886181,1,99,7,7,2.72,2,2,0,0,2,1,77,1,2,1,3 +62265,7,2,1,52,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19478.845078,19591.5023,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +62266,7,2,1,64,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,29999.543427,30837.648113,2,91,12,5,1.79,3,1,0,0,1,1,52,1,4,3,NA +62267,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,34430.806911,35615.742482,2,95,6,6,1.08,4,4,1,1,0,1,39,1,4,1,4 +62268,7,2,2,15,NA,1,1,1,16,192,NA,NA,1,1,NA,9,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,16734.618372,17498.916137,2,96,5,5,0.78,5,5,0,2,0,1,37,2,1,5,NA +62269,7,2,1,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,14718.123234,15404.517346,2,101,1,1,0.1,6,6,1,2,1,2,27,1,2,1,2 +62270,7,2,2,33,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,5,5,2,2,2,2,1,2,2,2,2,2,2,31765.061314,30907.973228,2,93,4,4,0.56,5,5,0,0,0,2,49,2,2,5,NA +62271,7,2,1,7,NA,4,4,2,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6971.452972,8307.996458,2,99,7,7,1.63,4,4,0,2,0,1,53,1,3,3,NA +62272,7,2,1,9,NA,2,2,1,9,111,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,11102.340512,11169.626274,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +62273,7,2,2,15,NA,5,6,1,15,184,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7588.544207,7881.983727,3,91,14,14,4.03,4,4,0,2,0,1,51,2,4,1,5 +62274,7,2,1,2,NA,4,4,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5103.735747,5455.59,2,95,3,3,0.38,5,5,2,2,0,2,37,1,4,3,NA +62275,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,14442.406316,14518.77693,2,99,15,15,5,1,1,0,0,0,2,41,2,5,5,NA +62276,7,2,1,9,NA,3,3,2,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,63059.776443,67841.511058,1,99,15,15,5,4,4,1,1,0,2,42,1,5,1,5 +62277,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,139343.551779,140618.30879,2,98,9,9,5,1,1,0,0,0,2,55,1,4,3,NA +62278,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,94,7,7,2.51,2,2,0,0,2,2,72,1,4,1,1 +62279,7,2,1,80,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,9456.784526,9941.375417,2,99,13,13,NA,3,3,0,0,1,1,80,1,2,2,NA +62280,7,2,2,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,16966.723528,16502.38463,2,95,6,6,1.7,2,2,0,0,0,2,54,1,4,2,NA +62281,7,2,2,13,NA,4,4,2,13,162,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11372.489138,11738.962427,1,99,6,6,0.96,5,5,1,2,0,2,35,1,4,1,2 +62282,7,2,2,57,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,21219.116826,20638.40003,1,102,6,6,1.7,2,2,0,0,1,2,80,NA,NA,2,NA +62283,7,2,1,2,NA,1,1,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14457.854197,15490.547336,1,92,10,10,2.93,4,4,1,0,0,2,55,1,4,1,4 +62284,7,2,2,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,117778.281347,120111.495123,1,94,8,8,2.41,3,3,0,0,3,1,63,1,4,1,5 +62285,7,2,2,17,NA,3,3,2,17,206,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,103007.696238,104941.393061,1,101,6,6,1.31,3,3,0,1,0,1,51,1,4,1,4 +62286,7,2,1,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,12556.207754,12615.022145,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +62287,7,2,2,73,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,12183.823561,12607.778632,2,100,6,6,2.11,2,2,0,0,2,1,79,1,3,1,4 +62288,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,22634.531479,23281.741513,1,103,9,6,2.24,3,1,0,0,0,1,27,1,5,5,NA +62289,7,2,1,71,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,13555.672819,15969.746949,1,94,3,3,1.07,1,1,0,0,1,1,71,1,2,3,NA +62290,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7618.827213,7957.141798,2,101,1,1,0,3,3,2,0,0,1,22,1,3,5,NA +62291,7,2,1,56,NA,5,7,1,NA,NA,1,1,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20111.196953,20038.543847,1,92,14,14,5,2,2,0,0,0,1,56,2,4,1,4 +62292,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,36829.543424,39682.305625,1,93,15,15,5,4,3,0,0,3,1,80,1,5,2,NA +62293,7,2,1,67,NA,3,3,2,NA,NA,1,1,2,1,9,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,28478.57859,28745.66908,1,101,3,3,1.16,1,1,0,0,1,1,67,2,4,3,NA +62294,7,2,1,9,NA,2,2,2,9,117,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,9390.522479,10327.334743,2,90,3,3,0.54,4,4,1,2,0,2,33,2,1,4,NA +62295,7,2,2,69,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,12994.252166,2,90,2,2,0.79,1,1,0,0,1,2,69,2,2,2,NA +62296,7,2,1,19,NA,4,4,2,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13251.602554,13277.802057,1,96,15,15,5,2,2,0,0,0,2,51,1,5,5,NA +62297,7,2,1,43,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18402.969014,18977.095614,2,95,10,10,3.67,3,3,0,1,0,1,43,1,4,1,4 +62298,7,2,1,15,NA,3,3,2,16,192,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,93665.036597,95017.313859,1,91,14,14,3.8,4,4,0,2,0,1,50,NA,NA,1,5 +62299,7,2,1,8,NA,5,6,2,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6631.058951,7488.793181,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +62300,7,2,2,6,NA,4,4,2,6,83,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6929.51414,7399.559927,2,99,14,14,4.09,3,3,0,2,0,2,37,1,5,5,NA +62301,7,2,1,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16907.09145,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +62302,7,2,2,51,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,5,NA,2,2,2,1,2,2,2,2,2,2,19676.781212,20033.616894,2,103,77,77,NA,4,4,0,0,0,2,46,2,1,4,NA +62303,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,61501.13451,65355.920739,2,101,6,6,1.62,3,3,0,0,2,1,80,1,3,1,3 +62304,7,2,2,6,NA,1,1,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9872.244853,10573.701398,2,90,6,6,0.96,5,5,1,1,0,1,39,2,2,1,NA +62305,7,2,1,10,NA,1,1,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13285.093011,14158.005149,2,94,9,9,2.37,5,5,0,1,0,1,48,2,4,1,2 +62306,7,2,1,0,9,2,2,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4884.343512,4884.433539,3,90,12,12,NA,3,3,1,0,0,1,40,2,5,1,4 +62307,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,7828.117773,8460.915547,2,90,4,4,1.2,2,2,0,0,2,2,80,1,3,2,NA +62308,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,83112.549416,87237.362828,1,97,7,7,2.64,2,2,0,0,2,1,79,1,4,1,3 +62309,7,2,2,47,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,2,NA,2,2,2,2,2,2,2,2,2,2,40337.933888,40548.292782,3,92,4,4,0.46,7,7,1,2,0,2,31,2,2,1,1 +62310,7,2,2,8,NA,4,4,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7632.404654,7765.546414,2,101,1,1,0.1,6,6,1,2,1,2,27,1,2,1,2 +62311,7,2,1,18,NA,3,3,2,19,228,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,68148.957861,67253.324127,1,93,15,15,3.92,5,5,0,1,0,2,54,1,5,1,5 +62312,7,2,2,63,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,1,1,2,2,1,2,2,2,16352.915834,17178.789759,3,92,8,8,1.85,5,5,1,0,2,1,66,2,1,1,1 +62313,7,2,1,7,NA,1,1,1,7,93,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12577.115885,12876.06354,2,96,5,5,0.76,5,5,1,2,0,1,44,2,1,1,3 +62314,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,7611.107768,7639.752345,2,97,3,3,1.33,1,1,0,0,1,1,61,1,3,5,NA +62315,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,12842.559946,13803.13967,2,95,99,99,NA,2,2,0,1,1,2,80,1,2,2,NA +62316,7,2,1,39,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,31674.692905,34832.561132,2,100,4,4,0.81,4,4,0,2,0,2,37,1,2,1,2 +62317,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18872.772727,18824.29246,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +62318,7,2,2,0,10,3,3,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8114.787453,8336.925581,1,91,2,2,0.27,5,5,2,2,0,2,42,1,4,3,NA +62319,7,2,2,4,NA,4,4,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11231.392369,2,100,1,1,0.08,5,5,1,2,0,2,19,1,3,NA,NA +62320,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,122483.259869,124909.680309,3,91,7,7,2.89,2,2,0,0,2,2,64,1,4,1,4 +62321,7,2,2,8,NA,5,6,1,8,100,NA,NA,2,1,3,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6412.057856,6847.117735,3,91,14,14,4.03,4,4,0,2,0,1,50,1,5,1,5 +62322,7,2,2,4,NA,4,4,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10295.166918,11223.20055,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +62323,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7618.827213,7957.141798,2,101,1,1,0,3,3,2,0,0,1,22,1,3,5,NA +62324,7,2,2,60,NA,1,1,2,NA,NA,2,NA,2,2,77,NA,4,4,NA,2,2,2,1,2,2,1,2,2,2,11469.456138,12167.81965,1,90,3,3,0.23,7,7,3,1,1,2,35,2,2,5,NA +62325,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,30932.175051,32888.281888,2,101,1,1,0.1,2,2,0,0,0,1,56,1,3,6,NA +62326,7,2,1,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,153565.050575,157855.235487,1,97,10,10,4.3,2,2,0,0,1,2,56,1,5,1,5 +62327,7,2,2,19,NA,4,4,2,19,238,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12209.74498,12386.615954,2,90,6,6,1.12,4,4,0,1,1,1,63,2,1,1,1 +62328,7,2,2,9,NA,4,4,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7899.813226,8111.155436,2,97,15,15,5,4,4,0,2,0,1,47,NA,NA,6,NA +62329,7,2,1,2,NA,2,2,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11793.948458,12167.27893,1,100,3,3,0.39,5,5,1,2,0,1,32,2,1,6,NA +62330,7,2,2,33,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,21097.664283,22267.583876,2,96,14,14,5,2,2,0,0,0,2,33,2,5,1,5 +62331,7,2,1,9,NA,5,7,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8246.426933,8701.859504,1,99,14,14,3.94,4,4,1,1,0,1,43,1,4,1,5 +62332,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,31962.323978,33458.586112,1,100,4,4,1.06,3,2,0,0,0,1,22,1,4,6,NA +62333,7,2,2,45,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,13046.228603,13115.21631,2,92,12,77,NA,7,2,0,0,2,1,53,2,3,1,3 +62334,7,2,1,9,NA,3,3,1,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19590.665143,20475.022602,3,91,5,5,0.87,4,4,0,2,0,2,38,1,2,3,NA +62335,7,2,1,14,NA,2,2,2,14,171,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13921.972975,14228.387356,3,90,14,14,3.69,4,4,0,2,0,2,49,1,4,1,4 +62336,7,2,1,55,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,4,6,NA,2,2,2,2,2,2,2,2,2,2,24211.824535,24947.165851,2,93,10,10,3.67,3,3,0,0,0,2,56,2,4,6,NA +62337,7,2,2,10,NA,1,1,2,10,123,NA,NA,2,2,3,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15166.167659,15537.272247,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +62338,7,1,2,2,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12260.86913,0,3,92,5,5,0.68,6,6,3,0,0,2,19,1,4,NA,NA +62339,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,71402.235366,74200.659205,2,100,15,15,5,4,4,1,1,0,1,29,1,4,1,4 +62340,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,130826.463813,1,101,6,6,1.28,4,4,2,0,0,1,44,1,4,1,4 +62341,7,2,1,8,NA,1,1,2,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13285.093011,13365.60735,2,94,7,7,2.16,3,3,0,1,0,2,28,1,2,1,1 +62342,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,78565.115731,1,101,8,8,1.85,5,5,0,3,0,1,41,1,3,1,4 +62343,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17615.311737,2,97,5,5,0.76,5,5,0,0,0,2,50,1,4,5,NA +62344,7,1,2,32,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,NA,NA,NA,NA,NA,NA,NA,26426.249254,0,1,99,NA,NA,NA,1,1,0,0,0,2,32,1,5,5,NA +62345,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,64324.554311,66806.652381,2,103,15,15,5,4,4,2,0,0,1,36,2,4,1,5 +62346,7,2,1,19,NA,5,7,1,19,239,2,NA,2,2,4,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6558.308393,6849.983523,2,92,99,1,0.22,4,1,0,0,0,1,19,1,4,NA,NA +62347,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,25812.913537,27430.822937,2,95,3,3,1.21,1,1,0,0,1,2,71,1,3,2,NA +62348,7,2,2,19,NA,4,4,2,19,236,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11419.859653,11886.179371,2,99,7,7,1.19,6,6,1,3,0,2,38,1,3,5,NA +62349,7,2,2,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,122473.120523,125156.324631,3,91,8,5,1.5,3,2,0,0,0,1,23,1,4,1,4 +62350,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,96255.674553,99423.043377,2,94,7,7,2.72,2,2,0,1,0,2,43,1,3,3,NA +62351,7,2,1,7,NA,3,3,2,7,89,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25604.034863,26336.174292,1,95,5,5,0.92,5,5,1,2,0,2,30,1,4,1,4 +62352,7,2,2,3,NA,4,4,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,10601.396934,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +62353,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,39587.338944,43437.954199,2,91,15,15,5,2,2,0,0,2,2,79,1,5,1,5 +62354,7,2,2,11,NA,3,3,2,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,80369.555824,79030.006233,1,97,8,8,2.72,3,3,0,2,0,2,43,1,1,3,NA +62355,7,2,2,16,NA,5,6,1,16,197,NA,NA,2,1,3,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7176.749123,7692.153155,3,91,7,7,1.79,4,4,0,1,0,2,45,2,2,1,3 +62356,7,2,2,14,NA,1,1,1,14,179,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26325.414456,27702.295836,3,92,12,12,NA,6,6,1,3,0,2,33,1,5,1,4 +62357,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,94433.586146,101591.315487,1,91,15,15,5,3,3,1,0,0,1,36,1,4,1,5 +62358,7,2,2,0,3,1,1,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9767.083234,9561.595244,3,92,7,7,1.99,3,3,1,0,0,1,40,1,4,1,4 +62359,7,2,2,54,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22224.73066,23825.197607,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +62360,7,2,1,17,NA,4,4,1,17,210,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11429.628358,11541.555232,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +62361,7,2,1,7,NA,4,4,1,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13423.881856,14179.490667,2,101,1,1,0.21,4,4,1,2,0,2,26,1,3,5,NA +62362,7,2,2,11,NA,4,4,2,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.490652,8919.477637,2,97,6,6,1,6,6,1,2,2,2,60,1,2,2,NA +62363,7,2,2,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,134897.594057,143557.343892,2,102,6,6,1.43,4,4,0,1,1,1,67,NA,NA,1,NA +62364,7,2,2,4,NA,1,1,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14899.363418,16449.297045,1,100,8,8,2.17,4,4,1,1,0,2,40,2,2,1,2 +62365,7,2,2,37,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21097.664283,21336.137518,2,96,8,8,3.4,2,2,0,0,0,1,46,2,4,1,4 +62366,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,37318.801462,40047.525745,1,98,6,6,1.65,2,2,0,0,2,1,80,1,3,1,3 +62367,7,2,1,50,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,10133.862484,10097.253197,3,90,15,15,3.23,6,6,0,2,0,1,50,2,2,1,2 +62368,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,23176.790531,24820.797478,1,98,3,3,0.81,2,2,0,0,1,2,80,2,1,2,NA +62369,7,2,2,8,NA,2,2,1,8,100,NA,NA,2,2,3,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15352.601806,15663.127806,2,102,7,7,1.53,5,5,1,2,0,2,37,2,4,1,4 +62370,7,2,1,21,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,13843.66558,14262.333267,1,90,15,15,3.7,5,5,0,0,0,1,54,NA,NA,1,NA +62371,7,2,1,32,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22403.911395,23863.238542,2,96,14,14,5,2,2,0,0,0,2,33,2,5,1,5 +62372,7,2,2,55,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,1,1,2,2,1,2,2,NA,17991.883465,18643.986017,2,102,8,8,2.01,4,4,0,0,0,1,59,2,4,1,4 +62373,7,2,1,46,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,37324.655911,36776.974122,1,102,6,6,1.34,4,4,0,1,0,2,48,2,3,1,1 +62374,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,33530.36206,1,101,4,4,0.78,4,4,1,2,0,2,31,1,4,3,NA +62375,7,2,1,24,NA,1,1,1,NA,NA,2,NA,2,2,99,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,52698.05363,59566.360508,3,92,4,4,0.65,4,4,2,0,0,2,20,1,3,5,NA +62376,7,2,1,6,NA,4,4,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7730.47951,9212.541007,1,99,5,5,0.84,5,5,2,1,0,1,35,1,3,1,2 +62377,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35965.834545,38220.111719,1,95,3,3,1.24,1,1,0,0,1,2,78,1,2,2,NA +62378,7,2,2,68,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,3,NA,2,2,2,1,2,2,2,2,2,2,10979.149658,11879.480817,1,96,15,8,4.66,2,1,0,0,2,2,68,2,1,3,NA +62379,7,2,1,40,NA,5,7,1,NA,NA,2,NA,2,1,5,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,24837.95225,25237.159887,1,102,10,10,3.22,4,4,0,0,2,2,29,2,5,5,NA +62380,7,2,1,16,NA,1,1,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,15506.325263,15592.022118,1,103,8,8,2,5,5,0,1,0,2,45,2,3,1,2 +62381,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,1,2,1,2,2,1,2,2,NA,15408.94893,15514.368855,1,99,7,2,0.74,3,1,0,0,2,1,70,1,2,1,4 +62382,7,2,2,1,21,4,4,2,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5743.559235,6261.298887,2,99,2,2,0.2,7,7,1,2,1,1,63,1,1,2,NA +62383,7,2,1,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,91704.59836,93129.802737,1,93,15,4,1.38,6,1,0,0,0,1,23,1,5,5,NA +62384,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,27444.308565,27682.940425,1,101,7,7,2.31,2,2,0,0,1,2,69,1,4,2,NA +62385,7,2,1,0,10,4,4,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6699.703488,6998.255943,2,96,6,6,1.32,5,5,1,3,0,2,30,1,4,3,NA +62386,7,2,1,35,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,21163.049914,22845.160537,1,97,8,8,2.51,3,3,0,1,0,1,35,1,3,1,4 +62387,7,2,1,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17597.975048,2,97,3,3,1.29,1,1,0,0,0,1,23,1,3,5,NA +62388,7,2,2,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,49644.076348,54110.530387,1,97,3,3,1.12,1,1,0,0,1,2,69,1,3,2,NA +62389,7,2,2,16,NA,5,7,2,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,15,15,5,6,6,0,3,0,1,47,1,5,1,5 +62390,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,14095.963218,14697.88566,2,92,15,8,4.59,2,1,0,0,0,2,25,2,5,5,NA +62391,7,2,2,40,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,34954.173075,36222.975959,2,98,15,15,5,3,3,0,1,0,1,38,1,4,1,3 +62392,7,2,2,1,12,1,1,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,12260.86913,12783.275371,3,92,6,6,0.96,5,5,2,1,0,2,26,2,1,1,1 +62393,7,2,1,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,48709.670361,2,98,7,7,1.53,5,5,0,0,0,2,48,1,3,5,NA +62394,7,2,1,1,14,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,1,1,0.13,4,4,2,0,0,2,52,1,2,4,NA +62395,7,2,2,1,16,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12871.484115,13281.030392,2,102,8,8,2.24,4,4,1,1,0,1,35,2,3,1,1 +62396,7,2,1,10,NA,1,1,1,10,123,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,10658.399025,10827.062436,1,102,5,5,0.62,7,7,1,3,0,1,49,2,2,1,1 +62397,7,2,2,70,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,1,2,2,2,2,2,NA,17077.396628,18362.705174,2,96,13,13,NA,6,6,0,2,1,1,43,2,4,1,3 +62398,7,2,1,9,NA,3,3,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19926.440922,21167.339982,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +62399,7,2,2,53,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,24870.513993,25871.320138,2,98,5,5,1.63,2,2,0,0,0,2,53,2,1,1,1 +62400,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,27463.558155,27680.636989,2,100,4,4,1.22,2,2,0,1,0,2,31,1,4,5,NA +62401,7,2,2,15,NA,3,3,1,15,187,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,93740.540203,99321.165816,1,100,8,8,1.95,4,4,0,2,1,2,49,1,5,6,NA +62402,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,1,4,NA,1,2,2,1,2,2,1,2,2,NA,14259.601244,14208.087437,1,93,6,6,1.15,5,5,1,0,2,2,70,NA,NA,1,NA +62403,7,2,2,3,NA,4,4,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8192.75936,8404.22838,2,99,77,77,NA,3,3,1,0,0,1,38,2,5,1,5 +62404,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,22009.438408,22692.209281,2,99,6,6,2.95,1,1,0,0,0,1,44,1,3,5,NA +62405,7,2,1,5,NA,2,2,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14716.463544,14890.443704,2,96,2,2,0.27,6,6,1,3,0,1,34,NA,NA,1,NA +62406,7,2,2,10,NA,2,2,2,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19936.606751,20692.800636,1,94,7,7,1.74,4,4,0,2,0,1,44,1,5,1,5 +62407,7,2,1,49,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,28680.660607,29290.218786,1,94,3,3,1.1,1,1,0,0,0,1,49,1,4,3,NA +62408,7,1,1,58,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,174520.785302,0,1,95,7,7,2.86,2,2,0,0,1,1,58,1,4,1,3 +62409,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,22419.63376,27869.657009,1,94,3,3,1.16,1,1,0,0,1,2,80,1,3,2,NA +62410,7,2,1,5,NA,4,4,2,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8158.702829,8662.344233,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +62411,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15790.702799,17527.166432,2,90,7,7,3.21,1,1,0,0,0,2,51,1,4,5,NA +62412,7,2,1,16,NA,1,1,2,16,199,NA,NA,2,2,4,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,21718.29328,22050.264992,2,94,6,6,1.5,4,4,0,2,0,1,44,2,2,1,2 +62413,7,2,1,65,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,131445.986898,130104.237054,1,101,5,5,1.6,2,2,0,0,1,1,65,1,4,6,NA +62414,7,2,1,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,1,2,1,2,2,1,1,2,NA,17206.320427,17681.811932,1,96,2,2,0.4,3,3,0,0,0,2,56,1,3,3,NA +62415,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,129336.409693,136474.939567,1,95,15,15,5,3,3,1,0,0,1,26,1,3,1,4 +62416,7,2,2,19,NA,2,2,2,19,235,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13824.001771,14551.102227,2,90,10,10,2.91,4,4,0,1,0,2,51,2,4,1,1 +62417,7,2,2,26,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,45207.136555,46085.238422,1,94,14,8,4.66,2,1,0,0,0,2,26,1,4,5,NA +62418,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,46965.818538,52174.805072,1,101,6,6,1.98,2,2,0,0,1,1,80,1,1,2,NA +62419,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,42993.150248,46481.579201,1,95,5,5,0.65,6,6,1,0,2,1,80,1,3,1,4 +62420,7,1,1,24,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,59682.963348,0,2,102,77,77,NA,4,4,0,1,0,1,47,1,2,1,3 +62421,7,2,1,23,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,15171.949804,3,91,6,1,0,2,1,0,0,0,1,24,1,5,5,NA +62422,7,2,2,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,63504.762752,64182.95787,1,91,15,15,5,1,1,0,0,1,2,72,1,4,2,NA +62423,7,1,2,8,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13192.206605,0,2,102,14,14,3.8,4,4,0,2,0,1,47,1,4,1,4 +62424,7,2,1,20,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,2,5,NA,2,2,2,2,2,2,2,2,2,2,41713.173502,43905.698512,1,90,99,3,0.9,3,1,0,0,0,1,41,NA,NA,99,NA +62425,7,2,2,30,NA,3,3,2,NA,NA,2,NA,2,2,1,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,81658.419251,86275.41601,2,99,15,15,5,2,2,0,0,0,1,30,NA,NA,1,5 +62426,7,2,1,9,NA,1,1,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8828.580268,8822.70874,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +62427,7,2,1,15,NA,4,4,2,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11462.850569,11753.30805,2,100,4,4,0.69,5,5,0,3,0,1,38,1,3,6,NA +62428,7,2,2,12,NA,4,4,1,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16598.888685,16325.283055,2,102,15,15,4.2,5,5,1,2,0,2,29,NA,NA,1,NA +62429,7,2,1,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,25964.952645,26121.35248,2,96,14,14,5,2,2,0,1,0,1,47,1,5,5,NA +62430,7,2,1,27,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,49006.291777,50482.76018,1,92,9,9,2.93,3,3,0,1,0,2,30,1,5,1,5 +62431,7,2,1,54,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,25969.864445,29542.265764,1,97,2,2,0.81,1,1,0,0,0,1,54,1,2,5,NA +62432,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,75294.690128,81171.633513,1,90,15,15,5,4,4,0,2,0,1,37,1,5,1,5 +62433,7,2,1,10,NA,4,4,2,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,8579.422451,10224.240431,1,99,NA,NA,NA,4,4,1,1,0,1,42,NA,NA,1,NA +62434,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,9113.905743,10210.592308,3,90,14,14,5,2,2,0,0,2,1,60,NA,NA,1,3 +62435,7,2,2,0,7,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16547.193167,16560.896108,1,97,12,12,NA,5,5,3,0,0,2,33,1,5,1,5 +62436,7,2,1,4,NA,1,1,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11776.305841,11467.607256,1,90,4,4,0.47,7,7,1,1,0,2,50,2,1,1,1 +62437,7,2,1,39,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,6,NA,2,2,2,1,2,2,1,2,2,2,33948.23667,35734.088319,2,97,4,4,0.67,4,4,0,2,0,1,39,2,2,6,NA +62438,7,2,1,0,0,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6339.587912,6622.092882,1,91,7,7,1.49,5,5,3,0,0,2,38,2,4,1,4 +62439,7,2,1,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60942.568495,64726.722108,1,94,15,15,5,2,2,0,0,2,1,75,1,4,1,3 +62440,7,2,1,22,NA,1,1,2,NA,NA,2,NA,2,1,4,NA,4,1,NA,1,2,2,2,2,2,1,2,2,2,35669.2076,36294.041819,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +62441,7,2,1,68,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,1,2,2,1,2,2,2,8609.250304,11228.904188,2,90,2,2,0.31,4,4,0,0,2,1,68,2,1,1,NA +62442,7,2,1,0,8,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6981.458608,7088.61417,2,92,9,9,2.71,4,4,1,0,0,1,43,1,2,1,4 +62443,7,2,2,4,NA,4,4,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8464.796876,9108.215863,2,93,8,8,1.67,5,5,1,1,0,2,31,1,4,5,NA +62444,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,21503.272394,20634.528185,2,100,1,1,0,2,2,0,0,0,2,55,1,5,3,NA +62445,7,2,2,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,19866.025076,19772.340772,2,95,6,6,1.08,4,4,1,0,0,2,42,1,4,4,NA +62446,7,2,2,4,NA,2,2,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,17065.756351,2,98,1,1,0,3,1,2,0,0,2,27,1,3,6,NA +62447,7,2,2,19,NA,1,1,1,19,237,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17490.464019,17826.708822,1,102,6,6,1.43,3,3,0,1,0,2,39,1,4,3,NA +62448,7,2,1,13,NA,1,1,1,13,162,NA,NA,2,2,4,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18583.729819,18727.0393,2,96,6,6,1.11,5,5,0,3,0,2,32,2,3,1,2 +62449,7,2,2,38,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,32097.38481,34606.180038,2,100,14,14,3.36,4,4,1,1,0,1,45,2,5,1,2 +62450,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19282.792088,20545.343351,2,97,7,7,1.92,3,3,0,1,0,1,57,1,4,1,4 +62451,7,2,2,0,4,3,3,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,NA,2,1,2,2,NA,NA,NA,NA,9142.358181,9688.944551,2,98,1,1,0.23,2,2,1,0,0,2,20,1,3,6,NA +62452,7,2,1,39,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,5,NA,2,2,2,2,2,2,2,2,2,2,34564.442715,35621.093093,2,90,4,4,0.81,3,3,0,0,0,1,39,2,3,5,NA +62453,7,2,2,2,NA,4,4,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7329.363701,7518.547014,1,103,6,6,1.57,3,3,1,0,0,2,25,1,4,5,NA +62454,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,7278.790659,7582.574348,2,93,5,5,1.32,2,2,0,0,1,1,49,2,2,1,4 +62455,7,2,1,18,NA,4,4,2,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7946.436474,8100.311671,3,90,15,15,5,5,5,1,0,1,1,38,2,3,1,4 +62456,7,2,1,17,NA,4,4,1,17,214,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13731.625553,14242.275028,1,100,14,14,3.93,3,3,0,1,0,2,47,1,5,4,NA +62457,7,2,1,69,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,7736.56115,7645.782314,1,99,15,15,5,2,2,0,0,2,2,63,2,5,1,5 +62458,7,2,1,13,NA,5,6,2,13,162,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,77,77,NA,3,3,0,1,0,1,54,2,3,1,3 +62459,7,2,1,4,NA,3,3,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,76935.850725,86801.923297,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +62460,7,2,1,41,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,109679.354704,1,98,15,15,4.34,4,4,1,1,0,1,41,1,5,1,5 +62461,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,19362.260448,24981.28051,1,96,6,6,1.98,2,2,0,1,0,2,29,1,3,5,NA +62462,7,2,2,11,NA,3,3,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,79732.314338,79120.693768,1,100,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +62463,7,2,1,7,NA,1,1,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,19774.151841,21259.203461,2,94,5,5,0.65,6,6,0,3,0,1,44,2,1,1,1 +62464,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,22824.336433,1,95,10,7,3.21,5,1,1,2,0,1,32,1,3,6,NA +62465,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20084.755052,20430.629009,1,99,14,14,4.21,4,4,0,2,0,2,44,1,5,1,5 +62466,7,2,1,4,NA,4,4,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7629.74403,8207.121237,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +62467,7,2,1,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,117075.881463,118577.582598,1,94,5,5,2.15,1,1,0,0,1,1,65,1,5,1,NA +62468,7,2,2,0,8,2,2,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6787.112205,6644.319314,2,94,5,5,0.89,4,4,2,0,0,2,35,2,4,1,2 +62469,7,2,1,9,NA,4,4,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,13521.226684,2,101,4,4,0.76,4,4,1,1,0,1,28,1,2,1,4 +62470,7,2,1,4,NA,1,1,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12870.245769,12532.871153,1,102,6,6,0.8,7,7,3,3,0,2,34,2,3,1,1 +62471,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,45482.078305,46877.423634,2,96,99,99,NA,4,4,0,1,1,2,51,1,2,1,4 +62472,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,27988.858556,28110.553782,1,97,6,6,2.69,2,1,0,0,0,1,31,1,5,6,NA +62473,7,2,2,17,NA,4,4,1,17,209,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,6,6,1.9,2,2,0,1,0,2,42,1,5,5,NA +62474,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,31347.021791,31681.790338,1,98,6,3,1.13,2,1,0,0,2,1,69,1,4,6,NA +62475,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,36750.682715,37321.834378,2,97,6,1,0.05,2,1,0,0,0,1,22,1,3,6,NA +62476,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,28680.660607,28606.985896,3,91,6,3,1.29,2,1,0,0,0,1,40,1,3,5,NA +62477,7,2,1,11,NA,3,3,1,11,139,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21839.599095,22875.076583,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +62478,7,2,1,5,NA,4,4,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8275.349856,8376.287205,2,95,1,1,0.03,2,2,1,0,0,1,24,1,3,5,NA +62479,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,11608.998717,11632.703325,3,90,10,10,2.41,5,5,1,2,0,1,44,2,4,1,5 +62480,7,2,1,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,110055.244549,1,98,14,14,4.12,4,4,0,2,0,2,36,1,5,1,3 +62481,7,2,2,39,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,4,2,2,2,2,1,2,2,1,2,2,1,27127.983961,27837.333201,2,90,10,10,3.13,4,4,1,2,0,2,39,1,5,4,NA +62482,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,31552.004994,1,95,10,6,1.34,5,4,1,2,0,1,32,1,3,6,NA +62483,7,2,1,11,NA,3,3,2,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25604.034863,26336.174292,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +62484,7,2,2,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,27585.470618,26830.521849,2,102,6,6,1.22,5,5,0,2,0,2,42,1,4,1,4 +62485,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,99,1,0.28,2,1,0,0,0,1,21,1,4,5,NA +62486,7,1,2,14,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,117872.104347,0,2,101,8,8,1.72,5,5,0,3,0,1,37,1,3,1,3 +62487,7,2,1,65,NA,2,2,2,NA,NA,1,1,2,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,10655.434864,11610.446696,1,90,14,14,5,2,2,0,0,2,1,65,2,2,1,3 +62488,7,1,1,9,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,41165.805324,0,2,100,15,15,5,4,4,1,1,0,1,29,1,4,1,4 +62489,7,2,2,1,22,4,4,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7281.670423,7938.059494,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +62490,7,2,1,0,6,3,3,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15379.505002,15960.887694,1,102,14,14,3,6,6,1,2,0,1,44,1,4,1,5 +62491,7,2,2,61,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,2,1,2,1,3,18695.172864,19350.637044,2,102,15,15,5,5,5,1,0,2,1,30,1,4,1,5 +62492,7,2,1,6,NA,5,7,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8227.856305,8510.505183,3,91,10,10,2.48,5,5,2,1,0,2,27,1,2,1,4 +62493,7,2,2,0,7,5,7,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6570.947402,7236.391986,2,102,7,7,2.65,2,2,1,0,0,2,42,1,4,5,NA +62494,7,2,1,28,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,4,1,NA,1,2,2,1,2,2,2,2,2,2,37970.860743,39407.668593,2,92,15,7,3.67,2,1,0,0,0,1,28,2,4,1,NA +62495,7,2,1,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,86361.036512,88802.863313,2,93,10,10,3.61,3,3,0,0,2,1,75,1,4,1,4 +62496,7,2,1,4,NA,1,1,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,18754.85406,18780.196288,2,102,5,5,0.89,4,4,2,0,0,1,33,2,9,1,2 +62497,7,2,1,12,NA,3,3,2,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61479.689958,61628.148021,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +62498,7,2,2,13,NA,1,1,1,13,159,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20347.899985,21072.708732,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +62499,7,2,2,1,14,5,7,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9679.976914,10817.322533,1,95,4,4,0.97,3,3,2,0,0,2,22,1,4,5,NA +62500,7,2,2,52,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,1,96,12,12,NA,2,2,0,0,0,1,46,1,4,1,5 +62501,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,78018.093799,1,101,14,14,3.15,5,5,2,1,0,1,35,1,4,1,5 +62502,7,2,1,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,14739.896059,14808.93904,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +62503,7,2,1,5,NA,3,3,2,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22669.354731,25576.419472,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +62504,7,2,2,30,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,1,6,2,2,2,2,2,2,2,2,2,1,2,38161.026403,37131.361742,1,100,3,3,0.39,5,5,1,2,0,1,32,2,1,6,NA +62505,7,2,2,3,NA,1,1,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13196.707564,13241.769839,2,96,77,77,NA,7,7,3,2,0,2,33,2,2,6,NA +62506,7,2,2,46,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,29105.053716,30161.539189,2,93,4,4,0.84,3,3,0,1,0,2,46,2,3,1,2 +62507,7,2,2,17,NA,1,1,1,17,207,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18581.167701,19284.858627,2,96,3,3,0.24,7,7,2,3,1,2,40,1,3,3,NA +62508,7,2,1,3,NA,3,3,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58332.578536,68350.303275,1,91,15,15,5,3,3,1,0,0,1,36,1,4,1,5 +62509,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,30131.691064,30623.993423,2,95,6,6,1.36,3,3,0,0,2,2,60,1,5,1,4 +62510,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,62763.524469,78020.806152,1,92,7,7,2.64,2,2,0,0,2,1,80,1,3,1,3 +62511,7,2,1,9,NA,3,3,2,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25019.74954,25881.463934,1,101,3,3,0.44,5,5,0,3,0,1,35,1,3,1,4 +62512,7,2,1,39,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17605.619977,18470.699991,3,91,15,15,5,4,4,1,1,0,1,39,2,5,1,5 +62513,7,2,2,46,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,29470.67209,35523.062266,1,90,5,5,1,4,4,0,2,0,1,40,2,2,1,1 +62514,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19633.637051,20188.770976,2,95,6,6,1.19,4,4,0,1,0,1,44,1,3,1,2 +62515,7,2,2,42,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,5,2,2,2,2,2,2,2,2,2,2,2,31235.666551,33485.036978,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +62516,7,2,1,10,NA,2,2,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18107.947773,18538.358733,1,97,14,14,3.25,4,4,0,2,0,1,45,1,3,6,NA +62517,7,2,1,80,NA,3,3,2,NA,NA,2,NA,2,1,8,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,11483.380372,15883.29652,1,90,77,77,NA,2,2,0,0,2,1,80,2,1,1,1 +62518,7,1,1,47,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16651.742047,0,1,100,15,15,5,3,3,0,0,0,1,47,2,5,1,5 +62519,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,17801.655316,19397.911862,2,95,7,2,0.72,3,1,0,0,0,2,56,1,3,2,NA +62520,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11017.136221,10826.673882,1,91,3,3,0.89,2,2,1,0,0,2,23,1,3,3,NA +62521,7,2,2,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,178239.535384,176744.998212,1,102,14,14,5,2,2,0,0,1,2,59,1,5,3,NA +62522,7,2,1,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,24930.322327,25494.618871,2,94,9,9,5,1,1,0,0,0,1,54,1,4,3,NA +62523,7,2,1,33,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23872.904125,23622.849234,1,91,6,6,0.99,5,5,3,0,0,2,33,2,3,1,4 +62524,7,2,1,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,91704.59836,93129.802737,1,93,15,7,3.67,6,1,0,0,0,1,23,1,5,5,NA +62525,7,2,1,15,NA,5,6,2,15,189,NA,NA,2,2,3,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10725.405063,11099.246363,2,94,3,3,0.68,3,2,0,1,0,2,45,2,4,3,NA +62526,7,2,2,62,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,8811.978874,9348.531299,3,90,12,12,NA,3,3,0,0,1,2,62,2,3,1,5 +62527,7,2,1,79,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,NA,9541.516696,10104.465045,1,100,77,77,NA,1,1,0,0,1,1,79,1,2,5,NA +62528,7,2,1,40,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,6,NA,2,2,2,2,2,2,2,2,1,NA,25035.846455,24668.484001,2,99,99,99,NA,5,3,0,1,0,1,40,2,1,6,NA +62529,7,2,1,59,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15760.921402,16568.510632,3,90,12,12,NA,3,3,0,0,0,1,59,2,4,1,4 +62530,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,141316.739364,156265.607046,2,94,5,5,0.89,4,4,0,2,0,2,51,1,2,3,NA +62531,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,20149.292081,21423.504707,2,99,2,2,0.4,2,2,0,0,0,2,52,1,3,1,3 +62532,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,77,NA,1,2,2,1,2,2,1,2,2,1,11523.037911,11989.050618,2,97,13,13,NA,1,1,0,0,1,2,64,1,3,77,NA +62533,7,2,2,1,17,1,1,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10089.038145,2,94,8,8,2.7,3,3,1,0,0,2,23,2,4,1,3 +62534,7,2,1,13,NA,5,7,1,13,159,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11068.745625,11332.552011,1,103,3,3,0.37,5,5,1,2,0,2,30,1,4,5,NA +62535,7,2,2,5,NA,3,3,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,69665.012606,74034.381659,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +62536,7,2,1,46,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,14238.597316,14347.374047,2,92,15,9,5,2,1,0,0,0,1,40,NA,NA,77,NA +62537,7,2,2,10,NA,3,3,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15442.305642,15459.941839,2,94,7,7,1.62,5,5,0,3,0,1,30,1,2,1,9 +62538,7,2,2,1,16,4,4,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6802.424856,6978.006983,2,99,15,15,5,4,4,2,0,0,1,34,1,5,1,5 +62539,7,2,1,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11218.730451,2,101,2,2,0.92,1,1,0,0,1,1,60,1,2,2,NA +62540,7,2,2,0,3,3,3,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22478.08837,21867.533571,3,91,10,10,3,4,4,2,0,0,1,32,1,4,1,5 +62541,7,2,2,13,NA,3,3,1,13,163,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,68399.970058,69290.143431,1,102,14,14,4.05,3,3,0,2,0,2,34,1,4,3,NA +62542,7,2,2,11,NA,2,2,1,11,137,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14414.529053,14932.182215,2,96,2,2,0.27,6,6,1,3,0,1,34,NA,NA,1,NA +62543,7,2,2,1,12,2,2,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11981.824297,12142.965635,2,91,2,2,0.26,4,4,1,1,0,2,42,2,4,3,NA +62544,7,2,1,42,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19320.837782,1,99,14,14,4.86,3,3,0,1,0,1,42,1,5,1,5 +62545,7,2,1,8,NA,2,2,2,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15673.230419,15680.173615,1,97,15,15,4.52,6,6,0,4,0,2,41,1,5,1,5 +62546,7,2,1,64,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,13473.930124,13736.530204,1,92,6,6,2.69,1,1,0,0,1,1,64,1,4,2,NA +62547,7,2,1,9,NA,1,1,2,9,113,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13484.595524,13562.00827,1,97,3,3,0.5,5,5,0,2,0,1,56,2,2,6,NA +62548,7,2,1,57,NA,2,2,1,NA,NA,1,2,2,1,8,NA,3,5,NA,1,2,2,1,2,2,2,2,2,1,25422.415762,25922.20279,2,100,7,7,2.64,2,2,0,0,1,1,57,2,3,5,NA +62549,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,10579.097347,10866.833801,2,92,8,8,2.01,4,4,0,0,0,1,53,2,3,1,3 +62550,7,2,2,9,NA,5,7,1,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8292.876947,8466.609309,1,102,15,15,5,4,4,0,2,0,2,40,2,5,1,4 +62551,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,86578.861495,89840.962333,2,101,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +62552,7,2,2,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,139800.409559,140918.856987,1,100,15,15,4.07,5,5,0,2,0,2,41,1,5,1,4 +62553,7,2,1,8,NA,5,6,2,8,100,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,4945.578914,5359.127104,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +62554,7,2,2,15,NA,5,6,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12546.119668,12876.82216,2,102,14,14,4.86,3,3,0,1,0,1,55,NA,NA,1,5 +62555,7,2,1,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,23471.353577,23548.945779,1,100,7,7,1.83,3,3,0,1,0,2,40,1,4,6,NA +62556,7,2,2,31,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,17978.142628,18308.053591,1,91,10,10,3.78,3,3,1,0,0,1,35,2,5,1,5 +62557,7,2,1,10,NA,1,1,2,10,122,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,10591.186197,11647.778431,1,90,4,4,0.46,7,7,2,3,0,2,34,2,1,6,NA +62558,7,2,2,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,20084.755052,20500.648257,1,99,14,14,3.67,4,4,1,0,0,2,49,1,3,1,3 +62559,7,2,2,9,NA,1,1,2,9,109,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,2,2,2,1,18668.602894,22428.786321,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +62560,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12435.659176,12095.32474,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +62561,7,2,2,10,NA,3,3,1,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,50248.753555,51858.292831,2,100,8,8,2.91,3,3,0,2,0,2,48,1,5,1,NA +62562,7,2,1,4,NA,1,1,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17865.135763,18076.339981,3,92,1,1,0,5,5,3,0,0,1,26,1,2,1,2 +62563,7,2,2,72,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,7,77,NA,1,2,2,1,2,2,1,2,2,NA,13638.730054,13839.452317,1,99,12,12,NA,1,1,0,0,1,2,72,1,7,77,NA +62564,7,2,2,13,NA,4,4,2,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,11743.959438,2,95,1,1,0.17,2,2,0,1,0,2,49,1,3,99,NA +62565,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15533.829525,2,101,7,5,1.84,2,1,0,0,0,1,27,2,5,5,NA +62566,7,2,2,2,NA,4,4,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7734.994032,8078.467013,2,95,1,1,0.18,4,4,2,1,0,2,38,1,2,5,NA +62567,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,22991.276372,25575.167764,1,99,99,99,NA,1,1,0,0,1,2,80,1,1,3,NA +62568,7,2,2,1,13,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10867.770426,11631.363355,1,100,4,4,0.56,5,5,2,0,0,2,25,2,2,1,2 +62569,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,45973.010529,51521.910389,1,94,8,8,3.47,2,2,0,0,1,2,80,1,1,2,NA +62570,7,2,1,6,NA,4,4,2,6,72,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8655.162127,8675.53524,2,101,2,2,0.22,4,4,1,1,0,2,41,1,2,4,NA +62571,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,85420.170155,86011.35365,1,91,14,14,3.06,5,5,2,0,0,2,30,1,5,1,5 +62572,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,47566.45715,54102.989916,1,90,7,7,3.22,1,1,0,0,1,2,80,1,5,3,NA +62573,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,30442.30641,30472.199404,1,95,6,3,1.1,2,1,0,0,0,2,48,1,4,3,NA +62574,7,2,2,13,NA,3,3,2,13,166,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,132630.209478,136814.3405,1,97,9,9,2.88,3,3,0,1,0,2,33,1,3,5,NA +62575,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,129336.409693,130993.13082,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +62576,7,2,1,66,NA,1,1,1,NA,NA,2,NA,2,1,77,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,14488.953694,14771.336069,3,92,9,9,2.22,5,5,1,0,2,1,66,2,1,1,1 +62577,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,72551.269339,73326.076054,1,92,6,6,2.04,2,2,0,0,2,2,71,1,4,1,1 +62578,7,2,2,6,NA,3,3,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,101,7,7,1.55,5,5,1,2,0,2,31,1,4,1,2 +62579,7,2,1,78,NA,1,1,1,NA,NA,1,2,2,1,9,NA,4,1,NA,2,2,2,1,2,2,1,2,2,NA,12782.642018,13005.47245,2,96,5,5,1.08,3,3,0,0,2,1,53,2,4,3,NA +62580,7,2,2,14,NA,3,3,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38400.791741,38900.548719,1,92,4,4,0.5,6,6,0,3,0,2,41,1,4,1,NA +62581,7,2,2,10,NA,3,3,1,10,128,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,53370.126656,53491.559571,2,98,15,15,5,3,3,0,1,0,1,48,1,4,1,5 +62582,7,1,2,10,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23170.920553,0,1,94,4,4,1.26,2,2,0,1,0,1,40,1,4,3,NA +62583,7,2,2,17,NA,3,3,1,17,212,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,93740.540203,99321.165816,1,100,8,8,1.95,4,4,0,2,1,2,49,1,5,6,NA +62584,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,29738.952706,31253.462984,2,94,8,8,3.4,2,2,0,0,0,1,22,1,3,5,NA +62585,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,14859.685983,15314.825218,1,95,3,3,0.98,1,1,0,0,1,2,80,1,3,2,NA +62586,7,2,1,70,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,68266.732554,71967.824097,1,95,5,5,2.02,1,1,0,0,1,1,70,1,3,5,NA +62587,7,2,1,73,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,NA,15565.766387,16476.020536,1,101,3,3,1.07,2,1,0,0,1,1,73,1,4,6,NA +62588,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,137038.746155,146293.19093,2,101,3,1,0.18,2,1,0,0,0,1,21,1,4,5,NA +62589,7,2,2,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,61388.874846,64435.558603,1,90,7,7,1.89,3,3,0,0,1,2,75,1,4,3,NA +62590,7,2,1,11,NA,4,4,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8483.005475,8584.70346,1,96,7,7,1.69,4,4,0,1,0,2,19,2,4,NA,NA +62591,7,2,1,10,NA,3,3,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,54897.892683,57357.850008,2,98,14,14,3.58,4,4,0,2,0,1,36,1,3,1,4 +62592,7,2,1,0,5,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9665.908305,9498.805759,1,95,5,5,1.08,3,3,1,0,0,2,22,1,3,6,NA +62593,7,2,2,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,64463.340883,65151.773075,1,91,7,7,2.92,2,2,0,0,1,2,47,1,5,5,NA +62594,7,2,1,0,10,4,4,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5707.173345,5961.496632,1,90,4,4,0.67,5,5,3,0,0,2,32,2,3,3,NA +62595,7,2,2,28,NA,5,7,1,NA,NA,2,NA,2,1,5,NA,4,1,3,1,2,2,1,2,2,1,2,2,1,13851.686232,14954.517784,3,91,14,14,4.32,3,3,1,0,0,1,31,2,3,1,4 +62596,7,2,2,52,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11428.6913,11489.125563,1,103,5,5,0.65,6,6,0,0,1,2,26,2,4,5,NA +62597,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,12170.020379,2,97,6,6,1,6,6,1,2,2,2,60,1,2,2,NA +62598,7,2,1,18,NA,4,4,1,18,223,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11666.009872,12200.765691,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +62599,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17521.481386,17644.217766,2,97,5,5,0.76,5,5,0,0,0,2,50,1,4,5,NA +62600,7,2,1,10,NA,2,2,1,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10738.959181,10632.988891,2,93,14,14,3.25,4,4,0,2,0,2,46,2,5,1,4 +62601,7,2,1,65,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,9636.209947,9711.587411,2,97,14,14,5,2,2,0,0,1,2,52,1,5,1,3 +62602,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,60071.993203,65791.533402,1,95,8,8,4.59,1,1,0,0,1,2,80,1,4,2,NA +62603,7,2,2,38,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,39561.667842,42653.886229,2,98,6,6,1.25,4,4,1,0,1,1,46,1,2,6,NA +62604,7,2,2,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,69886.968852,80170.534309,1,102,4,4,1.42,1,1,0,0,1,2,73,1,3,5,NA +62605,7,1,1,1,22,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7025.964374,0,2,91,4,4,0.65,5,5,1,3,0,1,43,2,3,5,NA +62606,7,2,1,2,NA,4,4,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5930.749873,6003.089312,2,93,6,6,1.98,2,2,1,0,0,2,51,1,2,3,NA +62607,7,2,1,4,NA,4,4,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,11070.778245,1,100,1,1,0.04,4,4,1,1,0,2,51,1,3,3,NA +62608,7,1,2,67,NA,2,2,NA,NA,NA,2,NA,2,1,NA,NA,2,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,7278.790659,0,2,93,NA,NA,NA,2,2,0,0,2,1,68,NA,NA,1,2 +62609,7,2,1,9,NA,3,3,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,NA,2,1,2,2,1,2,2,1,25604.034863,26336.174292,1,95,5,5,0.92,5,5,1,2,0,2,30,1,4,1,4 +62610,7,2,2,12,NA,2,2,1,12,146,NA,NA,2,2,1,4,NA,NA,NA,2,1,2,2,2,2,2,2,1,2,18006.855255,21837.57166,1,100,3,3,0.39,5,5,1,2,0,1,32,2,1,6,NA +62611,7,2,1,45,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,11725.7448,11815.324423,2,95,3,3,1.16,1,1,0,0,0,1,45,2,2,4,NA +62612,7,2,2,38,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21619.283038,22049.338941,2,102,9,9,2.68,4,4,1,1,0,2,38,2,5,1,2 +62613,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,28394.357741,26997.683446,1,100,3,3,0.66,2,2,0,1,0,2,29,1,4,1,NA +62614,7,2,1,12,NA,3,3,2,12,154,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58479.782556,60361.370686,1,99,15,15,4.47,4,4,0,2,0,2,43,1,5,1,5 +62615,7,2,2,0,11,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3774.069255,3925.050204,2,99,5,5,0.78,5,5,2,2,0,2,30,1,3,5,NA +62616,7,2,2,37,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,1,1,2,1,2,1,1,2,2,1,2,1,NA,15542.93857,16609.63545,3,91,4,4,0.69,5,5,0,2,0,1,45,2,4,1,1 +62617,7,2,1,8,NA,5,7,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8439.403196,8726.876152,2,103,6,6,1.11,5,5,1,2,0,2,36,1,4,5,NA +62618,7,2,1,10,NA,5,7,2,10,129,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7923.925927,8546.646915,1,91,15,15,5,5,5,0,3,0,1,40,1,5,1,5 +62619,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,24023.719783,25884.561742,2,96,7,7,3.21,2,1,0,0,1,1,80,1,5,5,NA +62620,7,2,2,7,NA,2,2,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18660.103977,19985.967776,2,91,6,6,0.93,5,5,1,2,0,1,34,1,2,1,3 +62621,7,2,1,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,23242.990557,23753.836506,1,100,8,8,1.95,4,4,0,2,0,2,42,1,4,1,4 +62622,7,2,2,15,NA,5,6,2,16,192,NA,NA,2,1,4,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10963.340882,11440.408955,2,91,15,15,5,4,4,0,2,1,2,56,1,5,1,5 +62623,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,39653.38014,40869.906755,2,95,6,6,1.57,3,3,0,0,2,1,80,1,2,1,4 +62624,7,2,2,40,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,18255.735511,19354.37213,2,91,14,14,3.47,4,4,1,1,0,2,40,2,5,1,NA +62625,7,2,2,60,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15207.312407,15896.113669,1,92,15,15,5,3,3,0,0,1,1,57,1,3,1,4 +62626,7,2,1,13,NA,1,1,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,17314.330266,19031.527568,1,90,4,4,0.46,7,7,2,3,0,2,34,2,1,6,NA +62627,7,2,2,2,NA,1,1,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10379.318342,2,94,9,9,2.29,5,5,2,1,0,2,33,2,3,1,1 +62628,7,2,2,1,19,3,3,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16717.071084,17765.560854,2,94,8,8,1.6,6,6,3,1,0,2,32,1,4,1,4 +62629,7,2,1,11,NA,5,6,2,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6262.834446,6755.01452,3,90,12,12,NA,5,5,1,2,0,1,37,2,5,1,5 +62630,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,149153.684635,157450.342804,1,101,3,3,1.25,1,1,0,0,1,2,68,1,2,2,NA +62631,7,2,2,37,NA,3,3,2,NA,NA,2,NA,2,1,4,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,79987.938327,1,101,6,6,1.28,4,4,2,0,0,1,44,1,4,1,4 +62632,7,2,1,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,14424.961621,14817.68753,2,102,5,5,1.08,3,3,0,1,0,2,46,2,1,5,NA +62633,7,2,2,61,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12176.672371,12646.648452,2,92,15,15,5,2,2,0,0,2,1,61,1,5,1,5 +62634,7,2,1,68,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,114174.703171,113009.251918,2,97,8,8,3.06,2,2,0,0,2,1,68,1,2,1,4 +62635,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,1,2,1,2,1,1,2,2,NA,NA,NA,NA,13851.686232,14678.247845,3,91,5,5,1.08,3,3,1,0,0,1,29,2,5,1,5 +62636,7,2,1,17,NA,4,4,1,17,215,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12147.046136,12703.852077,2,100,4,4,0.86,3,3,0,2,0,2,36,1,3,5,NA +62637,7,2,2,3,NA,4,4,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13130.790087,13857.266639,2,102,15,15,4.2,5,5,1,2,0,2,29,NA,NA,1,NA +62638,7,2,2,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,13050.526646,2,101,13,3,0.64,5,4,0,3,1,2,62,1,1,2,NA +62639,7,2,2,26,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,6,2,2,2,2,1,2,2,2,2,2,2,43708.837271,43518.466069,1,96,9,9,3.97,2,2,0,0,0,1,28,2,2,6,NA +62640,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,26546.087356,29693.438127,1,102,6,6,1.12,4,4,2,0,0,2,31,1,3,6,NA +62641,7,2,1,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10276.786905,10602.092524,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +62642,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23607.684366,1,95,1,1,0.11,1,1,0,0,0,1,30,1,3,5,NA +62643,7,2,2,2,24,4,4,2,2,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5687.793894,6161.690011,2,90,99,99,NA,5,5,1,0,0,1,20,1,3,5,NA +62644,7,2,1,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,11761.359913,11893.852645,1,95,5,5,1.79,1,1,0,0,1,1,61,1,4,2,NA +62645,7,2,2,12,NA,5,6,1,12,153,NA,NA,2,2,2,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6391.016092,6494.382638,1,100,99,99,NA,6,6,0,1,0,1,53,2,2,1,3 +62646,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,17164.211773,16694.46809,2,99,8,8,3.57,2,2,0,0,1,1,67,1,2,1,2 +62647,7,2,1,0,0,2,2,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8143.831412,8143.981517,2,102,5,5,0.89,4,4,2,0,0,1,45,1,3,1,4 +62648,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,2,NA,1,2,1,1,2,2,1,2,1,NA,19516.411172,20124.53654,2,102,10,10,4.76,2,2,0,0,1,2,49,2,5,5,NA +62649,7,2,1,76,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,9334.084938,9516.918553,2,96,8,8,2.59,3,3,0,0,2,1,76,1,3,1,4 +62650,7,2,1,71,NA,4,4,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,7110.382011,7529.893703,2,93,6,6,1.85,2,2,0,0,2,1,71,2,1,1,2 +62651,7,2,1,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,152467.08796,155918.172532,1,94,6,6,2.69,1,1,0,0,0,1,55,1,3,3,NA +62652,7,2,1,46,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,34205.013302,40575.476948,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +62653,7,1,1,49,NA,5,6,NA,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,13323.689579,0,2,92,6,6,1.3,4,4,0,1,0,2,48,2,3,1,3 +62654,7,1,1,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30553.632981,0,1,98,5,2,0.42,4,3,2,0,0,1,24,1,3,6,NA +62655,7,2,1,1,23,4,4,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5930.749873,6003.089312,2,93,9,9,2.6,4,4,1,1,0,1,37,1,4,1,4 +62656,7,2,2,0,9,1,1,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6787.112205,6969.467907,2,94,4,4,0.73,5,5,2,1,0,1,35,2,1,6,NA +62657,7,2,2,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11401.934012,11887.743086,1,95,13,13,NA,5,5,1,2,0,2,34,2,1,1,1 +62658,7,2,1,68,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,28559.076421,28710.827523,1,92,6,6,2.3,1,1,0,0,1,1,68,1,3,3,NA +62659,7,2,1,18,NA,5,6,1,18,219,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,5526.901806,5811.556543,2,103,7,7,1.65,4,4,0,1,1,2,55,2,3,1,NA +62660,7,2,2,7,NA,5,6,1,7,88,NA,NA,2,1,2,1,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,7932.110938,8947.143287,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +62661,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,84910.063417,90031.493834,2,96,14,7,3.67,3,1,0,0,0,1,30,2,5,5,NA +62662,7,2,2,11,NA,1,1,1,11,138,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16664.698857,2,98,7,7,1.97,4,4,0,1,0,1,40,1,3,1,3 +62663,7,1,2,3,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12984.581505,0,2,93,15,15,5,4,4,2,0,0,1,34,1,5,1,5 +62664,7,2,1,64,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,25436.904729,25763.177128,1,94,8,8,3.3,2,2,0,0,2,1,64,1,5,1,3 +62665,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,13504.560081,14155.716256,1,102,7,7,1.8,5,4,1,0,2,1,47,1,3,5,NA +62666,7,2,1,3,NA,5,6,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8838.066777,9670.229845,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +62667,7,2,1,6,NA,3,3,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53915.042746,57006.573447,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +62668,7,2,1,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,25120.174741,24762.106831,2,102,6,6,1.22,5,5,0,2,0,2,42,1,4,1,4 +62669,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,22249.799905,2,97,6,6,1.35,3,3,0,0,0,2,54,1,3,6,NA +62670,7,2,1,13,NA,3,3,2,14,169,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,107087.58296,107224.801212,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +62671,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,7973.883342,8036.257566,1,100,77,77,NA,1,1,0,0,1,1,69,1,4,3,NA +62672,7,2,2,13,NA,4,4,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11078.202838,10933.134393,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +62673,7,2,1,34,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,34959.343013,34695.493801,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +62674,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,NA,28989.076324,29596.20575,1,93,6,6,1.16,4,4,2,0,0,2,33,1,5,1,4 +62675,7,2,1,0,9,3,3,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16921.794985,16629.253929,1,99,15,15,5,4,4,1,1,0,2,27,1,5,1,5 +62676,7,2,2,17,NA,3,3,2,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,111142.989658,114235.009147,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +62677,7,2,2,30,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,56677.205755,57971.218225,2,102,10,10,4.76,2,2,0,0,0,1,27,1,4,1,4 +62678,7,2,1,68,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,1,2,2,2,2,9235.951997,9462.879133,2,103,5,5,1.79,2,1,0,0,2,1,68,2,1,1,NA +62679,7,2,2,7,NA,1,1,1,7,90,NA,NA,2,2,2,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15897.166957,16345.216522,2,102,6,3,0.54,6,4,0,4,0,2,43,2,1,5,NA +62680,7,2,1,68,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7581.139559,8116.967146,3,90,14,14,4.96,2,2,0,0,2,1,68,1,3,1,5 +62681,7,2,2,5,NA,1,1,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15457.736897,15510.51982,2,98,3,3,0.33,7,7,2,3,0,1,40,2,1,1,1 +62682,7,2,2,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,44636.780791,48652.73082,2,91,3,3,0.86,2,2,0,0,1,2,62,1,3,2,NA +62683,7,2,2,55,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16829.599526,17568.396647,1,90,99,99,NA,3,3,0,1,1,1,60,1,5,1,5 +62684,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,82612.6713,83351.284903,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +62685,7,2,1,36,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,5,NA,1,2,1,1,2,1,1,2,1,1,12869.386353,13443.315161,2,92,7,7,1.89,3,3,0,0,1,1,36,2,3,5,NA +62686,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,38007.846215,47247.232001,1,94,7,7,2.31,2,2,0,0,1,2,80,1,3,2,NA +62687,7,2,1,10,NA,4,4,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8483.005475,8584.70346,1,96,8,8,2,4,4,1,2,0,2,40,1,4,5,NA +62688,7,2,1,24,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,10141.381563,13212.383706,3,90,6,6,1.98,2,2,0,0,0,2,47,2,5,2,NA +62689,7,2,1,44,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,116464.874823,116611.129855,2,94,15,15,5,5,5,0,3,0,1,44,1,5,1,4 +62690,7,2,2,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,17568.277926,19062.73336,1,90,99,99,NA,2,2,0,1,0,2,26,1,4,5,NA +62691,7,2,1,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,19387.603198,2,100,7,7,1.79,4,4,0,1,0,2,51,1,3,3,NA +62692,7,1,2,50,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17521.481386,0,2,97,7,7,3.49,1,1,0,0,0,2,50,1,4,5,NA +62693,7,2,2,69,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,9570.416297,10279.373686,2,98,5,5,2.2,1,1,0,0,1,2,69,1,2,2,NA +62694,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,21219.562726,22239.20882,2,91,3,3,0.86,2,2,0,0,1,2,62,1,3,2,NA +62695,7,2,2,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,2,1,2,2,1,2,2,1,2,2,1,19130.246369,19734.446951,2,101,2,2,0.22,4,4,1,1,0,2,41,1,2,4,NA +62696,7,2,1,13,NA,4,4,2,13,159,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,12116.15399,2,95,6,6,1.3,4,4,1,1,0,1,38,1,4,1,4 +62697,7,2,1,9,NA,2,2,2,9,119,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12477.812875,12553.43469,2,94,6,6,1.43,5,4,2,1,0,2,23,2,3,6,NA +62698,7,1,1,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,38666.703155,0,2,94,77,77,NA,2,2,0,0,2,2,80,1,5,1,5 +62699,7,2,1,1,23,4,4,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4912.962876,5115.96715,2,90,8,8,1.67,6,6,2,2,0,2,35,2,5,3,NA +62700,7,2,1,9,NA,4,4,1,9,119,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9022.8939,9530.778148,2,100,3,3,0.31,7,7,3,2,0,2,28,1,3,1,3 +62701,7,2,2,29,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,30253.427014,31766.413225,2,90,8,8,2.24,4,4,1,1,0,2,29,1,4,6,NA +62702,7,1,2,12,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,55,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,20322.312754,0,2,91,6,6,1.3,4,4,1,1,0,2,27,1,4,6,NA +62703,7,2,2,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7785.57328,8700.336584,1,96,8,8,2.17,4,4,1,1,0,2,41,1,3,1,3 +62704,7,2,1,80,NA,5,7,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,9071.406562,10878.533019,1,94,5,5,1.59,2,2,0,0,2,2,73,1,3,1,3 +62705,7,2,2,30,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,35353.005268,34399.106917,2,91,15,15,5,2,2,0,0,0,2,30,1,4,1,4 +62706,7,2,2,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,42150.923371,53077.558906,1,97,9,9,3.7,2,2,0,0,0,1,25,NA,NA,5,NA +62707,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,25511.973394,26011.568993,1,98,6,6,0.97,7,7,1,2,0,1,49,1,2,1,2 +62708,7,2,1,52,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,13567.923118,14187.110343,3,91,6,6,1.34,4,4,0,2,0,1,52,2,3,1,1 +62709,7,2,2,10,NA,3,3,2,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,25563.654853,1,95,6,6,1.09,5,5,0,3,0,1,31,1,4,1,4 +62710,7,2,1,41,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,36225.654087,36329.951191,2,93,5,5,0.87,4,4,1,1,0,1,41,2,5,1,3 +62711,7,2,1,1,21,3,3,2,NA,23,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18848.609643,22085.568952,1,91,6,6,2.04,2,2,1,0,0,2,31,1,5,4,NA +62712,7,2,2,4,NA,2,2,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16087.525226,17761.059567,2,91,4,4,0.69,4,4,2,0,0,2,21,1,3,6,NA +62713,7,2,1,15,NA,3,3,2,15,183,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17395.533107,17264.495057,1,99,13,13,NA,4,4,0,2,0,1,55,NA,NA,1,4 +62714,7,2,1,75,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,1,1,NA,2,2,2,2,2,2,1,2,2,NA,14200.083364,15006.095575,3,92,3,3,0.68,2,2,0,0,2,1,75,1,1,1,1 +62715,7,2,1,10,NA,3,3,2,11,132,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,47596.305609,49235.587472,1,99,15,15,3.82,5,5,0,3,0,1,57,1,5,1,5 +62716,7,2,2,42,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,11762.034222,12708.069605,3,90,12,12,NA,5,5,1,2,0,1,37,2,5,1,5 +62717,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,32252.129527,31981.695662,1,99,6,4,1.38,2,1,0,0,0,2,50,1,3,6,NA +62718,7,2,1,63,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,6038.685119,6085.921613,1,96,6,6,2.51,1,1,0,0,1,1,63,1,4,5,NA +62719,7,2,1,74,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,4,NA,2,2,2,1,2,2,2,2,2,NA,14646.929358,15478.305035,1,96,15,8,4.66,2,1,0,0,2,2,68,2,1,3,NA +62720,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,151766.599459,151581.541662,3,91,15,15,5,2,2,0,0,0,2,57,1,5,1,5 +62721,7,2,2,2,NA,3,3,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,33127.913744,33563.225688,1,99,15,15,5,4,4,2,0,0,1,33,1,5,1,5 +62722,7,2,1,1,20,1,1,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,6,6,1.21,4,4,1,0,0,2,49,2,2,6,NA +62723,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,95214.22557,102645.939709,1,97,15,15,5,3,3,1,0,0,2,31,1,5,1,5 +62724,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,187291.098551,189225.431861,2,91,15,15,5,2,2,0,0,1,2,57,1,5,1,5 +62725,7,2,2,3,NA,5,6,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,2,NA,NA,NA,NA,5060.292252,5371.954509,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +62726,7,1,2,1,18,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39493.444219,0,2,103,15,15,5,4,4,2,0,0,1,36,2,4,1,5 +62727,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,43807.995099,48928.4376,1,95,6,6,1.65,2,2,0,0,2,2,80,1,4,1,4 +62728,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,32569.109434,37398.26507,1,96,77,77,NA,1,1,0,0,0,2,32,1,5,5,NA +62729,7,2,2,1,14,2,2,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6962.449638,7451.646327,3,90,12,12,NA,5,5,1,1,0,1,35,2,5,3,NA +62730,7,2,1,0,3,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7493.544598,7825.810309,1,98,6,6,0.97,7,7,1,2,0,1,49,1,2,1,2 +62731,7,2,1,19,NA,1,1,2,19,238,2,NA,2,2,2,12,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,21718.29328,21806.698186,2,94,NA,13,NA,3,2,0,0,0,1,44,2,2,6,NA +62732,7,2,2,71,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,2,2,2,2,2,2,NA,18067.031882,19590.328656,2,94,2,2,0.56,2,2,0,0,2,2,71,2,2,1,1 +62733,7,1,1,5,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8253.750998,0,1,90,15,15,5,4,4,2,0,0,1,36,1,5,1,5 +62734,7,2,1,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18783.626894,19376.125899,2,99,2,2,0.53,2,2,0,0,1,2,69,1,4,2,NA +62735,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,105261.096488,129835.348564,1,97,15,15,5,4,4,1,1,0,2,33,1,5,1,3 +62736,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,17036.134307,17206.306314,2,90,6,6,1.4,3,3,0,1,0,2,40,1,4,5,NA +62737,7,2,1,58,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,10579.097347,10676.360686,2,92,3,3,0.7,3,3,0,0,0,1,58,2,1,1,1 +62738,7,2,1,6,NA,3,3,1,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20333.209695,22709.426802,1,103,6,6,1.11,5,5,1,1,1,1,29,1,3,1,3 +62739,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,60135.660369,64822.591837,1,90,8,8,2.49,3,3,0,0,2,1,74,1,5,1,2 +62740,7,2,2,19,NA,4,4,2,19,232,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,8,8,2.7,3,3,0,0,1,2,72,1,2,3,NA +62741,7,2,2,0,3,4,4,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3861.876549,4122.902052,1,96,14,14,2.91,6,6,1,2,1,2,32,1,5,1,4 +62742,7,2,1,70,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,1,2,2,NA,12962.876803,13431.341497,2,90,6,6,1.7,2,2,0,0,2,1,70,2,1,1,4 +62743,7,2,1,0,5,3,3,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7467.727239,7549.772257,3,91,4,4,0.65,5,5,2,2,0,2,27,2,2,3,NA +62744,7,2,1,37,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,43108.74283,45119.517495,2,91,9,9,2.6,4,4,1,1,0,2,31,2,4,1,5 +62745,7,2,2,71,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,12183.823561,13095.132048,2,100,5,5,1.63,2,2,0,0,2,1,71,NA,NA,1,2 +62746,7,2,2,38,NA,2,2,2,NA,NA,2,NA,2,1,4,NA,4,1,2,2,2,2,2,2,2,NA,NA,NA,NA,26897.674477,26781.441446,2,99,77,77,NA,4,4,1,1,1,2,38,2,4,1,4 +62747,7,2,1,52,NA,4,4,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19064.767778,19872.734197,2,93,14,14,2.78,5,5,0,0,0,1,52,2,4,1,2 +62748,7,2,1,13,NA,2,2,1,13,164,NA,NA,2,2,1,7,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,15674.964193,15512.049412,2,93,9,9,1.49,7,7,0,3,0,2,41,2,5,1,5 +62749,7,2,1,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,22039.963414,22735.178265,1,96,15,15,5,2,2,0,0,0,1,48,1,2,1,3 +62750,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,15890.289377,17041.022437,2,94,3,3,0.68,3,2,0,1,0,2,45,2,4,3,NA +62751,7,2,1,8,NA,3,3,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21839.599095,22875.076583,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +62752,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,59510.728426,61449.871516,1,99,15,15,5,5,5,3,0,0,2,34,1,5,1,5 +62753,7,2,2,16,NA,4,4,1,16,203,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18421.460617,19740.37466,1,92,6,6,1.3,4,4,0,1,1,1,25,1,1,1,3 +62754,7,2,2,0,7,3,3,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25216.508684,24531.572308,1,101,14,14,3.38,4,4,2,0,0,1,32,1,4,1,5 +62755,7,2,2,19,NA,4,4,2,19,235,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,3,3,0.66,3,3,2,0,0,2,19,1,3,NA,NA +62756,7,2,1,7,NA,3,3,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25604.034863,28346.339599,1,95,7,7,1.66,5,5,0,3,0,1,34,1,2,1,4 +62757,7,2,1,54,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,105571.343095,105442.613847,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +62758,7,1,2,9,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7722.982971,0,1,93,15,15,5,3,3,0,2,0,2,40,2,5,4,NA +62759,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,18395.989535,18290.733411,2,93,9,9,2.07,5,5,0,1,0,1,55,NA,NA,5,NA +62760,7,2,2,10,NA,2,2,2,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9872.244853,10573.701398,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +62761,7,2,1,68,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11992.012141,12562.386395,2,102,6,6,1.97,2,2,0,0,2,2,67,1,3,1,3 +62762,7,2,2,1,13,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12260.86913,13122.344171,3,92,10,10,2.26,6,6,1,3,0,1,34,1,4,1,1 +62763,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,110931.964733,116248.869259,1,94,15,15,5,2,2,0,0,0,1,29,1,4,1,5 +62764,7,2,2,51,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,22969.116046,23881.325913,2,93,1,1,0.36,1,1,0,0,0,2,51,1,3,5,NA +62765,7,2,2,29,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16844.740449,17564.040518,3,91,7,7,2.45,2,2,0,0,0,2,29,2,5,1,5 +62766,7,2,1,1,22,5,6,2,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5891.941477,6363.138629,1,90,6,6,0.92,6,6,2,0,2,2,30,2,5,1,5 +62767,7,1,2,40,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,NA,NA,NA,NA,NA,NA,NA,29650.79971,0,2,90,NA,NA,NA,1,1,0,0,0,2,40,1,4,5,NA +62768,7,2,2,38,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,3,4,2,2,2,2,1,2,2,2,2,2,2,42456.72357,41311.151976,1,95,4,4,0.68,5,5,0,1,0,2,38,2,3,4,NA +62769,7,2,2,13,NA,3,3,2,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74165.041171,76338.869017,2,94,5,5,0.89,4,4,0,2,0,2,51,1,2,3,NA +62770,7,2,1,1,15,3,3,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51373.484735,55257.405076,3,91,14,14,4.32,3,3,1,0,0,1,28,1,5,1,5 +62771,7,2,1,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,21863.450986,22291.478781,2,99,2,2,0.75,1,1,0,0,0,1,30,1,2,5,NA +62772,7,2,2,46,NA,1,1,2,NA,NA,2,NA,2,2,1,NA,5,5,NA,2,2,2,1,2,2,2,2,2,2,29995.384937,31080.287607,1,93,15,15,5,3,2,0,1,0,2,46,2,5,5,NA +62773,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,27693.650341,27908.388498,3,91,1,1,0.19,3,3,0,2,0,2,50,1,4,3,NA +62774,7,1,1,80,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11524.806252,0,1,94,3,3,0.39,6,6,1,0,2,1,80,1,4,1,3 +62775,7,1,2,69,NA,2,2,NA,NA,NA,2,NA,2,1,6,NA,1,3,NA,2,2,2,2,2,2,NA,NA,NA,NA,13676.984152,0,2,91,6,6,1.36,3,3,0,0,1,2,48,2,1,5,NA +62776,7,2,1,9,NA,4,4,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10410.106675,10617.081899,2,96,6,6,1.62,3,3,0,2,0,2,31,1,3,5,NA +62777,7,2,1,28,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18927.052732,18722.519921,2,92,15,5,1.93,4,1,0,0,0,1,28,1,5,5,NA +62778,7,2,2,4,NA,3,3,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78365.406271,80834.23308,2,91,14,14,4.12,4,4,2,0,0,1,35,1,5,1,5 +62779,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,81291.35274,86533.223356,2,95,12,99,NA,2,1,0,0,0,2,40,1,4,6,NA +62780,7,2,2,5,NA,3,3,1,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,83950.915901,92655.852423,1,100,15,15,5,4,4,1,1,0,1,40,1,5,1,5 +62781,7,2,2,3,NA,1,1,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10493.785765,10940.90082,1,103,5,5,0.71,6,6,2,2,0,2,31,2,2,1,2 +62782,7,2,2,0,3,5,6,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7997.590655,8653.844084,3,91,15,15,5,4,4,2,0,0,1,36,2,5,1,5 +62783,7,2,2,6,NA,2,2,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,15897.166957,16345.216522,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +62784,7,2,1,31,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,46646.692487,3,92,7,7,1.49,5,5,0,2,1,2,62,1,4,2,NA +62785,7,2,1,4,NA,4,4,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8005.528865,8827.404644,1,99,14,14,3.8,4,4,1,1,0,1,48,2,5,1,5 +62786,7,2,1,7,NA,1,1,1,8,96,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,16605.106492,16594.063114,1,92,4,4,0.74,4,4,1,1,0,1,42,2,3,1,4 +62787,7,2,2,21,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,11739.283384,12800.154398,1,96,15,15,5,5,5,0,0,0,1,58,2,5,1,5 +62788,7,2,1,35,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,6,NA,2,2,2,1,2,2,2,2,2,2,34887.439952,36924.956604,2,94,4,4,0.73,5,5,2,1,0,1,35,2,1,6,NA +62789,7,2,2,26,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,16929.836231,18556.498474,2,101,6,5,2.2,2,1,0,0,0,2,26,2,4,6,NA +62790,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7631.175557,7797.231767,1,93,1,1,0.02,5,5,0,4,0,2,36,NA,NA,5,NA +62791,7,2,1,14,NA,3,3,1,14,173,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24231.355333,25219.610889,2,100,5,5,1.3,3,3,0,1,0,2,46,1,3,2,NA +62792,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,23128.736624,26524.976891,1,98,3,3,1.09,1,1,0,0,0,2,52,1,4,3,NA +62793,7,2,1,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,87347.444626,90661.31559,1,95,15,15,5,2,2,0,0,2,1,72,1,3,1,4 +62794,7,2,2,45,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,19757.142379,19558.756904,1,96,8,8,2.17,4,4,0,2,0,2,45,2,5,4,NA +62795,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,35522.958395,36075.029683,1,102,13,13,NA,2,1,0,0,0,1,22,1,4,5,NA +62796,7,2,2,17,NA,5,6,2,17,211,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,6937.463063,7785.963668,3,90,NA,NA,NA,4,4,0,1,0,1,56,NA,NA,1,NA +62797,7,2,2,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16929.836231,20416.10433,2,101,7,5,1.84,2,1,0,0,0,2,21,NA,NA,5,NA +62798,7,2,1,50,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,2,2,2,2,27240.276328,27670.554468,1,90,6,6,1.57,3,3,0,0,0,1,50,2,2,1,2 +62799,7,2,2,0,2,4,4,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3800.155777,4057.009552,2,93,3,3,0.36,6,6,1,1,2,2,69,2,3,1,3 +62800,7,2,2,15,NA,3,3,2,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,103298.858809,106172.653059,1,95,9,9,2.66,4,4,0,2,0,1,45,1,3,1,3 +62801,7,2,2,19,NA,3,3,2,19,229,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,23572.289725,23898.02545,2,95,3,3,0.63,3,3,0,0,0,2,44,1,2,4,NA +62802,7,2,1,6,NA,3,3,1,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64054.596883,66498.597232,1,92,6,6,1.57,3,3,0,1,0,1,29,1,4,6,NA +62803,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,71525.773464,1,98,14,14,3.15,5,5,0,3,0,1,34,1,4,1,4 +62804,7,2,1,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,97936.972803,98855.488943,2,95,14,14,5,2,2,0,0,2,2,66,1,5,1,5 +62805,7,2,2,41,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,17059.906216,21044.744151,3,90,9,9,4.1,2,2,0,1,0,2,41,2,5,5,NA +62806,7,2,1,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,23775.734331,24513.29876,2,96,4,2,0.76,2,1,0,0,0,1,53,1,2,6,NA +62807,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,9,9,4.15,2,2,0,0,2,2,64,1,4,1,5 +62808,7,2,2,44,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,2,2,2,2,1,2,2,1,2,2,2,31334.47528,32083.194015,2,96,5,5,0.78,5,5,0,2,0,1,37,2,1,5,NA +62809,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,27004.065356,27080.034561,1,96,1,1,0.23,1,1,0,0,0,2,51,1,3,2,NA +62810,7,2,2,15,NA,3,3,1,15,190,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,105891.533689,107879.366927,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +62811,7,2,2,40,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,19258.69251,18731.627868,2,99,12,6,2.69,6,1,0,0,0,2,57,1,5,2,NA +62812,7,2,1,50,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,37557.946192,37006.841228,2,102,NA,2,0.46,2,1,0,0,1,1,50,2,1,6,NA +62813,7,2,1,71,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,NA,13555.672819,14397.395601,1,94,3,3,1.16,1,1,0,0,1,1,71,1,4,5,NA +62814,7,2,1,72,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,8601.453077,8734.617022,2,101,5,5,1.7,2,2,0,0,1,1,72,1,2,2,NA +62815,7,2,1,4,NA,2,2,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13504.027725,13522.274849,2,93,8,8,2.17,4,4,2,0,0,2,30,1,4,1,4 +62816,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,1,1,2,1,1,2,1,3,14385.653726,15564.966804,2,101,7,4,1.38,2,1,0,0,0,1,23,2,4,5,NA +62817,7,2,1,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,19692.655418,21458.476044,2,99,6,3,0.94,3,2,0,0,0,1,41,1,3,6,NA +62818,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15096.339697,2,100,7,7,1.34,5,5,0,2,0,2,53,1,4,4,NA +62819,7,2,2,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140431.173819,141856.211353,1,91,8,8,2.17,4,4,0,0,0,1,59,1,4,1,5 +62820,7,2,2,53,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,1,2,1,1,2,2,1,2,1,NA,21760.356138,22156.586691,1,92,4,4,0.76,4,4,0,0,0,2,53,2,1,1,1 +62821,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,16058.142925,17073.637087,2,95,7,6,1.88,3,2,0,0,0,2,56,1,3,2,NA +62822,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,114838.671743,118127.710351,1,91,8,4,1.38,2,1,0,0,0,1,33,1,5,6,NA +62823,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,20393.886544,21026.540202,2,97,1,1,0.18,1,1,0,0,0,1,46,1,2,4,NA +62824,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,29670.405171,29084.152013,2,101,14,14,4.03,4,4,0,1,0,2,40,1,5,1,5 +62825,7,2,2,3,NA,1,1,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9468.006743,10197.085534,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +62826,7,1,2,80,NA,5,7,NA,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,36240.721121,0,1,101,3,3,1.12,1,1,0,0,1,2,80,1,1,2,NA +62827,7,2,2,0,6,5,7,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25216.508684,26724.106581,1,101,6,6,1.28,4,4,2,0,0,1,44,1,4,1,4 +62828,7,2,2,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,3,1,2,2,1,2,2,NA,NA,NA,NA,60324.348827,61156.73477,1,95,7,2,0.78,2,1,0,0,0,1,26,1,3,6,NA +62829,7,2,1,0,3,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8429.177912,8429.333277,1,95,15,15,5,3,3,1,0,0,1,41,1,5,1,5 +62830,7,2,1,14,NA,3,3,2,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,88448.252445,87285.839384,1,101,14,14,5,3,3,0,1,0,2,36,1,5,1,5 +62831,7,2,2,4,NA,1,1,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10024.946819,10059.178608,2,93,77,77,NA,7,7,3,1,0,2,43,2,1,1,9 +62832,7,2,2,15,NA,1,1,1,15,189,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,16427.640886,17012.806816,1,102,3,3,0.54,3,3,0,2,0,2,42,2,2,3,NA +62833,7,2,2,18,NA,3,3,2,18,219,2,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,31627.471241,33789.841724,1,95,1,1,0.21,4,4,1,0,1,2,75,1,1,2,NA +62834,7,2,1,6,NA,1,1,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11159.151566,11226.781631,1,102,6,6,0.8,7,7,3,3,0,2,34,2,3,1,1 +62835,7,2,2,66,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,12139.361543,12607.897559,2,103,14,14,3.48,5,5,0,2,1,1,43,1,4,1,5 +62836,7,2,1,25,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,5,NA,2,2,2,2,2,2,NA,NA,NA,NA,39899.764102,44211.181291,2,93,4,4,0.82,4,4,0,0,0,1,51,2,3,1,3 +62837,7,2,2,18,NA,3,3,2,18,221,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,31716.869763,32646.512808,1,95,77,77,NA,3,3,0,0,0,2,41,1,2,5,NA +62838,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,19258.69251,19091.502506,2,99,12,3,1.16,6,1,0,0,0,2,57,1,5,2,NA +62839,7,2,2,3,NA,4,4,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8833.042831,9629.276723,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +62840,7,2,1,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,1,2,1,116001.539479,120724.7298,2,101,5,5,1.27,3,3,0,0,1,2,55,1,3,1,1 +62841,7,2,1,52,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,28867.753408,2,101,8,8,2.43,3,3,0,1,0,1,52,1,2,1,5 +62842,7,2,1,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9885.965005,10900.89298,2,97,3,3,0.82,2,2,1,0,0,2,22,1,4,5,NA +62843,7,1,1,14,NA,2,2,NA,NA,NA,NA,NA,2,1,77,8,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,26616.794908,0,2,91,1,1,0.17,4,4,0,1,0,1,49,2,1,6,NA +62844,7,2,1,7,NA,5,6,2,7,91,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4852.395137,5120.382571,1,99,14,14,2.66,7,7,3,1,0,1,35,1,5,1,5 +62845,7,2,1,27,NA,4,4,1,NA,NA,2,NA,2,2,6,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18831.340773,22141.643614,2,93,14,14,2.78,5,5,0,0,0,1,52,2,4,1,2 +62846,7,1,2,80,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,12535.973802,0,2,100,5,2,0.41,3,2,0,0,2,2,80,1,1,2,NA +62847,7,2,1,44,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,33514.643153,35491.262929,1,90,15,15,5,4,4,0,2,0,2,43,1,5,1,5 +62848,7,2,1,38,NA,4,4,1,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,22185.88687,25293.081507,1,98,7,4,1.61,2,1,0,0,0,1,38,2,5,5,NA +62849,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,19075.861607,19193.852226,1,96,15,15,5,4,4,0,1,0,1,42,2,4,1,4 +62850,7,2,2,1,14,5,7,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6257.554806,6809.629993,2,92,15,15,5,3,3,1,0,0,2,37,1,5,1,5 +62851,7,2,1,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,94547.245282,99362.23578,2,91,5,5,1.39,2,2,0,0,0,1,58,1,4,3,NA +62852,7,2,2,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8602.397328,9613.133098,2,99,13,13,NA,3,3,1,1,0,2,36,NA,NA,5,NA +62853,7,2,1,16,NA,5,6,1,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,5526.901806,5811.556543,2,103,7,7,1.65,4,4,0,1,1,2,55,2,3,1,NA +62854,7,2,1,8,NA,4,4,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13239.363106,13690.337986,3,92,6,6,0.93,5,5,2,1,0,2,37,1,5,1,3 +62855,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,147198.558516,148052.525251,2,91,14,14,5,1,1,0,0,0,2,47,1,4,3,NA +62856,7,2,2,2,NA,1,1,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10575.997988,11390.397051,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +62857,7,2,2,0,5,4,4,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3659.311381,3880.295282,1,99,8,8,1.99,5,5,1,0,0,1,55,1,5,1,2 +62858,7,2,1,17,NA,4,4,2,17,208,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11763.86086,12201.333419,1,99,14,14,4.86,3,3,0,1,1,2,56,1,5,1,5 +62859,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16058.142925,18803.458224,2,95,7,7,1.41,5,5,2,0,0,2,53,1,3,3,NA +62860,7,2,1,55,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,16499.662173,16948.4296,3,91,6,6,1.81,3,3,0,1,0,2,47,2,3,1,3 +62861,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,60071.993203,66823.228048,1,95,5,5,1.88,1,1,0,0,1,2,80,1,3,1,NA +62862,7,2,1,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9661.66953,9494.640263,2,95,4,4,0.78,4,4,2,0,0,1,27,1,4,1,4 +62863,7,2,2,1,13,1,1,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,14781.923489,3,92,5,5,0.87,4,4,2,0,0,2,28,1,3,1,3 +62864,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,32041.645327,32334.772002,1,94,1,1,0.32,1,1,0,0,0,2,57,1,4,5,NA +62865,7,1,1,17,NA,5,6,NA,NA,NA,2,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,10346.302718,0,2,91,4,4,0.65,5,5,1,3,0,1,43,2,3,5,NA +62866,7,2,2,5,NA,3,3,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,31376.988784,34630.493438,1,101,1,1,0.1,4,4,1,1,0,2,52,1,4,3,NA +62867,7,2,1,12,NA,3,3,2,12,152,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21603.199906,21630.881484,2,95,5,5,1.05,3,3,0,1,0,1,43,1,3,1,2 +62868,7,2,1,27,NA,3,3,2,NA,NA,2,NA,2,1,2,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23002.111021,24919.46038,2,97,6,6,1.16,4,4,1,1,0,1,27,2,4,1,3 +62869,7,2,1,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6936.347746,7364.53247,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +62870,7,2,1,13,NA,1,1,1,13,163,NA,NA,2,2,4,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,24228.858782,24791.594558,2,102,4,4,0.57,5,5,0,3,0,1,41,2,1,1,2 +62871,7,2,1,48,NA,5,7,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12490.95898,12886.461592,2,92,15,15,4.59,4,4,0,2,0,2,45,2,5,1,5 +62872,7,2,2,17,NA,3,3,1,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,78268.283998,80112.547303,2,98,15,15,5,4,4,0,2,0,2,46,1,4,1,NA +62873,7,1,1,15,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10879.348751,0,2,100,10,10,2.33,6,6,0,2,2,2,35,1,2,5,NA +62874,7,2,2,33,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,3,6,2,2,2,2,1,2,2,NA,NA,NA,NA,33355.357535,33078.896803,1,90,6,6,1.11,5,5,1,2,0,1,30,2,1,6,NA +62875,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,98217.832546,101788.674762,1,99,8,8,2.81,3,3,0,1,0,1,19,1,4,NA,NA +62876,7,2,2,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,63504.762752,64182.95787,1,91,7,7,3.67,1,1,0,0,1,2,74,1,4,2,NA +62877,7,2,1,8,NA,4,4,1,8,105,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,14179.490667,2,101,1,1,0.15,3,3,0,2,0,2,58,1,3,5,NA +62878,7,2,1,15,NA,4,4,1,15,187,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16463.950838,16583.858395,2,96,5,5,0.67,6,6,1,2,1,1,34,1,4,1,4 +62879,7,2,2,14,NA,4,4,2,14,171,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,18028.02401,2,101,8,8,2.43,3,3,0,1,0,1,52,1,2,1,5 +62880,7,2,2,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,117778.281347,120111.495123,1,94,7,7,1.52,4,4,0,2,2,1,61,2,1,1,5 +62881,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,134213.669088,137679.44344,1,93,15,15,4.59,4,4,0,1,0,1,57,1,5,1,5 +62882,7,2,1,59,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11690.444016,12008.407525,3,90,77,77,NA,4,4,0,0,0,1,59,2,2,1,2 +62883,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,43807.995099,48928.4376,1,101,7,7,2.31,2,2,0,0,2,2,80,1,4,1,2 +62884,7,2,2,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,1,2,2,1,23725.035562,23797.982183,1,94,3,1,0.13,2,1,0,0,0,2,36,1,3,5,NA +62885,7,2,1,60,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,9392.289727,9639.798184,1,90,15,15,5,3,3,0,0,1,1,60,2,4,2,NA +62886,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15576.264148,16963.869897,1,103,8,8,1.95,4,4,0,1,0,2,48,1,5,1,5 +62887,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,11982.125462,2,101,1,1,0.2,2,2,0,0,1,2,55,1,4,4,NA +62888,7,2,1,6,NA,4,4,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10410.106675,10390.534388,2,96,4,4,0.57,5,5,0,3,0,2,26,1,2,5,NA +62889,7,2,1,2,NA,2,2,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8914.157023,9196.329398,1,99,8,8,1.91,5,5,2,0,1,2,38,2,4,1,4 +62890,7,2,2,16,NA,5,6,1,16,193,NA,NA,2,1,5,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8210.014908,8564.874659,2,92,15,15,5,4,4,0,2,1,2,59,1,5,1,5 +62891,7,2,2,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,13141.36586,14124.295248,1,96,12,12,NA,1,1,0,0,1,2,74,1,2,3,NA +62892,7,2,1,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18225.504252,18491.00599,2,95,4,4,0.79,3,3,1,0,0,1,50,1,4,6,NA +62893,7,2,2,21,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,2,4,2,2,2,2,2,2,2,NA,NA,NA,NA,44119.608456,46238.164206,2,98,6,6,1.21,4,4,1,0,0,2,49,2,2,6,NA +62894,7,2,2,9,NA,4,4,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7620.214819,8204.982373,2,99,7,7,1.19,6,6,1,3,0,2,38,1,3,5,NA +62895,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,78240.016337,81914.532146,1,93,15,15,5,3,3,1,0,0,1,33,1,5,1,3 +62896,7,2,2,5,NA,3,3,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53166.229434,56500.79967,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +62897,7,2,1,5,NA,2,2,2,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17458.543556,17482.134163,2,91,10,10,3.04,4,4,1,1,0,2,31,2,5,1,5 +62898,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,22473.275629,22284.590536,2,97,7,7,2.38,2,2,0,0,0,1,25,1,2,1,2 +62899,7,2,2,45,NA,2,2,2,NA,NA,2,NA,2,2,77,NA,3,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,23377.708086,24402.18571,3,90,77,77,NA,4,1,0,0,0,1,45,2,3,3,NA +62900,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8949.073879,2,95,6,6,2.69,1,1,0,0,1,2,68,1,3,2,NA +62901,7,2,2,64,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11704.708696,12115.082932,1,101,15,15,5,3,3,0,0,1,1,58,2,4,1,5 +62902,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,35126.205635,36772.568368,1,95,5,5,1.08,3,3,0,1,0,1,53,1,4,1,4 +62903,7,2,1,7,NA,5,6,2,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,9720.482616,10818.978947,2,91,12,12,NA,7,6,0,4,2,2,72,2,1,2,NA +62904,7,2,1,2,NA,4,4,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6390.839385,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +62905,7,2,2,1,20,5,6,2,NA,20,NA,NA,2,2,1,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4735.146545,4730.145135,3,90,77,77,NA,3,3,1,0,0,1,35,2,3,1,5 +62906,7,2,2,0,0,1,1,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6885.817041,7118.841014,2,96,2,2,0.27,5,5,1,2,0,2,26,1,2,1,2 +62907,7,2,2,16,NA,2,2,2,16,200,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,5,5,0.8,5,5,0,3,0,2,40,2,1,5,NA +62908,7,2,1,21,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,5,NA,2,2,2,1,2,2,2,2,2,2,30581.409928,30998.258142,3,90,7,7,1.48,5,5,0,1,0,1,43,2,1,6,NA +62909,7,2,2,31,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,24598.096547,23934.388227,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +62910,7,2,2,7,NA,4,4,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12120.418061,13050.526646,2,101,10,10,2.91,4,4,0,1,0,2,51,1,2,5,NA +62911,7,2,1,16,NA,1,1,1,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,24902.864049,25283.513039,1,94,8,8,1.85,5,5,0,2,0,1,44,2,1,6,NA +62912,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,100742.761147,101756.213818,2,100,8,8,4.59,1,1,0,0,0,1,59,1,3,3,NA +62913,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,NA,NA,NA,NA,19463.737283,25688.523518,3,91,4,4,1.09,2,2,0,1,0,2,40,1,5,3,NA +62914,7,2,2,4,NA,3,3,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27528.66901,27890.404993,1,95,1,1,0.31,2,2,1,0,0,2,23,1,3,3,NA +62915,7,1,1,35,NA,1,1,NA,NA,NA,2,NA,2,2,3,NA,4,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,39073.76885,0,2,99,99,3,0.66,4,2,0,0,0,1,35,2,4,1,2 +62916,7,2,1,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37911.437415,38922.114085,2,103,4,4,0.79,3,3,0,0,0,2,42,2,2,5,NA +62917,7,2,1,13,NA,3,3,2,13,159,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,69216.263169,70543.167563,1,91,14,14,3.15,5,5,0,1,0,2,50,1,5,1,5 +62918,7,2,1,25,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,18259.989639,18151.137608,2,95,6,6,1.08,4,4,1,0,0,2,42,1,4,4,NA +62919,7,2,2,34,NA,3,3,2,NA,NA,2,NA,2,2,99,NA,1,1,2,1,2,1,1,2,1,NA,NA,NA,NA,20717.382973,22040.621269,2,97,1,1,0.21,4,4,2,0,0,2,34,2,1,1,2 +62920,7,2,1,3,NA,2,2,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12920.2211,12937.679363,2,90,14,14,3.58,4,4,1,1,0,1,37,1,3,1,4 +62921,7,2,2,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8147.287486,8590.325322,2,90,8,8,1.67,6,6,2,2,0,2,35,2,5,3,NA +62922,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,89807.047643,92234.66957,3,91,6,6,2.57,1,1,0,0,0,2,31,1,4,5,NA +62923,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,20333.447198,19976.945976,1,98,12,4,1.34,4,1,0,0,0,1,21,1,4,6,NA +62924,7,2,2,79,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,16361.152596,17584.911061,1,100,3,3,0.91,1,1,0,0,1,2,79,1,1,2,NA +62925,7,2,2,18,NA,3,3,2,18,226,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22699.241957,23364.572192,2,95,2,2,0.46,3,3,0,0,0,2,48,1,2,1,2 +62926,7,2,2,1,21,1,1,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11414.885224,11901.246118,1,94,6,6,1.11,5,5,1,2,0,2,41,2,1,1,1 +62927,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,138075.879417,141933.339512,2,91,15,15,5,3,3,0,0,2,2,62,1,4,1,4 +62928,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,15206.604563,14790.435937,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +62929,7,2,1,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9221.19173,9293.322792,2,95,77,77,NA,2,2,0,0,2,1,68,1,4,1,4 +62930,7,2,1,23,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,4,5,NA,2,2,2,1,2,2,1,2,2,1,42077.383821,44160.926598,1,102,4,4,0.67,4,4,0,1,0,1,23,2,4,5,NA +62931,7,2,1,15,NA,5,6,1,15,187,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11171.449402,11936.033174,1,92,14,14,3.47,4,4,0,2,0,2,53,2,4,1,4 +62932,7,1,2,2,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,35285.563011,0,2,100,15,15,5,4,4,1,1,0,1,29,1,4,1,4 +62933,7,2,2,17,NA,5,6,2,17,207,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,9,9,1.78,6,6,0,1,1,1,45,2,3,1,3 +62934,7,2,2,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,39030.893313,44151.142675,1,91,7,7,2.2,3,3,0,0,1,2,60,1,2,2,NA +62935,7,2,1,51,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,2,2,2,2,21139.303536,21566.542108,2,103,12,12,NA,4,4,0,1,0,2,50,2,3,1,4 +62936,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,32985.054579,1,95,5,5,1.03,4,4,0,2,0,1,33,1,3,1,3 +62937,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10598.2543,1,99,5,5,1.63,2,2,0,0,2,1,64,NA,NA,1,4 +62938,7,2,2,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,36053.766709,37679.125242,1,100,6,6,1.13,4,4,0,3,0,2,32,1,3,5,NA +62939,7,2,1,38,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,41155.167164,49173.131788,1,102,7,7,1.41,5,5,0,2,2,1,72,1,4,1,3 +62940,7,2,1,62,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9814.165625,10072.791483,1,90,15,15,4.34,4,4,0,0,1,1,62,2,5,1,3 +62941,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,13728.308948,13352.59776,2,90,99,4,1.16,5,2,0,0,1,1,43,NA,NA,1,NA +62942,7,1,1,48,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,91761.294148,0,2,92,15,15,5,3,3,1,0,0,1,48,1,5,1,5 +62943,7,2,1,15,NA,2,2,1,15,189,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18042.255087,18115.696579,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +62944,7,2,2,17,NA,4,4,2,17,211,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13775.846051,13737.029624,2,97,7,7,1.06,7,7,1,2,0,2,40,1,4,5,NA +62945,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19100.40225,19426.955733,1,96,15,15,4.9,4,4,0,1,0,1,47,1,3,1,5 +62946,7,2,1,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9699.683862,9681.447258,2,101,2,2,0.27,6,6,0,3,0,2,45,1,2,5,NA +62947,7,1,2,68,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,1,2,NA,2,2,2,1,2,2,NA,NA,NA,NA,11469.456138,0,1,90,4,4,0.79,3,3,0,0,1,2,68,1,1,2,NA +62948,7,2,1,79,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,55509.98679,58756.097166,1,101,15,15,5,3,3,0,0,2,1,79,1,4,1,4 +62949,7,2,2,8,NA,4,4,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9139.784234,9384.299154,2,100,14,14,3.89,4,4,0,2,0,1,38,1,3,1,4 +62950,7,2,2,16,NA,3,3,2,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,91539.042546,96988.607103,1,101,14,14,3.3,4,4,0,2,0,2,42,1,4,1,3 +62951,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,15190.604914,17388.543575,1,96,15,15,5,6,6,1,1,1,2,44,1,3,1,3 +62952,7,2,1,20,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,10547.036825,10866.006067,3,90,15,15,3.7,5,5,0,0,0,1,56,2,3,1,3 +62953,7,2,1,44,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17249.311662,18125.470447,2,91,14,14,3.47,4,4,1,1,0,2,36,2,3,1,5 +62954,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18523.956321,18091.254104,2,99,2,2,0.72,1,1,0,0,0,1,28,1,5,5,NA +62955,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,1,2,2,1,76827.086279,81170.917712,2,99,15,15,5,2,1,0,0,0,2,31,1,5,1,NA +62956,7,2,2,0,7,5,6,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,4444.744532,4630.927855,2,90,3,3,0.65,5,3,1,2,0,1,44,2,5,1,5 +62957,7,2,2,3,NA,5,6,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5307.591514,5454.53335,2,102,3,3,0.38,5,5,3,0,0,2,30,2,2,1,4 +62958,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,65611.003966,67854.891478,1,94,15,15,4.95,4,4,0,0,2,1,72,1,3,1,3 +62959,7,2,2,13,NA,5,6,1,13,166,NA,NA,2,1,4,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8210.014908,8564.874659,2,92,15,15,5,4,4,0,2,1,2,59,1,5,1,5 +62960,7,2,2,3,NA,4,4,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9727.363166,10466.751274,2,97,6,6,1,6,6,1,2,2,2,60,1,2,2,NA +62961,7,2,1,0,6,4,4,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7882.953266,8719.306286,2,96,5,5,1.5,2,2,1,0,0,2,22,1,3,5,NA +62962,7,2,1,2,NA,4,4,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8009.966208,8254.622305,2,96,2,2,0.44,3,3,2,0,0,2,22,1,2,5,NA +62963,7,2,2,6,NA,5,7,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22371.648216,23759.450609,1,95,6,6,1.15,5,5,2,1,0,1,29,1,4,6,NA +62964,7,1,1,22,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,13171.824182,0,1,100,NA,NA,NA,4,4,0,0,1,1,21,NA,NA,5,NA +62965,7,2,2,3,NA,5,7,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,29364.157365,32408.949946,1,102,2,2,0.49,3,3,1,0,0,1,20,1,2,6,NA +62966,7,2,2,21,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,24185.894115,24390.02655,1,93,3,3,0.7,3,3,1,0,0,1,23,2,4,1,2 +62967,7,2,1,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,27572.205373,28895.579143,1,100,15,15,5,3,3,0,0,0,2,33,1,5,1,4 +62968,7,2,1,5,NA,2,2,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13610.050526,14582.186889,2,100,3,3,0.76,3,3,1,0,0,2,31,2,1,6,NA +62969,7,2,1,14,NA,4,4,2,14,178,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16890.963304,17218.04077,1,91,10,10,2.56,5,5,0,3,0,1,51,2,5,1,4 +62970,7,1,1,6,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12577.115885,0,2,96,3,3,0.54,4,4,1,1,0,1,29,1,2,1,2 +62971,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,175544.769665,178639.415011,1,91,15,15,5,2,2,0,0,0,1,53,1,5,1,5 +62972,7,2,1,3,NA,2,2,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17458.543556,18705.569422,2,91,4,4,0.84,3,3,1,0,0,2,21,1,4,1,2 +62973,7,2,1,10,NA,1,1,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17882.621856,18280.794545,3,92,12,12,NA,6,6,1,3,0,2,33,1,5,1,4 +62974,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,86986.68246,91060.136414,2,94,9,9,5,1,1,0,0,0,1,30,1,5,5,NA +62975,7,2,2,10,NA,4,4,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7397.129324,7630.740597,1,96,12,12,NA,5,5,1,2,0,2,35,1,5,1,4 +62976,7,2,2,18,NA,3,3,2,18,221,2,NA,2,2,5,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,82089.722105,85880.903702,3,91,14,14,5,2,2,0,0,0,2,48,2,5,3,NA +62977,7,2,1,25,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,50326.347525,51411.397032,1,93,12,12,NA,3,1,0,0,0,1,24,NA,NA,5,NA +62978,7,2,2,18,NA,1,1,1,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21062.314667,23105.758741,1,91,14,14,3.9,4,4,0,1,0,1,41,1,2,1,4 +62979,7,2,2,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,53370.063988,54427.336747,3,92,4,4,1.13,2,2,0,0,2,1,64,1,3,1,4 +62980,7,1,1,39,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,19384.896286,0,1,94,5,5,1.05,3,3,0,1,0,1,39,1,4,6,NA +62981,7,2,1,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,25120.174741,25387.314373,2,102,15,15,4.47,4,4,1,1,0,1,32,1,5,1,4 +62982,7,2,2,66,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,49644.076348,54110.530387,1,97,3,3,1.16,1,1,0,0,1,2,66,1,3,2,NA +62983,7,2,1,7,NA,4,4,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7730.47951,9212.541007,1,99,6,6,1.3,5,5,1,2,0,1,34,1,2,1,3 +62984,7,2,2,5,NA,2,2,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8825.559072,9505.166523,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +62985,7,2,1,68,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11138.867102,11750.838884,1,102,7,7,2.72,2,2,0,0,2,2,67,NA,NA,1,5 +62986,7,2,1,14,NA,3,3,1,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,69211.537407,68936.770872,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +62987,7,2,1,10,NA,2,2,1,10,125,NA,NA,2,1,3,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13395.612951,13401.547169,2,102,7,7,1.53,5,5,1,2,0,2,37,2,4,1,4 +62988,7,2,1,10,NA,2,2,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11036.458246,11087.266596,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +62989,7,2,2,1,19,5,6,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8173.816615,8894.95474,1,97,15,15,5,4,4,2,0,0,2,35,2,4,1,4 +62990,7,2,1,79,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,79754.311902,90534.066519,1,97,9,9,3.97,2,2,0,0,2,1,79,1,3,1,3 +62991,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,129608.716834,132839.525748,1,100,8,8,2.97,2,2,0,0,0,1,24,1,5,1,5 +62992,7,2,2,9,NA,1,1,2,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18668.602894,18957.049554,1,101,4,4,0.84,3,3,0,1,0,1,42,1,4,1,4 +62993,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,74501.766669,80316.820348,1,90,14,14,3.93,3,3,1,0,0,1,35,1,2,1,5 +62994,7,2,2,49,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,3,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,18255.735511,18352.270791,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +62995,7,2,1,18,NA,4,4,2,18,220,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11386.695644,11908.648036,2,99,6,6,1.18,5,5,0,3,0,2,38,1,2,5,NA +62996,7,2,2,9,NA,2,2,2,9,114,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13257.060167,14867.908577,2,90,8,8,1.72,5,5,1,2,0,1,20,2,1,1,2 +62997,7,2,1,60,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,29552.786683,29829.95179,2,96,3,3,0.95,2,2,0,0,2,2,62,1,4,1,4 +62998,7,2,1,19,NA,5,6,1,20,NA,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6558.308393,6849.983523,2,92,99,99,NA,4,1,0,0,0,1,19,1,4,NA,NA +62999,7,2,2,9,NA,5,7,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6137.256046,6434.751859,1,103,15,15,3.7,5,5,0,2,1,1,55,1,5,1,5 +63000,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11862.436765,12619.924744,1,90,2,2,0.45,1,1,0,0,1,2,60,1,5,3,NA +63001,7,2,1,5,NA,4,4,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9624.976734,10219.132066,2,96,3,3,0.38,5,5,1,2,0,2,30,1,3,5,NA +63002,7,2,2,54,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,21901.662873,22693.823819,2,93,8,8,2.49,3,3,0,0,0,1,52,2,2,1,4 +63003,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,151649.038926,151259.483772,1,101,13,13,NA,2,2,0,0,0,1,40,1,2,1,3 +63004,7,2,2,38,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,3,1,2,1,1,2,2,1,2,2,NA,13047.751375,13287.186355,2,92,15,15,5,3,3,1,0,0,1,39,2,5,1,5 +63005,7,2,1,19,NA,1,1,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,32326.52031,34735.818434,2,94,5,5,0.65,6,6,0,3,0,1,44,2,1,1,1 +63006,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,123771.419917,127443.198085,2,98,10,10,3.78,3,3,0,0,0,1,53,1,3,1,4 +63007,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,47098.572584,49762.054694,1,95,7,7,2.38,2,2,0,0,2,1,80,1,3,1,4 +63008,7,2,1,38,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15051.024912,15121.525249,3,90,15,15,5,5,5,1,0,1,1,38,2,3,1,4 +63009,7,2,1,6,NA,4,4,2,7,84,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8483.005475,8584.70346,1,96,10,10,2.95,4,4,0,1,0,2,34,2,3,1,5 +63010,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,12535.973802,12972.182488,2,100,7,7,2.37,3,3,0,1,1,2,45,1,5,1,NA +63011,7,2,2,16,NA,3,3,2,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,122091.956024,127137.394167,2,91,15,15,5,3,3,0,1,0,1,52,1,5,1,5 +63012,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,10,10,4.76,2,2,0,0,2,2,64,1,4,1,5 +63013,7,2,1,65,NA,5,6,1,NA,NA,1,1,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11138.867102,11750.838884,1,102,14,14,5,2,2,0,0,2,1,65,2,5,1,5 +63014,7,2,2,11,NA,4,4,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7814.742747,7978.458393,1,98,8,8,2.97,2,2,0,1,0,2,40,1,4,3,NA +63015,7,2,1,65,NA,5,7,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,117343.481374,118848.614941,1,91,7,7,2.64,2,2,0,0,1,2,58,1,5,1,4 +63016,7,2,2,14,NA,2,2,2,14,170,NA,NA,2,2,3,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12680.621719,14355.413798,2,90,3,3,0.46,5,5,0,2,2,1,75,2,1,1,2 +63017,7,2,1,71,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,12511.526803,13352.932153,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +63018,7,2,1,10,NA,3,3,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,27154.222487,28089.451048,2,101,4,4,0.73,5,5,1,2,0,1,40,1,5,1,5 +63019,7,2,2,65,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,3,NA,2,2,2,2,2,2,1,2,2,2,10235.0654,10662.230581,2,93,3,3,0.87,2,2,0,0,1,2,65,2,4,3,NA +63020,7,2,1,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13533.281742,15943.839793,1,100,6,6,1.11,5,5,0,2,1,1,38,2,2,1,1 +63021,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,3,5,NA,1,2,1,1,2,1,NA,NA,NA,NA,19524.115198,21455.7569,1,93,7,7,2.38,2,2,0,0,0,2,46,2,3,5,NA +63022,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,92467.370896,92229.84126,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +63023,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,124820.027137,126759.886775,1,91,6,3,0.92,2,1,0,0,0,2,24,1,4,6,NA +63024,7,2,2,78,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,12692.401451,13134.05328,2,95,12,12,NA,3,3,0,0,2,1,65,1,4,1,4 +63025,7,2,2,79,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,14226.966896,14722.016314,2,100,5,5,0.95,4,4,0,0,1,2,53,1,3,5,NA +63026,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,53830.599426,56471.452044,1,99,15,15,5,3,3,1,0,0,2,31,1,5,1,5 +63027,7,2,1,15,NA,1,1,1,15,181,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18242.832494,18521.680571,1,102,6,6,1.03,6,6,0,4,0,1,34,2,2,1,1 +63028,7,2,2,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14414.529053,14932.182215,2,96,8,8,1.33,7,7,2,1,1,1,62,2,1,1,1 +63029,7,2,2,2,NA,5,7,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20272.436775,20911.100412,2,94,77,77,NA,4,4,2,0,0,2,23,1,2,6,NA +63030,7,2,1,21,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,42165.369652,45330.590147,2,102,3,3,0.45,4,4,2,0,0,1,21,2,2,6,NA +63031,7,2,2,77,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,15183.616455,20169.750633,1,90,6,6,1.78,2,2,0,0,1,2,77,1,1,2,NA +63032,7,2,1,14,NA,4,4,2,14,172,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11085.075029,11001.247749,1,93,1,1,0.02,5,5,0,4,0,2,36,NA,NA,5,NA +63033,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,153755.392794,158780.137655,1,91,15,15,5,4,4,0,1,0,1,45,1,5,1,5 +63034,7,2,2,5,NA,3,3,2,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,92,4,4,0.61,5,5,1,2,0,1,34,1,3,6,NA +63035,7,2,1,7,NA,5,7,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8017.552697,8398.795399,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +63036,7,2,2,74,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,12895.665603,13811.504793,1,93,2,2,0.55,1,1,0,0,1,2,74,2,1,3,NA +63037,7,2,2,41,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,4,2,2,2,2,1,2,2,2,2,2,2,34501.569761,34681.492512,1,93,5,5,1.36,2,2,0,0,0,2,41,2,1,4,NA +63038,7,2,2,2,NA,5,7,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7871.443574,8074.618887,1,96,6,6,1.49,3,3,1,0,0,2,24,1,4,5,NA +63039,7,2,2,2,NA,1,1,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10582.75863,3,92,6,6,1,6,6,1,1,0,1,42,2,1,1,4 +63040,7,2,2,54,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,2,1,NA,1,2,1,NA,NA,NA,1,2,1,3,15268.129241,15348.866231,2,96,NA,NA,NA,4,4,0,0,1,1,67,2,3,1,2 +63041,7,2,1,35,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14376.416432,15539.834252,2,103,15,15,5,4,4,0,3,0,1,35,1,5,5,NA +63042,7,2,2,12,NA,4,4,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13841.239638,13875.328502,1,96,15,15,4.52,6,6,0,4,0,1,46,1,4,1,4 +63043,7,2,2,20,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,11609.8069,12151.984044,2,103,77,77,NA,5,5,0,2,0,2,39,2,5,1,5 +63044,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,79316.940936,94360.361124,1,93,10,10,5,1,1,0,0,0,1,35,1,5,5,NA +63045,7,2,2,53,NA,1,1,1,NA,NA,2,NA,2,2,8,NA,2,4,NA,1,2,2,2,2,2,1,2,2,1,18295.488967,18390.898385,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +63046,7,2,1,1,NA,3,3,2,NA,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39241.111643,42207.80453,1,99,6,6,1.73,3,3,1,1,0,2,42,1,5,3,NA +63047,7,2,2,6,NA,3,3,2,6,81,NA,NA,2,1,2,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14287.66096,14320.169639,2,97,6,6,1.16,4,4,1,1,0,1,27,2,4,1,3 +63048,7,2,1,29,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15875.103787,17176.519619,1,93,10,10,4.76,2,2,0,0,0,1,29,2,5,1,5 +63049,7,2,1,19,NA,2,2,1,19,233,2,NA,2,1,5,15,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,30061.88611,30025.949584,1,92,6,6,0.93,5,5,0,2,0,1,47,2,1,1,1 +63050,7,2,1,24,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,12364.328404,12075.509308,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +63051,7,2,1,30,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22403.911395,23911.071969,2,96,14,14,5,2,2,0,0,0,1,30,2,5,1,5 +63052,7,2,2,37,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,3,2,1,2,2,1,2,2,NA,NA,NA,NA,19741.154437,19781.46423,1,100,7,7,2.51,2,2,0,1,0,2,37,2,5,3,NA +63053,7,2,2,8,NA,1,1,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12789.411811,13121.359297,1,102,3,3,0.54,3,3,0,2,0,2,42,2,2,3,NA +63054,7,2,2,11,NA,1,1,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14469.11917,14745.425968,2,92,15,15,3.37,7,7,0,4,0,1,42,2,3,1,1 +63055,7,2,2,2,NA,3,3,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25257.21318,27876.153487,1,98,2,2,0.31,3,3,1,0,0,1,45,NA,NA,1,NA +63056,7,2,1,21,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15196.92397,16091.373745,2,101,7,3,1.1,3,1,0,0,0,1,21,2,4,5,NA +63057,7,2,1,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,43892.276067,44574.41704,1,98,6,6,2.6,2,1,0,0,0,1,29,1,4,5,NA +63058,7,2,2,13,NA,5,6,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6135.470395,6372.721366,1,91,15,15,5,6,6,0,2,2,1,50,2,5,1,5 +63059,7,2,1,7,NA,4,4,1,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10469.725162,11059.049224,1,100,6,6,1.13,4,4,0,3,0,2,32,1,3,5,NA +63060,7,2,2,7,NA,1,1,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13064.573334,13201.924867,1,103,5,5,0.71,6,6,2,2,0,2,31,2,2,1,2 +63061,7,2,2,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,1,1,2,2,1,2,2,NA,NA,NA,NA,22326.231285,22166.696692,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +63062,7,2,1,4,NA,4,4,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10690.995725,11500.031681,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +63063,7,2,2,7,NA,3,3,1,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,60557.637514,61692.695301,3,92,6,6,1.17,4,4,0,2,0,2,30,1,2,1,4 +63064,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,7233.371983,2,95,3,3,1.07,1,1,0,0,1,1,61,1,1,4,NA +63065,7,2,1,11,NA,1,1,1,11,143,NA,NA,2,2,3,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,13822.148996,14860.201344,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +63066,7,2,1,3,NA,3,3,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,61250.535365,69105.159981,1,90,8,8,1.67,5,5,2,1,0,2,28,1,4,1,5 +63067,7,2,2,0,5,5,6,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6956.259272,7247.645977,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +63068,7,2,1,9,NA,3,3,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,26240.82746,27691.552263,1,94,4,4,0.56,5,5,1,2,0,1,34,1,2,3,NA +63069,7,2,1,20,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15533.829525,2,101,6,2,0.46,2,1,0,0,0,1,20,2,4,5,NA +63070,7,2,2,70,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,1,5,NA,2,2,2,1,2,2,2,2,2,NA,21122.17432,23417.039872,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +63071,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,20450.752436,20266.431761,1,98,6,6,1.72,2,2,0,0,0,2,53,1,5,2,NA +63072,7,2,2,12,NA,3,3,2,12,152,NA,NA,2,1,1,7,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,31756.649984,32677.072621,2,97,5,5,0.8,5,5,1,2,0,1,46,2,4,1,2 +63073,7,2,1,16,NA,3,3,1,16,194,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,25367.590269,25034.201904,1,94,6,6,1.26,5,5,0,2,0,2,38,1,4,1,NA +63074,7,2,1,3,NA,4,4,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9698.338509,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +63075,7,2,2,12,NA,2,2,1,12,152,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20502.928313,21114.699878,2,98,12,12,NA,3,3,0,1,0,2,34,1,4,1,3 +63076,7,2,1,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,21168.33083,23066.473787,2,99,2,2,0.4,2,2,0,0,0,2,52,1,3,1,3 +63077,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,86986.68246,92645.868047,2,94,15,15,4.59,4,4,1,1,0,2,37,1,5,1,5 +63078,7,2,1,6,NA,1,1,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8828.580268,8822.70874,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +63079,7,2,1,17,NA,5,6,1,17,212,2,NA,2,1,5,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11171.449402,11936.033174,1,92,14,14,3.47,4,4,0,2,0,2,53,2,4,1,4 +63080,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,NA,NA,NA,NA,30505.56355,30746.687156,1,97,3,3,0.93,2,2,0,1,0,2,34,1,4,5,NA +63081,7,2,1,62,NA,5,7,2,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19328.482066,19868.466665,3,90,7,7,2.51,2,2,0,0,2,1,62,2,3,1,4 +63082,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,175997.804296,180603.118894,1,101,4,2,0.82,2,1,0,0,1,1,63,1,2,6,NA +63083,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,69601.920609,70345.22994,1,98,7,7,3.58,1,1,0,0,1,2,71,1,4,2,NA +63084,7,2,1,4,NA,3,3,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,45649.909879,51503.94697,1,99,15,15,5,5,5,3,0,0,2,34,1,5,1,5 +63085,7,2,2,4,NA,4,4,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8267.490849,9012.744386,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +63086,7,2,2,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,94,15,15,5,2,2,0,0,2,1,75,1,4,1,3 +63087,7,2,1,3,NA,3,3,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,81508.607355,87670.792766,1,94,14,6,1.65,3,2,1,0,0,1,26,1,4,6,NA +63088,7,2,1,44,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11113.602843,11073.454175,3,90,10,10,2.41,5,5,1,2,0,1,44,2,4,1,5 +63089,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,80232.348161,83992.832552,1,99,15,15,4.47,4,4,0,2,0,2,43,1,5,1,5 +63090,7,2,2,15,NA,3,3,2,15,186,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41202.729804,43105.611516,2,91,6,6,1.26,5,5,0,1,2,2,80,1,4,2,NA +63091,7,2,1,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,NA,55996.810038,59271.38884,2,93,15,8,4.48,2,1,0,0,2,2,63,2,4,6,NA +63092,7,2,2,17,NA,4,4,2,18,216,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12581.940435,12644.353117,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +63093,7,2,2,10,NA,3,3,1,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,1,2,1,2,2,1,21800.021754,23152.363882,3,91,7,1,0,7,1,0,4,0,1,40,1,4,1,3 +63094,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,27167.433399,29371.776665,1,94,7,7,2.58,2,2,0,0,2,2,71,1,5,1,4 +63095,7,2,2,4,NA,4,4,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11664.396755,2,100,9,9,2.46,4,4,1,1,1,2,59,1,3,1,3 +63096,7,2,1,8,NA,2,2,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13672.897697,14159.650726,2,100,14,14,3.58,4,4,0,2,0,2,40,NA,NA,1,4 +63097,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,71070.181743,74923.26272,1,95,7,7,2.45,2,2,0,0,2,2,70,1,3,1,3 +63098,7,2,2,10,NA,3,3,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60197.256541,63931.531988,2,94,14,14,2.63,6,6,1,3,0,1,39,1,4,1,4 +63099,7,2,2,3,NA,2,2,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15550.931019,16748.422137,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +63100,7,2,2,13,NA,1,1,1,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22424.988432,22856.096824,1,94,5,5,0.87,4,4,0,2,0,2,41,2,4,1,1 +63101,7,2,1,6,NA,4,4,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11060.738342,11193.339318,2,96,6,6,1.48,4,4,1,1,0,2,25,1,4,5,NA +63102,7,2,2,19,NA,1,1,1,19,238,2,NA,2,2,1,12,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,16427.640886,17012.806816,1,102,5,5,0.98,4,4,1,1,0,2,42,2,2,6,NA +63103,7,2,1,46,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12820.674452,13169.378628,3,90,15,15,5,3,3,0,0,0,1,46,2,3,1,3 +63104,7,2,2,6,NA,4,4,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8146.767632,8699.382682,2,100,15,15,4.97,5,5,0,2,1,2,42,1,5,1,5 +63105,7,1,1,14,NA,5,6,NA,NA,NA,NA,NA,2,1,4,9,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8915.81491,0,1,95,3,3,0.43,4,4,0,1,2,1,65,2,5,1,3 +63106,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32838.149884,1,95,3,3,0.95,1,1,0,0,0,1,50,1,2,3,NA +63107,7,2,2,66,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,9716.805546,12994.252166,2,90,3,3,1.1,1,1,0,0,1,2,66,2,1,1,NA +63108,7,2,1,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,26847.643051,28699.104328,1,98,4,4,0.66,4,4,2,0,0,2,22,1,4,6,NA +63109,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,105873.555835,111215.69511,1,101,14,14,3.9,4,4,0,2,0,2,41,1,2,1,2 +63110,7,2,1,36,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22439.245437,22882.446062,2,96,14,14,3.58,4,4,2,0,0,1,36,1,4,1,5 +63111,7,2,1,8,NA,1,1,1,8,103,NA,NA,2,7,77,1,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,11399.23838,11295.714433,1,103,8,8,1.85,5,5,2,1,0,2,25,2,2,1,2 +63112,7,2,2,66,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,17221.648537,17753.661813,1,95,6,6,1.7,2,2,0,0,2,2,66,2,1,1,3 +63113,7,2,2,3,NA,1,1,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17543.203297,19368.16722,1,95,8,8,2.24,4,4,2,0,0,2,29,1,3,1,4 +63114,7,2,1,15,NA,5,6,1,15,189,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11657.164593,12175.606972,1,92,9,9,2.88,3,3,0,2,0,1,50,2,5,3,NA +63115,7,2,1,4,NA,3,3,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,32621.433667,36804.729607,2,101,4,4,0.73,5,5,1,2,0,1,40,1,5,1,5 +63116,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,24291.664633,24483.672027,1,99,8,8,4.13,1,1,0,0,0,2,34,1,5,5,NA +63117,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,6,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15533.829525,2,101,8,5,2.2,2,1,0,0,0,1,24,2,4,6,NA +63118,7,2,1,16,NA,1,1,1,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30061.88611,30025.949584,1,92,7,7,1.48,5,5,0,1,0,1,42,1,5,1,4 +63119,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,84933.772167,92023.102027,2,99,15,15,5,2,2,0,0,0,2,37,1,5,1,5 +63120,7,2,2,4,NA,3,3,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,55336.504558,58807.19381,2,102,14,14,3.44,5,5,1,2,0,2,34,1,4,6,NA +63121,7,2,1,9,NA,1,1,1,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15233.096858,16234.004804,1,94,15,15,4.37,7,7,0,4,1,1,58,1,4,1,5 +63122,7,2,2,3,NA,2,2,1,3,44,NA,NA,2,2,2,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10301.516763,10950.95816,2,93,6,6,0.93,5,5,1,2,0,1,40,2,4,1,4 +63123,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18753.573091,18904.865313,2,99,2,2,0.77,1,1,0,0,0,1,55,1,3,5,NA +63124,7,2,2,54,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15460.72194,15832.955199,1,102,9,9,2.39,5,5,0,1,1,1,55,2,5,1,5 +63125,7,2,2,46,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22109.546782,21887.540337,1,93,7,7,1.79,4,4,0,2,0,1,53,2,4,1,4 +63126,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,111448.08155,119470.923607,1,90,15,15,5,4,4,0,2,0,1,44,1,5,1,5 +63127,7,2,1,28,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14391.77847,15024.211748,1,92,14,14,3.3,4,4,2,0,0,1,28,1,4,1,4 +63128,7,2,2,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,3,1,2,2,1,2,2,1,2,2,1,38589.695298,40356.151096,2,96,6,5,1.84,2,1,0,0,0,2,26,1,2,5,NA +63129,7,2,1,14,NA,1,1,1,14,172,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22768.423624,23297.239555,2,98,6,6,1.4,3,3,0,1,0,1,56,1,2,1,2 +63130,7,2,2,16,NA,5,6,2,16,196,NA,NA,2,2,1,8,NA,NA,NA,1,2,1,NA,NA,NA,1,2,1,NA,10767.566937,12084.516227,2,91,99,1,0,7,3,0,4,0,1,36,2,9,1,2 +63131,7,2,2,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8480.466509,9125.076563,1,100,13,13,NA,5,5,2,0,0,2,54,1,4,5,NA +63132,7,2,2,80,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,4,2,NA,1,2,1,1,2,2,1,2,1,NA,18698.205673,19635.336647,1,97,15,15,4.81,5,5,0,1,1,1,51,2,5,1,5 +63133,7,2,1,24,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,35669.2076,40318.090187,2,94,8,8,2.33,4,4,2,0,0,1,24,1,2,6,NA +63134,7,2,2,66,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,3,2,NA,2,2,2,2,2,2,2,2,2,2,11851.128358,12345.740673,2,93,4,4,0.69,4,4,0,1,1,2,66,2,3,2,NA +63135,7,2,1,15,NA,4,4,2,15,190,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,7,7,1.74,4,4,0,2,0,2,47,1,5,4,NA +63136,7,2,1,18,NA,3,3,2,18,224,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,66448.116716,70579.976727,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +63137,7,2,1,49,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19898.840409,19922.416835,2,94,15,15,5,2,2,0,0,0,1,49,2,5,1,5 +63138,7,2,1,15,NA,3,3,2,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,76583.482739,78051.61978,3,91,4,4,0.92,3,3,0,1,0,2,53,1,4,1,4 +63139,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,24118.129224,23465.858863,2,96,3,3,0.59,3,3,1,0,0,2,25,1,4,1,NA +63140,7,2,2,9,NA,1,1,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12307.832776,12437.228482,2,93,77,77,NA,7,7,3,1,0,2,43,2,1,1,9 +63141,7,2,2,34,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,27303.803575,30038.060995,1,96,10,10,2.95,4,4,0,1,0,2,34,2,3,1,5 +63142,7,2,1,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19064.767778,19872.734197,2,93,10,10,3.93,3,3,0,0,2,1,54,1,5,1,5 +63143,7,2,1,70,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,10498.47031,11456.643725,3,90,4,4,1.22,2,2,0,0,2,2,69,2,4,1,1 +63144,7,2,1,1,21,2,2,2,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10803.555682,11145.535856,2,94,7,7,1.34,5,5,2,1,0,1,32,2,1,1,NA +63145,7,2,1,50,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,15044.515884,15040.577827,3,90,5,5,0.87,4,4,0,0,0,2,43,2,3,5,NA +63146,7,2,2,6,NA,4,4,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8362.256577,9003.967662,2,100,3,3,0.38,5,5,2,1,0,2,28,1,2,5,NA +63147,7,2,1,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,31010.243793,32025.638239,3,92,6,6,1.41,4,3,0,1,0,1,41,1,4,1,4 +63148,7,2,1,40,NA,1,1,2,NA,NA,2,NA,2,2,77,NA,3,1,NA,2,2,2,1,2,2,2,2,2,2,31640.296506,31176.023929,2,94,6,4,1.38,2,1,0,0,0,1,40,2,3,1,NA +63149,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,145772.192378,153127.526275,1,95,9,9,2.66,4,4,0,2,0,1,45,1,3,1,3 +63150,7,2,1,19,NA,3,3,2,19,229,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,93665.036597,95017.313859,1,91,15,15,5,4,4,0,1,0,1,45,1,5,1,5 +63151,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,17212.153036,21760.360036,3,90,7,6,2.42,2,1,0,0,0,1,44,1,2,6,NA +63152,7,2,2,62,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15277.358397,15812.991914,2,96,5,1,0,2,1,0,0,1,1,46,2,3,3,NA +63153,7,2,1,2,NA,2,2,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13002.944731,13931.716845,2,91,2,2,0.42,3,3,1,1,0,2,27,1,3,5,NA +63154,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,51543.062078,51154.050295,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +63155,7,2,1,18,NA,3,3,2,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,68148.957861,67253.324127,1,93,15,15,3.92,5,5,0,1,0,2,54,1,5,1,5 +63156,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,49260.413155,50771.674072,2,100,8,8,3.4,2,2,0,0,2,1,69,1,4,1,4 +63157,7,2,1,13,NA,3,3,2,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,32477.57544,32050.74555,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +63158,7,2,2,0,5,3,3,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10263.789813,10611.184403,1,94,8,8,1.39,7,7,2,0,1,2,52,1,5,2,NA +63159,7,2,1,48,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,37724.155022,39553.56554,2,102,4,4,1.16,2,2,0,0,0,1,48,1,4,1,4 +63160,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,130577.02995,132175.980892,1,98,5,5,1.81,1,1,0,0,1,2,61,1,3,2,NA +63161,7,2,2,37,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,4,3,2,2,2,2,1,2,2,2,2,2,2,39450.135734,38385.688196,2,93,9,9,1.94,6,6,0,3,0,2,37,NA,NA,3,NA +63162,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19000.571418,18807.33617,1,96,8,8,4.48,1,1,0,0,0,2,58,1,4,3,NA +63163,7,2,1,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,146181.198007,148606.927767,2,91,15,2,0.85,7,1,0,0,1,1,49,NA,NA,5,NA +63164,7,2,1,54,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,27343.459193,27021.369249,1,90,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +63165,7,1,2,13,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16537.460749,0,2,100,1,1,0.04,4,4,0,2,0,1,34,NA,NA,6,NA +63166,7,2,2,17,NA,4,4,2,17,205,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10848.628906,11198.221038,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +63167,7,2,1,37,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12327.761744,13424.968474,3,90,12,12,NA,5,5,1,2,0,1,37,2,5,1,5 +63168,7,2,1,10,NA,5,6,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8580.826574,9087.233306,1,92,14,14,2.42,6,6,1,3,0,1,30,1,4,6,NA +63169,7,2,2,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,53955.606082,55487.991675,2,100,6,6,1.7,3,3,0,1,0,2,33,1,4,6,NA +63170,7,2,2,53,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,22224.73066,22340.630739,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +63171,7,2,1,20,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,9162.933592,9412.398479,1,103,5,5,0.65,6,6,0,0,1,2,26,2,4,5,NA +63172,7,2,2,68,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,2,NA,2,2,2,1,2,2,2,2,2,2,13057.178942,15139.165763,1,102,6,6,1.18,5,5,0,2,1,2,42,2,2,2,NA +63173,7,2,1,18,NA,5,6,2,18,217,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,5096.872559,5447.231524,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +63174,7,2,2,47,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,29650.79971,34013.933936,2,90,14,14,5,1,1,0,0,0,2,47,1,5,5,NA +63175,7,2,1,15,NA,3,3,1,15,184,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,31348.486193,31739.246143,1,98,5,5,0.74,5,5,0,3,0,1,35,1,2,6,NA +63176,7,2,1,19,NA,4,4,2,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13513.882801,1,96,4,4,0.65,4,4,0,0,0,1,19,1,4,NA,NA +63177,7,2,1,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,8355.583627,8420.94363,2,93,10,10,3.93,3,3,0,0,2,1,54,1,5,1,5 +63178,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,30543.064147,31583.211468,2,101,8,8,2.81,3,3,0,1,0,1,35,1,1,1,2 +63179,7,2,1,8,NA,2,2,1,8,100,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,13898.598114,14013.214919,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +63180,7,2,1,50,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10857.294346,10859.552755,1,91,15,15,5,6,6,0,2,2,1,50,2,5,1,5 +63181,7,2,2,67,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,10308.451947,2,90,8,8,2.01,4,4,0,0,1,2,67,2,4,2,NA +63182,7,2,2,14,NA,4,4,2,14,171,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10671.280357,10591.403308,1,99,15,8,2.7,4,3,0,2,0,1,49,1,4,6,NA +63183,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,20135.631696,26575.299535,1,96,4,4,1.12,2,2,0,1,0,2,44,1,2,5,NA +63184,7,2,1,3,NA,3,3,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,86817.367332,95073.481824,2,91,15,15,5,4,4,2,0,0,1,34,1,5,1,5 +63185,7,2,1,3,NA,4,4,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,11070.778245,1,100,3,3,0.73,3,3,2,0,0,2,39,1,3,5,NA +63186,7,2,1,11,NA,5,7,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11611.58308,11813.013945,1,98,14,14,3.16,6,6,2,2,0,1,39,1,5,1,5 +63187,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,26773.686592,29962.63786,2,98,6,6,1.7,2,2,0,0,2,2,80,1,2,1,2 +63188,7,2,2,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,12782.405209,13353.125929,1,100,3,3,1.17,1,1,0,0,1,2,60,1,4,4,NA +63189,7,2,2,0,5,4,4,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4964.196196,5018.399368,1,93,1,1,0.16,3,3,1,1,0,2,39,1,3,5,NA +63190,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,104765.204996,105038.68379,2,92,15,15,5,5,5,0,3,0,2,46,1,5,1,5 +63191,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,70667.985128,72578.248908,2,92,15,7,3.67,2,1,0,0,0,2,30,1,5,1,NA +63192,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,41229.806244,46206.205733,2,103,6,6,1.82,2,2,0,0,2,1,70,1,2,5,NA +63193,7,2,2,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,26389.420306,26882.397721,2,98,3,3,0.96,1,1,0,0,0,2,41,1,4,3,NA +63194,7,2,2,56,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,2,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12649.084278,13204.362319,3,90,4,4,0.92,3,3,0,0,1,2,56,2,2,1,2 +63195,7,2,1,59,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,3,1,NA,2,2,2,2,2,2,1,2,1,2,24211.824535,24594.266281,2,93,8,8,2.57,3,3,0,0,1,1,59,2,3,1,3 +63196,7,2,1,39,NA,4,4,1,NA,NA,2,NA,2,1,4,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18838.303827,18900.579975,2,93,12,12,NA,4,4,1,1,0,2,27,2,4,1,4 +63197,7,2,2,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,18070.666316,17918.945427,1,99,7,7,2.38,2,2,0,0,0,2,27,1,5,1,5 +63198,7,2,1,80,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,7199.330978,7340.349591,1,93,4,4,1.56,1,1,0,0,1,1,80,2,5,2,NA +63199,7,2,1,12,NA,3,3,1,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,27156.800586,27669.661454,1,92,5,5,1.05,3,3,1,1,0,2,35,1,4,5,NA +63200,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,164722.990078,163821.547042,1,90,15,15,5,3,3,0,0,0,1,59,1,5,1,5 +63201,7,2,1,7,NA,1,1,1,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12665.770043,13116.669484,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +63202,7,2,1,0,3,5,7,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6371.499593,6469.293142,2,95,12,14,3.93,4,3,1,0,0,1,35,1,5,1,4 +63203,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35334.703093,40990.264786,1,101,3,3,0.9,1,1,0,0,1,2,80,1,2,2,NA +63204,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,26757.554986,26943.613048,2,97,7,7,1.89,3,3,0,0,0,1,50,1,2,1,2 +63205,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,28216.191929,28480.821588,1,101,7,7,1.83,3,3,0,0,2,1,67,1,1,1,2 +63206,7,2,1,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,14204.262514,14001.792163,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +63207,7,2,2,8,NA,3,3,2,8,107,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,52414.628675,53163.961325,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +63208,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105261.096488,116369.237268,1,97,15,15,5,3,3,1,0,0,2,31,1,5,1,5 +63209,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,65033.706797,70202.805273,1,102,8,8,2.42,4,4,0,2,0,2,34,1,4,1,3 +63210,7,2,1,10,NA,4,4,2,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7250.311091,8640.316317,2,99,2,2,0.2,7,7,1,2,1,1,63,1,1,2,NA +63211,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,93110.905446,112207.13845,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +63212,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,11764.405491,12074.424659,1,97,4,4,1.34,1,1,0,0,1,1,62,1,5,5,NA +63213,7,2,1,43,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13535.287828,13486.390654,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +63214,7,2,1,37,NA,1,1,1,NA,NA,2,NA,2,1,5,NA,1,6,NA,2,2,2,1,2,2,1,2,2,2,37715.365512,38126.275234,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +63215,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,11862.334174,1,96,15,15,5,3,3,0,0,1,2,62,1,4,3,NA +63216,7,2,1,54,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,29042.244317,28700.143679,1,90,12,12,NA,4,4,0,0,0,1,54,2,4,1,2 +63217,7,1,2,8,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16195.492817,0,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +63218,7,2,1,35,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,34887.439952,35451.076414,2,94,3,3,0.82,2,2,0,0,0,1,35,2,1,1,2 +63219,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,20698.946375,20973.485449,3,91,15,15,5,1,1,0,0,0,1,39,2,5,5,NA +63220,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,22634.531479,23281.741513,1,103,9,2,0.81,3,1,0,0,0,1,27,1,5,5,NA +63221,7,2,2,67,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,16352.915834,18960.412859,3,92,8,8,2.97,2,2,0,0,1,1,49,1,2,3,NA +63222,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20360.306379,19986.123493,2,99,15,15,5,2,2,0,0,0,2,51,1,5,1,5 +63223,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,174307.982009,1,95,7,7,3.21,1,1,0,0,0,1,59,1,4,3,NA +63224,7,2,2,31,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,29102.738194,28317.485179,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +63225,7,2,2,63,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,11862.334174,1,96,12,12,NA,5,5,2,0,1,2,63,2,5,3,NA +63226,7,2,2,2,NA,2,2,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9267.834226,9392.475614,2,93,77,77,NA,4,4,1,1,0,2,33,2,4,1,4 +63227,7,2,2,40,NA,1,1,1,NA,NA,2,NA,99,NA,NA,NA,3,1,2,2,2,2,2,2,2,NA,NA,NA,NA,25713.328161,31117.9447,1,103,5,5,0.74,5,5,1,1,0,2,40,99,3,1,1 +63228,7,2,1,27,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,44074.735764,53571.145963,2,91,4,4,0.84,3,3,1,0,0,2,21,1,4,1,2 +63229,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,19440.793325,19514.660132,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +63230,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14455.875684,16658.375886,1,93,9,9,5,1,1,0,0,0,1,48,2,5,5,NA +63231,7,2,2,42,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,4,5,2,2,2,2,2,2,2,2,2,1,2,29141.220673,30195.229087,2,99,99,1,0,4,1,0,0,0,2,42,2,4,5,NA +63232,7,2,2,14,NA,4,4,1,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10128.026158,10319.790822,2,103,7,7,1.48,5,5,0,1,1,2,80,1,4,3,NA +63233,7,2,1,32,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,23284.536512,27522.885754,1,97,5,5,1.04,4,4,1,1,0,1,32,1,3,6,NA +63234,7,2,2,35,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,20310.041341,20837.576644,1,92,3,3,0.9,1,1,0,0,0,2,35,1,5,5,NA +63235,7,2,2,63,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,16352.915834,17093.606152,3,92,3,3,0.95,2,2,0,0,2,2,63,1,4,1,1 +63236,7,2,1,80,NA,2,2,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,14200.083364,14896.175407,2,98,3,3,1.1,1,1,0,0,1,1,80,1,3,3,NA +63237,7,2,1,2,NA,3,3,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49276.9767,53002.397569,2,98,15,15,5,3,3,1,0,0,1,26,1,4,1,4 +63238,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,2,2,NA,2,2,2,1,2,2,NA,NA,NA,NA,18006.276697,19962.608629,2,93,3,3,0.66,2,2,0,0,1,2,80,2,2,2,NA +63239,7,2,2,6,NA,4,4,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9399.281543,9563.245188,2,96,4,4,0.57,5,5,0,3,0,2,26,1,2,5,NA +63240,7,2,1,5,NA,2,2,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17306.08847,2,98,6,6,1.07,5,5,3,0,0,2,24,1,3,1,3 +63241,7,1,1,9,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37831.648033,0,1,99,77,77,NA,4,4,0,2,0,2,45,1,3,1,NA +63242,7,2,1,59,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,25221.349696,24851.265269,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +63243,7,2,1,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13058.677088,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +63244,7,2,1,4,NA,4,4,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9228.425814,10175.8485,1,96,8,8,2,4,4,1,2,0,2,40,1,4,5,NA +63245,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,99275.150567,100291.087043,2,95,12,5,1.79,2,1,0,0,0,2,40,1,4,6,NA +63246,7,2,1,13,NA,4,4,2,13,167,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13416.172328,13513.882801,1,96,15,15,5,4,4,0,1,0,1,42,2,4,1,4 +63247,7,2,1,19,NA,5,7,2,19,239,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13251.602554,13277.802057,1,96,15,15,5,3,3,0,0,0,2,40,1,5,1,4 +63248,7,2,1,75,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,67447.112074,71391.281096,1,101,15,15,5,3,3,0,0,2,1,75,1,2,1,2 +63249,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,102183.259724,105037.978798,2,90,15,8,4.59,2,1,0,0,2,1,67,1,5,6,NA +63250,7,2,1,17,NA,3,3,2,17,212,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,88198.948426,91036.751291,1,101,9,9,2.6,4,4,0,1,2,2,63,1,4,1,4 +63251,7,2,2,80,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,1,2,NA,1,2,1,1,2,2,NA,NA,NA,NA,15288.064726,15818.288224,3,91,3,3,0.54,3,3,0,0,1,1,57,2,4,1,3 +63252,7,2,1,7,NA,4,4,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11709.3276,12266.117914,1,100,8,8,3.3,2,2,0,1,0,2,44,1,4,3,NA +63253,7,2,2,13,NA,4,4,2,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11160.089502,11615.801738,2,99,99,99,NA,5,5,0,2,0,2,20,1,3,6,NA +63254,7,2,2,72,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,2,1,NA,2,2,2,1,2,2,1,2,2,NA,23271.708938,25108.705116,1,102,7,7,1.7,4,4,0,0,2,1,44,1,4,4,NA +63255,7,1,1,64,NA,4,4,NA,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,6239.974623,0,1,96,77,77,NA,2,2,0,0,2,1,64,1,5,1,5 +63256,7,2,1,9,NA,4,4,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10122.702296,10196.10824,2,93,9,9,2.86,4,4,1,1,0,1,30,1,4,6,NA +63257,7,2,2,6,NA,5,6,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6834.715094,7332.504615,2,90,5,5,1.08,3,3,0,1,0,2,29,2,4,1,5 +63258,7,2,1,1,12,3,3,2,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46703.291366,54723.864587,1,93,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +63259,7,2,2,7,NA,1,1,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10118.363218,10311.586628,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +63260,7,2,2,42,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,36276.046363,36418.32035,2,91,99,99,NA,3,3,0,0,0,1,40,NA,NA,1,4 +63261,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20434.221508,20198.461156,1,102,15,15,5,3,3,0,1,0,1,41,1,5,1,5 +63262,7,2,2,76,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,2,2,NA,2,2,2,1,2,2,2,2,2,NA,19352.965911,23161.019266,1,103,6,6,0.97,6,6,0,3,1,2,50,2,1,1,1 +63263,7,2,1,53,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,2,2,2,2,2,2,1,2,2,1,24211.824535,24594.266281,2,93,6,6,1.39,4,4,0,0,0,1,53,2,3,1,3 +63264,7,2,1,32,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,1,1,2,2,1,2,1,NA,20963.414192,21636.182301,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +63265,7,2,2,28,NA,4,4,2,NA,NA,2,NA,2,2,1,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,28823.434754,27922.831827,1,97,6,1,0,2,1,0,0,0,1,31,1,5,6,NA +63266,7,2,1,0,10,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6575.334977,7272.954395,2,95,2,2,0.42,3,3,2,0,0,1,25,1,3,5,NA +63267,7,2,2,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,35965.834545,38220.111719,1,101,3,3,1.12,1,1,0,0,1,2,72,1,3,2,NA +63268,7,2,1,12,NA,2,2,1,12,154,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15506.325263,16662.012915,1,103,5,5,0.74,5,5,0,1,0,1,47,2,1,1,1 +63269,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,25840.959268,29976.982116,1,101,77,77,NA,2,2,0,0,2,2,80,1,1,2,NA +63270,7,2,1,4,NA,1,1,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17306.08847,2,98,14,14,3.25,5,5,2,1,0,1,37,1,5,1,5 +63271,7,2,1,19,NA,5,6,1,19,236,2,NA,2,2,5,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8062.957534,8614.793403,1,92,12,12,NA,7,7,1,2,1,2,45,2,3,1,3 +63272,7,2,2,20,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,NA,NA,NA,1,2,2,1,114993.808573,116714.079488,1,98,7,NA,NA,4,1,0,0,0,2,20,1,4,5,NA +63273,7,2,1,66,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11492.781131,11942.286414,1,100,15,15,5,2,2,0,0,2,2,64,1,3,1,3 +63274,7,2,2,5,NA,5,7,1,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11956.543345,12952.739683,1,94,2,2,0.33,5,5,1,3,0,2,37,1,4,3,NA +63275,7,2,1,0,3,3,3,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22570.662508,23423.888442,1,92,9,9,2,6,6,1,3,0,1,33,1,4,1,4 +63276,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,18079.825103,18175.893804,2,97,3,3,0.92,1,1,0,0,1,1,67,1,1,2,NA +63277,7,2,1,18,NA,3,3,2,18,224,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,69216.263169,70543.167563,1,91,14,14,3.15,5,5,0,1,0,2,50,1,5,1,5 +63278,7,2,2,3,NA,5,6,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7029.864692,7462.832472,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +63279,7,2,1,1,18,4,4,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5770.570361,6126.790978,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +63280,7,2,1,12,NA,5,6,1,12,150,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7558.274942,7903.176011,2,96,15,15,5,3,3,0,2,0,2,42,2,5,4,NA +63281,7,2,1,40,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,35406.972937,35699.930106,2,98,6,6,1.21,4,4,1,0,0,2,49,2,2,6,NA +63282,7,2,1,5,NA,5,7,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11081.601387,11216.767571,2,95,6,6,1.3,4,4,1,1,0,1,47,1,5,1,4 +63283,7,2,1,36,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19133.795531,19387.575333,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +63284,7,2,1,79,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,81415.860066,87761.355472,1,97,7,7,2.64,2,2,0,0,2,1,79,1,4,1,3 +63285,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,42992.537371,49508.460769,2,95,3,3,1.16,1,1,0,0,1,2,80,1,3,2,NA +63286,7,2,2,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,10402.056617,1,101,4,4,0.79,3,3,1,0,0,1,41,1,3,1,3 +63287,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,18956.418923,20374.294465,2,101,99,99,NA,3,3,0,1,1,2,78,1,1,2,NA +63288,7,2,2,58,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16033.091438,16307.204086,1,96,77,77,NA,4,4,0,0,0,1,52,2,5,1,5 +63289,7,2,1,6,NA,3,3,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47990.623546,51629.685381,1,100,15,15,4.07,5,5,0,2,0,2,41,1,5,1,4 +63290,7,2,2,16,NA,4,4,2,16,201,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11436.28571,11295.489882,1,93,1,1,0.02,5,5,0,4,0,2,36,NA,NA,5,NA +63291,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,21799.527449,22114.217255,1,96,14,14,5,1,1,0,0,0,1,47,1,5,3,NA +63292,7,2,2,6,NA,5,7,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12292.225251,12666.385814,1,95,14,14,3.04,6,6,0,4,0,1,56,1,5,1,4 +63293,7,2,2,61,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,9570.416297,10355.226074,2,98,5,5,1.93,1,1,0,0,1,2,61,1,2,2,NA +63294,7,2,2,62,NA,5,7,1,NA,NA,2,NA,2,1,5,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9525.506997,9950.810696,2,93,9,9,5,1,1,0,0,1,2,62,2,4,3,NA +63295,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,44886.08631,48362.89646,2,102,6,6,1.15,5,5,0,0,2,1,80,1,5,1,1 +63296,7,2,2,55,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16672.82247,17074.238333,1,92,15,15,4.44,5,5,0,0,1,1,65,NA,NA,1,5 +63297,7,2,1,50,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,182298.775287,1,101,14,14,5,3,3,0,1,0,2,36,1,5,1,5 +63298,7,2,2,22,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16291.99448,17037.586582,1,90,15,15,3.7,5,5,0,0,0,1,54,NA,NA,1,NA +63299,7,2,1,17,NA,1,1,1,17,208,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22768.423624,23116.446945,2,98,9,9,2.6,4,4,0,2,0,1,30,1,2,1,2 +63300,7,2,2,5,NA,1,1,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19235.084509,21236.049482,3,92,4,4,0.65,4,4,2,0,0,2,20,1,3,5,NA +63301,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,12433.776145,13392.195631,2,99,6,6,1.39,4,4,1,0,1,2,63,1,3,3,NA +63302,7,2,1,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,123110.069898,131423.888983,1,101,5,5,1.45,2,2,0,0,0,2,49,1,4,3,NA +63303,7,2,1,7,NA,1,1,2,7,85,NA,NA,2,2,3,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11546.167056,12698.029578,1,90,4,4,0.47,7,7,1,1,0,2,50,2,1,1,1 +63304,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,98760.497744,125641.994435,2,91,15,6,2.69,2,1,0,0,0,1,44,1,3,5,NA +63305,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16905.961576,17390.157008,2,94,7,7,1.18,7,7,1,4,0,2,31,1,4,6,NA +63306,7,2,1,37,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,34438.924452,34418.648235,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +63307,7,2,1,8,NA,3,3,1,8,104,NA,NA,1,1,NA,1,NA,NA,NA,1,NA,2,1,2,2,1,2,2,1,66868.503099,69864.859716,1,98,15,15,4.34,4,4,1,1,0,1,41,1,5,1,5 +63308,7,2,1,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,22497.998055,22497.243767,1,102,4,2,0.73,2,1,0,0,0,1,36,NA,NA,4,NA +63309,7,2,1,0,10,5,6,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9148.090461,9898.749752,1,92,14,14,3.3,4,4,2,0,0,1,28,1,4,1,4 +63310,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,25964.813959,25539.412946,2,101,2,2,0.74,1,1,0,0,0,2,53,1,2,5,NA +63311,7,2,1,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7610.147862,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +63312,7,2,1,74,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,65208.881742,76821.663824,3,91,7,7,2.92,2,2,0,0,2,1,74,1,3,1,3 +63313,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20297.001922,20419.260869,1,96,15,15,5,2,2,0,0,0,1,56,1,5,1,5 +63314,7,2,2,0,8,4,4,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4200.172174,4368.199293,2,93,10,10,2.26,6,6,2,0,0,1,34,1,4,1,4 +63315,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17852.668137,18502.046882,3,91,3,3,0.54,3,3,0,0,1,1,57,2,4,1,3 +63316,7,2,1,10,NA,4,4,2,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9023.469661,9333.449986,2,90,14,14,4.25,4,4,0,2,1,2,45,2,5,5,NA +63317,7,2,1,32,NA,5,6,2,NA,NA,1,1,2,2,5,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17585.737085,18369.998342,2,91,12,5,2.2,3,1,0,0,0,1,29,NA,NA,5,NA +63318,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17115.540769,2,97,12,6,2.75,3,1,0,0,0,1,21,NA,NA,77,NA +63319,7,1,2,51,NA,5,6,NA,NA,NA,2,NA,2,1,7,NA,5,77,NA,1,2,2,1,2,2,NA,NA,NA,NA,18322.475193,0,3,91,12,14,5,2,1,0,0,0,2,51,2,5,77,NA +63320,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16844.740449,17983.530016,3,91,7,7,2.72,2,2,0,0,0,2,27,2,5,1,5 +63321,7,2,1,6,NA,3,3,2,6,82,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,65374.972543,69123.624578,1,90,15,15,5,4,4,0,2,0,1,37,1,5,1,5 +63322,7,2,2,6,NA,4,4,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9460.53021,9835.43092,1,96,6,6,1.98,2,2,0,1,0,2,29,1,3,5,NA +63323,7,2,2,48,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16833.890659,17522.038775,3,91,15,15,5,4,4,0,2,0,1,38,2,5,1,5 +63324,7,2,1,35,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,1,NA,NA,NA,NA,11715.79771,11871.189399,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +63325,7,2,2,2,NA,1,1,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,15816.39252,3,92,15,15,5,3,3,1,0,0,1,41,2,5,1,3 +63326,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,11574.200203,11257.441852,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +63327,7,2,1,14,NA,3,3,1,14,176,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25736.568804,25798.716176,3,92,5,5,1.03,4,4,0,3,0,1,55,1,4,4,NA +63328,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9793.924718,10231.212981,2,100,10,10,2.75,5,5,1,1,1,1,27,1,3,1,5 +63329,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,27842.199551,30775.350974,1,90,15,15,5,2,2,0,0,2,1,74,1,3,1,3 +63330,7,2,1,51,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,174520.785302,174976.353865,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +63331,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,64048.78027,64245.709042,2,95,6,6,1.98,2,2,0,0,0,1,35,1,4,1,4 +63332,7,2,2,15,NA,1,1,1,15,186,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18515.058419,19360.671834,2,96,6,6,0.87,6,6,1,3,0,1,46,2,1,1,1 +63333,7,2,1,66,NA,4,4,1,NA,NA,2,NA,2,2,8,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,8062.039403,9043.239367,2,103,4,4,0.99,2,2,0,0,2,1,66,2,3,1,NA +63334,7,2,1,9,NA,1,1,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10890.103352,10791.203193,1,102,4,4,0.61,5,5,2,2,0,2,27,2,2,5,NA +63335,7,2,1,10,NA,4,4,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10665.048307,10877.092316,1,96,6,6,1.52,3,3,0,1,0,2,44,1,3,1,3 +63336,7,2,2,9,NA,5,6,1,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7932.110938,8316.610099,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +63337,7,2,1,75,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,8544.243039,9048.352361,2,95,12,12,NA,3,3,0,0,3,2,73,1,2,1,1 +63338,7,2,1,31,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,28996.250643,28582.932384,2,101,14,14,5,1,1,0,0,0,1,31,1,4,3,NA +63339,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,15747.833197,16391.584661,3,91,14,14,4.03,4,4,0,2,0,1,51,2,4,1,5 +63340,7,2,1,26,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,34629.549705,1,94,5,5,0.74,5,5,1,1,0,2,24,1,3,1,4 +63341,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,18094.847125,18029.478224,3,91,14,9,2.68,6,4,0,0,2,1,48,2,1,1,1 +63342,7,2,1,10,NA,5,6,2,11,132,NA,NA,2,2,2,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8151.552109,8792.161653,1,90,14,14,3.98,3,3,0,1,0,1,33,2,5,1,5 +63343,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,129042.31855,133624.984525,2,101,14,14,4.86,3,3,0,1,0,1,53,1,4,1,5 +63344,7,2,2,26,NA,1,1,1,NA,NA,2,NA,2,2,1,NA,5,1,2,2,1,2,2,2,2,NA,NA,NA,NA,46606.430863,48004.221702,2,102,15,15,5,3,3,1,0,0,1,41,2,2,1,5 +63345,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10598.2543,1,99,6,6,1.84,2,2,0,0,2,1,69,1,3,1,4 +63346,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,51543.062078,54553.310105,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +63347,7,2,2,15,NA,1,1,1,15,189,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,26325.414456,26852.811114,3,92,7,7,1.3,5,5,1,2,0,2,33,2,2,1,1 +63348,7,1,2,10,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14716.367649,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +63349,7,2,2,48,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,20001.392001,24207.190257,1,100,99,99,NA,6,6,0,1,0,1,53,2,2,1,3 +63350,7,2,1,16,NA,3,3,1,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,103085.56884,109495.609645,1,94,15,15,5,4,4,0,1,0,1,41,1,5,1,5 +63351,7,2,2,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,26465.930618,26744.909102,2,100,14,14,4.59,3,3,1,0,0,1,30,NA,NA,1,4 +63352,7,2,1,64,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,125558.167126,127168.668278,1,94,15,15,5,4,3,0,0,1,1,33,1,2,5,NA +63353,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,36283.627734,36608.028102,1,102,5,1,0.21,5,4,1,1,0,2,24,1,4,5,NA +63354,7,2,2,1,17,4,4,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7881.296797,8480.363269,2,96,14,14,3.06,5,5,1,1,1,2,54,1,3,6,NA +63355,7,2,2,9,NA,1,1,2,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17596.36942,17952.278489,1,97,4,4,0.65,4,4,0,1,0,2,45,2,2,3,NA +63356,7,1,2,70,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,29145.675285,0,3,92,6,6,1.98,2,2,0,0,2,1,72,1,4,1,1 +63357,7,2,2,31,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,2,6,2,2,2,2,1,2,2,2,2,2,2,31460.18163,32805.207594,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +63358,7,2,1,6,NA,3,3,2,6,82,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14307.565788,15198.555052,3,91,3,3,0.76,3,3,0,1,0,2,24,1,4,6,NA +63359,7,1,1,1,16,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50163.512784,0,1,90,15,15,5,4,4,1,1,0,2,39,1,5,1,4 +63360,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35525.197101,39677.515157,2,93,8,8,2.17,4,4,0,0,2,2,62,1,4,3,NA +63361,7,2,1,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,8232.241159,8296.636338,2,98,6,6,2.75,1,1,0,0,1,1,67,1,5,2,NA +63362,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,38758.039282,0,1,101,6,6,1.78,2,2,0,0,2,1,80,1,2,1,1 +63363,7,2,2,65,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,35475.142583,36054.748166,2,95,2,2,0.75,1,1,0,0,1,2,65,1,5,5,NA +63364,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,21143.97379,23464.841482,1,97,12,12,NA,4,4,0,0,2,1,72,1,2,1,3 +63365,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,1,2,2,2,2,1,2,23200.373382,24548.135184,2,93,5,5,1.26,3,3,0,1,0,1,55,2,2,1,2 +63366,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5221.819282,5505.774343,3,90,3,3,0.37,5,5,2,2,0,2,36,2,4,4,NA +63367,7,2,1,10,NA,4,4,1,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8714.559478,8865.734494,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +63368,7,2,2,6,NA,1,1,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14300.71869,15541.734563,2,94,9,9,2.1,5,5,1,2,0,1,31,2,4,1,4 +63369,7,2,2,10,NA,4,4,2,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8147.287486,8590.325322,2,90,8,8,2.59,3,3,0,2,0,2,35,1,4,6,NA +63370,7,2,2,6,NA,2,2,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15148.721588,15796.67129,2,91,2,2,0.22,4,4,0,3,0,2,45,2,5,4,NA +63371,7,2,1,13,NA,4,4,2,13,161,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10162.625863,10628.468372,2,99,5,5,0.78,5,5,2,2,0,2,30,1,3,5,NA +63372,7,2,2,2,NA,1,1,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9955.153132,10271.907274,2,94,77,77,NA,4,4,2,0,0,2,27,2,3,1,3 +63373,7,2,2,29,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16937.04417,23964.143641,2,98,9,9,3.83,2,2,1,0,0,2,29,2,4,5,NA +63374,7,2,1,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,16851.334496,17374.092058,2,95,4,4,1.34,1,1,0,0,0,1,57,1,1,2,NA +63375,7,2,2,17,NA,3,3,2,17,206,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22046.14863,22741.646094,2,97,9,9,1.45,7,7,1,2,2,2,45,1,3,5,NA +63376,7,2,1,10,NA,1,1,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14042.313177,2,98,3,3,0.54,3,3,0,2,0,2,35,1,3,5,NA +63377,7,2,2,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,28315.055559,38147.595136,1,96,15,15,5,2,2,0,1,0,2,39,1,4,5,NA +63378,7,2,2,18,NA,1,1,1,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,16360.434077,17687.989006,3,91,5,5,1.03,4,4,0,2,0,2,42,2,1,5,NA +63379,7,2,1,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9983.293162,10181.782419,1,97,4,4,0.46,7,7,3,3,0,2,31,1,3,1,NA +63380,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,134450.153638,1,101,7,7,1.74,4,4,1,0,0,1,24,NA,NA,1,4 +63381,7,2,1,3,NA,4,4,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8947.841984,9500.1974,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +63382,7,2,1,39,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,30626.581617,30979.39441,2,90,6,6,0.96,5,5,1,1,0,1,39,2,2,1,NA +63383,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16801.552467,2,97,6,6,1.7,2,2,0,0,1,2,62,2,5,1,2 +63384,7,2,2,13,NA,5,7,2,13,161,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9508.389138,9876.066661,3,91,8,8,2.24,4,4,0,2,0,1,45,1,4,1,4 +63385,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,15369.196003,16055.414165,1,100,15,5,2.15,2,1,0,0,2,1,60,1,5,6,NA +63386,7,2,1,7,NA,2,2,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13927.458372,13742.678011,2,98,6,6,0.78,7,7,1,3,1,2,63,1,2,4,NA +63387,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,25989.236835,2,101,99,1,0.23,3,1,0,0,0,1,20,1,4,5,NA +63388,7,2,2,44,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,19100.40225,19426.955733,1,96,4,4,0.65,4,4,0,0,0,1,19,1,4,NA,NA +63389,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,31313.292063,33738.773556,1,95,6,6,1.65,2,2,0,0,2,2,80,1,4,1,4 +63390,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,151766.599459,154414.492891,3,91,7,7,1.97,4,4,0,0,1,2,77,1,5,2,NA +63391,7,2,1,70,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,4,1,NA,2,2,2,1,2,2,1,2,2,NA,11755.776731,12180.618102,3,90,7,7,1.15,7,7,2,1,1,2,30,1,9,1,4 +63392,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,63717.895797,67578.761066,2,101,5,5,1.36,2,2,0,0,0,2,22,1,4,5,NA +63393,7,2,2,19,NA,1,1,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20502.928313,21226.512457,2,98,8,8,2.24,4,4,0,0,0,1,58,2,1,1,3 +63394,7,2,1,16,NA,5,6,1,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,5873.088927,6275.048272,1,103,6,6,1.82,2,2,0,1,0,2,56,2,5,77,NA +63395,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,37456.985636,43133.944105,2,98,99,99,NA,2,2,0,0,2,2,80,1,3,1,1 +63396,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,26344.362464,28384.957988,2,95,13,13,NA,2,2,0,0,2,1,80,1,5,1,3 +63397,7,2,2,51,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,2,1,NA,1,2,1,1,2,1,1,2,1,NA,17018.449206,17108.441787,2,91,99,1,0,7,3,0,4,0,1,36,2,9,1,2 +63398,7,2,2,78,NA,5,6,1,NA,NA,2,NA,2,2,8,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,11812.364238,12222.042847,1,94,4,4,1.11,2,2,0,0,1,2,37,2,4,5,NA +63399,7,2,2,5,NA,1,1,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18078.669459,18848.958225,1,101,2,2,0.26,5,5,3,0,0,2,26,1,2,1,3 +63400,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,14883.664782,14924.287598,2,90,8,6,1.46,4,3,1,1,0,2,21,1,5,6,NA +63401,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,163194.688032,166437.638141,1,97,8,8,3.57,2,2,0,0,0,2,49,1,3,3,NA +63402,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16844.740449,18124.20195,3,91,14,14,5,2,2,0,0,0,2,27,2,5,1,5 +63403,7,2,1,8,NA,4,4,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10199.928366,10684.945227,1,100,9,9,2.22,5,5,1,2,0,2,40,2,4,1,4 +63404,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,20048.680628,21335.7055,2,95,2,2,0.46,3,3,0,0,0,2,48,1,2,1,2 +63405,7,2,2,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,15914.916287,16468.700526,2,99,8,8,3.47,2,2,0,0,1,2,74,1,5,2,NA +63406,7,2,1,12,NA,4,4,2,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12462.601191,12584.643654,2,97,5,5,0.92,5,5,0,3,0,2,54,1,3,2,NA +63407,7,2,2,16,NA,4,4,1,16,203,NA,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12531.903464,13043.632492,2,100,4,4,0.86,3,3,0,2,0,2,36,1,3,5,NA +63408,7,2,1,8,NA,4,4,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13818.701911,14596.53451,2,101,2,2,0.38,3,3,0,2,0,2,56,1,3,2,NA +63409,7,2,2,69,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,11009.072628,11500.615946,2,99,2,2,0.53,2,2,0,0,1,2,69,1,4,2,NA +63410,7,2,1,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16598.645683,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +63411,7,2,1,19,NA,4,4,2,19,233,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13863.378072,13964.345562,1,96,15,15,5,4,4,0,1,0,1,56,1,4,1,5 +63412,7,2,2,40,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,2,1,2,2,2,2,2,2,2,2,2,2,2,26889.724138,34281.795458,3,90,12,12,NA,2,2,0,1,0,2,40,2,2,1,NA +63413,7,2,2,61,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,128294.718377,130390.843426,1,93,15,15,5,4,3,0,0,3,1,80,1,5,2,NA +63414,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,113642.287024,118593.484239,1,101,9,6,2.24,2,1,0,0,0,2,27,1,3,6,NA +63415,7,2,1,18,NA,4,4,2,18,226,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8364.097643,8526.060452,2,90,6,6,0.96,5,5,0,1,0,1,55,1,4,6,NA +63416,7,2,2,7,NA,4,4,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7619.934086,8032.046596,1,103,8,8,1.95,4,4,0,1,0,2,48,1,5,1,5 +63417,7,2,2,6,NA,3,3,1,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,61745.495006,63723.291316,2,101,7,7,1.88,4,4,0,2,0,2,36,1,4,1,5 +63418,7,2,2,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,26595.398371,26963.678025,1,91,7,7,2.2,3,3,0,0,1,2,60,1,2,2,NA +63419,7,2,1,2,NA,3,3,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25107.382643,27005.542261,1,95,6,6,1.35,3,3,1,0,0,1,22,1,3,1,4 +63420,7,2,1,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,21963.854411,22169.845613,2,102,3,3,1.29,1,1,0,0,1,1,62,1,4,3,NA +63421,7,2,1,13,NA,5,6,1,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,8915.81491,9312.338117,1,92,2,2,0.33,5,5,0,1,0,1,51,2,1,4,NA +63422,7,2,2,64,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,12043.867275,12495.995159,1,91,1,1,0.05,2,1,0,0,2,1,72,1,1,3,NA +63423,7,2,2,2,NA,5,6,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6097.947961,6201.918891,1,96,15,15,4.34,4,4,1,1,0,1,36,2,5,1,5 +63424,7,2,1,17,NA,1,1,1,17,206,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24902.864049,25040.491572,1,94,5,5,0.94,4,4,0,2,0,2,37,2,3,1,2 +63425,7,2,1,51,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,1,1,2,2,1,2,2,1,13567.923118,13997.525763,3,91,14,14,4.03,4,4,0,2,0,1,51,2,4,1,5 +63426,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,33802.428047,1,95,3,3,1.19,1,1,0,0,0,1,58,1,2,3,NA +63427,7,2,2,9,NA,4,4,2,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9565.802332,9920.158544,1,96,14,14,2.58,6,6,2,2,0,1,40,2,4,1,4 +63428,7,2,2,13,NA,1,1,1,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18515.058419,19360.671834,2,96,6,6,1.12,4,4,0,3,0,1,26,1,2,77,NA +63429,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,16386.190684,20296.970403,2,90,7,4,1.38,2,1,0,0,0,1,21,1,3,5,NA +63430,7,2,2,4,NA,3,3,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26966.264969,27815.81123,1,98,6,6,1.31,3,3,2,0,0,2,22,1,3,5,NA +63431,7,2,1,34,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,2,5,NA,1,2,2,1,2,1,1,2,2,1,20071.705576,20599.326983,3,91,6,6,1.12,4,4,0,0,2,1,69,2,3,1,1 +63432,7,2,1,7,NA,3,3,1,7,89,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48147.167375,49984.220445,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +63433,7,2,1,4,NA,5,7,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10276.262805,11525.953064,1,97,15,15,4.77,4,4,1,1,0,2,40,1,5,1,5 +63434,7,2,2,23,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16844.740449,17849.904413,3,91,6,3,1.1,3,1,0,0,0,2,23,1,5,5,NA +63435,7,2,1,14,NA,3,3,2,14,177,NA,NA,2,1,1,9,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,26858.274239,26923.130249,2,97,5,5,0.8,5,5,1,2,0,1,46,2,4,1,2 +63436,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,1,2,1,2,2,1,2,2,NA,29302.509441,32727.496464,2,95,15,15,5,3,3,0,0,1,2,47,1,4,1,5 +63437,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,128575.977224,133862.807708,1,102,6,4,1.38,2,1,0,0,0,2,23,1,5,5,NA +63438,7,2,1,64,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,6358.062034,6283.458155,1,99,15,15,5,2,2,0,0,2,1,64,1,3,1,4 +63439,7,2,1,51,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,23431.677775,25582.72205,2,93,10,10,3.4,3,3,0,1,0,1,51,1,3,1,4 +63440,7,2,1,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,NA,54654.899954,58048.628546,2,103,6,6,1.82,2,2,0,0,2,1,70,1,2,5,NA +63441,7,2,1,3,NA,2,2,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14505.510202,14676.996441,2,94,6,6,1.43,5,4,2,1,0,2,23,2,3,6,NA +63442,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,24719.680932,27438.0417,1,97,4,4,1.61,1,1,0,0,0,2,51,1,4,3,NA +63443,7,2,2,8,NA,3,3,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,23750.822126,1,95,7,7,1.17,6,6,1,3,0,2,44,1,4,1,NA +63444,7,2,2,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8317.65714,8487.710712,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +63445,7,2,2,21,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,41527.748953,47819.246487,2,97,1,1,0.01,1,1,0,0,0,2,21,1,4,5,NA +63446,7,2,1,16,NA,4,4,1,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,6,6,1.16,4,4,0,3,0,2,36,1,4,4,NA +63447,7,2,2,9,NA,4,4,2,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8192.839047,8748.579234,2,99,5,5,1.32,2,2,0,1,0,2,34,1,4,5,NA +63448,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,47098.572584,49762.054694,1,95,5,5,1.43,2,2,0,0,2,1,80,1,3,1,4 +63449,7,2,1,38,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,2,1,2,2,1,2,2,2,41241.224595,43514.733172,2,102,6,6,1.12,4,4,1,1,0,1,38,2,2,1,3 +63450,7,2,1,6,NA,2,2,1,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16028.98796,15961.028504,1,100,14,14,4.71,3,3,0,1,0,1,38,1,5,1,5 +63451,7,2,1,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16088.355002,17176.258631,2,100,13,13,NA,2,2,0,0,1,2,71,NA,NA,1,NA +63452,7,2,1,11,NA,4,4,1,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10469.725162,11059.049224,1,100,1,1,0,4,4,1,2,0,2,35,1,2,5,NA +63453,7,2,1,48,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,1,1,2,1,2,2,2,2,46745.699003,49120.516055,2,98,13,13,NA,5,5,0,2,0,1,48,2,1,1,2 +63454,7,2,1,13,NA,5,6,2,13,159,NA,NA,2,2,1,6,NA,NA,NA,1,1,1,NA,NA,NA,1,2,1,NA,10346.302718,11892.421636,2,91,99,1,0,7,3,0,4,0,1,36,2,9,1,2 +63455,7,2,1,30,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,24134.97174,25042.42256,1,98,7,7,1.52,4,4,2,0,0,1,30,1,3,1,4 +63456,7,2,1,80,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,17609.976188,17569.292452,1,98,15,15,5,5,5,0,1,1,2,55,1,5,1,5 +63457,7,2,1,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25807.688156,26357.095043,1,100,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +63458,7,2,2,0,1,2,2,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8264.844608,8090.961959,1,93,14,14,4.75,3,3,1,0,0,2,42,1,5,1,5 +63459,7,2,2,80,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,2,2,2,2,2,2,NA,21933.218587,23583.994398,1,93,2,2,0.43,2,2,0,0,2,2,80,2,1,2,NA +63460,7,2,1,2,NA,3,3,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47507.757497,54303.981935,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +63461,7,2,2,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,34906.069211,35828.732314,1,103,1,1,0.03,3,3,0,0,0,1,50,1,2,3,NA +63462,7,2,2,18,NA,4,4,2,18,218,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10484.6104,10912.740054,2,99,3,3,0.56,4,4,1,0,0,2,38,1,3,5,NA +63463,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,117419.769432,119338.215671,2,95,15,15,5,2,2,0,0,1,1,54,NA,NA,1,4 +63464,7,2,1,7,NA,1,1,1,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17882.621856,18280.794545,3,92,8,8,1.55,6,6,1,3,0,2,38,1,5,1,4 +63465,7,2,1,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16385.890285,2,100,10,10,4.42,2,2,0,0,0,2,55,1,2,1,4 +63466,7,2,1,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17602.101156,21123.738865,1,96,14,14,2.19,7,7,0,2,0,1,39,1,2,1,3 +63467,7,2,2,10,NA,4,4,1,11,132,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9139.784234,11102.911341,2,100,6,6,0.85,6,6,0,2,0,1,59,1,3,1,3 +63468,7,2,1,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,26052.523863,2,101,NA,99,NA,2,1,0,0,0,1,55,1,2,3,NA +63469,7,2,2,14,NA,2,2,2,14,175,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,14437.97544,16344.869867,2,90,3,3,0.38,5,5,0,4,0,2,33,2,2,5,NA +63470,7,2,1,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6580.937346,7256.559544,2,97,3,3,0.66,3,3,2,0,0,2,19,1,3,NA,NA +63471,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,37074.886861,38850.492434,1,101,3,3,1.07,2,1,0,0,1,2,65,1,3,3,NA +63472,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,137368.929197,138597.101074,1,91,6,5,1.93,2,1,0,0,0,2,24,1,4,6,NA +63473,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,31313.292063,33738.773556,1,101,7,7,2.31,2,2,0,0,2,2,80,1,4,1,2 +63474,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,74761.468834,80588.325624,2,91,7,7,1.89,3,3,0,0,2,2,69,NA,NA,1,4 +63475,7,2,1,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,111236.95715,110951.212312,2,92,15,6,2.75,2,1,0,0,0,1,41,1,4,5,NA +63476,7,2,2,15,NA,1,1,1,15,187,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21818.047789,22469.060223,2,102,5,5,0.89,4,4,1,2,0,2,36,2,5,3,NA +63477,7,2,2,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10389.292229,10657.457488,2,95,6,6,1.65,2,2,1,0,0,2,27,2,4,5,NA +63478,7,2,1,62,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,22184.040999,24922.402846,2,94,3,3,1.01,1,1,0,0,1,1,62,1,3,3,NA +63479,7,2,2,19,NA,4,4,1,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,1,1,0.16,4,1,0,0,0,2,21,1,4,5,NA +63480,7,2,2,9,NA,1,1,1,9,117,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,10870.942302,10985.231575,2,103,5,5,0.89,5,5,1,3,0,2,34,2,1,99,NA +63481,7,2,2,48,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,33737.181071,40665.783943,2,91,4,4,0.76,4,4,1,0,0,2,25,2,4,77,NA +63482,7,2,2,43,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,22513.236051,21981.065205,1,91,10,10,2.56,5,5,0,3,0,1,51,2,5,1,4 +63483,7,2,1,2,NA,1,1,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14810.484787,14830.497242,1,92,10,10,3.04,4,4,2,0,0,2,37,2,5,1,5 +63484,7,2,1,69,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,95193.424282,96086.209653,1,100,5,5,2.15,1,1,0,0,1,1,69,1,5,3,NA +63485,7,2,1,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18668.895165,18966.875509,1,96,13,13,NA,5,5,1,1,0,1,42,1,3,5,NA +63486,7,2,2,11,NA,2,2,2,11,134,NA,NA,2,1,4,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15583.587534,16935.930722,1,93,15,15,5,4,4,0,2,0,1,50,1,5,1,5 +63487,7,2,1,17,NA,4,4,1,17,208,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12972.249316,12937.057154,1,100,15,15,3.7,5,5,0,3,0,1,51,1,5,1,5 +63488,7,2,2,6,NA,4,4,1,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9309.947844,9654.826166,2,98,14,14,3.36,4,4,0,2,0,1,37,1,4,1,4 +63489,7,2,1,32,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,85455.763827,87903.260844,2,92,10,10,4.89,2,2,0,0,0,2,34,2,5,1,5 +63490,7,2,2,11,NA,3,3,1,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58636.069237,60514.266203,1,100,6,6,1.18,5,5,2,2,0,2,40,1,5,3,NA +63491,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,146951.437687,151959.13798,1,98,15,15,5,3,3,0,0,0,1,56,1,5,1,5 +63492,7,1,1,69,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,7101.739553,0,2,100,3,3,0.92,1,1,0,0,1,1,69,1,2,3,NA +63493,7,2,2,65,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,2,1,2,1,3,14388.729229,15167.035829,1,90,2,2,0.33,2,2,0,0,2,2,65,2,3,1,5 +63494,7,2,2,0,2,4,4,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5099.47985,5303.483608,1,100,9,9,1.78,6,6,1,1,0,2,45,2,3,1,3 +63495,7,2,2,14,NA,5,7,1,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11419.438939,11635.655291,2,103,7,7,1.55,5,5,2,2,0,2,31,1,4,3,NA +63496,7,2,1,58,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,124170.603852,125419.736085,2,98,6,6,2.57,1,1,0,0,0,1,58,1,3,3,NA +63497,7,2,2,1,21,2,2,2,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10047.902864,11093.154402,1,90,3,3,0.43,4,4,2,0,0,1,31,1,3,6,NA +63498,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,20131.904783,23186.488493,2,98,6,6,3.01,1,1,0,0,1,2,70,1,3,2,NA +63499,7,2,2,33,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,1,6,2,2,2,2,2,2,2,2,2,2,2,38218.668882,37878.487888,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +63500,7,2,1,53,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,15001.445077,15740.201709,2,99,7,7,1.63,4,4,0,2,0,1,53,1,3,3,NA +63501,7,1,2,4,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13366.393396,0,3,92,8,8,2.01,4,4,1,0,0,2,49,2,5,4,NA +63502,7,2,1,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,11245.778093,11672.431186,1,98,5,5,1.59,2,2,0,0,2,1,73,1,2,1,5 +63503,7,2,2,3,NA,3,3,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,52983.056893,55223.723565,3,91,15,15,5,6,6,1,3,0,2,40,1,5,1,5 +63504,7,2,1,54,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,2,33162.406014,34847.152396,3,92,10,10,4.3,5,2,2,1,1,2,68,1,3,1,1 +63505,7,2,2,0,1,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23207.538828,22577.170535,1,94,9,9,2.88,3,3,1,0,0,2,28,1,4,1,4 +63506,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,2,2,2,1,2,2,2,9716.805546,10308.451947,2,90,5,5,1.19,3,3,1,0,1,2,60,2,1,4,NA +63507,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,9015.10987,2,95,3,3,1.31,1,1,0,0,1,2,61,1,2,2,NA +63508,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,21340.150623,22501.62641,2,95,4,4,1.19,2,2,0,0,0,2,34,1,4,4,NA +63509,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,3,2,0.54,4,1,0,0,0,1,20,1,4,5,NA +63510,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,199029.909449,1,91,15,15,5,2,2,0,0,0,2,56,1,4,1,4 +63511,7,2,1,1,17,3,3,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24594.444896,28818.16319,1,98,4,4,0.66,4,4,2,0,0,2,22,1,4,6,NA +63512,7,2,1,64,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,11019.434708,12461.093856,3,91,4,4,0.81,3,3,0,0,1,1,64,2,1,1,1 +63513,7,1,1,17,NA,4,4,NA,NA,NA,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,15360.522091,0,1,98,15,15,5,4,4,0,2,0,2,50,1,5,1,5 +63514,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,13399.379222,14870.161708,2,90,4,4,1.2,2,2,0,0,2,2,80,1,3,2,NA +63515,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,220233.315202,222507.874115,1,98,14,14,5,2,2,0,0,0,1,59,1,3,1,4 +63516,7,2,2,54,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,22632.809716,22750.837894,1,103,3,3,0.79,2,2,0,0,0,2,54,2,1,4,NA +63517,7,2,1,10,NA,5,7,1,10,123,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7101.095162,7528.512272,2,96,15,15,5,3,3,0,2,0,2,42,2,5,4,NA +63518,7,2,2,3,NA,1,1,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13366.393396,13935.903375,2,94,6,6,1.15,5,5,1,2,0,1,33,1,2,1,2 +63519,7,2,1,54,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,16117.991297,16620.832307,1,96,9,9,2.78,4,4,0,2,0,1,54,2,5,4,NA +63520,7,2,2,0,0,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21671.775435,21083.121886,1,98,15,15,4.77,4,4,2,0,0,1,35,1,4,1,5 +63521,7,2,2,15,NA,5,6,2,15,183,NA,NA,2,1,4,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8424.942002,9162.575745,2,94,15,15,5,3,3,0,1,0,1,50,1,2,1,4 +63522,7,2,1,6,NA,4,4,2,6,82,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8579.422451,8987.382625,1,99,3,3,0.75,2,2,0,1,0,2,41,1,5,77,NA +63523,7,2,2,22,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,128171.594518,135937.909642,1,93,14,7,3.95,2,1,0,0,0,2,26,1,5,5,NA +63524,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,24072.616069,27614.797496,1,100,4,4,1.16,2,2,0,0,2,1,73,1,3,1,3 +63525,7,1,2,52,NA,5,6,NA,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12649.084278,0,3,90,77,77,NA,3,3,0,0,0,1,56,NA,NA,1,5 +63526,7,2,2,9,NA,3,3,1,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,51531.402068,50847.086518,1,94,14,14,2.96,5,5,0,3,0,2,39,1,4,1,3 +63527,7,2,2,11,NA,1,1,1,11,140,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12215.503444,12532.555214,1,102,5,5,0.92,5,5,0,3,0,2,39,2,3,1,3 +63528,7,2,2,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,43717.124878,44415.60038,2,101,6,6,1.54,3,3,0,1,0,2,34,1,4,1,3 +63529,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,31962.323978,33458.586112,1,100,4,4,1.06,3,2,0,0,0,1,22,1,4,6,NA +63530,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,28483.117096,31921.002992,1,94,3,3,0.39,6,6,1,0,2,1,80,1,4,1,3 +63531,7,2,1,32,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,1,2,2,1,2,2,2,54969.430704,54554.559034,1,100,NA,13,NA,2,1,0,0,0,1,32,2,1,6,NA +63532,7,2,1,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,19752.546483,23704.421997,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +63533,7,2,2,32,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,3,1,2,2,1,2,2,1,2,2,1,41791.57979,40949.069487,2,102,15,12,NA,5,4,0,3,0,1,42,2,4,6,NA +63534,7,2,1,39,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,43108.74283,42783.38752,2,91,8,8,1.85,5,5,0,2,1,1,39,2,3,1,4 +63535,7,2,2,3,NA,2,2,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9793.360626,10410.766193,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +63536,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12105.109893,11778.058179,1,95,6,6,0.83,7,6,2,1,0,1,43,1,4,1,4 +63537,7,2,1,1,19,5,6,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5492.796032,5818.035599,2,100,4,4,0.5,6,6,2,1,0,1,30,2,4,1,3 +63538,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16519.058735,17573.900053,1,97,77,77,NA,3,3,0,0,3,2,62,1,5,1,NA +63539,7,2,1,14,NA,1,1,1,14,173,NA,NA,2,2,2,8,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,30061.88611,30025.949584,1,92,5,5,0.87,4,4,0,2,0,1,42,2,1,1,4 +63540,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,27944.169354,28022.783308,2,94,3,3,1.24,1,1,0,0,0,2,57,1,2,3,NA +63541,7,2,1,70,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,11755.776731,15354.199056,3,90,12,12,NA,6,6,0,0,2,1,70,2,1,1,1 +63542,7,2,2,2,NA,3,3,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14718.567269,15747.930582,2,97,3,3,0.43,6,6,1,3,0,2,36,2,4,3,NA +63543,7,2,2,74,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,13446.397433,13865.38304,1,93,13,13,NA,2,2,0,0,2,1,76,2,5,1,5 +63544,7,2,1,63,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,4,1,NA,2,2,2,2,2,2,1,2,2,2,9357.880765,9682.593718,2,90,10,10,2,7,7,0,3,1,1,63,2,4,1,NA +63545,7,2,2,56,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19319.908753,18964.846355,1,96,15,15,5,2,2,0,0,0,1,56,1,5,1,5 +63546,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,30212.098573,35047.752261,2,98,3,3,1.1,1,1,0,0,1,2,80,1,1,2,NA +63547,7,2,1,0,4,4,4,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5825.739712,6022.371944,1,99,2,2,0.43,3,3,2,0,0,2,26,1,4,5,NA +63548,7,2,2,0,10,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9189.424641,8939.81946,1,98,6,6,1.65,2,2,1,0,0,2,24,1,3,4,NA +63549,7,2,2,5,NA,4,4,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9404.475744,9924.78953,1,96,14,14,2.58,6,6,2,2,0,1,40,2,4,1,4 +63550,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,14834.928147,19579.353906,1,103,2,2,0.53,2,2,0,1,0,2,51,1,3,5,NA +63551,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,109027.902363,130159.069706,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +63552,7,2,1,50,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23431.677775,23884.31716,2,93,8,8,2,4,4,1,1,0,1,50,2,4,1,4 +63553,7,2,1,76,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,8155.039267,8917.162886,3,90,99,99,NA,2,2,0,0,1,1,76,2,3,3,NA +63554,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,8895.639271,8965.223759,1,96,15,15,5,2,2,0,0,2,1,61,1,5,1,5 +63555,7,2,1,6,NA,2,2,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13898.598114,14013.214919,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +63556,7,2,1,64,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9082.311855,9548.677283,1,96,7,7,2.64,2,2,0,0,2,1,64,2,5,1,5 +63557,7,2,1,3,NA,5,7,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8981.553859,10073.795326,3,91,15,15,5,3,3,1,0,0,2,39,2,5,1,5 +63558,7,2,2,18,NA,3,3,2,19,228,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,99340.784743,108314.70799,2,94,12,12,NA,5,5,1,1,0,1,37,1,4,1,3 +63559,7,2,1,41,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,20543.822351,1,97,15,15,4.77,4,4,1,1,0,1,41,2,4,1,5 +63560,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,116165.700541,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +63561,7,1,2,65,NA,2,2,NA,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,10938.831279,0,1,93,6,6,1.55,3,3,0,0,3,1,61,2,4,1,1 +63562,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,43892.276067,44574.41704,1,98,6,1,0,2,1,0,0,0,1,29,1,4,5,NA +63563,7,2,1,16,NA,4,4,2,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10817.360862,11313.215634,2,99,99,99,NA,5,5,0,2,0,2,20,1,3,6,NA +63564,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,65706.229298,0,1,101,10,10,4.3,2,2,0,0,2,1,80,1,2,1,4 +63565,7,2,2,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12280.58152,13558.091553,2,92,14,14,4.03,4,4,1,1,1,2,30,1,5,4,NA +63566,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,14809.997435,16069.288743,2,101,13,3,0.64,5,4,0,3,1,2,62,1,1,2,NA +63567,7,2,2,9,NA,5,7,2,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10699.45895,11230.540406,1,97,8,8,2.51,3,3,0,2,0,2,39,2,4,2,NA +63568,7,2,1,19,NA,4,4,1,19,235,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12792.875152,12871.476461,2,93,99,99,NA,7,6,1,0,0,1,19,1,3,NA,NA +63569,7,2,2,49,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,2,2,2,1,2,2,NA,NA,NA,NA,25778.164795,26907.837256,2,90,77,77,NA,3,3,0,0,0,2,49,1,2,5,NA +63570,7,1,1,71,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,17780.584319,0,1,97,3,3,1.16,1,1,0,0,1,1,71,1,2,3,NA +63571,7,2,1,36,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,12031.037329,12793.158379,1,99,10,10,3.99,3,3,0,1,0,1,36,2,2,6,NA +63572,7,2,2,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,81857.569857,83650.947594,2,92,15,7,3.67,4,1,0,0,0,1,28,1,5,5,NA +63573,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,22154.886709,21259.816918,1,96,7,7,2.31,2,2,0,0,1,2,62,1,3,3,NA +63574,7,2,1,6,NA,5,6,2,6,78,NA,NA,1,1,NA,1,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5399.929397,5851.470272,3,91,15,15,5,3,3,0,1,0,2,40,2,5,1,5 +63575,7,2,1,19,NA,5,6,2,19,233,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6999.347953,7445.743611,3,90,9,9,2.6,4,4,0,0,1,1,62,2,4,1,5 +63576,7,2,1,46,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,39244.104141,38781.831565,1,90,15,15,5,4,4,1,1,0,2,40,1,5,6,NA +63577,7,2,2,5,NA,1,1,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12714.663639,13256.404976,1,102,4,4,0.5,6,6,2,2,0,1,25,1,2,1,3 +63578,7,2,2,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,17754.413992,17268.517878,2,99,6,6,1.11,5,5,1,2,0,2,41,1,2,5,NA +63579,7,2,1,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,120735.071461,122283.708051,1,94,8,8,2.41,3,3,0,0,3,1,63,1,4,1,5 +63580,7,2,1,9,NA,3,3,1,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24713.905595,25821.327941,1,98,4,4,0.67,5,5,1,2,0,1,29,1,4,1,3 +63581,7,2,2,14,NA,5,6,1,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,5760.953091,5914.685125,2,92,8,8,1.91,5,5,0,2,1,2,47,2,1,1,3 +63582,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,33821.324425,34164.529253,3,92,4,3,0.52,5,4,0,0,0,2,57,1,4,1,2 +63583,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,38321.717684,40488.857872,1,95,15,15,5,2,2,0,0,2,2,80,1,4,1,4 +63584,7,2,2,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,33506.462855,33906.169633,2,96,3,3,0.38,5,5,1,2,0,2,30,1,3,5,NA +63585,7,2,2,8,NA,4,4,2,8,99,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7282.523598,8846.731146,2,99,5,5,0.76,5,5,0,2,0,1,51,1,2,1,2 +63586,7,2,1,4,NA,4,4,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11342.022131,11810.675983,2,102,4,4,0.53,6,6,2,2,0,2,27,1,2,1,2 +63587,7,2,1,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,69063.138927,71041.142737,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +63588,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,41229.806244,46206.205733,1,103,6,6,1.98,2,2,0,0,2,1,80,1,5,1,4 +63589,7,2,1,80,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,2,1,2,1,1,2,2,NA,12882.868646,13921.030537,2,92,77,77,NA,5,5,0,1,2,2,80,NA,NA,1,1 +63590,7,2,1,21,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21495.752024,21074.130073,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +63591,7,2,2,19,NA,5,6,1,19,236,2,NA,2,2,1,13,NA,NA,NA,1,2,1,1,2,1,1,2,2,NA,6145.01663,6308.997467,2,101,12,1,0,5,1,0,0,0,2,19,2,3,NA,NA +63592,7,2,2,2,NA,4,4,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6276.300496,6799.229858,2,99,1,1,0.1,6,6,2,3,0,2,31,1,2,5,NA +63593,7,2,1,77,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,73144.179917,78844.986335,2,91,77,77,NA,2,2,0,0,2,2,70,1,3,1,4 +63594,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5256.453918,5473.651288,1,99,5,5,0.84,5,5,2,1,0,1,35,1,3,1,2 +63595,7,2,2,27,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,1,2,1,2,1,1,2,1,NA,NA,NA,NA,8044.549611,8388.06604,2,92,10,6,1.12,7,4,1,1,1,2,27,2,3,1,3 +63596,7,2,1,74,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,15470.980685,17519.370244,1,91,7,7,3.58,1,1,0,0,1,1,74,1,2,1,NA +63597,7,2,1,22,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,14385.653726,15564.966804,2,101,14,8,4.59,2,1,0,0,0,1,22,2,4,5,NA +63598,7,2,2,18,NA,2,2,2,18,223,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16189.692833,16766.382859,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +63599,7,1,2,76,NA,2,2,NA,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,18241.877822,0,2,93,7,7,2.31,2,2,0,0,2,1,80,2,1,1,1 +63600,7,2,2,10,NA,3,3,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,51093.739991,50940.240166,2,102,14,14,3.44,5,5,1,2,0,2,34,1,4,6,NA +63601,7,2,1,5,NA,3,3,1,6,73,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,50644.672852,56040.796491,2,100,NA,NA,NA,5,5,1,2,0,1,36,NA,NA,3,NA +63602,7,2,1,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,18838.303827,19546.605226,2,93,5,5,1.05,3,3,1,0,0,2,29,1,3,5,NA +63603,7,2,1,11,NA,1,1,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13533.281742,14131.961026,1,100,7,7,1.74,4,4,0,2,0,2,39,2,1,1,3 +63604,7,2,2,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11414.885224,11778.085279,1,94,7,7,1.56,4,4,2,0,0,1,21,1,4,1,4 +63605,7,2,1,7,NA,4,4,2,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9502.15317,9484.287948,2,97,3,3,0.4,6,6,2,3,0,2,25,1,2,5,NA +63606,7,2,1,6,NA,3,3,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24713.905595,25821.327941,1,98,4,4,0.67,5,5,1,2,0,1,29,1,4,1,3 +63607,7,2,1,41,NA,1,1,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,36273.943099,35741.678901,1,90,15,15,4.77,4,4,1,1,0,2,41,1,5,1,2 +63608,7,2,2,71,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,1,4,NA,2,2,2,1,2,2,2,2,1,NA,12972.932238,13949.32349,2,93,6,6,0.98,5,5,0,2,1,1,48,2,5,1,5 +63609,7,2,1,66,NA,5,7,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,23761.280382,24066.059994,2,103,5,5,1.2,3,3,0,0,2,1,66,2,2,1,2 +63610,7,2,1,16,NA,4,4,2,16,195,NA,NA,2,2,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11523.287163,11546.069645,1,96,8,8,2.17,4,4,0,2,0,2,45,2,5,4,NA +63611,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,1,2,1,2,2,1,2,2,NA,20944.990388,22567.358502,2,95,6,6,1.57,3,3,0,0,2,1,80,1,2,1,4 +63612,7,1,1,5,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8006.699948,0,1,90,15,15,5,3,3,1,0,0,1,42,1,5,1,5 +63613,7,2,1,30,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,40219.06806,40845.122132,1,93,9,9,3.98,3,2,0,0,0,2,27,1,3,1,4 +63614,7,2,2,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32144.824104,32969.273278,2,97,2,2,0.77,1,1,0,0,0,2,58,1,2,3,NA +63615,7,2,2,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,128171.594518,135937.909642,1,93,14,9,5,2,1,0,0,0,2,26,1,5,5,NA +63616,7,2,1,9,NA,5,6,2,9,115,NA,NA,2,1,3,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6026.102306,6805.584778,2,95,6,6,1.08,4,4,1,1,0,1,39,1,4,1,4 +63617,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,90303.174138,94631.352733,2,92,15,8,4.59,2,1,0,0,0,2,29,1,5,1,NA +63618,7,2,2,2,NA,5,6,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6024.192029,6555.678695,2,103,15,15,5,3,3,1,0,0,1,35,1,9,1,5 +63619,7,2,1,1,21,3,3,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53040.637714,62149.552868,3,91,8,8,1.95,4,4,2,0,0,2,30,1,5,1,4 +63620,7,2,1,61,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14113.631895,14272.623174,1,92,9,9,3.97,2,2,0,0,1,2,59,1,5,1,4 +63621,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,129559.2554,1,98,14,14,4.96,2,2,0,0,2,1,71,1,5,1,5 +63622,7,2,1,18,NA,3,3,2,18,222,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,88448.252445,87285.839384,1,95,9,9,3.24,3,3,0,0,0,2,42,1,4,3,NA +63623,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,20611.860643,21777.486671,1,99,5,5,2.02,1,1,0,0,1,1,80,1,5,2,NA +63624,7,2,2,7,NA,1,1,1,7,90,NA,NA,2,2,3,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13616.85154,14798.521446,1,102,6,6,1.73,3,3,0,1,0,1,30,2,5,1,4 +63625,7,2,2,23,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,50915.06085,54078.415833,3,92,2,2,0.4,3,3,1,0,0,1,21,1,2,6,NA +63626,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,58826.425292,59007.297053,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +63627,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,56180.550638,62747.143757,2,98,8,8,3.4,2,2,0,0,2,1,80,1,4,1,4 +63628,7,1,1,61,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,125558.167126,0,3,91,12,5,2.02,2,1,0,0,1,1,61,1,3,3,NA +63629,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,15542.93857,15828.161907,3,91,7,7,2.16,3,3,1,0,1,2,36,2,5,1,NA +63630,7,2,2,11,NA,3,3,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41020.258665,40851.726244,1,103,15,15,5,2,2,0,1,0,1,49,1,5,77,NA +63631,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85610.546667,92292.669073,2,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +63632,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,65891.955175,73297.270697,1,95,7,7,2.72,2,2,0,0,2,1,80,1,3,1,3 +63633,7,2,1,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13232.135,13189.930654,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +63634,7,2,1,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8890.779467,9258.147648,3,91,1,1,0.07,6,6,2,3,0,2,30,1,2,3,NA +63635,7,2,1,79,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,1,2,NA,55241.951079,58472.387275,2,93,7,7,2.31,2,2,0,0,2,2,79,1,3,1,5 +63636,7,2,1,17,NA,4,4,2,17,204,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11093.269222,11505.803928,2,99,3,3,0.44,5,5,1,1,0,2,53,1,4,1,3 +63637,7,2,1,7,NA,3,3,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,74331.764009,78594.005469,2,91,15,15,5,3,3,0,2,0,1,44,2,5,3,NA +63638,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,125007.681473,127469.032295,1,92,10,10,3.4,3,3,0,0,0,1,56,1,4,1,5 +63639,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16970.447459,16981.184092,1,99,8,8,1.99,5,5,1,0,0,1,55,1,5,1,2 +63640,7,2,1,0,1,3,3,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6420.20398,6662.903304,2,97,3,3,0.33,6,6,2,0,0,2,22,2,4,1,3 +63641,7,2,1,12,NA,3,3,1,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,81241.067732,81008.266507,2,102,14,14,3.44,5,5,1,2,0,2,34,1,4,6,NA +63642,7,2,1,25,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,20759.115219,21340.685849,1,93,2,2,0.32,3,3,0,1,0,1,25,1,3,6,NA +63643,7,2,2,18,NA,3,3,1,18,223,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,71832.578284,75129.017547,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +63644,7,2,2,2,NA,4,4,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8010.447273,8217.210509,2,93,7,7,2.58,2,2,1,0,0,2,32,1,5,5,NA +63645,7,2,1,15,NA,5,7,2,15,185,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13693.32264,13720.395459,1,96,5,5,1.45,2,2,0,1,0,2,41,1,4,3,NA +63646,7,1,1,9,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13822.148996,0,2,94,5,5,0.65,6,6,0,2,0,1,53,NA,NA,6,NA +63647,7,2,2,2,NA,4,4,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5158.14785,5587.91487,3,90,99,99,NA,5,5,1,1,1,2,63,1,3,2,NA +63648,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,71525.773464,1,101,7,7,1.55,5,5,1,2,0,2,31,1,4,1,2 +63649,7,2,1,1,21,3,3,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,38636.988369,42311.269327,1,91,15,15,4.59,4,4,2,0,0,1,35,1,5,1,5 +63650,7,2,2,62,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,7863.861726,8261.011593,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +63651,7,2,2,76,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,1,1,2,2,1,2,1,NA,13446.397433,13865.38304,1,93,3,3,0.82,2,2,0,0,2,1,80,2,5,1,1 +63652,7,2,1,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,1,2,1,2,2,1,1,2,NA,16995.648055,19983.260181,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +63653,7,2,2,19,NA,2,2,1,19,229,2,NA,2,2,3,12,NA,NA,NA,2,2,2,1,2,2,2,2,1,2,12712.538972,12956.930724,2,93,4,4,0.56,5,5,0,0,0,2,49,2,2,5,NA +63654,7,2,1,11,NA,2,2,2,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9807.589376,10028.771,2,90,7,7,1.66,4,4,0,3,0,2,34,1,5,3,NA +63655,7,2,2,17,NA,3,3,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,97212.131473,101229.4133,1,91,15,15,5,3,3,0,1,0,1,52,NA,NA,1,5 +63656,7,2,2,16,NA,4,4,2,16,203,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7825.55935,7975.961244,3,90,3,3,0.37,5,5,2,2,0,2,36,2,4,4,NA +63657,7,2,1,30,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21280.199633,23174.199432,1,97,14,14,4.5,3,3,1,0,0,1,30,1,5,1,5 +63658,7,2,1,10,NA,3,3,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71470.369236,87471.572436,2,101,8,8,2.81,3,3,0,2,0,1,48,1,3,3,NA +63659,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,36810.071228,39501.597518,1,95,14,14,5,1,1,0,0,1,1,80,1,3,2,NA +63660,7,2,1,11,NA,3,3,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20080.431771,20654.625485,1,94,4,4,1,3,3,0,1,0,2,41,1,4,5,NA +63661,7,2,2,46,NA,3,3,1,NA,NA,2,NA,2,1,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,30747.096519,32457.841726,2,91,2,2,0.44,3,3,0,1,0,1,46,2,3,1,4 +63662,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,33707.673642,36318.620408,2,95,10,10,4.3,2,2,0,0,2,1,80,1,5,1,4 +63663,7,2,2,42,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,4,2,2,2,2,1,2,2,NA,NA,NA,NA,32208.300114,32376.263659,1,102,4,4,0.67,4,4,0,1,0,1,23,2,4,5,NA +63664,7,2,1,58,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,18916.732604,18939.145414,2,91,9,9,5,1,1,0,0,0,1,58,1,5,3,NA +63665,7,2,1,56,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,5,NA,2,2,2,1,2,2,2,2,1,2,23431.677775,27795.676997,2,93,14,14,2.91,6,6,2,0,1,2,74,NA,NA,2,NA +63666,7,2,2,79,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,30880.887565,31700.101057,1,98,3,3,1.12,1,1,0,0,1,2,79,1,3,2,NA +63667,7,2,2,2,NA,3,3,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,36506.435703,36986.142564,1,98,9,9,2.6,4,4,1,1,0,1,31,1,4,1,5 +63668,7,2,1,4,NA,1,1,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14716.463544,14890.443704,2,96,5,5,0.76,5,5,1,2,0,1,44,2,1,1,3 +63669,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,87811.478076,90326.44396,1,90,8,8,1.67,5,5,2,1,0,2,28,1,4,1,5 +63670,7,2,2,8,NA,4,4,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7239.045424,7432.710238,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +63671,7,1,2,14,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5268.765205,0,1,99,9,9,2.68,4,4,0,2,0,1,43,2,3,1,NA +63672,7,2,1,9,NA,2,2,2,9,112,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,11567.189008,12721.148711,2,90,2,2,0.32,3,3,0,1,0,1,53,NA,NA,1,1 +63673,7,2,1,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,126463.833097,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +63674,7,2,1,5,NA,5,6,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8253.750998,8652.000238,1,90,7,7,1.52,4,4,2,0,0,2,30,2,4,6,NA +63675,7,2,1,12,NA,3,3,2,12,155,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,101055.977672,102514.960722,1,90,15,15,5,4,4,0,2,0,1,44,1,5,1,5 +63676,7,2,1,2,NA,4,4,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5447.377416,6006.624362,2,90,15,15,5,4,4,1,1,0,1,53,2,5,1,5 +63677,7,2,2,2,NA,1,1,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13065.99844,14425.21291,1,95,6,6,1.37,3,3,1,1,0,2,28,1,4,5,NA +63678,7,2,2,22,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,2,2,2,1,2,2,1,32537.532358,33640.063825,2,90,1,1,0.22,3,3,0,1,0,2,48,2,2,5,NA +63679,7,2,1,0,11,3,3,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20370.716701,21140.779334,1,91,15,15,4.2,5,5,3,0,0,2,32,1,4,1,5 +63680,7,2,1,54,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22446.308035,23586.645568,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +63681,7,2,2,5,NA,3,3,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,59190.129038,61693.294338,2,91,15,15,5,5,5,2,1,0,2,40,1,5,1,5 +63682,7,2,1,14,NA,3,3,2,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,77169.155154,77548.231618,1,101,14,14,3.9,4,4,0,2,0,2,41,1,2,1,2 +63683,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,29181.414565,29257.589647,1,94,3,3,0.39,6,6,1,0,2,1,80,1,4,1,3 +63684,7,2,2,54,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,17364.980275,22918.553497,2,93,7,7,2.78,2,2,0,1,0,2,54,1,4,3,NA +63685,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,12437.053229,13000.378144,3,91,5,5,0.89,4,4,0,2,2,1,61,2,3,1,4 +63686,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,1,NA,1,2,2,NA,NA,NA,1,2,2,1,12237.578196,12748.319173,2,93,8,8,2.17,4,4,0,0,3,1,80,2,2,1,2 +63687,7,2,1,69,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11761.359913,11893.852645,1,92,14,14,5,2,2,0,0,2,1,69,1,5,1,5 +63688,7,2,1,2,NA,5,6,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8253.750998,8652.000238,1,90,7,7,1.52,4,4,2,0,0,2,30,2,4,6,NA +63689,7,2,2,66,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,93265.413087,97732.118213,2,98,15,15,5,2,2,0,0,2,2,66,1,3,1,1 +63690,7,2,1,29,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12971.121387,14034.473347,1,93,15,15,5,2,2,0,0,0,1,29,2,5,1,5 +63691,7,2,1,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,2,2,2,1,2,2,1,40899.412129,44211.773156,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +63692,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,30259.77569,2,101,4,2,0.6,2,1,0,0,0,2,22,1,4,5,NA +63693,7,2,2,11,NA,1,1,1,11,137,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,16986.005478,17421.337631,2,102,8,8,1.91,5,5,1,2,0,1,36,2,1,1,4 +63694,7,1,1,6,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46081.129115,0,2,95,15,15,4.63,5,5,1,2,0,1,32,1,4,1,4 +63695,7,1,1,56,NA,4,4,NA,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,15599.953109,0,1,99,12,12,NA,1,1,0,0,0,1,56,1,3,5,NA +63696,7,2,1,15,NA,1,1,1,15,191,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,18635.323223,18738.312717,1,103,5,5,0.74,5,5,1,1,0,2,40,99,3,1,1 +63697,7,2,1,41,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17602.101156,18151.242681,1,96,10,10,2.95,4,4,0,1,0,2,34,2,3,1,5 +63698,7,2,1,42,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,2,2,2,2,2,2,1,2,1,NA,34128.967046,33628.177065,2,93,3,3,0.87,2,2,0,0,1,2,65,2,4,3,NA +63699,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,18462.756377,18592.086302,1,99,6,6,1.46,3,3,0,0,1,2,80,NA,NA,2,NA +63700,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,17602.101156,21123.738865,1,96,14,14,2.19,7,7,0,2,0,1,39,1,2,1,3 +63701,7,2,1,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,145790.86143,146040.776498,1,90,15,15,5,4,4,0,1,0,2,53,1,5,1,5 +63702,7,2,2,11,NA,3,3,1,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,56803.692074,58623.195384,1,100,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +63703,7,2,2,2,24,4,4,1,2,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,7791.142847,2,100,3,3,0.38,5,5,2,1,0,2,28,1,2,5,NA +63704,7,2,2,75,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,14534.533756,15040.28544,1,96,12,12,NA,3,3,0,0,2,1,77,NA,NA,6,NA +63705,7,2,1,8,NA,2,2,2,8,101,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,9807.589376,10786.008845,2,90,3,3,0.38,5,5,0,4,0,2,33,2,2,5,NA +63706,7,2,1,13,NA,3,3,1,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28732.336483,28618.270464,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +63707,7,2,2,63,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,3,3,NA,1,2,2,1,2,2,1,2,2,2,9048.366564,9718.651548,2,93,9,9,4.92,1,1,0,0,1,2,63,2,3,3,NA +63708,7,2,1,63,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13133.86792,13808.275718,2,102,8,8,1.72,5,5,0,2,1,1,63,2,5,1,5 +63709,7,2,2,16,NA,4,4,2,16,202,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10484.6104,10912.740054,2,99,1,1,0.07,4,4,1,1,0,2,24,1,2,5,NA +63710,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,94644.050918,104631.781207,2,91,15,15,5,5,5,1,2,0,1,37,1,4,6,NA +63711,7,1,2,7,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16442.636525,0,1,98,8,8,2.97,2,2,0,1,0,2,38,1,5,5,NA +63712,7,2,1,2,NA,3,3,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21071.650532,24690.382982,2,97,6,6,1.16,4,4,1,1,0,1,27,2,4,1,3 +63713,7,2,1,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,127000.852889,126845.993399,2,92,15,15,5,2,1,0,0,0,1,52,1,5,6,NA +63714,7,2,1,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,87954.465296,88343.63479,2,97,15,15,4.97,5,5,1,0,0,1,48,1,4,1,3 +63715,7,2,2,8,NA,4,4,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,13050.526646,2,101,3,3,0.65,3,3,0,1,0,2,54,1,3,5,NA +63716,7,2,1,2,NA,2,2,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8331.647763,8430.145707,2,90,3,3,0.46,5,5,1,3,0,2,35,2,1,4,NA +63717,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,37070.062227,37637.166459,1,92,1,1,0.03,2,2,0,1,0,2,50,1,4,3,NA +63718,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,30543.825378,35038.368904,2,91,2,2,0.86,1,1,0,0,0,2,50,2,3,2,NA +63719,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,34629.549705,1,94,5,5,0.74,5,5,1,1,0,2,24,1,3,1,4 +63720,7,2,1,5,NA,1,1,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17973.290893,2,98,1,1,0.19,3,3,2,0,0,2,31,1,4,2,NA +63721,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,NA,NA,NA,1,2,2,1,118761.81384,121363.708734,1,94,8,8,2.43,3,3,0,0,0,2,46,1,3,1,NA +63722,7,1,1,35,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,17371.064048,0,1,96,NA,NA,NA,4,4,1,1,0,2,37,NA,NA,1,4 +63723,7,2,2,62,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,14204.126838,15256.34028,3,92,5,5,1.56,2,2,0,0,1,1,58,1,3,1,2 +63724,7,2,1,33,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,51543.062078,51154.050295,3,92,3,3,0.52,5,5,2,1,0,2,29,2,1,1,3 +63725,7,2,1,5,NA,3,3,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30883.231636,34843.624635,1,95,7,7,1.17,6,6,1,3,0,2,44,1,4,1,NA +63726,7,2,2,12,NA,2,2,2,12,147,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21449.694498,22089.715913,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +63727,7,2,2,4,NA,5,6,1,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5879.523197,6241.641704,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +63728,7,2,2,11,NA,1,1,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16986.005478,17733.622754,2,102,7,7,1.53,5,5,1,2,0,1,36,1,2,1,3 +63729,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,160904.289966,160708.090054,1,97,15,15,3.89,5,5,0,2,0,1,50,1,4,6,NA +63730,7,2,1,14,NA,3,3,1,14,170,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71934.689876,71392.8162,1,100,15,15,5,5,5,0,3,0,1,47,1,5,1,5 +63731,7,2,1,51,NA,2,2,2,NA,NA,2,NA,2,2,77,NA,1,3,NA,2,2,2,2,2,2,NA,NA,NA,NA,24172.845721,24635.602694,2,99,1,1,0.03,2,2,0,0,0,1,51,2,1,3,NA +63732,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,1,NA,1,2,2,1,2,2,1,2,2,2,5185.036848,5649.75477,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +63733,7,2,2,58,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,23297.357076,24139.998866,2,93,9,9,2.6,4,4,0,0,0,2,58,2,4,4,NA +63734,7,2,1,43,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,32895.997285,1,95,2,2,0.6,1,1,0,0,0,1,43,1,4,3,NA +63735,7,2,1,29,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,4,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,14385.653726,15533.829525,2,101,5,3,1.1,2,1,0,0,0,1,29,2,4,1,NA +63736,7,2,1,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,30631.476666,31783.189579,2,101,6,6,1.54,3,3,0,1,0,2,34,1,4,1,3 +63737,7,2,1,8,NA,4,4,1,8,104,NA,NA,2,2,2,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11443.206518,12087.326286,1,100,9,9,1.78,6,6,1,1,0,2,45,2,3,1,3 +63738,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19260.892847,19199.459573,2,97,5,5,0.76,5,5,0,0,0,2,50,1,4,5,NA +63739,7,2,2,71,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,17087.605763,2,90,2,2,0.31,5,5,0,2,1,2,71,1,2,2,NA +63740,7,2,1,8,NA,3,3,2,8,100,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26349.460983,27598.763847,2,97,4,4,1.09,2,2,0,1,0,2,35,1,2,4,NA +63741,7,2,1,72,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,NA,21815.897449,24704.366996,3,92,5,4,1.39,2,1,0,0,2,2,63,NA,NA,3,NA +63742,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,1,2,1,2,2,1,1,2,NA,87944.345504,91474.433025,2,98,10,10,3.78,3,3,0,0,0,1,53,1,3,1,4 +63743,7,2,2,9,NA,1,1,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16371.237244,2,98,14,14,4.05,3,3,0,1,0,1,38,1,3,1,4 +63744,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,202246.928022,1,91,15,15,5,3,3,0,1,0,1,52,NA,NA,1,5 +63745,7,2,1,0,4,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,1,2,NA,NA,NA,NA,7284.164858,7692.652584,2,98,5,5,0.76,5,5,3,1,0,2,27,1,3,4,NA +63746,7,2,1,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,28542.421068,29427.85637,2,101,2,2,0.73,1,1,0,0,0,1,49,1,3,5,NA +63747,7,2,1,4,NA,5,6,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5953.107662,6129.253313,3,90,5,5,1.15,3,3,1,0,0,1,32,2,3,1,1 +63748,7,2,2,11,NA,2,2,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12307.832776,13375.906079,2,93,10,10,2.26,6,6,0,4,0,1,34,1,4,1,3 +63749,7,2,2,43,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,1,1,2,1,1,2,1,3,9145.761989,9194.124252,2,92,10,8,2.01,7,4,1,1,1,2,27,2,3,1,3 +63750,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,12,1,0.27,4,1,0,0,0,1,21,1,4,6,NA +63751,7,2,2,5,NA,1,1,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10493.785765,11155.348431,2,103,77,77,NA,5,5,1,2,0,2,30,1,2,1,2 +63752,7,2,1,60,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,25436.904729,28576.794771,1,94,3,3,1.25,1,1,0,0,1,1,60,1,3,3,NA +63753,7,2,1,33,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,6,NA,2,2,2,2,2,2,2,2,2,2,34438.924452,34835.654759,1,100,8,3,0.68,6,3,1,0,0,1,33,2,3,6,NA +63754,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,99120.116925,102640.158973,2,98,15,15,5,4,4,0,2,0,2,46,1,4,1,NA +63755,7,2,1,2,NA,3,3,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46257.816906,49754.984306,2,94,15,15,5,3,3,1,0,0,1,34,1,5,1,5 +63756,7,2,2,2,NA,4,4,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8754.193667,9543.319886,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +63757,7,2,2,5,NA,2,2,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8825.559072,9505.166523,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +63758,7,2,1,28,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,3,11182.713216,11928.362428,2,90,99,4,1.38,3,1,0,0,2,1,60,NA,NA,1,NA +63759,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,90969.330762,95023.624595,1,99,14,14,4.86,3,3,0,1,0,1,56,1,5,1,5 +63760,7,2,1,16,NA,4,4,2,16,195,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13756.125082,1,96,7,7,1.39,5,5,0,2,2,1,69,2,2,1,2 +63761,7,2,2,21,NA,2,2,1,NA,NA,2,NA,2,1,2,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,40149.982555,39975.11173,2,103,7,7,2.64,2,2,0,0,0,2,21,2,3,1,3 +63762,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,34128.92969,36973.759081,1,92,5,5,1.15,3,3,1,0,0,1,23,1,4,1,4 +63763,7,2,2,17,NA,5,6,2,17,205,2,NA,2,1,4,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7649.811754,7945.620413,2,90,6,6,1.24,4,4,0,1,0,1,57,2,5,1,3 +63764,7,2,2,14,NA,1,1,2,14,172,NA,NA,2,2,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18368.872199,18995.639955,2,94,12,12,NA,4,4,0,2,0,1,47,2,2,1,2 +63765,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,1,1,2,NA,24952.423186,27719.90048,2,98,14,14,4.64,3,3,0,0,1,1,49,1,3,1,9 +63766,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,163102.567998,164787.083347,1,99,15,15,5,2,2,0,0,0,1,54,1,3,1,4 +63767,7,2,1,66,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,6,NA,2,2,2,1,2,2,1,2,2,2,11019.434708,11290.181976,3,91,4,4,1.38,2,1,0,0,1,1,66,2,1,6,NA +63768,7,2,1,64,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,8609.250304,9380.869295,2,90,12,12,NA,3,3,0,0,2,2,61,2,3,4,NA +63769,7,2,1,44,NA,2,2,2,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,2,1,2,2,2,2,2,2,37883.328863,38044.589557,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +63770,7,2,2,11,NA,4,4,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10422.423011,10751.577119,1,98,3,3,0.86,2,2,0,1,0,2,34,1,4,5,NA +63771,7,2,1,43,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,32719.762791,34306.488277,1,101,7,7,2.71,2,2,0,0,0,1,43,1,4,1,4 +63772,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,136843.962333,135447.112041,1,95,14,14,5,2,2,0,0,2,2,65,1,4,1,4 +63773,7,2,1,56,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,31302.008691,30991.200711,2,91,9,9,5,1,1,0,0,0,1,56,1,5,5,NA +63774,7,2,1,8,NA,3,3,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,62291.152254,66151.751642,3,92,6,6,1.17,4,4,0,2,0,2,30,1,2,1,4 +63775,7,2,2,1,22,5,6,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4686.494502,4910.642079,1,90,14,14,3.33,5,5,1,2,0,1,41,1,5,1,5 +63776,7,2,1,7,NA,1,1,2,7,87,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,16288.924956,19190.320193,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +63777,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,30442.30641,30653.986309,1,95,77,77,NA,3,3,0,0,0,2,41,1,2,5,NA +63778,7,2,2,14,NA,4,4,1,14,171,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10972.028338,11002.546815,1,103,2,2,0.53,2,2,0,1,0,2,51,1,3,5,NA +63779,7,2,1,4,NA,4,4,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9488.600894,10206.6462,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +63780,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,35126.205635,35295.519265,1,95,7,7,1.17,6,6,1,3,0,2,44,1,4,1,NA +63781,7,2,2,63,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,4,6,NA,1,2,2,1,2,2,2,2,2,2,10680.068244,11125.805824,2,93,15,8,4.48,2,1,0,0,2,2,63,2,4,6,NA +63782,7,2,2,1,19,5,7,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5899.406975,6347.827712,1,103,3,3,0.37,5,5,1,2,0,2,30,1,4,5,NA +63783,7,2,2,10,NA,4,4,1,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8930.342072,9169.253826,1,100,15,15,3.7,5,5,0,3,0,1,51,1,5,1,5 +63784,7,2,2,40,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,4,1,2,2,2,2,2,2,2,NA,NA,NA,NA,34954.173075,36023.601038,3,92,9,9,2.46,4,4,0,2,0,1,43,2,3,1,4 +63785,7,1,2,32,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,3,1,2,2,1,2,2,NA,NA,NA,NA,86578.861495,0,2,101,8,8,1.72,5,5,0,3,0,1,37,1,3,1,3 +63786,7,2,1,8,NA,5,6,2,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6276.493588,6689.515302,1,98,15,15,5,4,4,1,1,0,1,40,NA,NA,1,5 +63787,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18404.681357,22792.166915,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +63788,7,2,2,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,123493.356057,126566.961964,1,102,3,3,0.92,1,1,0,0,0,2,40,1,3,3,NA +63789,7,1,1,29,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,84850.826285,0,3,90,15,15,5,2,1,0,0,0,1,29,1,5,1,NA +63790,7,2,1,11,NA,4,4,2,11,135,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11277.594097,11665.009628,1,90,5,5,0.74,5,5,0,2,0,2,18,1,4,NA,NA +63791,7,2,2,0,8,1,1,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6700.950086,6971.360383,2,96,3,3,0.24,7,7,2,3,1,2,40,1,3,3,NA +63792,7,2,2,2,NA,5,6,2,2,35,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6075.554662,6069.137471,1,93,14,14,4.86,3,3,1,0,0,1,31,2,5,1,5 +63793,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,33202.24577,45456.634755,1,99,4,4,1.02,2,2,0,1,0,2,27,1,4,3,NA +63794,7,2,1,4,NA,3,3,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78946.660075,92504.536814,3,91,15,15,5,4,4,1,1,0,2,41,1,5,1,5 +63795,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,152281.176016,1,94,10,7,3.76,2,1,0,0,0,1,59,1,4,6,NA +63796,7,2,2,36,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,18901.436377,19274.920746,3,91,15,10,5,2,1,0,0,0,2,36,1,5,6,NA +63797,7,2,1,14,NA,3,3,2,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,127790.772987,128099.355719,1,97,15,15,3.89,5,5,0,2,0,1,50,1,4,6,NA +63798,7,2,2,2,NA,3,3,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50865.409844,56139.684211,1,101,7,7,1.74,4,4,1,0,0,1,24,NA,NA,1,4 +63799,7,2,1,69,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,10288.337394,12038.909334,3,91,6,6,1.12,4,4,0,0,2,1,69,2,3,1,1 +63800,7,2,2,3,NA,5,6,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5022.237557,1,91,2,2,0.32,3,3,1,1,0,2,28,1,4,77,NA +63801,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10440.656902,1,99,6,6,2.3,1,1,0,0,1,2,64,1,5,3,NA +63802,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,18462.756377,18043.935864,1,99,7,7,3.4,1,1,0,0,0,2,48,1,5,3,NA +63803,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,6,2,2,2,2,2,2,2,2,2,2,2,41791.57979,45058.092516,2,102,7,7,1.79,4,4,0,2,0,1,40,2,2,6,NA +63804,7,2,1,61,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,5729.786464,5774.606655,2,95,14,14,4.58,3,3,0,1,1,1,61,1,4,1,5 +63805,7,2,2,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27769.056387,28050.845299,1,94,7,7,1.65,5,4,0,0,0,1,46,1,4,1,4 +63806,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,38226.070503,39676.327756,1,99,12,12,NA,2,2,0,0,2,1,70,1,5,1,5 +63807,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,10798.193871,11318.855823,2,95,2,2,0.67,2,2,0,0,1,2,61,1,3,3,NA +63808,7,1,2,13,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23477.73925,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +63809,7,2,2,10,NA,3,3,2,10,126,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55626.447796,54931.333538,1,95,9,9,2.13,6,6,0,4,0,2,44,1,1,1,1 +63810,7,2,1,16,NA,5,6,1,16,198,NA,NA,2,2,1,8,NA,NA,NA,1,2,1,1,2,2,1,2,1,NA,7558.274942,7964.822305,2,96,4,4,0.92,3,3,0,1,1,2,41,2,2,1,2 +63811,7,1,2,4,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12129.691938,0,1,97,7,7,1.74,4,4,2,0,0,1,34,1,5,1,5 +63812,7,2,2,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,30932.175051,30085.634936,2,101,3,3,0.68,2,2,0,0,0,1,58,1,1,6,NA +63813,7,2,1,67,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,6016.509449,6063.572478,1,93,4,4,1.38,1,1,0,0,1,1,67,2,5,2,NA +63814,7,2,1,17,NA,3,3,2,17,208,2,NA,2,1,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,57357.902168,67351.058423,1,99,77,77,NA,4,4,1,1,0,1,31,2,3,1,3 +63815,7,2,1,8,NA,4,4,2,8,98,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.422451,9062.344401,1,99,5,5,1.13,3,3,1,1,0,2,30,1,1,4,NA +63816,7,2,1,5,NA,4,4,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7431.820906,7738.904727,1,99,6,6,1.3,5,5,1,2,0,1,34,1,2,1,3 +63817,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,19075.861607,18553.800612,1,96,15,15,5,2,2,0,1,0,2,47,1,5,3,NA +63818,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,NA,NA,NA,NA,35126.205635,36772.568368,1,95,1,1,0.12,3,3,0,2,0,2,40,1,5,3,NA +63819,7,2,2,0,11,1,1,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7579.106293,8082.789623,1,90,15,15,4.77,4,4,1,1,0,2,41,1,5,1,2 +63820,7,2,2,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15561.208623,2,100,5,5,1.08,3,3,0,0,0,1,38,1,2,5,NA +63821,7,2,1,4,NA,4,4,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10510.490567,10944.785425,2,98,6,6,1,5,5,2,1,0,2,31,1,4,6,NA +63822,7,2,1,13,NA,4,4,2,13,160,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13416.172328,13756.125082,1,96,14,14,2.19,7,7,0,2,0,1,39,1,2,1,3 +63823,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,104488.914565,109862.797404,1,98,3,1,0.27,4,1,0,0,0,1,20,1,4,5,NA +63824,7,1,1,34,NA,5,6,NA,NA,NA,2,NA,2,1,5,NA,3,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,16974.834956,0,1,93,9,9,1.77,7,7,0,2,0,2,56,NA,NA,5,NA +63825,7,2,1,31,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,20729.794283,21506.407763,3,91,14,14,5,1,1,0,0,0,1,31,1,5,5,NA +63826,7,1,1,9,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,55902.987481,0,1,103,15,15,5,2,2,0,1,0,2,52,2,5,3,NA +63827,7,2,2,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,29756.667529,30535.306876,2,98,4,4,1.19,2,2,0,0,0,2,52,1,3,1,NA +63828,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,10,10,4.76,2,2,0,0,2,2,64,1,4,1,5 +63829,7,2,2,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,80418.665565,83274.564983,2,100,10,10,3.13,4,4,0,2,0,1,45,1,4,1,4 +63830,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,1,2,2,2,2,1,NA,11225.5556,12146.092964,2,93,8,8,2.62,3,3,0,0,2,2,64,2,1,1,1 +63831,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,20000.263815,19016.481945,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +63832,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,133542.212862,137914.897649,3,91,8,8,1.95,4,4,2,0,0,2,30,1,5,1,4 +63833,7,2,1,9,NA,2,2,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,13742.678011,2,98,6,6,0.78,7,7,1,3,1,2,63,1,2,4,NA +63834,7,2,2,52,NA,4,4,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,15776.849485,18474.07459,2,93,14,14,2.78,5,5,0,0,0,1,52,2,4,1,2 +63835,7,2,2,76,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,1,2,1,2,2,1,1,2,NA,12535.973802,12972.182488,2,100,15,15,4.97,5,5,0,2,1,2,42,1,5,1,5 +63836,7,2,1,16,NA,4,4,2,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12462.601191,12584.643654,2,97,5,5,0.92,5,5,0,3,0,2,54,1,3,2,NA +63837,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,63504.762752,64182.95787,1,91,10,10,5,1,1,0,0,1,2,70,1,4,2,NA +63838,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,25812.913537,27430.822937,2,95,4,4,1.34,1,1,0,0,1,2,78,1,3,2,NA +63839,7,2,1,75,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,9257.537917,9400.859081,1,99,10,10,2.71,5,5,1,1,2,1,75,1,1,1,3 +63840,7,2,1,10,NA,3,3,2,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,57057.523607,61384.115788,1,98,10,10,3.04,4,4,0,2,0,2,47,1,4,1,3 +63841,7,2,1,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,59682.963348,63721.06052,2,102,10,10,4.76,2,2,0,0,0,1,27,1,4,1,4 +63842,7,2,1,0,7,5,6,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8577.614982,8519.98112,2,91,14,14,4.19,3,3,1,0,0,2,31,1,5,1,5 +63843,7,2,2,13,NA,2,2,2,13,159,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,17848.732433,20206.102312,2,91,99,99,NA,6,6,1,3,0,2,20,2,2,5,NA +63844,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,28974.537912,30613.083607,1,99,6,6,1.7,2,2,0,0,2,2,77,1,3,1,5 +63845,7,2,1,43,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,29247.173902,1,94,3,3,1.21,1,1,0,0,0,1,43,1,4,3,NA +63846,7,2,1,3,NA,3,3,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,38749.197676,45403.777431,1,92,6,6,1.24,4,4,1,1,0,1,30,1,3,3,NA +63847,7,2,1,58,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,155918.172532,3,91,6,6,2.24,1,1,0,0,0,1,58,1,3,5,NA +63848,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,16214.132654,16029.957596,3,90,15,15,4.89,5,5,0,0,0,2,57,2,3,1,3 +63849,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,71279.707602,73321.195079,1,103,14,14,2.96,5,5,1,2,0,1,34,1,4,1,5 +63850,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,140084.621651,140222.178533,1,102,10,10,4.76,2,2,0,0,0,1,23,1,5,5,NA +63851,7,2,1,9,NA,4,4,1,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,14179.490667,2,101,1,1,0.27,3,3,0,2,0,2,36,1,3,5,NA +63852,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,158509.005274,161135.953834,1,100,15,15,5,4,4,0,1,0,1,50,1,4,1,4 +63853,7,2,2,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,77299.255327,77536.924917,2,92,15,15,5,2,2,0,0,0,2,36,1,5,1,5 +63854,7,2,2,5,NA,1,1,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14812.229505,15746.041025,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +63855,7,2,1,8,NA,2,2,2,8,97,NA,NA,2,1,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14700.46789,14706.980156,1,97,15,15,5,4,4,1,1,0,2,43,1,5,1,5 +63856,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,2,1,0.13,4,1,0,0,0,2,19,1,4,NA,NA +63857,7,1,1,4,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8199.080864,0,1,90,4,4,0.67,5,5,3,0,0,2,32,2,3,3,NA +63858,7,2,2,20,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,2,6,1,2,2,2,2,2,2,2,2,2,2,42621.881199,51089.379491,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +63859,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,17648.758915,17930.45653,2,99,3,3,0.44,5,5,1,1,0,2,53,1,4,1,3 +63860,7,2,2,50,NA,5,7,2,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,120670.257812,123358.620194,3,90,9,9,3.14,3,3,0,0,0,1,56,2,3,1,3 +63861,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,138075.879417,141933.339512,2,91,15,15,5,2,2,0,0,1,2,57,1,5,1,5 +63862,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,NA,43004.283229,49692.210403,1,97,NA,77,NA,2,1,0,0,2,1,80,1,3,6,NA +63863,7,2,1,6,NA,4,4,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9502.15317,9484.287948,2,97,13,13,NA,6,6,2,2,0,2,24,1,2,6,NA +63864,7,2,1,3,NA,1,1,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14993.478359,14600.446315,1,97,6,3,0.45,7,6,2,1,0,1,29,2,2,1,1 +63865,7,2,1,2,NA,2,2,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11853.772636,11869.789876,2,96,6,6,1.12,4,4,2,0,0,1,27,2,2,6,NA +63866,7,2,2,0,3,2,2,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7367.430495,7419.943227,2,91,2,2,0.19,5,5,3,0,0,1,24,2,1,1,3 +63867,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,28930.832375,30957.619671,1,92,5,5,1.05,3,3,1,1,0,2,35,1,4,5,NA +63868,7,2,1,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,131445.986898,130104.237054,1,95,10,10,5,1,1,0,0,1,1,69,1,5,3,NA +63869,7,1,1,36,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,86986.68246,0,2,94,15,15,5,2,2,0,0,0,1,36,1,2,1,4 +63870,7,2,2,11,NA,4,4,2,11,140,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8184.286585,8442.757341,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +63871,7,2,2,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18490.479848,18604.849683,2,100,7,7,2.37,3,3,0,1,1,2,45,1,5,1,NA +63872,7,2,2,18,NA,5,6,1,18,218,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,6370.316505,6989.133332,2,92,7,7,1.17,6,6,0,1,1,1,78,2,1,1,3 +63873,7,2,1,80,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,8763.51401,9280.560292,2,100,5,3,1.29,3,1,0,0,2,2,80,1,1,2,NA +63874,7,2,1,3,NA,1,1,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14505.510202,14964.673559,2,94,7,7,1.23,6,6,2,1,0,1,33,2,1,6,NA +63875,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,10266.896689,11139.888992,1,96,3,3,1.25,1,1,0,0,1,2,64,1,2,2,NA +63876,7,2,2,9,NA,4,4,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7321.387082,7717.353133,1,103,3,3,0.52,3,3,0,2,0,2,45,1,4,5,NA +63877,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,29672.504425,2,101,12,1,0.32,4,1,0,0,0,2,20,1,4,5,NA +63878,7,2,1,8,NA,3,3,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25457.327997,26428.651236,3,92,6,6,1.41,4,3,0,1,0,1,41,1,4,1,4 +63879,7,2,1,76,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,38226.070503,39676.327756,1,99,7,7,3.31,1,1,0,0,1,1,76,1,5,2,NA +63880,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53541.401974,54961.757487,1,99,7,7,2.72,2,2,0,0,2,1,77,1,2,1,3 +63881,7,2,2,25,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,50197.83865,52206.228199,1,93,12,6,2.75,4,1,0,0,0,2,25,2,5,5,NA +63882,7,2,1,43,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15271.238172,15754.77307,3,91,15,15,5,3,3,0,1,0,2,44,2,5,1,5 +63883,7,1,2,80,NA,2,2,NA,NA,NA,2,NA,2,1,8,NA,1,2,NA,2,2,2,2,2,2,NA,NA,NA,NA,17318.187297,0,2,90,4,4,0.57,5,5,1,0,2,2,80,2,1,2,NA +63884,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,7867.418849,7869.055339,1,103,77,77,NA,6,6,0,2,2,1,70,NA,NA,1,1 +63885,7,2,1,19,NA,4,4,1,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,1,1,0.32,2,1,0,0,0,1,19,1,4,NA,NA +63886,7,2,2,7,NA,5,6,2,7,95,NA,NA,2,1,2,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11068.40581,11617.80042,1,97,15,15,5,3,3,0,1,0,2,40,1,5,1,5 +63887,7,2,2,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,94637.019439,107051.932277,1,94,7,7,3.13,1,1,0,0,1,2,64,1,3,2,NA +63888,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,20948.005175,20851.734447,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +63889,7,2,1,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,29425.409675,1,94,1,1,0.36,1,1,0,0,0,1,48,1,3,5,NA +63890,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,9716.805546,10308.451947,2,90,3,3,0.68,2,2,0,0,1,1,21,2,4,5,NA +63891,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,1,96,9,9,4.13,2,2,0,0,1,2,55,1,4,5,NA +63892,7,2,2,10,NA,3,3,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49543.011606,52616.361829,1,94,15,15,5,6,6,0,4,0,1,38,1,5,1,4 +63893,7,1,1,6,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12722.361971,0,2,93,8,8,2.62,3,3,0,1,0,1,43,2,4,6,NA +63894,7,2,2,19,NA,4,4,2,19,231,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13775.846051,13737.029624,2,97,7,7,1.06,7,7,1,2,0,2,40,1,4,5,NA +63895,7,2,1,37,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18094.858384,18452.252422,1,96,15,15,5,3,3,0,1,0,2,37,1,4,1,4 +63896,7,2,2,9,NA,5,6,2,9,118,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9620.269705,10320.938187,2,91,14,14,3.47,4,4,1,1,0,2,40,2,5,1,NA +63897,7,2,2,7,NA,2,2,2,7,95,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13338.830817,13909.366846,1,90,6,6,1.68,3,3,1,1,0,2,36,2,4,4,NA +63898,7,2,2,51,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,NA,NA,NA,1,2,2,1,24870.513993,25000.211608,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +63899,7,2,2,75,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,1,3,NA,2,2,2,2,2,2,NA,NA,NA,NA,18006.276697,20109.914446,2,93,3,3,1.14,1,1,0,0,1,2,75,2,1,3,NA +63900,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,1,1,1,1,2,1,1,2,1,NA,NA,NA,NA,14138.631841,14167.501749,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +63901,7,2,1,12,NA,2,2,1,12,155,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20560.901695,20875.182272,2,96,2,2,0.27,6,6,1,3,0,1,34,NA,NA,1,NA +63902,7,2,1,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,143397.643998,144742.519652,2,98,10,10,4.76,2,2,0,0,2,1,68,1,4,1,NA +63903,7,2,1,19,NA,4,4,1,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13731.625553,14242.275028,1,100,14,14,3.93,3,3,0,1,0,2,47,1,5,4,NA +63904,7,2,2,42,NA,3,3,2,NA,NA,2,NA,2,2,6,NA,4,4,3,1,2,2,1,2,2,NA,NA,NA,NA,113005.700223,113116.666806,1,99,10,10,5,1,1,0,0,0,2,42,2,4,4,NA +63905,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,1,1,2,1,NA,NA,NA,NA,14979.624397,15387.451243,1,102,3,2,0.73,2,1,0,0,0,1,24,2,4,5,NA +63906,7,2,1,8,NA,4,4,2,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11324.954668,11525.075349,1,93,4,4,1.03,3,3,1,1,0,2,35,2,3,4,NA +63907,7,2,1,60,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,11492.781131,11582.681279,1,100,15,14,5,2,1,0,0,2,1,60,1,5,6,NA +63908,7,2,1,55,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,22446.308035,22116.943066,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +63909,7,2,2,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,43972.04458,44690.47559,2,96,3,3,0.95,2,2,0,0,2,2,62,1,4,1,4 +63910,7,1,2,41,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,134076.17118,0,1,98,15,15,5,3,3,0,0,0,2,41,1,5,1,NA +63911,7,2,2,67,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10083.559248,10533.779383,1,96,9,9,4.92,1,1,0,0,1,2,67,1,4,3,NA +63912,7,2,1,28,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,11477.00145,11789.46785,2,100,12,5,1.88,5,1,0,0,0,1,22,NA,NA,5,NA +63913,7,2,1,18,NA,2,2,2,18,223,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14081.782012,14391.713696,2,90,2,2,0.25,5,5,0,1,0,2,41,2,4,1,NA +63914,7,2,2,7,NA,1,1,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16535.37648,2,98,9,9,2.6,4,4,0,2,0,1,30,1,2,1,2 +63915,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,20048.680628,20209.076405,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +63916,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,19788.748292,21708.160855,1,94,4,4,0.59,5,5,0,3,0,1,34,1,2,1,4 +63917,7,2,1,71,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,14055.866747,14300.892374,2,93,5,5,1.32,2,2,0,0,2,1,71,2,4,1,1 +63918,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,157853.944421,1,95,12,12,NA,3,3,0,0,0,1,49,1,5,1,NA +63919,7,2,1,2,NA,1,1,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11160.282155,11957.436882,2,97,2,2,0.27,3,3,2,0,0,2,19,1,3,NA,NA +63920,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,1,1,2,2,1,2,2,1,2,2,1,104934.725755,109561.954446,2,98,10,10,4.42,2,2,0,0,0,1,31,1,4,1,3 +63921,7,2,1,3,NA,4,4,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8402.233801,8920.908511,2,101,1,1,0.1,6,6,1,2,1,2,27,1,2,1,2 +63922,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,5,2,1,2,2,1,2,2,1,2,2,3,14767.290807,18767.43866,2,90,5,5,1.43,2,2,0,1,0,2,38,2,4,5,NA +63923,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13728.308948,13391.816234,2,90,15,15,5,4,4,0,0,0,1,57,2,5,1,5 +63924,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,2,1,2,2,1,2,2,1,2,2,1,18730.678506,18151.501185,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +63925,7,1,2,32,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,6,3,1,2,2,1,2,2,NA,NA,NA,NA,18933.643351,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +63926,7,2,1,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21317.283165,21013.422419,2,96,5,5,0.67,6,6,1,2,1,1,34,1,4,1,4 +63927,7,2,1,37,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,2,2,1,1,2,1,2,2,2,2,34997.800447,34733.660984,2,96,3,3,0.46,5,5,1,2,0,1,37,1,1,1,2 +63928,7,2,2,42,NA,4,4,2,NA,NA,2,NA,2,1,8,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,22754.478969,25596.207975,1,96,7,7,3.58,1,1,0,0,0,2,42,2,5,5,NA +63929,7,2,2,34,NA,2,2,2,NA,NA,2,NA,2,1,99,NA,4,1,1,1,2,2,2,2,2,1,2,2,1,28899.648059,29089.927914,1,96,15,15,5,4,4,0,2,0,1,36,2,3,1,4 +63930,7,2,1,4,NA,5,7,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7666.445036,8598.756895,1,96,6,6,1.34,3,3,1,0,0,2,42,2,4,6,NA +63931,7,1,2,32,NA,5,6,NA,NA,NA,2,NA,2,1,4,NA,3,2,3,1,2,2,1,2,2,NA,NA,NA,NA,20584.427267,0,1,95,6,6,1.34,4,4,0,2,0,2,32,2,3,2,NA +63932,7,2,1,1,13,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15546.999135,15290.852049,2,98,10,10,3.82,3,3,1,0,0,2,33,1,4,1,2 +63933,7,2,2,6,NA,3,3,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19880.837381,19632.404233,1,95,2,2,0.22,4,4,2,1,0,2,22,1,2,5,NA +63934,7,2,1,18,NA,2,2,2,18,227,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26628.917773,31355.430562,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +63935,7,2,1,17,NA,3,3,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20991.942732,21394.366957,1,91,3,3,0.62,3,3,0,1,0,2,55,1,4,4,NA +63936,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,110819.46221,119829.247006,2,96,10,7,3.67,2,1,0,0,0,1,35,1,5,5,NA +63937,7,2,2,15,NA,4,4,1,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12744.907234,12578.013387,2,93,7,7,2.78,2,2,0,1,0,2,54,1,4,3,NA +63938,7,2,2,12,NA,4,4,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12208.965913,12602.394285,2,100,15,15,4.97,5,5,0,2,1,2,42,1,5,1,5 +63939,7,2,1,66,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9221.19173,9293.322792,2,95,5,5,1.32,2,2,0,0,2,1,66,1,2,1,4 +63940,7,2,1,15,NA,2,2,2,15,183,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,16033.31661,16386.200415,2,90,10,10,3.13,4,4,1,2,0,2,39,1,5,4,NA +63941,7,2,2,53,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14680.520497,15280.64157,3,91,9,9,3.24,3,3,0,1,1,1,64,2,2,1,5 +63942,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,145772.192378,148626.818504,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +63943,7,2,2,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,137368.929197,138597.101074,1,91,8,7,3.21,2,1,0,0,0,1,33,1,5,6,NA +63944,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39031.957066,39875.03294,1,95,77,77,NA,3,3,0,0,0,2,41,1,2,5,NA +63945,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,87611.353116,90505.825807,2,92,10,10,5,1,1,0,0,0,2,29,1,5,5,NA +63946,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,15867.258653,19649.848899,3,91,6,6,1.22,5,5,1,2,0,2,37,1,4,1,2 +63947,7,2,1,1,16,4,4,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6454.74783,2,100,6,6,1.51,3,3,1,0,0,1,29,1,3,1,4 +63948,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,24351.694017,24510.535836,1,100,12,14,5,2,1,0,0,0,2,50,1,3,6,NA +63949,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18295.488967,19299.909712,2,103,12,12,NA,4,4,0,1,0,2,50,2,3,1,4 +63950,7,2,2,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,22531.325817,21485.967466,2,91,15,15,5,4,4,0,0,1,1,61,NA,NA,1,2 +63951,7,2,1,14,NA,4,4,2,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11806.79775,12091.578602,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +63952,7,2,2,10,NA,3,3,1,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,63812.58912,64724.869865,3,91,15,15,5,2,2,0,1,0,1,42,1,5,2,NA +63953,7,2,2,31,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,39561.667842,38764.112139,3,92,7,7,1.49,5,5,0,2,1,2,62,1,4,2,NA +63954,7,2,1,41,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,17249.311662,20609.214634,2,91,6,6,1.57,3,3,0,1,0,1,41,2,3,1,3 +63955,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,128294.718377,130390.843426,1,93,15,12,NA,4,1,0,0,3,1,80,1,5,2,NA +63956,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,87648.893016,94490.113574,2,91,15,15,5,4,4,2,0,0,2,33,1,5,1,5 +63957,7,2,2,59,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19676.781212,23812.59189,1,103,7,7,1.33,5,5,0,1,1,1,28,1,2,1,3 +63958,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,2,NA,2,2,2,1,2,2,2,2,1,2,11851.128358,12729.036357,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +63959,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,28129.563738,1,101,6,6,1.17,4,4,0,1,0,1,41,1,3,6,NA +63960,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25651.892165,25126.271361,1,97,6,6,1.41,3,3,0,1,0,2,51,1,4,5,NA +63961,7,2,2,0,9,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6699.512423,6879.514499,3,91,15,14,4.03,5,4,2,0,0,1,42,2,4,1,5 +63962,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,54095.581484,0,2,91,6,6,2.24,1,1,0,0,1,2,80,1,3,2,NA +63963,7,2,1,72,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,83244.241244,88112.194036,2,102,15,15,5,2,2,0,0,2,1,72,1,5,1,NA +63964,7,2,1,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,85786.890667,86591.455494,2,96,15,15,5,3,2,0,0,1,1,62,1,5,1,2 +63965,7,2,1,72,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,19115.0887,22519.216384,2,98,6,6,1.26,4,4,0,1,2,2,63,1,3,1,3 +63966,7,2,2,34,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,26426.249254,26363.744856,1,99,7,1,0.24,2,1,0,0,0,2,38,1,5,6,NA +63967,7,2,2,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,16929.836231,18556.498474,2,101,8,5,1.84,2,1,0,0,0,2,27,2,5,5,NA +63968,7,2,2,61,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,3,NA,2,2,2,1,2,2,2,2,2,2,10310.145764,11073.900839,1,100,13,13,NA,4,4,0,1,1,1,26,2,3,5,NA +63969,7,2,1,8,NA,4,4,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9173.220503,9355.60378,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +63970,7,2,2,9,NA,5,6,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10235.530383,11121.127441,1,100,7,7,2.51,2,2,0,1,0,2,37,2,5,3,NA +63971,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,3,1,2,1,2,1,1,2,2,1,2,1,NA,21470.176619,21617.60214,1,98,7,7,2.71,2,2,0,0,0,1,43,1,3,1,3 +63972,7,2,1,15,NA,3,3,2,15,189,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74123.161671,78732.269389,1,93,15,15,4.59,4,4,0,1,0,1,57,1,5,1,5 +63973,7,2,2,15,NA,5,6,2,15,190,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12224.9472,12547.183925,1,97,14,14,2.72,7,7,0,2,0,1,40,1,5,1,5 +63974,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,139662.869107,140583.8015,1,100,15,15,5,3,3,0,0,0,1,53,1,5,1,4 +63975,7,2,2,6,NA,4,4,1,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9309.947844,9472.353128,2,98,2,2,0.31,4,4,2,1,0,2,27,1,2,4,NA +63976,7,2,1,1,13,4,4,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8022.100831,8575.148723,2,102,7,7,1.53,5,5,1,3,0,2,36,1,5,5,NA +63977,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,18070.666316,17713.108755,1,99,6,6,1.46,3,3,0,0,1,2,80,NA,NA,2,NA +63978,7,2,1,12,NA,2,2,1,12,146,NA,NA,2,2,1,6,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15674.964193,15512.049412,2,93,9,9,1.49,7,7,0,3,0,2,41,2,5,1,5 +63979,7,2,1,8,NA,3,3,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,65374.972543,69123.624578,1,90,15,15,5,4,4,0,2,0,1,37,1,5,1,5 +63980,7,2,2,6,NA,4,4,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7814.742747,8095.069503,2,95,7,7,2.64,2,2,0,1,0,1,48,1,2,77,NA +63981,7,2,2,6,NA,3,3,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,43528.185872,43349.34959,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +63982,7,2,2,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,41983.304745,42669.243011,1,101,7,7,2.31,3,2,0,0,1,2,69,1,4,2,NA +63983,7,2,1,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,94698.084211,97410.286035,1,101,5,5,0.89,5,5,1,2,0,1,31,1,2,1,1 +63984,7,2,1,24,NA,5,7,2,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,33942.93341,34470.44913,3,91,6,6,2.04,2,2,0,0,0,1,24,2,4,5,NA +63985,7,2,1,5,NA,2,2,2,5,70,NA,NA,2,2,2,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12403.412256,12420.172189,2,90,2,2,0.32,4,4,1,2,0,2,34,2,1,77,NA +63986,7,2,1,75,NA,1,1,2,NA,NA,2,NA,2,1,9,NA,1,1,NA,2,2,2,1,2,2,2,1,2,NA,16607.774808,17550.450209,1,101,3,3,0.93,2,2,0,0,2,1,75,2,1,1,1 +63987,7,2,1,0,1,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6238.040326,6448.58866,1,93,10,10,2.91,4,4,2,0,0,2,27,1,5,1,4 +63988,7,2,1,4,NA,1,1,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16775.083123,16797.750213,2,98,2,2,0.27,4,4,2,0,0,2,20,2,2,6,NA +63989,7,2,2,53,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,31785.728924,32871.467684,1,101,3,3,0.92,2,2,0,1,0,2,53,1,5,3,NA +63990,7,2,1,17,NA,5,6,2,17,204,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,13,13,NA,3,3,0,2,0,2,41,2,3,4,NA +63991,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,22707.329726,23247.668083,2,97,2,2,0.27,4,4,0,2,0,1,51,1,2,4,NA +63992,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19696.958879,19993.739669,2,95,1,1,0.4,1,1,0,0,0,1,44,1,4,5,NA +63993,7,2,1,8,NA,1,1,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14007.413517,3,92,7,7,1.41,5,5,1,2,0,1,40,1,3,1,4 +63994,7,2,2,9,NA,4,4,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,13050.526646,2,101,1,1,0.21,4,4,1,2,0,2,26,1,3,5,NA +63995,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,16851.334496,16987.280633,2,95,1,1,0,1,1,0,0,0,1,56,1,2,2,NA +63996,7,2,1,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,19478.738759,23024.340691,1,90,7,7,2.1,3,3,0,1,0,1,35,1,3,6,NA +63997,7,2,2,79,NA,3,3,2,NA,NA,2,NA,2,2,6,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,27102.582153,29013.853259,1,93,13,13,NA,1,1,0,0,1,2,79,2,1,2,NA +63998,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,29448.834066,32687.247837,1,97,9,9,5,1,1,0,0,0,2,48,1,5,5,NA +63999,7,2,2,44,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,14254.989855,14385.318229,1,103,15,15,3.7,5,5,0,2,1,1,55,1,5,1,5 +64000,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,17879.023129,20112.694262,2,90,NA,NA,NA,1,1,0,0,0,1,31,1,3,5,NA +64001,7,2,1,7,NA,4,4,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13423.881856,14062.200951,2,101,5,5,0.89,4,4,1,1,1,2,38,1,4,77,NA +64002,7,2,1,80,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,31039.556381,33443.834712,1,96,15,15,5,2,2,0,0,2,2,80,1,5,1,5 +64003,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,138322.767578,143283.052066,1,95,14,14,5,2,2,0,0,0,1,54,1,4,1,3 +64004,7,2,2,0,10,1,1,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6331.376224,6501.48724,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +64005,7,2,2,12,NA,1,1,1,12,152,NA,NA,2,2,3,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18515.058419,19512.090709,2,96,5,5,0.76,5,5,1,2,0,1,44,2,1,1,3 +64006,7,2,2,9,NA,5,7,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19608.444487,19549.535258,2,98,3,3,0.38,5,5,0,4,0,2,39,1,4,5,NA +64007,7,1,1,0,7,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7530.249163,0,2,102,12,12,NA,6,6,1,0,0,2,53,1,4,1,1 +64008,7,2,1,4,NA,4,4,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8123.332359,8458.989525,1,96,14,14,2.58,6,6,2,2,0,1,40,2,4,1,4 +64009,7,2,1,32,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18666.270458,19921.991676,2,93,77,77,NA,2,2,0,0,0,2,28,2,5,1,5 +64010,7,1,1,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13345.162299,0,2,102,14,14,4.86,3,3,1,0,0,1,30,1,5,1,5 +64011,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,27118.033816,33710.198359,1,94,5,5,1.39,2,2,0,0,2,1,60,1,1,5,NA +64012,7,2,2,16,NA,3,3,2,17,205,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27482.814969,29965.467716,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +64013,7,2,1,80,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,8606.120537,9222.025464,1,93,2,2,0.69,1,1,0,0,1,1,80,2,5,2,NA +64014,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,26141.606772,25260.281919,1,92,9,6,2.24,3,1,0,0,0,2,21,NA,NA,5,NA +64015,7,2,1,32,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,45691.377881,46792.745533,3,91,14,14,5,2,2,0,0,0,1,32,1,4,6,NA +64016,7,2,2,0,8,2,2,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5234.186769,5271.49441,2,90,3,3,0.46,5,5,3,0,0,2,22,1,2,5,NA +64017,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,128585.755579,132183.659765,2,97,9,9,4.08,2,2,0,0,0,2,24,1,4,1,3 +64018,7,2,1,35,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18289.793332,18322.51979,1,99,10,10,3.13,4,4,0,2,0,1,35,1,4,1,5 +64019,7,2,2,10,NA,2,2,2,10,123,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13154.122703,13626.512275,1,93,9,9,2.46,4,4,0,2,0,1,35,2,1,1,1 +64020,7,2,2,17,NA,5,6,2,17,209,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11225.761275,11659.847432,2,91,8,8,2.34,4,4,0,2,0,1,56,2,5,1,5 +64021,7,2,2,62,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13057.178942,13648.591881,1,102,10,10,4.42,2,2,0,0,2,2,62,1,5,1,4 +64022,7,2,2,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,14516.765165,13843.248577,3,90,15,15,4.34,4,4,0,0,1,1,65,1,3,1,4 +64023,7,2,1,80,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,14200.083364,15006.095575,2,98,99,99,NA,1,1,0,0,1,1,80,1,1,2,NA +64024,7,2,2,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,94637.019439,96511.799704,1,94,4,4,1.71,1,1,0,0,1,2,62,1,4,3,NA +64025,7,2,1,31,NA,3,3,1,NA,NA,2,NA,2,1,7,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,88274.617148,90802.847573,2,92,15,14,5,2,1,0,0,0,2,29,1,5,6,NA +64026,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17207.598344,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +64027,7,2,2,5,NA,3,3,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25864.922734,27487.163063,1,95,7,2,0.35,5,4,1,2,0,1,26,1,4,6,NA +64028,7,2,1,11,NA,2,2,2,11,142,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,9390.522479,9862.720437,2,90,1,1,0.14,2,2,0,1,0,2,36,1,3,3,NA +64029,7,2,1,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,39915.513053,41236.907607,2,98,7,7,1.53,5,5,0,0,0,2,48,1,3,5,NA +64030,7,2,1,6,NA,2,2,1,6,78,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14821.597351,14686.992722,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +64031,7,2,2,19,NA,1,1,1,19,233,2,NA,1,1,NA,13,NA,NA,NA,2,2,2,2,2,2,1,2,2,NA,16781.078148,17658.768186,2,103,77,77,NA,5,5,0,2,0,2,45,2,4,5,NA +64032,7,2,1,46,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,36319.60275,35786.668567,1,103,8,8,4.48,1,1,0,0,0,1,46,1,4,3,NA +64033,7,2,2,64,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,1,NA,1,2,1,1,2,2,1,2,1,3,14102.354333,14646.654863,3,91,7,7,2.16,3,3,1,0,1,2,36,2,5,1,NA +64034,7,2,2,62,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,13473.304889,14578.166065,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +64035,7,2,1,8,NA,2,2,1,8,98,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,NA,15039.041447,15306.786696,3,91,5,5,0.89,4,4,0,2,2,1,61,2,3,1,4 +64036,7,2,1,69,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,28953.774534,28658.225591,1,98,6,5,1.93,2,1,0,0,2,1,69,1,4,6,NA +64037,7,2,1,28,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,12538.868652,13740.340257,2,95,15,15,5,4,1,0,0,0,1,29,NA,NA,99,NA +64038,7,2,1,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8325.511113,9180.237397,2,99,6,6,1.13,4,4,1,1,0,1,33,1,3,6,NA +64039,7,2,2,0,4,4,4,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3689.415307,3729.699375,2,99,13,13,NA,4,4,1,0,0,2,50,1,2,1,9 +64040,7,2,1,31,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19185.622388,19060.093906,2,95,5,1,0,3,1,0,0,0,1,31,1,4,5,NA +64041,7,2,1,9,NA,4,4,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10122.702296,10692.492997,2,100,77,77,NA,4,4,0,1,1,2,28,1,3,5,NA +64042,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16905.961576,17944.772858,2,94,4,4,1.16,2,2,0,0,0,1,39,1,2,1,5 +64043,7,2,1,14,NA,4,4,2,14,177,NA,NA,2,2,4,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11523.287163,11546.069645,1,96,8,8,2.17,4,4,0,2,0,2,45,2,5,4,NA +64044,7,2,2,8,NA,1,1,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,10870.942302,11918.469007,1,103,10,10,2.82,4,4,0,2,0,1,41,2,1,1,1 +64045,7,2,2,4,NA,3,3,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,52159.241328,54365.068635,1,100,6,6,1.18,5,5,2,2,0,2,40,1,5,3,NA +64046,7,2,2,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,38500.994547,38409.930489,2,91,2,2,0.81,1,1,0,0,0,2,39,1,2,6,NA +64047,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,58826.425292,61096.366503,1,102,8,8,2.42,4,4,0,2,0,2,34,1,4,1,3 +64048,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,150482.742079,150600.121666,2,98,8,8,3.67,2,2,0,0,0,2,54,1,4,3,NA +64049,7,2,2,16,NA,1,1,1,16,195,NA,NA,2,2,4,10,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,15690.47168,16407.081535,1,102,5,5,0.62,7,7,1,3,0,1,49,2,2,1,1 +64050,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,35469.911999,45030.280097,2,91,3,3,0.86,2,2,0,0,0,2,41,1,4,1,3 +64051,7,2,1,21,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,52571.533452,58252.213979,1,93,4,4,0.92,3,3,0,0,1,1,60,NA,NA,1,4 +64052,7,2,1,60,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,10004.038848,10557.19122,2,102,8,8,4.13,1,1,0,0,1,1,60,2,1,4,NA +64053,7,2,1,8,NA,1,1,2,8,102,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13285.093011,13346.253362,2,94,6,6,1.15,5,5,1,2,0,1,33,1,2,1,2 +64054,7,2,2,19,NA,4,4,2,19,233,2,NA,1,1,NA,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10484.6104,10912.740054,2,99,3,3,0.56,4,4,1,0,0,2,38,1,3,5,NA +64055,7,2,2,59,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,16033.091438,16414.611167,1,96,4,4,1.02,3,3,0,0,0,2,59,1,3,2,NA +64056,7,2,1,18,NA,3,3,2,18,221,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,34847.322278,35515.35986,2,91,6,6,1.26,5,5,0,1,2,2,80,1,4,2,NA +64057,7,2,2,11,NA,3,3,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38662.840486,39387.514697,2,92,15,15,5,5,5,0,3,0,2,46,1,5,1,5 +64058,7,2,2,50,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15499.383981,15868.203732,2,99,5,5,1.26,3,3,1,0,0,2,50,2,3,5,NA +64059,7,2,2,68,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,12886.419545,13879.729659,2,97,1,1,0.22,1,1,0,0,1,2,68,1,3,2,NA +64060,7,2,2,2,NA,3,3,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27529.278041,30383.810541,1,92,5,5,1.05,3,3,1,1,0,2,35,1,4,5,NA +64061,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,35126.205635,35329.988956,1,95,1,1,0.17,2,2,0,1,0,2,47,1,2,3,NA +64062,7,2,2,10,NA,4,4,1,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9309.947844,9654.826166,2,98,14,14,3.36,4,4,0,2,0,1,37,1,4,1,4 +64063,7,2,2,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32161.692893,32052.891523,1,99,2,2,0.78,1,1,0,0,1,2,62,1,4,3,NA +64064,7,2,2,46,NA,5,6,1,NA,NA,2,NA,2,2,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17668.324663,18093.708295,1,102,14,14,4.86,3,3,0,1,0,1,42,1,4,1,5 +64065,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,106195.998472,105923.202819,1,93,15,15,5,2,2,0,0,0,1,46,1,4,1,5 +64066,7,2,2,11,NA,2,2,1,11,142,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,15929.068964,16501.112136,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +64067,7,2,1,2,NA,2,2,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,12915.99793,13324.846215,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +64068,7,2,1,10,NA,1,1,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12231.897958,12180.037346,1,100,7,7,1.3,5,5,0,3,0,1,43,2,2,1,4 +64069,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,74050.783686,75666.677003,1,94,6,6,1.31,3,3,0,0,0,2,46,1,5,6,NA +64070,7,2,2,7,NA,3,3,1,7,89,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,101,7,7,1.55,5,5,1,2,0,2,31,1,4,1,2 +64071,7,2,1,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,11074.62349,11161.252677,2,101,5,5,0.89,4,4,1,1,1,2,38,1,4,77,NA +64072,7,2,2,50,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,1,2,2,1,2,2,2,21828.388259,21942.221447,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +64073,7,2,1,13,NA,4,4,1,13,159,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12972.249316,12937.057154,1,100,15,15,3.7,5,5,0,3,0,1,51,1,5,1,5 +64074,7,1,1,50,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16287.780872,0,2,100,6,6,2.04,2,2,0,0,0,2,50,1,2,1,3 +64075,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,35074.640491,1,94,2,2,0.42,3,3,0,0,0,2,52,1,4,1,1 +64076,7,2,2,1,21,3,3,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26071.535804,27174.107547,1,93,10,10,2.48,5,5,2,1,0,1,40,2,5,1,5 +64077,7,2,1,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,30489.729187,30783.113246,3,92,12,12,NA,3,2,0,0,0,1,45,1,3,1,3 +64078,7,2,1,17,NA,4,4,1,17,206,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,14,14,4.03,4,4,0,1,0,2,40,1,5,1,5 +64079,7,2,2,25,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,41328.871311,42415.982935,2,93,9,9,2.6,4,4,0,0,0,2,58,2,4,4,NA +64080,7,2,1,0,3,2,2,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7004.278208,7004.40731,1,93,5,5,1.3,3,3,1,1,0,2,28,2,4,5,NA +64081,7,2,1,11,NA,4,4,2,11,143,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12176.538896,12387.770281,2,97,2,2,0.3,4,4,0,2,0,1,42,1,2,6,NA +64082,7,2,1,64,NA,3,3,2,NA,NA,2,NA,2,2,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,167711.394252,169284.299948,1,101,10,10,4.63,2,2,0,0,1,1,64,2,3,1,4 +64083,7,2,2,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,30634.82105,30961.983694,1,95,7,7,2.16,3,3,0,0,1,1,45,1,3,1,4 +64084,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,33810.591598,40546.042621,3,91,13,13,NA,3,3,0,1,1,1,80,1,3,2,NA +64085,7,2,2,13,NA,5,6,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10164.140113,10557.174707,3,91,15,15,5,4,4,0,2,0,1,44,2,5,1,5 +64086,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18040.833018,19102.925896,1,96,9,9,4.1,2,2,0,0,0,2,45,2,5,1,5 +64087,7,2,1,18,NA,1,1,2,18,225,2,NA,2,2,5,14,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,20398.562455,20186.553847,3,92,8,8,2.01,4,4,1,0,0,2,49,2,5,4,NA +64088,7,2,2,9,NA,3,3,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24832.585001,24642.096114,2,101,3,3,0.6,3,3,0,2,0,1,39,1,4,4,NA +64089,7,2,2,54,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16567.527819,16240.172481,1,96,15,15,5,3,3,0,0,0,1,55,1,4,1,5 +64090,7,2,1,18,NA,4,4,2,18,218,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,14,14,3.47,4,4,0,0,0,2,45,1,4,1,4 +64091,7,2,1,53,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12274.966216,12700.371312,3,90,5,5,1.05,3,3,0,0,0,1,53,2,1,1,2 +64092,7,2,1,18,NA,3,3,2,18,220,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,71458.892941,71654.216305,2,94,3,3,0.54,4,4,0,1,0,2,48,1,3,1,3 +64093,7,2,2,8,NA,5,6,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,1,1,2,1,1,2,2,NA,10387.513218,10891.034934,1,92,15,15,5,4,4,1,1,0,1,38,2,5,1,5 +64094,7,2,1,0,8,4,4,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7882.953266,8719.306286,2,96,7,7,1.79,4,4,2,0,0,2,49,1,3,1,3 +64095,7,2,1,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,113559.363135,118892.640077,2,102,14,14,4.93,3,3,0,1,0,1,37,1,5,1,5 +64096,7,2,1,10,NA,5,6,2,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,8246.426933,8701.859504,1,99,7,5,1.84,2,1,0,1,0,1,47,2,4,5,NA +64097,7,2,2,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9139.784234,9841.162002,2,100,2,2,0.33,5,5,0,4,0,2,27,1,3,5,NA +64098,7,2,1,54,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19374.410926,19463.695548,1,96,4,4,0.65,4,4,0,0,0,1,19,1,4,NA,NA +64099,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,90234.245265,93002.542962,2,101,7,7,3.9,1,1,0,0,1,2,71,1,5,3,NA +64100,7,1,1,5,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58116.402634,0,1,97,15,15,5,5,5,2,0,1,1,43,1,5,1,5 +64101,7,2,2,0,5,4,4,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3861.876549,4016.370213,1,96,8,8,1.61,6,6,3,0,0,1,33,2,5,1,4 +64102,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,9240.841805,10026.588852,2,95,13,13,NA,2,2,0,0,1,1,56,1,9,1,1 +64103,7,2,2,12,NA,5,6,1,12,148,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9505.147857,9693.556382,1,92,14,14,2.42,6,6,1,3,0,1,30,1,4,6,NA +64104,7,2,2,4,NA,4,4,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8340.858072,8802.325948,2,103,6,6,1.11,5,5,1,2,0,2,36,1,4,5,NA +64105,7,2,2,8,NA,1,1,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14042.378151,15260.975241,1,102,14,14,4.03,4,4,0,2,0,1,30,1,5,6,NA +64106,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,68184.631488,70137.474393,2,95,4,4,1.34,1,1,0,0,0,1,34,1,4,5,NA +64107,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,65891.955175,72165.622258,1,95,7,7,2.38,2,2,0,0,2,1,80,1,3,1,4 +64108,7,2,2,2,NA,3,3,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18127.266286,20006.89679,2,95,6,6,1.08,4,4,1,1,0,1,39,1,4,1,4 +64109,7,1,2,45,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,80232.348161,0,1,99,77,77,NA,4,4,0,2,0,2,45,1,3,1,NA +64110,7,2,2,6,NA,4,4,2,6,81,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7282.523598,7776.514874,2,99,3,3,0.93,2,2,0,1,0,2,27,1,4,3,NA +64111,7,2,2,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,28047.519499,31779.09658,2,90,1,1,0.14,1,1,0,0,0,2,33,1,2,5,NA +64112,7,2,1,14,NA,2,2,1,14,179,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18635.323223,19040.145288,2,103,12,12,NA,4,4,0,1,0,2,50,2,3,1,4 +64113,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,38808.357492,1,95,3,3,0.96,1,1,0,0,1,2,80,1,4,2,NA +64114,7,2,1,9,NA,5,6,1,9,111,NA,NA,2,1,3,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5769.526317,6088.16495,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +64115,7,2,1,8,NA,4,4,2,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7370.805738,7721.29497,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +64116,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,35276.751365,1,94,7,7,1.65,5,4,0,0,0,1,46,1,4,1,4 +64117,7,2,2,16,NA,3,3,2,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,60694.411883,64307.712903,1,99,15,15,4.47,4,4,0,2,0,2,43,1,5,1,5 +64118,7,2,2,0,3,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7782.311913,7756.671982,1,94,7,7,1.56,4,4,2,0,0,1,21,1,4,1,4 +64119,7,2,2,6,NA,3,3,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,98,15,15,5,5,5,0,3,0,2,41,1,5,6,NA +64120,7,2,1,77,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,4,NA,2,2,2,2,2,2,1,2,2,NA,15301.031416,15853.994551,1,90,99,99,NA,5,5,0,2,1,2,50,2,4,4,NA +64121,7,2,2,34,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,27127.983961,27837.333201,2,90,7,7,1.66,4,4,0,3,0,2,34,1,5,3,NA +64122,7,2,2,67,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,1,2,2,2,15876.871857,17178.834476,2,102,NA,13,NA,2,1,0,0,1,1,50,2,1,6,NA +64123,7,2,2,1,21,1,1,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12871.484115,14210.463876,2,102,3,3,0.45,4,4,2,0,0,1,21,2,2,6,NA +64124,7,2,1,6,NA,4,4,1,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9261.557132,9782.87535,2,100,8,8,1.8,5,5,0,3,0,2,43,1,3,1,3 +64125,7,1,1,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,55061.722794,0,2,95,15,15,4.63,5,5,1,2,0,1,32,1,4,1,4 +64126,7,2,2,7,NA,1,1,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,19059.339877,19259.716076,1,95,13,13,NA,5,5,1,2,0,2,34,2,1,1,1 +64127,7,2,2,69,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18695.172864,19350.637044,2,102,7,7,1.68,5,5,0,0,3,1,70,2,4,1,4 +64128,7,2,1,59,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,124170.603852,126212.047685,1,92,6,6,2.39,1,1,0,0,0,1,59,1,4,3,NA +64129,7,2,2,7,NA,4,4,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7588.605543,8170.947433,1,99,4,4,0.53,7,7,3,1,0,2,26,1,1,5,NA +64130,7,2,1,69,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,2,1,NA,1,2,1,1,2,1,1,2,1,1,13977.762704,14745.704028,1,92,77,77,NA,4,4,0,0,2,1,59,2,5,1,5 +64131,7,2,2,79,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,36067.495928,37024.300659,1,95,5,5,1.36,2,2,0,0,1,2,79,1,3,2,NA +64132,7,2,2,41,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20303.639991,21936.687597,1,97,15,15,4.07,5,5,0,3,0,1,42,2,5,1,5 +64133,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,57151.56429,59304.909373,2,95,8,8,2.17,4,4,1,1,0,1,43,1,4,1,5 +64134,7,2,2,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,29670.405171,29084.152013,2,101,10,10,3.89,3,3,0,1,0,2,49,1,4,1,3 +64135,7,2,2,23,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,11206.329484,11903.241195,2,103,15,15,5,3,3,0,0,0,2,52,2,4,1,5 +64136,7,2,1,9,NA,1,1,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12624.747427,12616.351223,2,92,15,15,3.37,7,7,0,4,0,1,42,2,3,1,1 +64137,7,2,2,72,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,1,2,NA,1,2,1,1,2,1,1,2,1,NA,10125.392704,11197.313648,2,91,12,12,NA,7,6,0,4,2,2,72,2,1,2,NA +64138,7,2,1,36,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,20071.705576,20337.925283,3,91,14,14,5,2,1,0,0,0,1,36,1,5,6,NA +64139,7,2,2,32,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,6,2,2,2,2,1,2,2,NA,NA,NA,NA,34401.268523,35501.848089,2,97,4,4,0.67,4,4,0,2,0,1,39,2,2,6,NA +64140,7,2,2,16,NA,4,4,1,16,192,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12531.903464,12935.738352,2,100,5,5,1.07,4,4,0,1,0,2,36,1,3,5,NA +64141,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,26344.362464,29482.177939,2,95,4,4,1.46,1,1,0,0,1,1,80,1,1,2,NA +64142,7,2,1,73,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,14537.797299,15440.503889,3,91,77,77,NA,2,2,0,0,2,1,73,1,5,1,5 +64143,7,2,1,58,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,25737.628192,27045.174332,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +64144,7,2,2,2,NA,5,7,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9254.729183,9958.191837,2,98,15,15,4.17,6,6,1,1,0,2,40,1,4,1,4 +64145,7,2,1,2,NA,1,1,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,1,1,0.19,3,3,2,0,0,2,31,1,4,2,NA +64146,7,2,2,47,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20303.639991,21936.687597,1,97,15,15,5,6,6,0,3,0,1,47,1,5,1,5 +64147,7,2,2,34,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,6,2,2,2,2,2,2,2,1,2,2,2,45655.090694,44423.220436,3,92,3,3,0.51,5,5,1,2,0,2,34,2,1,6,NA +64148,7,2,1,2,NA,4,4,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6580.937346,6661.20735,2,101,7,7,2.16,3,3,1,0,1,2,64,1,3,2,NA +64149,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,108504.032354,117548.425574,1,92,6,6,1.57,3,3,0,1,0,1,29,1,4,6,NA +64150,7,2,1,8,NA,4,4,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12839.999482,13062.740187,2,96,8,8,1.72,5,5,0,3,0,1,39,1,5,1,4 +64151,7,2,1,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,124820.027137,131239.54259,1,91,10,10,3.51,3,3,0,0,1,1,21,1,4,5,NA +64152,7,2,1,14,NA,4,4,1,14,173,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16261.995423,16421.244198,2,96,5,5,1.13,3,3,1,1,0,2,31,1,3,5,NA +64153,7,2,2,11,NA,4,4,2,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6979.847147,8479.043057,1,99,7,7,1.53,5,5,0,3,0,1,39,1,3,1,3 +64154,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,19675.36066,19726.184442,2,96,14,14,4.26,3,3,0,0,0,1,20,1,4,5,NA +64155,7,2,1,11,NA,4,4,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11543.27965,11681.665542,1,98,1,1,0.03,3,3,0,2,0,2,38,1,4,5,NA +64156,7,2,2,8,NA,5,6,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5142.091355,5516.602825,3,91,15,15,5,3,3,0,1,0,2,44,2,5,1,5 +64157,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,136832.42119,141624.96623,2,91,12,5,2.03,2,1,0,0,2,2,68,1,4,6,NA +64158,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17095.959542,2,97,7,7,3.67,1,1,0,0,0,1,27,1,4,1,NA +64159,7,2,1,75,NA,1,1,2,NA,NA,2,NA,2,2,9,NA,1,1,NA,2,2,2,1,2,2,2,2,2,NA,17161.371047,18002.626237,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +64160,7,2,1,13,NA,5,6,1,13,167,NA,NA,2,1,2,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11171.449402,11936.033174,1,92,7,7,1.56,4,4,0,2,0,2,38,2,4,6,NA +64161,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,1,96,15,15,5,2,2,0,0,0,2,51,1,5,5,NA +64162,7,2,1,18,NA,3,3,2,18,222,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,35639.306876,36153.844915,2,91,99,99,NA,3,3,0,0,0,1,40,NA,NA,1,4 +64163,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12262.33683,12778.149281,2,100,15,15,5,3,3,0,1,0,1,48,2,5,1,5 +64164,7,2,1,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19440.793325,20264.695737,2,95,15,10,3.67,5,3,0,0,0,1,47,1,5,1,3 +64165,7,2,2,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,20495.125801,20710.596821,2,98,3,3,0.4,6,6,1,2,0,2,29,2,1,4,NA +64166,7,2,1,7,NA,2,2,2,7,92,NA,NA,2,2,3,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10490.055059,10676.813132,3,90,4,4,0.63,5,5,0,3,0,1,45,2,4,1,4 +64167,7,2,2,21,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16929.836231,17652.770039,2,101,1,1,0.14,2,1,0,0,0,2,21,2,4,5,NA +64168,7,2,1,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,96844.935107,100539.350089,2,98,10,10,4.42,2,2,0,0,0,1,31,1,4,1,3 +64169,7,2,1,17,NA,3,3,1,17,207,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,29202.587704,29754.083616,3,92,6,6,0.74,7,7,2,1,0,2,46,1,2,1,4 +64170,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,19337.563688,19353.557903,1,96,6,6,1.21,4,4,2,0,0,1,24,1,4,1,3 +64171,7,2,1,11,NA,3,3,2,11,135,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25604.034863,28346.339599,1,95,10,6,1.34,5,4,1,2,0,1,32,1,3,6,NA +64172,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,10455.739374,11701.098067,1,101,3,3,0.86,2,2,0,0,2,2,80,1,2,1,1 +64173,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,17430.913214,17517.807291,1,90,5,5,1.06,4,4,0,2,0,1,53,1,3,1,4 +64174,7,2,2,18,NA,2,2,2,18,222,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16189.692833,16766.382859,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +64175,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,39416.921733,1,95,2,2,0.83,1,1,0,0,1,2,80,1,2,2,NA +64176,7,2,1,72,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,10160.645851,10359.669924,1,96,9,9,3.97,2,2,0,0,2,1,72,1,4,1,5 +64177,7,2,1,2,NA,3,3,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,22388.62869,26233.531918,2,97,1,1,0.21,4,4,2,0,0,2,34,2,1,1,2 +64178,7,2,1,7,NA,5,6,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6765.693703,7164.978412,2,92,15,15,5,3,3,0,1,0,1,45,2,4,1,4 +64179,7,2,1,52,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,25118.469449,25612.281104,2,98,5,5,1.63,2,2,0,0,0,2,53,2,1,1,1 +64180,7,2,2,31,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,4,1,2,2,2,2,1,2,2,NA,NA,NA,NA,38184.257672,39182.709093,2,91,9,9,2.6,4,4,1,1,0,2,31,2,4,1,5 +64181,7,2,2,56,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,23409.465713,23644.84324,2,97,14,9,5,2,1,0,0,0,2,56,1,3,6,NA +64182,7,2,2,67,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,90638.027317,92118.903864,2,100,6,6,2.04,2,2,0,0,2,1,74,1,4,1,3 +64183,7,2,2,18,NA,1,1,1,18,223,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27070.679378,27847.54398,1,92,7,7,1.48,5,5,0,1,0,1,42,1,5,1,4 +64184,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,36438.408188,36780.151097,1,101,3,3,0.66,2,2,0,0,1,1,67,1,2,3,NA +64185,7,2,2,14,NA,5,6,2,14,170,NA,NA,2,1,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,7,7,1.48,5,5,1,2,0,1,40,2,5,1,4 +64186,7,2,1,63,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,1,2,2,1,2,2,1,9068.437099,9499.757798,2,93,9,9,3.97,2,2,0,0,1,2,57,2,3,1,1 +64187,7,2,1,6,NA,3,3,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,66003.625505,68276.88064,1,101,14,14,3.15,5,5,2,1,0,1,35,1,4,1,5 +64188,7,1,1,65,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20187.172902,0,2,100,4,4,1.29,2,2,0,0,2,1,65,1,3,1,3 +64189,7,2,1,2,NA,5,6,2,2,33,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6208.192797,6963.167461,1,91,10,10,3.22,4,4,1,1,0,1,38,2,5,1,5 +64190,7,2,1,0,0,1,1,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7284.164858,7284.299119,2,98,4,4,0.67,4,4,1,0,0,2,40,1,3,3,NA +64191,7,2,1,72,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,3,1,NA,2,2,2,1,2,2,2,2,1,NA,14159.984279,14406.82491,2,93,4,4,0.99,2,2,0,0,2,1,72,2,3,1,4 +64192,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,118336.754883,2,92,15,15,5,6,6,2,0,0,1,18,1,4,NA,NA +64193,7,2,1,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16058.989596,16964.610342,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +64194,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10598.2543,1,99,15,15,5,2,2,0,0,2,1,67,1,5,1,5 +64195,7,2,1,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19008.083201,19399.303007,2,97,12,12,NA,3,3,0,0,0,1,33,1,4,5,NA +64196,7,2,2,9,NA,5,6,1,9,115,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9211.293091,9657.799007,1,92,14,14,3.47,4,4,0,2,0,1,37,1,5,1,5 +64197,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,1,2,1,2,2,1,1,2,NA,7360.303891,7756.453804,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +64198,7,2,2,76,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,14275.35524,2,90,3,3,0.92,1,1,0,0,1,2,76,1,3,2,NA +64199,7,2,2,2,NA,2,2,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8512.480199,8626.96297,2,90,3,3,0.68,2,2,1,0,0,2,23,1,1,5,NA +64200,7,2,2,3,NA,2,2,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15233.991221,16407.076559,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +64201,7,2,1,20,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,9177.295801,9548.31812,2,92,77,77,NA,4,4,0,0,1,1,20,1,2,5,NA +64202,7,2,1,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9298.536372,9483.411197,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +64203,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,15262.313583,16475.41377,1,101,2,2,0.47,3,3,1,0,0,1,35,1,2,6,NA +64204,7,2,2,0,7,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16547.193167,16560.896108,1,97,12,12,NA,5,5,3,0,0,2,33,1,5,1,5 +64205,7,2,2,1,12,4,4,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7556.585831,7751.634132,1,96,77,77,NA,3,3,1,0,0,2,39,1,7,5,NA +64206,7,2,2,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,12886.419545,13879.729659,2,101,3,3,1.19,1,1,0,0,1,2,69,1,2,2,NA +64207,7,2,2,28,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,2,1,2,1,2,2,1,2,2,1,2,1,NA,45798.520132,47350.399021,2,91,14,14,4.71,3,3,0,0,0,1,28,2,1,1,2 +64208,7,2,1,15,NA,1,1,1,15,182,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,14432.845547,14415.592261,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +64209,7,2,1,11,NA,2,2,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14820.807433,14943.02937,2,102,5,5,0.89,4,4,0,3,0,2,44,2,2,4,NA +64210,7,2,1,3,NA,4,4,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8414.846149,8934.299427,1,90,7,7,1.3,5,5,1,2,1,2,62,1,2,2,NA +64211,7,2,2,1,20,1,1,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11582.174418,11621.723611,2,102,8,8,1.28,7,7,1,3,0,1,39,2,1,1,3 +64212,7,2,2,8,NA,5,7,1,8,107,NA,NA,2,1,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8128.755281,8532.236543,1,98,9,9,2.39,4,4,0,2,0,2,48,1,5,1,5 +64213,7,2,1,37,NA,1,1,2,NA,NA,2,NA,2,2,77,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,38610.51698,2,94,77,77,NA,3,3,0,1,0,2,42,2,2,6,NA +64214,7,2,1,18,NA,1,1,1,18,227,2,NA,2,2,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,2,24228.858782,24599.205366,2,102,5,5,1.3,3,3,0,0,0,1,42,NA,NA,1,NA +64215,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,16494.288293,17728.004854,2,101,2,2,0.77,1,1,0,0,1,2,80,1,1,2,NA +64216,7,2,2,2,24,1,1,1,2,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,12710.400836,2,98,7,7,2.16,3,3,1,0,0,2,26,1,3,1,3 +64217,7,2,1,53,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,1,2,2,2,2,2,2,2,20592.227875,20667.110628,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +64218,7,2,1,53,NA,4,4,2,NA,NA,1,2,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,14699.320127,15747.67742,2,90,15,15,5,4,4,1,1,0,1,53,2,5,1,5 +64219,7,2,2,80,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,1,5,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,13555.744544,2,90,14,14,4.25,4,4,0,2,1,2,45,2,5,5,NA +64220,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,99381.891022,101559.2006,2,92,15,6,2.3,4,1,0,0,0,1,27,NA,NA,5,NA +64221,7,2,1,19,NA,1,1,1,19,239,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,20634.3158,20949.718537,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +64222,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105902.251482,110971.270582,3,91,10,10,3.51,3,3,0,1,0,1,39,1,5,1,3 +64223,7,2,2,0,1,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20239.765739,19690.008753,2,94,9,9,2.51,4,4,2,0,0,1,30,2,4,1,4 +64224,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,33292.204257,2,101,2,2,0.64,1,1,0,0,0,2,22,1,4,5,NA +64225,7,2,1,8,NA,3,3,2,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,50571.965712,52018.055374,2,95,15,15,4.63,5,5,1,2,0,2,36,1,5,1,3 +64226,7,2,1,73,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,73758.836891,83728.230941,2,91,3,3,1.25,1,1,0,0,1,1,73,1,3,5,NA +64227,7,2,2,59,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,4,5,NA,2,2,2,2,2,2,1,2,1,2,24553.193015,24681.235828,2,93,3,3,0.9,1,1,0,0,0,2,59,2,4,5,NA +64228,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,146181.198007,184923.777793,2,91,15,15,5,2,1,0,0,0,1,44,1,3,5,NA +64229,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,32609.153024,32528.629595,1,98,3,3,0.73,3,3,0,0,0,1,52,1,4,1,3 +64230,7,2,2,2,NA,4,4,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8296.101892,8926.698178,2,96,7,7,1.49,5,5,2,1,0,1,51,1,5,1,3 +64231,7,2,1,68,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7820.017944,8252.409456,2,98,7,7,2.1,3,3,0,0,1,1,68,1,2,1,9 +64232,7,2,1,0,6,3,3,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23912.171644,25599.009772,1,94,9,9,3.14,3,3,1,0,0,1,28,1,5,1,5 +64233,7,2,1,14,NA,4,4,1,15,180,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13731.625553,14361.066702,1,100,6,6,1.13,4,4,0,3,0,2,32,1,3,5,NA +64234,7,2,1,29,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,59682.963348,63262.110969,2,102,15,15,3.92,5,5,0,0,0,1,19,1,4,NA,NA +64235,7,2,2,56,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,2,2,2,2,22224.73066,22874.201587,2,94,12,12,NA,2,2,0,0,0,1,46,1,3,1,1 +64236,7,2,1,5,NA,1,1,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11388.091908,11522.723578,1,103,8,8,1.85,5,5,2,1,0,2,25,2,2,1,2 +64237,7,2,2,16,NA,3,3,2,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,38400.791741,38900.548719,1,92,4,4,0.5,6,6,0,3,0,2,41,1,4,1,NA +64238,7,2,1,0,2,5,6,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5024.464768,5303.683185,2,92,99,77,NA,7,3,3,3,1,1,61,2,1,1,3 +64239,7,2,1,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5396.442999,5408.183432,1,99,4,4,0.53,7,7,3,1,0,2,26,1,1,5,NA +64240,7,2,1,19,NA,1,1,1,19,233,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,23389.620035,23146.524434,1,94,10,10,2.94,4,4,0,2,0,2,52,1,5,2,NA +64241,7,2,2,0,9,3,3,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6423.658168,6554.989142,2,96,3,3,0.53,5,5,3,0,0,2,26,1,4,1,4 +64242,7,2,2,16,NA,3,3,1,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,82145.180523,84080.796514,1,98,15,15,5,5,5,0,3,0,2,44,1,5,1,5 +64243,7,2,2,7,NA,3,3,2,7,85,NA,NA,2,1,1,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,52455.416493,51758.830416,1,93,15,15,5,4,4,0,2,0,2,42,1,5,1,NA +64244,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,30888.99461,30919.326232,1,99,2,2,0.61,2,2,0,0,0,1,46,1,5,5,NA +64245,7,2,1,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,120041.937453,119895.563372,1,98,9,9,2.88,6,3,1,3,0,1,51,1,2,1,3 +64246,7,2,1,14,NA,2,2,2,14,172,NA,NA,2,1,2,7,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,26616.794908,27940.371621,2,91,7,7,2.64,2,2,0,1,0,1,33,2,3,1,NA +64247,7,2,1,42,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,43470.92932,47764.563168,1,92,5,5,0.87,4,4,0,2,0,1,42,2,1,1,4 +64248,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,67727.881967,67936.122757,2,99,15,15,5,1,1,0,0,0,2,38,1,5,5,NA +64249,7,1,1,11,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57057.523607,0,1,101,15,15,5,4,4,0,2,0,2,40,1,4,1,3 +64250,7,2,2,3,NA,1,1,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13366.393396,13791.68675,2,94,7,7,1.79,4,4,1,1,0,2,32,1,4,1,4 +64251,7,1,1,4,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7232.559351,0,2,103,14,14,3.86,4,4,2,0,0,2,37,2,5,1,NA +64252,7,2,1,61,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,3,1,NA,2,2,2,1,2,2,1,2,2,2,11019.434708,11234.197915,3,91,5,5,0.89,4,4,0,2,2,1,61,2,3,1,4 +64253,7,2,1,13,NA,5,7,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5388.361335,5758.757236,3,91,15,15,4.47,4,4,0,3,0,2,44,2,5,1,NA +64254,7,2,1,0,8,1,1,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6910.953528,6911.08091,2,96,4,4,0.81,3,3,1,0,0,2,37,2,5,1,3 +64255,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,1,2,2,3,13859.220514,14321.474311,1,98,12,14,5,3,1,0,0,0,1,24,1,4,5,NA +64256,7,2,2,67,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,11523.037911,11989.050618,2,97,6,6,2.31,2,2,0,0,1,2,67,1,3,2,NA +64257,7,2,2,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,53047.531099,53521.812192,1,99,2,1,0.18,2,1,0,0,0,2,24,1,5,5,NA +64258,7,2,2,13,NA,5,6,1,13,163,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12918.122917,13476.480232,1,92,10,10,2.82,4,4,0,2,0,2,48,2,5,1,5 +64259,7,2,2,35,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,2,1,2,2,2,2,1,2,2,2,2,2,2,35353.005268,36099.35979,2,94,6,6,1.34,4,4,0,2,0,1,37,2,4,1,2 +64260,7,2,2,17,NA,4,4,2,17,214,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11438.127668,11466.298034,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +64261,7,2,1,67,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,1,1,2,2,1,2,1,NA,13639.016686,14339.363246,2,102,15,15,5,5,5,1,0,2,1,30,1,4,1,5 +64262,7,2,2,6,NA,4,4,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10225.297464,10592.094499,1,93,2,2,0.32,3,3,0,1,0,1,25,1,3,6,NA +64263,7,2,2,62,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,2,2,2,2,9203.46153,9587.572248,2,97,6,6,1.7,2,2,0,0,1,2,62,2,5,1,2 +64264,7,2,1,14,NA,4,4,2,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8364.097643,8526.060452,2,90,6,6,0.96,5,5,0,1,0,1,55,1,4,6,NA +64265,7,2,1,48,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,27087.386131,27212.215064,1,101,6,6,1.43,4,4,0,1,2,2,72,1,2,1,NA +64266,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,90274.900586,93718.683628,2,99,15,15,5,2,1,0,0,0,1,31,1,5,6,NA +64267,7,2,2,10,NA,4,4,2,10,129,NA,NA,2,2,3,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7136.421849,7524.490259,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +64268,7,2,2,11,NA,4,4,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12476.900945,13434.365665,2,101,2,2,0.38,3,3,0,2,0,2,56,1,3,2,NA +64269,7,1,1,61,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9611.684527,0,1,98,7,7,1.52,4,4,0,1,2,1,61,1,4,1,2 +64270,7,2,2,47,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27934.372045,28667.797605,1,101,5,5,1.15,3,3,0,1,0,1,49,1,3,1,4 +64271,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,45549.853584,49025.946555,3,91,3,3,0.76,3,3,0,1,0,2,24,1,4,6,NA +64272,7,2,2,19,NA,4,4,2,19,239,2,NA,2,2,2,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12209.74498,12386.615954,2,90,6,6,1.34,4,4,1,0,0,1,38,2,4,6,NA +64273,7,2,1,5,NA,4,4,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9242.457181,9624.356732,2,97,5,5,0.76,5,5,1,2,0,1,32,1,4,6,NA +64274,7,2,1,0,3,1,1,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,7757.493251,7980.837709,2,98,3,3,0.4,6,6,1,2,0,2,29,2,1,4,NA +64275,7,1,1,62,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,4,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,10288.337394,0,3,91,8,8,4.13,1,1,0,0,1,1,62,2,4,4,NA +64276,7,2,1,50,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,23857.322871,23507.253435,1,103,1,1,0.03,3,3,0,0,0,1,50,1,2,3,NA +64277,7,2,2,48,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,36924.381422,39366.592716,2,102,7,7,1.89,3,3,0,1,0,1,41,2,2,6,NA +64278,7,2,2,18,NA,2,2,2,18,226,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13824.001771,14551.102227,2,90,5,5,1.19,3,3,0,0,0,2,50,2,4,4,NA +64279,7,2,1,11,NA,3,3,2,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,52386.010737,55389.865547,3,91,14,14,3.4,4,4,0,2,0,1,40,1,4,1,4 +64280,7,2,1,3,NA,4,4,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7014.280192,7545.08247,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +64281,7,2,1,44,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,34000.722046,33736.711001,2,93,14,14,3.52,5,5,1,2,0,1,44,1,5,1,5 +64282,7,2,1,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6074.284591,6449.253661,2,99,3,3,0.32,6,6,2,1,1,2,59,1,4,1,NA +64283,7,2,1,5,NA,4,4,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9035.668246,2,100,3,3,0.31,7,7,3,2,0,2,28,1,3,1,3 +64284,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,38808.357492,1,101,1,1,0.18,1,1,0,0,1,2,80,1,4,2,NA +64285,7,2,1,7,NA,1,1,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16334.967392,17408.274993,1,95,5,5,1.5,2,2,0,1,0,1,47,1,4,2,NA +64286,7,2,2,56,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16109.317112,16194.502254,1,103,15,15,5,2,2,0,0,1,2,56,2,5,1,5 +64287,7,2,1,7,NA,3,3,2,7,89,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24713.905595,26080.214484,1,98,6,6,0.97,7,7,1,2,0,1,49,1,2,1,2 +64288,7,2,2,41,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,31809.199771,32336.174545,2,103,9,9,3.97,2,2,0,0,1,1,61,1,5,1,3 +64289,7,2,2,0,3,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23207.538828,22577.170535,1,94,6,6,1.21,4,4,2,0,0,1,27,1,4,1,3 +64290,7,2,2,65,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10598.2543,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +64291,7,2,1,50,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,22238.49412,25006.164622,2,90,4,4,1.38,1,1,0,0,0,1,50,1,3,3,NA +64292,7,2,1,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,21924.03349,22615.591521,3,92,2,2,0.65,2,2,0,0,1,2,80,NA,NA,2,NA +64293,7,2,2,4,NA,3,3,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53166.229434,56500.79967,1,101,7,7,1.55,5,5,1,2,0,2,31,1,4,1,2 +64294,7,2,1,19,NA,2,2,2,19,234,2,NA,2,1,4,15,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,17149.002427,17445.048827,3,90,77,77,NA,4,3,0,0,0,1,45,2,3,3,NA +64295,7,2,1,10,NA,3,3,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,NA,NA,NA,1,2,2,1,69959.431608,85622.357277,2,100,NA,NA,NA,5,5,1,2,0,1,36,NA,NA,3,NA +64296,7,2,2,40,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,33716.655399,36032.83001,1,100,8,8,2.17,4,4,1,1,0,2,40,2,2,1,2 +64297,7,1,2,9,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15002.25457,0,1,91,7,7,2.72,2,2,0,1,0,2,31,1,2,5,NA +64298,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,10991.458112,11482.21496,2,99,10,10,4.76,2,2,0,0,2,1,80,1,2,2,NA +64299,7,2,1,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,95606.814645,96503.477057,2,98,15,15,5,2,2,0,0,1,2,52,1,4,1,4 +64300,7,1,2,6,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11035.074625,0,2,100,1,1,0.04,4,4,0,2,0,1,34,NA,NA,6,NA +64301,7,2,2,73,NA,5,7,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,12813.709202,13258.116643,2,103,12,12,NA,2,2,0,0,2,1,73,2,5,1,4 +64302,7,2,1,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,136880.768184,139080.782402,1,94,15,15,4.95,4,4,0,0,2,1,72,1,3,1,3 +64303,7,1,2,77,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,81395.297807,0,1,92,4,4,1.61,1,1,0,0,1,2,77,1,3,2,NA +64304,7,2,2,0,5,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8359.077295,8583.668456,3,92,5,5,0.81,5,5,3,0,0,2,23,1,4,5,NA +64305,7,2,2,41,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,14831.744106,14468.205243,3,90,10,10,3.67,3,3,0,1,0,2,52,2,3,5,NA +64306,7,2,2,2,NA,4,4,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7826.463896,8746.031629,1,96,6,6,1.21,4,4,2,0,0,1,24,1,4,1,3 +64307,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,102855.726146,106395.504024,1,101,7,7,1.74,4,4,1,0,0,1,24,NA,NA,1,4 +64308,7,2,2,31,NA,2,2,1,NA,NA,2,NA,2,2,77,NA,1,6,2,2,2,2,1,2,2,2,2,2,2,32097.38481,33124.257579,2,100,3,3,0.76,3,3,1,0,0,2,31,2,1,6,NA +64309,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53541.401974,54961.757487,1,99,13,13,NA,2,2,0,0,2,1,80,1,2,1,3 +64310,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,163194.688032,170363.320524,1,97,15,15,5,2,2,0,0,1,2,49,1,5,1,3 +64311,7,2,1,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17636.923031,18334.929229,2,97,15,14,5,2,1,0,0,0,1,54,1,4,5,NA +64312,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,42993.150248,46481.579201,1,92,7,7,2.64,2,2,0,0,2,2,68,1,4,1,4 +64313,7,2,1,65,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,3,6,NA,2,2,2,2,2,2,2,2,2,2,14067.170863,14736.245577,2,102,14,8,4.59,2,1,0,0,2,1,65,2,3,6,NA +64314,7,2,1,6,NA,1,1,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13285.093011,13495.322435,2,94,6,6,1.5,4,4,0,2,0,1,44,2,2,1,2 +64315,7,2,2,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,147501.330925,150787.451601,1,101,6,6,1.31,3,3,0,0,1,2,80,1,1,2,NA +64316,7,2,2,12,NA,4,4,1,12,155,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,6,6,1.16,4,4,0,3,0,2,36,1,4,4,NA +64317,7,2,2,18,NA,3,3,1,18,222,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,32725.110579,34226.88515,2,92,3,2,0.64,2,1,0,0,0,2,18,1,4,NA,NA +64318,7,2,2,14,NA,4,4,2,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13790.410898,14648.625582,1,93,7,7,1.79,4,4,0,2,0,1,53,2,4,1,4 +64319,7,2,2,14,NA,5,6,2,14,174,NA,NA,2,1,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8675.8731,8857.654394,1,96,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +64320,7,2,1,14,NA,4,4,2,14,171,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,18413.211403,2,101,13,3,0.64,5,4,0,3,1,2,62,1,1,2,NA +64321,7,2,1,12,NA,3,3,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,90320.117415,93226.168932,1,100,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +64322,7,2,1,8,NA,3,3,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41342.668304,42524.849071,1,102,8,8,2.42,4,4,0,2,0,2,34,1,4,1,3 +64323,7,2,1,3,NA,1,1,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17865.135763,18076.339981,3,92,1,1,0,5,5,3,0,0,1,26,1,2,1,2 +64324,7,2,2,28,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,2,2,2,2,2,2,2,2,2,2,2,38364.674202,40512.730459,2,97,13,13,NA,3,3,0,1,0,1,28,2,2,1,1 +64325,7,2,1,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,1,2,1,2,2,1,2,2,NA,108408.375382,111473.582646,2,98,14,14,4.16,3,3,0,0,0,1,49,1,5,1,4 +64326,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,90303.174138,94631.352733,2,92,14,9,5,2,1,0,0,0,1,29,1,5,6,NA +64327,7,2,1,9,NA,3,3,2,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30554.050397,31755.009616,1,97,3,3,0.93,2,2,0,1,0,2,34,1,4,5,NA +64328,7,2,1,78,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,13523.396212,13874.942566,2,94,2,2,0.56,2,2,0,0,2,2,71,2,2,1,1 +64329,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,34049.658577,35975.208577,1,91,9,9,4.27,2,2,0,0,2,1,80,1,4,1,3 +64330,7,2,1,43,NA,5,7,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,129656.862785,1,101,15,15,5,4,4,0,2,0,1,43,1,4,1,5 +64331,7,2,1,16,NA,3,3,1,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,59545.101745,58762.542429,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +64332,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,17579.006909,17715.920575,2,103,2,1,0.43,2,1,0,0,0,1,20,1,3,6,NA +64333,7,2,1,46,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,3,NA,1,2,2,1,2,2,1,2,2,3,20197.354438,20825.605262,2,96,5,5,1.84,2,1,0,0,1,1,46,2,3,3,NA +64334,7,2,1,6,NA,2,2,2,6,80,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11477.372934,11658.996164,1,93,9,9,2.46,4,4,0,2,0,1,35,2,1,1,1 +64335,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,NA,NA,NA,1,2,2,1,43813.24867,46884.227528,1,98,NA,NA,NA,4,4,0,2,0,1,31,NA,NA,1,2 +64336,7,2,1,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,19869.518693,21796.765593,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +64337,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,42894.724338,43561.362107,1,98,3,3,0.93,2,2,0,0,0,1,21,1,4,5,NA +64338,7,1,2,46,NA,1,1,NA,NA,NA,2,NA,2,2,6,NA,1,6,NA,2,2,2,1,2,2,NA,NA,NA,NA,40337.933888,0,2,94,5,5,0.65,6,6,0,2,0,1,53,NA,NA,6,NA +64339,7,2,1,6,NA,2,2,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12604.990052,13551.632975,1,103,7,7,1.03,7,7,0,3,0,1,50,2,1,1,1 +64340,7,1,1,80,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9443.12441,0,1,99,77,77,NA,2,2,0,0,2,1,80,1,5,1,4 +64341,7,2,2,51,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,2,1,NA,2,2,2,1,2,2,2,2,1,2,23200.373382,24548.135184,2,93,7,7,2.1,3,3,0,1,0,2,51,2,2,1,NA +64342,7,2,1,12,NA,3,3,2,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,103364.662244,103614.262032,1,98,14,14,3.15,5,5,0,3,0,1,34,1,4,1,4 +64343,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,84821.217572,87190.888968,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +64344,7,2,1,37,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,28213.419452,30402.035877,1,100,14,5,1.79,2,1,0,0,0,1,37,1,2,6,NA +64345,7,2,1,21,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21763.209029,22385.504537,2,92,4,1,0.18,4,1,0,0,0,1,21,1,4,5,NA +64346,7,2,1,3,NA,5,7,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8402.098771,9423.873047,3,91,14,14,4.32,3,3,1,0,0,1,31,2,3,1,4 +64347,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32838.149884,1,95,1,1,0,1,1,0,0,0,1,50,1,3,5,NA +64348,7,2,2,13,NA,3,3,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,105891.533689,107879.366927,1,101,8,8,1.85,5,5,0,3,0,1,41,1,3,1,4 +64349,7,2,2,24,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,NA,NA,NA,1,2,2,1,11475.373333,11965.391974,2,92,12,NA,NA,7,1,0,0,2,1,53,2,3,1,3 +64350,7,2,1,12,NA,4,4,2,12,145,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,12116.15399,2,95,7,7,1.55,5,5,0,3,0,1,30,1,4,1,4 +64351,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18353.275855,19744.388768,1,91,4,4,0.81,4,4,1,1,0,1,32,1,4,6,NA +64352,7,2,2,2,NA,4,4,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6085.457443,6422.142601,1,99,7,7,1.53,5,5,2,0,0,2,37,1,4,1,3 +64353,7,2,1,0,11,2,2,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7973.737542,8118.415368,1,91,7,7,1.66,4,4,2,0,0,1,32,2,5,1,4 +64354,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,1,2,NA,2,2,2,1,2,2,1,2,2,NA,21122.17432,23417.039872,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +64355,7,1,2,27,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,4,6,3,1,2,2,2,2,2,NA,NA,NA,NA,42583.505439,0,2,91,6,6,1.3,4,4,1,1,0,2,27,1,4,6,NA +64356,7,2,1,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,41236.907607,2,98,7,7,1.33,6,6,0,3,0,1,31,1,3,6,NA +64357,7,1,2,1,22,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9670.78354,0,2,93,15,15,5,4,4,2,0,0,1,34,1,5,1,5 +64358,7,2,1,5,NA,4,4,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,8005.528865,8250.049428,1,99,NA,NA,NA,4,4,1,1,0,1,42,NA,NA,1,NA +64359,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,25815.880139,26556.735732,2,101,99,2,0.73,2,1,0,0,0,1,24,1,4,5,NA +64360,7,2,2,54,NA,1,1,1,NA,NA,2,NA,2,2,99,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,21939.007884,22053.417944,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +64361,7,2,2,16,NA,5,6,2,16,199,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8301.172828,8662.397073,1,91,15,15,5,3,3,0,1,0,2,47,2,5,1,5 +64362,7,2,1,68,NA,4,4,2,NA,NA,2,NA,2,2,8,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,8491.292032,8823.40317,1,96,6,6,2.06,2,2,0,0,2,1,68,2,3,1,2 +64363,7,2,1,22,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,17701.114982,3,91,14,14,3.53,5,5,0,1,1,1,69,1,4,3,NA +64364,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,38976.947883,43357.400647,1,99,12,12,NA,1,1,0,0,1,2,80,1,3,3,NA +64365,7,2,2,5,NA,2,2,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14852.990935,14903.708855,3,92,7,7,0.93,7,7,1,3,0,2,20,1,3,1,1 +64366,7,2,1,4,NA,4,4,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10234.881417,10547.495238,2,97,2,2,0.33,4,4,2,1,0,2,34,1,2,5,NA +64367,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20039.469886,21581.359058,1,97,15,15,5,4,4,1,0,0,2,39,2,5,1,5 +64368,7,2,1,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,8497.912951,8999.288803,2,100,2,2,0.77,1,1,0,0,1,1,70,1,1,3,NA +64369,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,17824.805721,17767.952896,2,95,4,2,0.55,2,1,0,0,0,2,47,1,3,4,NA +64370,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25890.025676,30408.154535,2,93,3,3,1.25,1,1,0,0,0,1,25,1,4,5,NA +64371,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,1,96,15,9,4.92,2,1,0,0,0,2,55,1,4,5,NA +64372,7,2,2,19,NA,4,4,2,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13176.946531,13078.313981,2,99,9,9,1.78,6,6,1,1,0,1,46,1,3,6,NA +64373,7,2,2,6,NA,3,3,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,41790.228676,44382.642913,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +64374,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10700.939986,11250.682738,1,99,15,15,4.47,4,4,0,2,0,2,52,2,5,1,5 +64375,7,2,2,14,NA,2,2,2,14,175,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,5,5,0.8,5,5,0,3,0,2,40,2,1,5,NA +64376,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,34296.120763,1,95,3,3,0.65,3,3,1,0,0,1,58,1,3,3,NA +64377,7,2,2,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,19060.786733,19867.822877,2,97,5,5,0.92,5,5,0,3,0,2,54,1,3,2,NA +64378,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,115391.113177,120921.742093,1,102,14,7,3.31,2,1,0,0,0,1,27,1,4,5,NA +64379,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,30320.430859,2,101,4,3,1.15,2,1,0,0,0,2,22,1,4,5,NA +64380,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,114993.808573,116714.079488,1,98,7,3,0.9,4,1,0,0,0,2,20,NA,NA,5,NA +64381,7,2,2,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,148725.079159,151155.002758,2,94,15,15,5,2,2,0,0,2,1,63,1,5,1,5 +64382,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,6,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15533.829525,2,101,6,1,0.22,2,1,0,0,0,2,26,2,4,6,NA +64383,7,2,2,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,19658.218913,18995.471706,1,99,13,13,NA,4,4,1,0,0,2,26,1,4,4,NA +64384,7,2,1,0,5,3,3,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24315.386145,24328.135897,1,102,6,6,1.23,4,4,2,0,0,2,25,1,5,1,5 +64385,7,2,2,13,NA,5,6,1,13,160,NA,NA,2,1,3,6,NA,NA,NA,1,1,2,1,2,1,1,2,2,1,8878.081187,9740.503961,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +64386,7,2,2,9,NA,1,1,1,10,121,NA,NA,2,2,3,2,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,16397.644545,16823.243233,1,91,7,7,2.1,3,3,0,1,0,2,29,2,3,6,NA +64387,7,2,1,71,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,5,1,NA,1,2,1,1,2,1,1,2,1,NA,9748.579573,10638.31203,3,90,9,9,2.93,3,3,0,0,2,1,71,2,5,1,4 +64388,7,2,1,69,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,8232.241159,8296.636338,2,98,5,5,2.2,1,1,0,0,1,1,69,1,4,3,NA +64389,7,2,1,10,NA,1,1,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,9485.228453,10197.575258,1,103,10,10,2.82,4,4,0,2,0,1,41,2,1,1,1 +64390,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18494.181242,18934.264494,2,99,4,4,0.78,4,4,0,2,0,2,45,1,3,5,NA +64391,7,2,2,26,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,36731.516901,42296.380247,1,99,10,6,2.75,2,1,0,0,0,1,31,1,4,6,NA +64392,7,2,1,10,NA,3,3,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,46228.073505,48314.890943,2,94,5,5,0.89,4,4,0,2,0,2,51,1,2,3,NA +64393,7,2,2,16,NA,4,4,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14166.687432,14623.20249,1,100,15,15,3.87,6,6,1,3,0,2,39,1,4,1,4 +64394,7,2,2,2,NA,1,1,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8082.096138,8109.693752,1,90,4,4,0.46,7,7,2,3,0,2,34,2,1,6,NA +64395,7,2,1,6,NA,3,3,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58159.917125,59822.981903,3,92,15,15,5,4,4,0,2,0,2,38,1,5,1,5 +64396,7,2,2,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,162038.12624,162493.980108,1,94,77,77,NA,1,1,0,0,0,2,51,1,3,3,NA +64397,7,2,2,54,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15714.689474,15797.787849,2,99,15,15,5,1,1,0,0,0,2,54,1,5,5,NA +64398,7,2,1,4,NA,4,4,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14467.4421,15952.720644,2,101,5,5,1.19,3,3,1,0,0,2,32,1,4,1,3 +64399,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,26763.110196,36351.891896,2,94,3,3,0.95,2,2,0,1,0,2,45,1,5,3,NA +64400,7,2,2,61,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,11623.354795,12210.370942,1,94,6,6,1.98,2,2,0,0,2,1,65,2,1,1,1 +64401,7,2,1,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,29537.209125,29019.340657,1,95,12,3,1.19,4,1,0,0,0,1,29,1,3,6,NA +64402,7,2,1,48,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,5,1,NA,2,2,2,2,2,2,1,2,2,2,27776.016947,27368.446715,2,90,6,6,1.15,5,5,0,2,0,2,47,2,1,1,5 +64403,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,22685.373982,24056.024455,1,98,4,4,1,3,3,0,1,1,1,65,1,2,1,NA +64404,7,2,1,33,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,99283.360764,105383.970589,3,91,8,8,3.4,2,2,0,0,0,1,33,2,5,1,4 +64405,7,2,1,78,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,11550.158096,12480.92393,2,92,3,3,0.4,6,6,0,1,2,1,78,2,1,1,1 +64406,7,2,1,18,NA,5,6,2,18,219,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6999.347953,8045.308483,3,90,6,6,1.3,4,4,0,0,0,1,55,2,1,1,1 +64407,7,2,1,54,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,17801.655316,18085.793361,2,95,6,6,0.97,6,6,2,1,0,1,54,1,3,6,NA +64408,7,2,2,15,NA,4,4,2,15,184,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13124.737024,13087.755238,2,101,5,5,1.08,3,3,0,1,1,2,62,1,4,2,NA +64409,7,2,1,7,NA,4,4,2,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7886.48532,7943.675078,1,99,8,8,1.76,5,5,0,2,1,1,37,1,4,1,3 +64410,7,2,2,13,NA,2,2,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16360.434077,17220.943159,1,94,14,14,3.4,5,5,0,3,0,2,41,1,4,1,4 +64411,7,2,1,37,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18745.208345,19348.815401,1,92,7,7,2.1,3,3,0,0,2,1,37,2,5,5,NA +64412,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,27553.988486,28260.692091,2,98,3,3,0.93,1,1,0,0,0,2,54,1,3,3,NA +64413,7,2,2,48,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,2,5,NA,2,2,2,2,2,2,1,2,2,2,25778.164795,26907.837256,2,90,1,1,0.22,3,3,0,1,0,2,48,2,2,5,NA +64414,7,2,2,1,23,3,3,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17516.090261,18614.694278,1,98,2,2,0.36,5,5,3,0,0,1,25,1,3,1,3 +64415,7,2,2,55,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18525.3583,18971.375925,1,92,14,14,3.9,4,4,0,0,0,2,55,2,5,1,5 +64416,7,2,1,6,NA,5,6,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11522.32071,1,97,7,7,1.48,5,5,1,2,0,1,40,2,5,1,4 +64417,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,135384.418391,141422.067719,1,98,15,15,5,3,3,0,0,0,1,48,1,4,1,4 +64418,7,2,2,17,NA,3,3,1,17,211,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,80091.55101,82618.226829,1,98,6,6,1.11,5,5,0,2,1,2,37,1,1,1,1 +64419,7,2,2,63,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,16352.915834,17178.789759,3,92,5,5,1.26,3,3,0,0,2,1,76,2,1,1,1 +64420,7,2,2,54,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,17928.412795,17976.980061,1,90,15,15,4.34,4,4,0,0,1,1,62,2,5,1,3 +64421,7,2,2,2,NA,4,4,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8754.193667,9419.610037,2,98,8,8,1.8,5,5,2,1,0,1,32,1,4,1,5 +64422,7,2,1,16,NA,2,2,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,15351.501195,16874.029415,2,90,1,1,0.22,3,3,0,1,0,2,48,2,2,5,NA +64423,7,2,2,12,NA,4,4,1,12,151,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12826.497818,12890.123626,2,96,3,3,0.38,5,5,1,2,0,2,30,1,3,5,NA +64424,7,2,1,0,6,3,3,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25469.602005,25029.287945,2,91,15,15,5,3,3,1,0,0,1,35,1,5,1,5 +64425,7,2,2,7,NA,5,6,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7722.982971,8635.133042,1,93,8,8,2.24,4,4,0,2,0,1,44,2,5,1,4 +64426,7,2,2,0,1,4,4,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4412.61884,4541.653777,1,93,7,7,1.97,4,4,1,2,0,2,33,1,4,3,NA +64427,7,2,1,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105412.227726,111169.022023,2,101,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +64428,7,2,1,7,NA,5,6,1,7,86,NA,NA,2,1,2,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9101.455527,9700.372536,2,102,8,8,1.72,5,5,0,2,1,1,63,2,5,1,5 +64429,7,2,1,4,NA,5,6,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6185.185728,6767.562311,1,97,14,14,2.29,7,7,1,2,2,1,40,2,1,1,1 +64430,7,2,1,65,NA,5,7,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,7415.090784,7473.093956,2,95,12,12,NA,3,3,0,0,2,1,65,1,4,1,4 +64431,7,2,2,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,42468.064168,43146.583227,2,101,5,5,1.19,3,3,1,0,0,2,32,1,4,1,3 +64432,7,2,2,12,NA,4,4,1,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16598.888685,16552.117725,2,102,5,5,0.76,5,5,1,3,0,2,30,1,4,4,NA +64433,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,1,2,NA,6882.452425,7271.66356,1,99,6,6,1.12,4,4,0,0,2,1,51,1,4,3,NA +64434,7,2,2,7,NA,3,3,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,56541.371473,55790.525616,2,94,3,3,0.82,2,2,0,1,0,2,38,1,5,3,NA +64435,7,2,1,16,NA,5,7,2,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9136.388281,9719.077424,3,91,8,8,2.24,4,4,0,2,0,1,45,1,4,1,4 +64436,7,2,2,34,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,27127.983961,27837.333201,2,90,14,14,3.45,4,4,1,1,0,2,34,2,5,6,NA +64437,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,5,2,1,2,2,1,2,2,1,2,2,1,19520.240895,25185.107635,2,95,2,2,0.33,2,2,1,0,0,2,21,1,1,5,NA +64438,7,2,2,44,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,25774.834017,34018.000767,1,100,8,8,3.3,2,2,0,1,0,2,44,1,4,3,NA +64439,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,148039.171547,149225.244125,2,98,15,15,5,2,2,0,0,0,2,52,1,3,1,4 +64440,7,2,1,40,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,24506.160629,24417.630409,1,92,77,77,NA,2,2,0,0,1,1,40,2,5,5,NA +64441,7,2,1,0,1,4,4,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7867.225786,8217.805417,3,92,6,6,0.93,5,5,2,1,0,2,37,1,5,1,3 +64442,7,1,1,61,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,8390.796678,0,3,92,7,7,2.45,2,2,0,0,1,2,55,1,1,1,1 +64443,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7567.81858,8250.001805,2,97,7,7,1.06,7,7,1,2,0,2,40,1,4,5,NA +64444,7,2,1,18,NA,3,3,2,18,223,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,74123.161671,78732.269389,1,93,15,15,4.59,4,4,0,1,0,1,57,1,5,1,5 +64445,7,1,2,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11353.600279,0,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +64446,7,2,1,47,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,104871.724763,1,98,7,7,1.66,5,5,2,1,0,2,37,1,5,1,3 +64447,7,2,2,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,27934.372045,33663.467631,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +64448,7,2,1,0,0,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22215.410216,21831.35406,2,98,14,14,4.32,3,3,1,0,0,1,26,1,4,6,NA +64449,7,2,2,18,NA,5,6,1,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10312.363668,10584.186706,2,102,10,10,3.62,3,3,0,0,0,1,51,2,5,1,5 +64450,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,9845.894687,11807.30791,2,94,14,14,3.58,4,4,1,0,1,1,80,1,3,2,NA +64451,7,2,1,32,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18464.039593,21965.968723,1,101,6,6,2.51,2,1,0,0,0,1,32,1,4,6,NA +64452,7,2,1,0,10,2,2,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7284.164858,7284.299119,1,92,6,6,1.67,3,3,1,0,0,1,27,1,3,6,NA +64453,7,2,2,5,NA,4,4,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15449.848607,17265.123353,2,102,1,1,0.16,3,3,1,0,1,2,63,1,2,4,NA +64454,7,2,2,4,NA,5,7,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13130.790087,14128.876607,2,102,14,14,3.25,5,5,1,1,0,2,32,1,4,1,3 +64455,7,2,1,6,NA,4,4,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12399.014378,12645.533348,2,96,6,6,1.35,3,3,1,1,0,2,25,1,3,5,NA +64456,7,2,2,31,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,32097.38481,32019.876048,2,100,14,14,3.58,4,4,1,1,0,1,33,1,4,1,5 +64457,7,1,2,14,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20322.312754,0,2,91,6,6,0.93,5,5,1,2,0,2,50,2,1,5,NA +64458,7,2,1,4,NA,2,2,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17533.373205,2,98,6,6,0.78,7,7,1,3,1,2,63,1,2,4,NA +64459,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,129553.609875,132943.624501,2,95,10,10,4.49,2,2,0,0,1,1,62,NA,NA,1,3 +64460,7,2,1,10,NA,3,3,2,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,46081.129115,48091.57352,2,95,5,5,0.87,4,4,1,1,0,1,34,1,3,6,NA +64461,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,24919.497762,25578.256222,1,101,1,1,0.1,4,4,1,1,0,2,52,1,4,3,NA +64462,7,2,1,12,NA,4,4,1,13,157,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12147.046136,12703.852077,2,100,4,4,0.85,4,4,0,2,0,2,39,1,3,6,NA +64463,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,52209.836905,57180.809983,1,98,13,13,NA,2,2,0,0,2,2,80,1,2,2,NA +64464,7,2,1,0,7,5,6,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7997.590655,8653.844084,3,91,15,15,5,4,4,2,0,0,2,33,2,5,1,5 +64465,7,2,2,32,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,2,2,2,1,2,2,1,2,2,1,38184.257672,37153.966183,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +64466,7,2,2,23,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,18723.98095,18882.01405,2,95,1,1,0.03,3,3,1,0,0,1,23,1,3,6,NA +64467,7,2,1,4,NA,4,4,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10510.490567,11159.309176,1,92,77,77,NA,5,5,1,2,0,2,41,1,3,5,NA +64468,7,2,2,12,NA,5,7,2,12,147,NA,NA,2,1,4,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8301.172828,8622.168806,1,94,15,15,4.2,5,5,1,2,0,1,47,1,5,1,5 +64469,7,2,1,47,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,17787.524589,17730.790674,2,100,8,8,4.96,1,1,0,0,0,1,47,1,5,5,NA +64470,7,2,2,20,NA,5,7,2,NA,NA,2,NA,2,2,3,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,55392.206282,55887.450369,3,91,6,6,2.04,2,2,0,0,0,1,24,2,4,5,NA +64471,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,61994.231866,64386.409549,2,92,15,15,5,3,3,1,0,0,1,48,1,5,1,5 +64472,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,31460.11615,32394.500316,1,97,3,3,0.73,3,3,0,0,0,2,50,1,4,1,3 +64473,7,2,1,79,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11869.786782,12478.026352,2,101,6,6,2.04,2,2,0,0,2,2,74,1,3,1,3 +64474,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,23594.223469,25276.966347,1,97,15,15,5,4,4,0,1,0,1,40,1,4,1,4 +64475,7,2,1,62,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,1,NA,2,2,2,2,2,2,1,2,2,1,8197.936864,8932.691175,3,90,8,8,3.21,2,2,0,0,2,2,80,2,3,2,NA +64476,7,2,2,58,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,1,4,NA,2,2,2,2,2,2,NA,NA,NA,NA,26272.35217,26409.360251,2,102,4,4,0.65,5,5,1,0,0,2,58,2,1,4,NA +64477,7,2,1,49,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,19895.710643,19832.252596,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +64478,7,2,1,10,NA,4,4,2,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8655.162127,8668.652185,2,95,6,6,1.36,3,3,0,1,1,2,62,1,4,5,NA +64479,7,2,2,17,NA,1,1,1,17,205,2,NA,2,2,5,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,20117.170449,20520.192725,1,94,2,2,0.27,5,5,0,4,0,2,47,2,1,4,NA +64480,7,2,1,4,NA,5,6,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10276.262805,11525.953064,1,97,15,15,5,4,4,2,0,0,1,40,2,5,1,5 +64481,7,2,2,19,NA,3,3,2,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,35205.804094,37301.699975,2,101,2,1,0.32,3,1,0,0,0,2,19,NA,NA,NA,NA +64482,7,2,1,2,NA,5,6,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10498.222836,11004.769407,1,100,15,15,5,4,4,2,0,0,1,39,2,5,1,5 +64483,7,2,2,5,NA,1,1,1,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16462.187772,17500.018071,3,92,5,5,0.81,5,5,3,0,0,2,23,1,4,5,NA +64484,7,2,2,26,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,15265.136017,16765.388266,1,93,15,15,5,2,2,0,0,0,1,29,2,5,1,5 +64485,7,2,1,32,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,2,2,2,2,37658.482129,37374.26166,1,100,3,3,0.39,5,5,1,2,0,1,32,2,1,6,NA +64486,7,2,1,9,NA,4,4,1,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11443.206518,11526.18825,1,100,12,12,NA,5,5,0,3,0,1,39,1,5,1,3 +64487,7,2,1,7,NA,3,3,1,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18812.486733,19704.440218,1,98,6,6,0.81,6,6,0,4,0,2,34,NA,NA,1,2 +64488,7,2,2,39,NA,4,4,2,NA,NA,2,NA,2,2,5,NA,3,4,2,1,2,2,1,2,2,NA,NA,NA,NA,35601.750356,47964.629837,1,93,4,4,1.09,2,2,1,0,0,2,39,2,3,4,NA +64489,7,2,2,65,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,9991.888445,10532.363744,3,90,9,9,2.93,3,3,0,0,2,1,71,2,5,1,4 +64490,7,2,1,8,NA,1,1,1,8,104,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17882.621856,18280.794545,3,92,12,12,NA,6,6,1,3,0,2,33,1,5,1,4 +64491,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,87028.709207,89819.695129,1,98,8,8,2.46,3,3,1,0,0,1,29,1,4,6,NA +64492,7,2,1,0,5,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20854.290322,20493.76497,2,94,14,14,4.05,3,3,1,0,0,2,37,1,5,1,5 +64493,7,2,1,17,NA,4,4,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13513.882801,1,96,15,15,4.9,4,4,0,1,0,1,47,1,3,1,5 +64494,7,2,2,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,28546.083602,28843.236835,2,95,9,9,4.1,2,2,0,0,0,2,19,1,4,NA,NA +64495,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,166234.629208,1,95,10,10,4.76,2,2,0,0,0,1,53,1,2,1,3 +64496,7,1,1,30,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,25120.174741,0,2,102,14,14,4.86,3,3,1,0,0,1,30,1,5,1,5 +64497,7,2,1,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,25495.045769,28642.112646,1,94,5,5,1.39,2,2,0,0,2,1,60,1,1,5,NA +64498,7,2,2,47,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15747.833197,16088.766331,3,91,15,15,5,3,3,0,1,0,1,47,2,5,1,5 +64499,7,2,1,63,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10004.038848,10164.290775,2,102,9,9,3.24,3,3,0,0,1,1,63,1,4,1,4 +64500,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,105593.259211,109935.078529,2,92,15,9,5,2,1,0,0,0,2,29,1,5,6,NA +64501,7,2,1,66,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,1,NA,2,2,2,2,2,2,2,2,1,2,9068.437099,9213.701881,2,93,15,15,4.84,6,6,1,1,2,1,66,2,4,1,3 +64502,7,2,1,14,NA,4,4,2,14,177,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10366.393886,10567.129261,1,90,9,9,1.65,7,7,0,4,0,1,36,1,4,1,4 +64503,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,13555.744544,2,90,9,9,3.02,3,3,0,0,2,2,70,1,4,1,2 +64504,7,2,2,57,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,16165.962054,15723.538094,2,99,12,4,1.34,6,1,0,0,0,2,57,1,5,2,NA +64505,7,2,1,18,NA,4,4,1,18,218,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13731.625553,14361.066702,1,100,1,1,0.04,4,4,1,1,0,2,51,1,3,3,NA +64506,7,2,1,9,NA,3,3,2,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21087.869274,22686.932895,1,101,4,4,1.16,2,2,0,1,0,2,51,1,4,3,NA +64507,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,46023.826844,47769.922841,1,91,9,9,3.24,3,3,0,0,1,1,70,1,1,2,NA +64508,7,2,1,14,NA,4,4,2,14,171,NA,NA,2,2,2,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9987.254512,10059.992052,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +64509,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,36283.627734,36608.028102,1,102,5,4,1.74,5,1,1,1,0,2,24,1,4,5,NA +64510,7,2,2,10,NA,1,1,1,10,123,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13028.403003,13395.598637,2,96,6,6,1.11,5,5,0,3,0,2,32,2,3,1,2 +64511,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,9,9,4.15,2,2,0,0,2,2,64,1,4,1,5 +64512,7,2,1,7,NA,4,4,2,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7886.48532,7943.675078,1,99,14,14,3.8,4,4,1,1,0,1,48,2,5,1,5 +64513,7,1,2,80,NA,2,2,NA,NA,NA,2,NA,2,1,9,NA,1,2,NA,2,2,2,2,2,2,NA,NA,NA,NA,17318.187297,0,2,90,77,77,NA,1,1,0,0,1,2,80,2,1,2,NA +64514,7,2,2,31,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,6,2,2,2,2,2,2,2,1,2,2,1,29176.121289,29479.238307,2,90,4,4,0.81,3,3,0,0,0,1,39,2,3,5,NA +64515,7,2,2,41,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,NA,NA,NA,NA,36924.381422,38397.364281,2,102,7,7,2.16,3,3,0,2,0,2,41,1,5,3,NA +64516,7,2,2,2,NA,3,3,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37236.564417,41097.653079,2,95,7,7,2.91,2,2,1,0,0,1,32,1,5,2,NA +64517,7,2,2,4,NA,3,3,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51483.624552,52160.136719,1,91,8,8,3.57,2,2,1,0,0,2,33,1,5,3,NA +64518,7,2,1,14,NA,1,1,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,24805.109913,25184.264697,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +64519,7,1,2,1,18,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37915.354974,0,2,94,12,12,NA,5,5,1,0,2,2,39,1,5,3,NA +64520,7,2,2,64,NA,2,2,2,NA,NA,2,NA,2,1,NA,NA,3,1,NA,1,1,2,1,2,2,1,2,2,NA,12026.225854,13435.778737,1,90,14,14,5,2,2,0,0,2,1,65,2,2,1,3 +64521,7,2,1,15,NA,4,4,2,15,182,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,5,5,1.18,3,3,0,1,0,2,55,1,4,5,NA +64522,7,2,1,13,NA,5,7,1,13,163,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5535.564809,5914.423708,2,92,15,15,4.59,4,4,0,2,0,2,45,2,5,1,5 +64523,7,2,2,8,NA,4,4,2,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10888.493631,11627.08662,1,101,1,1,0.21,3,3,0,2,0,2,32,1,4,5,NA +64524,7,2,1,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25372.225163,26225.545107,2,93,6,2,0.72,4,1,0,0,1,1,69,NA,NA,1,NA +64525,7,2,2,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,45673.879644,47551.913663,1,94,5,5,1.47,2,2,0,0,0,1,24,1,4,1,4 +64526,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,139800.409559,143196.722449,1,100,8,8,1.95,4,4,0,2,1,2,49,1,5,6,NA +64527,7,1,2,42,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,NA,NA,NA,NA,NA,NA,NA,29650.79971,0,2,90,NA,NA,NA,2,2,0,0,0,1,40,NA,NA,1,5 +64528,7,2,2,7,NA,4,4,2,7,89,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8579.490652,8729.153641,2,97,13,13,NA,6,6,2,2,0,2,24,1,2,6,NA +64529,7,2,1,18,NA,3,3,1,18,219,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,112494.70924,119489.826838,1,94,5,5,1.04,4,4,1,1,0,1,18,1,2,NA,NA +64530,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,181786.280703,1,95,10,10,4.76,2,2,0,0,0,1,53,1,2,1,3 +64531,7,2,2,2,NA,5,6,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5248.47937,5499.505789,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +64532,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,14340.013944,13947.561844,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +64533,7,2,1,13,NA,4,4,2,13,157,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12418.38217,12987.625827,2,99,6,6,1.57,3,3,0,2,0,2,31,1,3,77,NA +64534,7,2,2,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,3,1,2,2,1,2,2,1,2,2,1,19658.218913,19871.634013,1,99,2,2,0.31,4,4,1,0,1,2,67,1,3,3,NA +64535,7,2,2,7,NA,4,4,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6491.294105,6989.429429,2,99,6,6,1.11,5,5,1,2,0,2,41,1,2,5,NA +64536,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,68852.695662,70965.028494,1,101,15,15,5,3,3,0,0,2,1,75,1,2,1,2 +64537,7,1,1,7,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8749.381325,0,2,100,15,15,5,4,3,0,2,0,1,42,1,3,5,NA +64538,7,2,2,11,NA,1,1,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,16986.005478,17733.622754,2,102,6,6,1,6,6,1,3,0,1,35,2,3,1,3 +64539,7,2,2,7,NA,3,3,2,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,80369.555824,80552.420473,1,97,15,15,4.07,5,5,0,3,0,1,36,1,5,1,5 +64540,7,2,1,69,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,1,2,1,2,2,1,2,2,NA,11992.012141,12184.108862,2,102,99,99,NA,2,2,0,0,2,2,67,2,5,1,5 +64541,7,2,2,0,10,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27492.029044,26745.284482,1,97,10,10,2.95,4,4,2,0,0,1,28,1,5,1,4 +64542,7,2,2,5,NA,1,1,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13366.393396,13791.68675,2,94,77,77,NA,4,4,2,0,0,1,26,2,2,1,4 +64543,7,2,2,0,7,3,3,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12997.670925,13008.434462,1,99,10,10,2.48,5,5,2,1,0,1,33,1,5,1,5 +64544,7,2,1,69,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,7688.593855,7926.541218,2,100,14,14,4.59,3,3,0,0,2,1,69,2,5,1,5 +64545,7,2,1,15,NA,2,2,1,15,184,NA,NA,2,2,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17555.907575,18699.509115,2,93,8,8,2,4,4,1,1,0,1,50,2,4,1,4 +64546,7,1,2,6,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14300.71869,0,2,94,4,4,0.72,4,4,1,1,0,1,30,2,1,1,3 +64547,7,2,1,2,NA,1,1,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10803.555682,10931.27688,2,94,9,9,2.1,5,5,1,2,0,1,31,2,4,1,4 +64548,7,2,2,59,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,17950.494975,18045.41616,1,92,2,2,0.24,5,5,0,2,0,1,35,2,4,1,3 +64549,7,2,1,44,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,42123.732489,42281.342391,1,102,7,7,1.7,4,4,0,0,2,1,44,1,4,4,NA +64550,7,2,2,62,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,3,12449.239856,12885.71781,1,96,7,7,2.64,2,2,0,0,2,1,64,2,5,1,5 +64551,7,2,2,10,NA,2,2,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14414.529053,14504.545241,2,96,14,14,3.36,4,4,1,1,0,2,28,1,2,6,NA +64552,7,2,1,76,NA,2,2,2,NA,NA,1,2,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,13725.398968,14221.420409,2,90,7,7,2.52,2,2,0,0,2,2,71,1,4,1,4 +64553,7,2,2,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,13422.679076,14021.98734,2,92,6,6,2.31,2,2,0,0,2,2,65,1,4,5,NA +64554,7,2,2,1,17,3,3,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,43715.161102,44289.593043,1,98,15,15,5,3,3,1,0,0,1,33,1,5,1,5 +64555,7,2,2,1,20,3,3,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20272.436775,20538.823422,2,94,77,77,NA,2,2,1,0,0,1,24,1,4,77,NA +64556,7,2,2,0,4,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9767.083234,10416.172562,3,92,2,2,0.4,3,3,1,0,0,1,21,1,2,6,NA +64557,7,2,1,3,NA,4,4,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11324.865632,11670.771889,2,96,5,5,1.13,3,3,1,1,0,2,31,1,3,5,NA +64558,7,2,1,62,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11764.405491,12074.424659,1,97,14,14,3.93,3,3,0,1,2,2,63,1,4,1,4 +64559,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,72551.269339,74475.92188,1,95,7,7,2.45,2,2,0,0,2,2,70,1,3,1,3 +64560,7,1,2,13,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,21282.11341,0,1,90,6,6,1.44,3,3,0,1,0,1,44,2,1,1,3 +64561,7,2,1,6,NA,2,2,2,6,83,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8927.426533,9245.241527,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +64562,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,23235.97926,24326.785264,2,95,6,6,1.19,4,4,0,1,0,1,44,1,3,1,2 +64563,7,2,2,0,7,2,2,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7849.042868,8059.930457,2,98,6,6,1.07,5,5,3,0,0,2,24,1,3,1,3 +64564,7,2,2,54,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,19302.748944,20091.820859,3,92,15,15,5,3,3,0,1,0,1,55,2,5,1,4 +64565,7,1,1,54,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,20286.317046,0,2,99,99,99,NA,1,1,0,0,0,1,54,1,3,5,NA +64566,7,2,1,7,NA,4,4,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8294.996898,8761.908989,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +64567,7,2,1,37,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,38835.309696,39871.800261,1,100,15,15,4.34,4,4,2,0,0,2,35,1,5,1,5 +64568,7,2,2,5,NA,1,1,1,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10493.785765,10940.90082,1,103,5,5,0.71,6,6,2,2,0,2,31,2,2,1,2 +64569,7,2,1,14,NA,4,4,1,14,177,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9188.45337,9407.445906,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +64570,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,49428.481088,50236.061312,1,101,2,2,0.72,1,1,0,0,1,2,65,1,4,2,NA +64571,7,2,1,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,124091.929364,132249.317489,1,95,15,15,5,3,3,1,0,0,1,26,1,3,1,4 +64572,7,2,1,50,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15693.68983,16353.841376,1,91,77,77,NA,4,4,0,2,0,1,50,2,5,1,5 +64573,7,2,1,7,NA,4,4,1,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9022.8939,9451.941588,2,100,5,5,0.88,5,5,2,1,0,2,30,1,4,6,NA +64574,7,2,1,17,NA,4,4,2,17,207,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11834.781205,12063.950506,2,90,6,6,1.12,4,4,0,1,1,1,63,2,1,1,1 +64575,7,2,2,6,NA,2,2,2,6,72,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13895.77426,15584.232002,2,91,99,99,NA,6,6,1,3,0,2,20,2,2,5,NA +64576,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,38666.703155,42427.769217,2,94,15,15,5,1,1,0,0,1,1,80,1,5,2,NA +64577,7,2,1,0,4,3,3,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12008.205501,11800.609728,1,92,4,4,1.22,2,2,1,0,0,2,30,1,4,5,NA +64578,7,2,1,1,12,1,1,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12567.081957,12360.030976,1,97,7,7,2.31,2,2,1,0,0,1,22,1,4,5,NA +64579,7,2,2,3,NA,4,4,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10683.855206,11939.151167,1,96,3,3,0.43,4,4,1,1,0,2,39,2,4,1,3 +64580,7,2,1,7,NA,1,1,1,7,88,NA,NA,2,7,77,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11367.678664,11216.859778,2,96,77,77,NA,7,7,3,2,0,2,33,2,2,6,NA +64581,7,2,2,31,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,14179.938483,16215.179647,3,90,10,10,4.63,2,2,0,0,0,2,31,1,5,1,4 +64582,7,2,1,59,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,1,1,2,2,1,2,2,1,16628.326744,17078.450103,2,102,8,8,2.01,4,4,0,0,0,1,59,2,4,1,4 +64583,7,2,1,16,NA,5,6,2,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8305.829479,8595.334823,1,93,15,15,5,3,3,0,2,0,2,48,2,5,3,NA +64584,7,2,1,41,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12471.410981,12474.00514,2,103,77,77,NA,5,5,0,2,0,2,39,2,5,1,5 +64585,7,2,2,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,3,1,2,2,1,2,2,NA,NA,NA,NA,25189.042335,25118.259708,1,100,8,8,1.95,4,4,0,2,0,2,42,1,4,1,4 +64586,7,2,2,25,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,1,1,2,2,2,2,2,2,2,NA,NA,NA,NA,50177.882654,49959.335916,1,100,4,4,0.78,4,4,0,0,1,1,33,2,1,1,1 +64587,7,2,1,19,NA,4,4,1,19,239,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,2,1,0.18,2,1,0,0,0,1,19,NA,NA,NA,NA +64588,7,2,2,3,NA,5,6,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8171.700571,8311.029296,1,92,7,7,1.65,4,4,2,0,0,1,24,1,4,1,3 +64589,7,2,1,13,NA,2,2,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14081.782012,14782.02856,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +64590,7,2,1,6,NA,4,4,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13423.881856,14062.200951,2,97,7,7,1.38,5,5,0,1,1,2,79,1,5,5,NA +64591,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,20075.522681,20011.491118,3,92,4,4,1.22,2,2,0,0,0,1,51,1,2,1,3 +64592,7,2,2,29,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,6,2,2,2,1,1,2,1,1,2,2,NA,45207.136555,47234.971464,1,91,7,7,2.1,3,3,0,1,0,2,29,2,3,6,NA +64593,7,2,1,47,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19686.178677,19752.591494,2,94,15,15,5,5,5,0,2,1,1,47,2,5,1,5 +64594,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21399.459455,20960.973241,1,90,15,15,4.34,4,4,0,0,1,1,62,2,5,1,3 +64595,7,2,1,4,NA,3,3,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,27813.351627,32589.867729,2,97,1,1,0.21,4,4,2,0,0,2,34,2,1,1,2 +64596,7,2,2,12,NA,1,1,1,12,150,NA,NA,2,2,4,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20419.465237,21192.774678,2,102,6,3,0.54,6,4,0,4,0,2,43,2,1,5,NA +64597,7,2,2,16,NA,3,3,2,16,203,NA,NA,1,1,NA,11,NA,NA,NA,1,2,1,1,2,1,1,2,2,1,23708.623398,23934.71279,2,97,2,2,0.38,4,4,0,2,2,2,64,2,1,1,NA +64598,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,98514.948291,98181.677236,1,99,15,15,5,2,2,0,0,2,1,62,1,5,1,4 +64599,7,2,1,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,29756.291619,30015.261296,2,101,8,8,2.43,3,3,0,1,0,1,35,1,4,6,NA +64600,7,2,2,14,NA,4,4,2,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11478.437608,11446.094627,1,96,10,10,3.04,4,4,0,1,0,2,43,1,5,1,4 +64601,7,2,1,6,NA,5,6,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8556.838894,9269.764719,2,95,15,15,5,3,3,0,1,0,2,34,2,5,1,NA +64602,7,2,2,59,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,22224.73066,22340.630739,2,94,14,14,5,1,1,0,0,0,2,59,1,4,2,NA +64603,7,2,2,40,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,20303.639991,21936.687597,1,97,15,15,4.77,4,4,1,1,0,2,40,1,5,1,5 +64604,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,2,3,NA,2,2,2,1,2,2,2,2,2,2,23200.373382,24548.135184,2,93,5,5,0.89,4,4,0,2,0,1,42,NA,NA,6,NA +64605,7,2,2,0,6,3,3,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21671.775435,21083.121886,1,98,6,6,1.34,4,4,2,0,0,2,25,1,3,1,4 +64606,7,2,2,59,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,23644.678283,24188.238174,2,93,5,5,1.32,2,2,0,0,0,2,59,2,4,2,NA +64607,7,2,2,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,14447.262849,14051.875602,3,90,15,15,5,5,5,1,0,1,1,38,2,3,1,4 +64608,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,104371.641146,109271.336207,1,90,15,15,5,3,3,0,0,0,1,59,1,5,1,5 +64609,7,2,1,64,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,8385.499814,8451.09383,2,92,12,12,NA,2,1,0,0,1,2,58,1,3,5,NA +64610,7,2,1,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,141773.363283,145979.183499,1,97,15,15,5,4,4,0,0,1,1,67,NA,NA,2,NA +64611,7,2,1,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17206.320427,17271.69718,2,100,14,14,3.06,5,5,1,0,0,1,50,1,5,1,5 +64612,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9013.911777,9371.113947,1,97,4,4,0.46,7,7,3,3,0,2,31,1,3,1,NA +64613,7,2,1,25,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,49741.714519,50662.492276,2,91,7,7,3.76,1,1,0,0,0,1,25,1,5,5,NA +64614,7,2,1,7,NA,3,3,1,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,71470.369236,87471.572436,2,101,8,8,2.81,3,3,0,2,0,1,48,1,3,3,NA +64615,7,2,2,14,NA,3,3,2,14,179,NA,NA,1,1,NA,9,NA,NA,NA,1,1,1,NA,NA,NA,1,2,2,1,23708.623398,23934.71279,2,97,2,2,0.38,4,4,0,2,2,2,64,2,1,1,NA +64616,7,2,1,21,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,32384.468407,33958.290597,2,100,14,14,3.58,4,4,0,1,0,1,46,2,5,1,5 +64617,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,9053.837749,9198.868668,2,99,77,77,NA,4,4,1,1,1,2,38,2,4,1,4 +64618,7,2,1,1,21,1,1,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8481.734412,8750.218705,1,103,5,5,0.74,5,5,1,1,0,2,40,99,3,1,1 +64619,7,2,1,16,NA,4,4,2,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13969.457688,14694.403205,1,90,14,14,3.25,4,4,0,2,0,2,33,2,3,1,3 +64620,7,2,1,36,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14221.330587,14963.406508,3,90,12,12,NA,4,4,0,0,1,1,62,2,4,3,NA +64621,7,2,1,38,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,39053.240727,39737.089727,1,100,14,14,4.71,3,3,0,1,0,1,38,1,5,1,5 +64622,7,2,1,13,NA,1,1,2,13,165,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20398.562455,20710.36162,2,94,13,13,NA,5,5,0,3,0,1,32,2,2,1,1 +64623,7,2,1,2,NA,2,2,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8488.185756,9094.478438,2,99,77,77,NA,4,4,1,1,1,2,38,2,4,1,4 +64624,7,2,1,1,15,1,1,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10078.126531,10467.748183,2,97,NA,2,0.36,6,4,3,1,0,2,25,1,4,6,NA +64625,7,2,1,69,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,2,2,2,1,8491.292032,8823.40317,1,96,7,7,1.39,5,5,0,2,2,1,69,2,2,1,2 +64626,7,2,1,0,4,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9081.731172,9425.042696,1,101,5,5,0.74,6,6,1,3,0,1,38,1,4,1,4 +64627,7,2,2,17,NA,5,6,1,18,216,2,NA,2,2,5,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9269.277563,9333.801929,2,102,5,5,1.08,3,3,0,1,0,2,46,2,1,5,NA +64628,7,2,2,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27524.153939,27114.967247,3,92,12,12,NA,3,2,0,0,0,1,45,1,3,1,3 +64629,7,2,1,14,NA,3,3,2,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,119111.433099,126517.990149,2,94,7,7,2.38,2,2,0,1,0,1,39,1,4,3,NA +64630,7,2,1,0,3,3,3,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20370.716701,21140.779334,1,91,15,15,5,5,5,3,0,0,1,45,1,5,1,5 +64631,7,2,2,1,17,5,6,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7029.864692,7462.832472,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +64632,7,2,1,21,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,51858.383222,54820.448996,2,91,10,10,4.63,2,2,0,0,0,1,55,2,3,3,NA +64633,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,110095.623149,1,94,10,10,4.3,2,2,0,0,0,1,27,1,5,1,5 +64634,7,2,2,74,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,16361.152596,17584.911061,1,100,1,1,0.36,1,1,0,0,1,2,74,1,2,2,NA +64635,7,2,1,29,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19510.698389,19365.075974,1,102,7,7,1.9,4,4,1,1,0,1,29,1,4,1,3 +64636,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,2,1,0.02,2,1,0,0,0,1,20,1,4,5,NA +64637,7,2,1,77,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,1,2,2,2,2,2,NA,16591.871479,16938.772121,3,91,77,77,NA,4,4,0,0,2,1,54,1,4,1,2 +64638,7,2,1,8,NA,4,4,1,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10410.106675,10617.081899,2,96,5,5,1.08,3,3,0,1,0,2,41,1,3,1,NA +64639,7,2,1,58,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,25963.141347,26172.595903,1,92,9,9,3.7,2,2,0,0,0,1,58,1,2,1,4 +64640,7,2,1,80,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,1,1,NA,2,2,2,2,2,2,1,2,2,NA,18949.267372,20024.848444,2,98,4,4,1.15,2,2,0,0,2,1,80,1,1,1,1 +64641,7,2,1,4,NA,2,2,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17533.373205,2,98,8,8,1.48,7,7,3,0,0,1,26,1,3,1,3 +64642,7,2,1,15,NA,2,2,1,15,183,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,24585.624844,25010.051033,3,91,5,5,0.89,4,4,0,2,2,1,61,2,3,1,4 +64643,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22560.963402,22680.264479,1,98,6,6,1.65,2,2,0,1,0,2,52,2,5,1,NA +64644,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,93796.829073,95761.252302,1,100,6,6,1.78,3,3,1,1,0,2,35,1,5,4,NA +64645,7,2,1,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5942.817425,6352.518414,2,97,5,5,0.84,5,5,2,1,0,2,27,1,3,1,3 +64646,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,32860.812334,35527.111698,1,91,7,7,2.68,2,2,0,0,2,1,80,1,4,1,4 +64647,7,2,1,4,NA,2,2,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13504.027725,14468.59111,2,93,8,8,2,4,4,1,1,0,1,50,2,4,1,4 +64648,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,37080.526463,37974.333878,1,103,15,15,5,2,2,0,0,0,1,36,2,5,1,5 +64649,7,2,2,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,2,NA,NA,NA,NA,15326.318384,16292.539752,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +64650,7,2,2,10,NA,3,3,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22371.648216,23759.450609,1,95,5,5,1.08,3,3,0,1,0,1,53,1,4,1,4 +64651,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,28454.541725,29098.608791,3,91,3,3,1.24,1,1,0,0,0,1,58,1,4,5,NA +64652,7,2,2,10,NA,5,6,1,10,125,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7905.246022,8589.222558,1,100,3,3,0.73,2,2,0,1,0,2,38,2,5,3,NA +64653,7,2,2,1,18,4,4,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9287.278834,9993.215624,2,102,5,3,0.63,5,4,2,1,0,1,24,1,4,6,NA +64654,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,151649.038926,165350.159672,1,101,7,7,2.31,2,2,0,0,0,1,44,1,3,1,2 +64655,7,2,2,9,NA,1,1,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15510.382876,18634.445505,1,100,13,13,NA,4,4,1,1,0,1,28,2,1,1,1 +64656,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,14314.968597,14503.241546,1,96,15,15,5,4,3,0,0,1,2,54,2,4,1,5 +64657,7,2,2,4,NA,3,3,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,71121.657525,76575.027332,1,92,9,4,1,7,3,2,1,0,1,45,1,4,2,NA +64658,7,2,2,51,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,1,2,25483.560748,27318.705448,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +64659,7,2,2,11,NA,4,4,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7646.649777,8233.445923,2,99,4,4,1,3,3,0,1,0,2,38,1,3,5,NA +64660,7,2,2,4,NA,2,2,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13366.393396,14209.054666,2,94,7,7,1.34,5,5,2,1,0,1,32,2,1,1,NA +64661,7,2,1,29,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,31312.870743,38059.589922,2,90,8,8,2.24,4,4,1,1,0,2,29,1,4,6,NA +64662,7,2,1,10,NA,3,3,1,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,66003.625505,68276.88064,1,101,8,8,1.85,5,5,0,3,0,1,41,1,3,1,4 +64663,7,2,2,33,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21522.871343,21589.047039,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +64664,7,2,2,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,40760.712736,41570.695949,1,98,4,4,1.26,2,2,0,0,1,2,80,1,4,2,NA +64665,7,2,2,6,NA,3,3,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24070.467912,23750.822126,1,92,4,4,0.5,6,6,0,3,0,2,41,1,4,1,NA +64666,7,2,2,11,NA,4,4,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10332.067017,10608.478853,1,100,12,12,NA,5,5,0,3,0,1,39,1,5,1,3 +64667,7,2,1,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,26052.523863,2,101,3,3,0.68,2,2,0,0,0,1,58,1,1,6,NA +64668,7,1,1,21,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,52698.05363,0,3,92,2,2,0.4,3,3,1,0,0,1,21,1,2,6,NA +64669,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,35475.142583,37174.132552,2,95,6,6,2.95,1,1,0,0,1,2,60,1,3,3,NA +64670,7,2,2,2,NA,3,3,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,55441.113009,61189.845638,1,92,6,6,1.62,3,3,1,0,0,2,26,1,5,1,5 +64671,7,2,2,13,NA,3,3,1,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,117872.104347,120084.841085,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +64672,7,2,1,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16715.026676,2,100,7,7,1.38,5,5,1,0,0,2,45,1,2,3,NA +64673,7,2,1,12,NA,5,6,1,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5388.361335,5758.757236,3,91,6,6,1.22,5,5,1,2,0,2,37,1,4,1,2 +64674,7,2,2,39,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,1,2,2,2,2,2,2,2,NA,NA,NA,NA,38161.026403,39476.245254,1,100,7,7,1.74,4,4,0,2,0,2,39,2,1,1,3 +64675,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,159455.333031,1,95,15,15,5,4,4,0,2,0,2,42,1,5,1,5 +64676,7,2,2,56,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,4,6,NA,2,2,2,2,2,2,1,2,1,2,19969.163208,20990.960204,2,93,10,10,3.67,3,3,0,0,0,2,56,2,4,6,NA +64677,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19210.136544,18684.400763,1,96,12,12,NA,1,1,0,0,0,2,56,1,4,3,NA +64678,7,2,2,0,4,4,4,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7333.056164,7413.124496,2,101,5,5,1.08,3,3,1,0,0,1,31,1,4,6,NA +64679,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,17978.142628,18905.276914,1,91,7,7,1.57,4,4,0,3,0,2,38,2,2,3,NA +64680,7,2,2,35,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,21116.677917,21908.928919,1,92,14,14,3.47,4,4,0,2,0,1,37,1,5,1,5 +64681,7,2,1,15,NA,3,3,2,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,68148.957861,67253.324127,1,93,7,7,2.16,3,3,0,1,0,2,50,1,5,3,NA +64682,7,2,1,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,133542.212862,160359.69013,1,94,14,14,2.96,5,5,0,3,0,2,39,1,4,1,3 +64683,7,1,2,26,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,6,3,1,2,2,1,2,2,NA,NA,NA,NA,109522.19868,0,1,90,9,1,0,2,1,0,0,0,2,26,1,5,6,NA +64684,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,1,2,1,2,2,1,2,2,1,16995.648055,19983.260181,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +64685,7,2,1,12,NA,2,2,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13752.835112,15116.811136,3,90,7,7,1.48,5,5,0,1,0,1,43,2,1,6,NA +64686,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6226.488588,6570.976462,2,99,6,6,1.03,6,6,3,0,0,1,33,1,3,6,NA +64687,7,2,2,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,20247.768461,19251.812222,2,93,4,4,0.56,5,5,2,1,0,1,27,1,2,6,NA +64688,7,2,1,1,18,1,1,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11853.772636,11869.789876,2,96,4,4,0.81,4,4,1,1,0,1,36,2,1,6,NA +64689,7,2,2,42,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,2,5,2,2,2,2,1,2,2,2,2,2,2,27654.660303,28156.17371,2,103,4,4,0.79,3,3,0,0,0,2,42,2,2,5,NA +64690,7,2,2,11,NA,4,4,2,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8147.287486,8590.325322,2,90,2,2,0.38,4,4,1,2,0,2,32,1,4,5,NA +64691,7,2,1,0,10,2,2,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,2,2,1,NA,NA,NA,NA,5357.080288,5657.49929,1,103,12,12,NA,6,6,2,1,0,2,27,2,2,1,3 +64692,7,1,2,59,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,13728.308948,0,2,90,10,10,3.51,3,3,0,0,1,2,59,1,4,1,NA +64693,7,1,2,46,NA,2,2,NA,NA,NA,2,NA,2,2,4,NA,2,4,NA,2,2,2,2,2,2,NA,NA,NA,NA,23968.560941,0,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +64694,7,2,1,23,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,44887.234615,46900.157613,2,93,9,9,2.6,4,4,0,0,0,2,58,2,4,4,NA +64695,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,11608.998717,12267.891619,3,90,14,14,3.47,4,4,1,1,0,2,38,2,5,1,5 +64696,7,2,1,11,NA,4,4,2,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.422451,8641.637123,1,99,14,14,4.86,3,3,0,1,0,1,42,1,5,1,5 +64697,7,2,1,8,NA,4,4,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11443.206518,11987.342507,1,100,6,6,1.65,2,2,0,1,0,2,42,1,4,5,NA +64698,7,2,1,13,NA,3,3,1,13,166,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23685.067681,25157.846578,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +64699,7,2,1,16,NA,4,4,1,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18123.994406,21384.995218,2,101,8,8,2.81,3,3,0,1,0,1,35,1,1,1,2 +64700,7,1,1,24,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,108410.783716,0,1,91,8,8,2.51,3,3,1,0,0,2,24,1,4,1,3 +64701,7,2,1,57,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,3,NA,2,2,2,1,2,2,2,2,1,2,27131.416371,32184.468102,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +64702,7,2,2,4,NA,3,3,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,31376.988784,34630.493438,1,101,7,7,1.82,4,4,2,0,0,2,27,1,2,1,3 +64703,7,2,2,22,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,32537.532358,33640.063825,2,90,5,5,1.19,3,3,0,0,0,2,50,2,4,4,NA +64704,7,2,1,62,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,11937.570805,12597.633777,2,96,8,8,1.33,7,7,2,1,1,1,62,2,1,1,1 +64705,7,2,2,72,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,13242.661868,13437.555164,1,99,5,5,1.69,2,2,0,0,2,1,79,1,1,1,4 +64706,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20332.409486,19927.598485,2,93,6,6,1.47,3,3,0,0,0,2,47,1,4,5,NA +64707,7,2,1,10,NA,1,1,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,17882.621856,17720.218058,3,92,4,4,0.67,4,4,0,3,0,2,36,2,1,5,NA +64708,7,2,2,11,NA,1,1,2,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15002.25457,15643.939501,1,91,6,6,1.35,3,3,0,2,0,2,38,1,4,3,NA +64709,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9221.19173,9652.555988,2,95,3,3,0.75,2,2,0,0,2,1,60,1,2,1,2 +64710,7,2,1,3,NA,5,7,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8981.553859,10073.795326,3,91,15,15,4.47,4,4,2,0,0,1,33,1,5,1,5 +64711,7,2,2,35,NA,5,7,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,18346.384255,19018.034723,2,96,15,15,5,4,4,1,1,0,2,35,2,5,1,5 +64712,7,2,1,6,NA,1,1,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14820.807433,14827.373008,2,102,5,5,0.89,4,4,1,2,0,2,36,2,5,3,NA +64713,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22224.73066,22340.630739,2,94,15,15,5,2,2,0,0,1,1,77,1,5,1,4 +64714,7,2,2,17,NA,4,4,2,17,204,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13661.047334,13622.554377,2,97,5,5,0.76,5,5,1,1,0,2,47,1,4,5,NA +64715,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,4,2,0.83,2,1,0,0,0,1,24,1,4,5,NA +64716,7,2,1,1,19,3,3,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46257.816906,54201.886729,2,94,14,14,3.36,4,4,2,0,0,1,31,1,3,1,5 +64717,7,2,1,1,13,4,4,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,11283.202594,2,101,5,5,0.89,4,4,1,1,1,2,38,1,4,77,NA +64718,7,2,1,18,NA,4,4,1,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14848.504688,14956.646891,1,98,2,2,0.45,2,1,0,0,0,1,19,1,4,NA,NA +64719,7,2,2,39,NA,5,6,2,NA,NA,1,2,2,1,7,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,18480.909695,18518.646173,1,93,9,9,5,1,1,0,0,0,2,39,2,5,3,NA +64720,7,2,1,29,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,21548.249649,21044.90278,1,100,8,8,1.61,6,6,1,3,0,1,29,1,5,6,NA +64721,7,2,1,56,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,17206.320427,17151.440282,2,100,5,5,1.08,3,3,0,0,0,1,38,1,2,5,NA +64722,7,2,2,33,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,1,1,2,2,2,2,2,2,2,1,2,2,NA,38218.668882,37187.448906,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +64723,7,2,2,6,NA,4,4,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8292.876947,8466.609309,1,102,1,1,0,5,5,0,3,0,2,41,1,4,1,4 +64724,7,2,2,3,NA,3,3,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50908.326714,52512.144621,1,99,15,15,5,4,4,1,1,0,2,42,1,5,1,5 +64725,7,2,2,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,101005.054511,105662.333954,2,91,15,8,4.48,2,1,0,0,0,2,55,1,5,6,NA +64726,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18486.334367,18427.371573,2,95,8,8,1.85,5,5,1,2,0,1,55,1,2,1,3 +64727,7,2,1,50,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,1,2,22446.308035,22401.210337,2,94,77,77,NA,4,4,0,0,0,1,28,2,1,3,NA +64728,7,2,1,23,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,3,5,NA,2,2,2,1,2,2,2,2,2,2,38474.772527,42632.210531,2,93,7,5,1.79,3,1,0,0,0,1,25,2,4,5,NA +64729,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,2,NA,1,2,1,NA,NA,NA,NA,NA,NA,NA,14314.616082,14811.078253,2,92,NA,NA,NA,2,1,0,0,1,2,58,2,4,5,NA +64730,7,2,1,9,NA,2,2,2,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9390.522479,10327.334743,2,90,1,1,0.19,4,4,0,1,0,2,44,1,2,5,NA +64731,7,2,2,34,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,36904.965687,36815.84758,2,93,9,9,3.14,3,3,0,2,0,2,34,2,5,3,NA +64732,7,2,1,17,NA,4,4,1,17,215,2,NA,2,1,4,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16261.995423,16380.43213,2,96,6,6,1.7,2,2,0,1,0,1,25,2,4,5,NA +64733,7,2,2,30,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,51753.495707,50822.503524,1,100,8,8,3.17,2,2,0,0,0,1,31,2,4,1,5 +64734,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12331.419303,12882.003985,2,95,5,5,1.32,2,2,0,0,2,1,66,1,2,1,4 +64735,7,2,2,6,NA,3,3,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49543.011606,52616.361829,1,94,15,15,5,6,6,0,4,0,1,38,1,5,1,4 +64736,7,2,1,6,NA,5,6,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8376.521179,8870.870608,1,92,12,12,NA,4,4,1,1,0,1,33,2,4,1,4 +64737,7,2,1,19,NA,4,4,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,2,2,0.73,2,1,0,0,0,1,20,1,4,5,NA +64738,7,2,1,15,NA,3,3,2,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71458.892941,70519.759062,2,91,15,15,5,4,4,0,2,0,2,48,1,5,1,5 +64739,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,25026.664203,25574.319716,1,97,15,15,5,4,4,0,1,0,1,40,1,4,1,4 +64740,7,2,1,45,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,2,1,2,1,3,16903.372311,16842.307696,1,97,9,9,1.78,6,6,0,1,1,1,45,2,3,1,3 +64741,7,2,2,44,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,25189.042335,25070.255719,1,100,14,14,5,3,3,0,1,1,2,44,1,4,5,NA +64742,7,2,1,56,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16419.180608,2,100,4,4,1.74,1,1,0,0,0,1,56,1,3,3,NA +64743,7,2,1,10,NA,4,4,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8017.552697,8398.795399,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +64744,7,2,2,5,NA,3,3,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,29420.847299,31676.739048,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +64745,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20820.576198,20899.685598,2,96,7,7,1.49,5,5,2,1,0,1,51,1,5,1,3 +64746,7,2,1,29,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18523.956321,18232.779525,2,99,15,15,4.34,4,4,0,0,0,1,59,2,4,1,5 +64747,7,1,1,5,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9787.724348,0,1,96,10,10,3.51,3,3,1,0,0,1,25,1,4,1,5 +64748,7,2,2,0,4,4,4,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5576.185193,5739.245437,2,96,6,6,1.35,3,3,1,1,0,2,25,1,3,5,NA +64749,7,2,1,2,NA,5,6,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9239.758777,10363.400393,2,91,14,14,3.47,4,4,1,1,0,2,36,2,3,1,5 +64750,7,2,1,18,NA,1,1,1,18,226,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,32326.52031,34735.818434,2,98,13,13,NA,5,5,0,2,0,1,48,2,1,1,2 +64751,7,2,1,9,NA,3,3,2,9,118,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61920.455064,68552.408117,2,94,12,12,NA,5,5,1,1,0,1,37,1,4,1,3 +64752,7,2,2,62,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16352.915834,17093.606152,3,92,8,8,2.97,2,2,0,0,2,2,62,1,4,1,4 +64753,7,2,2,68,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,9716.805546,12994.252166,2,90,77,77,NA,1,1,0,0,1,2,68,2,1,4,NA +64754,7,2,1,36,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,14204.262514,14001.792163,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +64755,7,2,1,3,NA,1,1,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14415.164987,15444.808928,1,103,77,77,NA,4,4,1,0,1,1,20,1,3,6,NA +64756,7,2,1,72,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,2,2,2,1,2,2,2,2,2,NA,13654.270555,14323.606702,2,93,10,10,3.04,4,4,0,0,2,1,72,2,3,1,2 +64757,7,2,2,9,NA,5,7,2,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,67349.005531,67425.922822,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +64758,7,2,1,33,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20071.705576,20986.552878,3,91,14,14,5,2,2,0,0,0,2,27,2,5,1,5 +64759,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,1,2,1,2,2,1,1,2,NA,52279.532372,58506.425352,2,101,5,5,1.63,2,2,0,0,2,1,80,1,1,1,1 +64760,7,2,1,4,NA,3,3,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,77702.196479,85091.48102,1,95,9,9,2.68,4,4,2,0,0,2,27,1,4,1,4 +64761,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,35276.751365,1,94,7,7,1.65,5,4,0,0,0,1,46,1,4,1,4 +64762,7,2,1,17,NA,4,4,1,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,10,10,3.89,3,3,0,1,0,2,49,1,4,1,3 +64763,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,17701.770315,2,95,5,2,0.63,3,1,0,0,0,1,31,1,4,5,NA +64764,7,2,1,36,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,24555.036413,24478.369844,2,94,8,8,3.4,2,2,0,0,0,1,36,1,2,1,5 +64765,7,2,1,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,78529.577822,80778.70531,1,101,7,7,1.55,5,5,1,2,0,2,31,1,4,1,2 +64766,7,2,2,3,NA,1,1,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11859.546176,12772.78418,1,102,5,5,0.62,7,7,1,3,0,1,49,2,2,1,1 +64767,7,2,2,7,NA,2,2,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15510.382876,16516.802792,1,100,5,5,0.78,6,5,1,2,0,2,40,2,1,5,NA +64768,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,38616.556866,1,94,6,6,1.21,4,4,2,0,0,1,27,1,2,1,2 +64769,7,2,1,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19093.004278,19397.753966,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +64770,7,2,1,11,NA,5,6,2,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5855.595238,6345.238788,1,91,15,15,3.25,7,7,1,2,0,2,31,1,5,1,5 +64771,7,2,1,64,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,11937.570805,12505.355675,2,96,3,3,0.24,7,7,2,3,1,2,40,1,3,3,NA +64772,7,2,1,50,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,2,NA,2,2,2,2,2,2,NA,NA,NA,NA,31872.125984,32482.275435,2,96,4,4,1.56,1,1,0,0,0,1,50,2,1,2,NA +64773,7,2,2,16,NA,1,1,1,16,203,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19836.724169,20428.617367,1,98,15,15,5,5,5,0,1,1,2,55,1,5,1,5 +64774,7,2,2,5,NA,1,1,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16648.051651,2,98,5,5,0.59,7,7,2,1,2,2,71,1,2,1,1 +64775,7,2,2,6,NA,5,6,1,7,84,NA,NA,1,1,NA,1,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,6402.995556,7222.354698,2,92,7,7,1.61,4,4,0,2,0,1,51,2,3,1,3 +64776,7,2,2,29,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,2,2,2,2,2,2,2,NA,NA,NA,NA,50915.06085,54061.945895,3,92,3,3,0.52,5,5,2,1,0,2,29,2,1,1,3 +64777,7,2,2,52,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15790.702799,16017.473382,2,90,14,14,5,2,2,0,0,1,2,52,2,5,1,NA +64778,7,1,1,22,NA,5,6,NA,NA,NA,2,NA,2,1,99,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,13367.406737,0,1,92,15,15,4.44,5,5,0,0,1,1,65,NA,NA,1,5 +64779,7,2,2,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,26465.930618,27659.054945,2,100,7,7,1.79,4,4,0,1,0,2,51,1,3,3,NA +64780,7,2,2,18,NA,4,4,1,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13697.127402,14256.437303,2,100,4,4,1.16,2,2,0,0,1,2,18,1,2,NA,NA +64781,7,2,1,15,NA,2,2,2,15,185,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,19820.949231,20163.121943,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +64782,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,29250.663295,29731.562834,1,94,2,2,0.81,1,1,0,0,0,1,50,1,4,3,NA +64783,7,2,1,0,1,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4461.618312,4741.503802,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +64784,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,20135.920214,21074.978603,2,97,5,5,0.76,5,5,1,1,0,2,47,1,4,5,NA +64785,7,2,1,76,NA,1,1,1,NA,NA,2,NA,2,1,99,NA,1,1,NA,2,2,2,2,2,2,2,2,2,NA,21815.897449,22383.010849,3,92,5,5,1.26,3,3,0,0,2,1,76,2,1,1,1 +64786,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,113128.964375,115356.428049,1,94,15,15,4.95,4,4,0,0,2,1,72,1,3,1,3 +64787,7,2,1,10,NA,2,2,2,10,129,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,9390.522479,10327.334743,2,90,1,1,0.06,3,3,0,2,0,2,32,2,2,77,NA +64788,7,2,1,5,NA,4,4,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12996.965152,13155.4937,1,101,6,6,1.72,2,2,1,0,0,2,29,1,4,5,NA +64789,7,2,1,67,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,7736.56115,7645.782314,1,99,15,15,5,2,2,0,0,2,1,67,1,5,1,5 +64790,7,2,1,2,NA,3,3,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46703.291366,50234.137371,1,93,15,15,5,3,3,1,0,0,1,39,NA,NA,1,NA +64791,7,2,2,26,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,6,2,2,2,2,NA,NA,NA,NA,NA,NA,NA,31196.446669,31060.57243,2,99,12,3,0.52,5,3,0,1,0,1,30,2,2,4,NA +64792,7,2,2,40,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,35815.777398,37277.17285,1,91,14,14,3.9,4,4,0,1,0,1,41,1,2,1,4 +64793,7,2,2,14,NA,2,2,2,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23968.380373,25111.880337,2,91,14,14,4.19,3,3,0,1,0,1,55,2,3,1,5 +64794,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,20443.961017,19891.057859,2,99,6,6,1.13,4,4,1,1,0,1,33,1,3,6,NA +64795,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,9772.038079,10324.658831,1,95,3,3,0.78,3,3,0,0,2,1,80,1,4,1,3 +64796,7,2,1,1,15,5,6,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5492.796032,5818.035599,2,100,4,4,0.5,6,6,2,1,0,1,30,2,4,1,3 +64797,7,2,1,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21055.122405,22540.415493,1,93,15,15,5,3,3,1,0,0,1,33,1,5,1,3 +64798,7,2,2,6,NA,3,3,2,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,62595.719575,66478.781231,1,95,6,6,1.35,3,3,0,1,0,1,42,1,4,1,4 +64799,7,2,1,28,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,38502.344077,41392.592866,1,100,13,13,NA,4,4,1,1,0,1,28,2,1,1,1 +64800,7,2,2,52,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,12449.932013,12483.65832,3,90,10,10,3.67,3,3,0,1,0,2,52,2,3,5,NA +64801,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,29167.119125,32047.917266,1,101,6,6,1.52,3,3,0,1,1,1,62,1,2,1,3 +64802,7,2,1,42,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,24874.121286,25386.96888,1,102,8,8,4.78,1,1,0,0,0,1,42,1,3,5,NA +64803,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19440.629552,20463.14283,1,93,6,6,1.16,4,4,2,0,0,2,33,1,5,1,4 +64804,7,2,2,9,NA,3,3,2,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,73810.484644,74865.697805,1,94,10,10,2.67,5,5,0,3,0,1,40,1,5,1,2 +64805,7,2,1,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,19008.083201,19380.210545,2,101,2,2,0.73,1,1,0,0,0,1,38,1,2,5,NA +64806,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,40157.007559,43267.510233,2,98,8,8,3.4,2,2,0,0,2,1,80,1,4,1,4 +64807,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,66503.043118,67175.236045,2,98,14,14,3.25,5,5,2,1,0,1,37,1,5,1,5 +64808,7,2,1,44,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16651.742047,16721.380189,1,100,15,15,5,4,4,0,1,0,1,44,2,5,1,5 +64809,7,2,2,26,NA,4,4,2,NA,NA,2,NA,2,1,2,NA,4,1,3,1,2,2,1,2,2,NA,NA,NA,NA,20146.149642,19228.641128,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +64810,7,1,1,28,NA,5,6,NA,NA,NA,2,NA,2,2,1,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,11321.172632,0,1,96,3,3,0.54,4,4,0,1,0,1,28,2,5,5,NA +64811,7,2,2,16,NA,5,6,1,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8663.507259,9422.028242,1,102,9,9,2.39,5,5,0,1,1,1,55,2,5,1,5 +64812,7,2,2,17,NA,4,4,2,17,215,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16317.790515,16843.623891,1,101,6,6,1.43,4,4,0,1,2,2,72,1,2,1,NA +64813,7,2,2,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19944.119297,19741.288195,2,98,2,2,0.52,1,1,0,0,0,2,55,1,4,3,NA +64814,7,2,2,1,22,4,4,2,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,7960.486003,2,95,9,9,1.78,6,6,2,0,0,2,48,1,3,1,2 +64815,7,2,2,11,NA,1,1,1,11,137,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15352.601806,16028.326912,2,102,4,4,0.61,5,5,0,3,0,1,34,2,3,1,3 +64816,7,2,1,21,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,21763.209029,22385.504537,2,92,4,1,0,4,1,0,0,0,1,21,1,4,5,NA +64817,7,2,1,1,20,4,4,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6454.74783,2,100,14,1,0,3,1,1,0,1,1,62,1,5,1,5 +64818,7,2,1,8,NA,5,6,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,7030.880662,7583.419516,3,91,14,14,3.58,4,4,1,1,0,1,39,2,5,1,5 +64819,7,2,2,2,NA,4,4,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,8250.113235,2,100,9,9,3.24,3,3,1,0,0,1,32,1,3,1,4 +64820,7,2,1,7,NA,1,1,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19774.151841,21259.203461,3,92,7,7,1.65,4,4,1,1,0,1,27,1,3,1,3 +64821,7,2,1,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,11281.447612,11722.687225,2,92,8,8,4.59,1,1,0,0,1,1,62,1,3,4,NA +64822,7,2,1,53,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,29181.414565,30161.390695,1,94,2,2,0.63,2,1,0,0,0,1,53,1,3,6,NA +64823,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,23799.136983,23147.811167,1,92,15,15,4.44,5,5,0,3,0,2,43,1,5,6,NA +64824,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,33364.852884,34296.975056,1,97,2,2,0.76,1,1,0,0,1,1,62,1,5,3,NA +64825,7,2,2,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,150482.742079,150600.121666,2,98,15,15,5,2,2,0,0,1,2,52,1,4,1,4 +64826,7,2,1,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7800.5318,8105.625946,2,96,3,3,1.01,1,1,0,0,1,1,61,1,3,3,NA +64827,7,2,2,8,NA,4,4,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11334.095519,11753.9565,2,96,4,4,0.65,5,5,0,3,0,1,30,1,4,1,2 +64828,7,2,2,58,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,35505.352567,36934.11174,3,92,5,5,1.39,2,2,0,0,0,1,56,2,1,1,1 +64829,7,2,2,11,NA,2,2,2,11,134,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12985.951695,13541.394178,1,90,15,15,5,4,4,0,2,0,2,43,1,5,1,5 +64830,7,2,1,15,NA,1,1,1,15,181,NA,NA,1,1,NA,9,NA,NA,NA,2,1,1,2,2,1,1,2,2,1,15506.325263,15357.347514,2,103,2,2,0.42,3,3,0,2,0,2,51,2,2,5,NA +64831,7,2,1,24,NA,5,7,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,10559.047286,11105.574109,2,94,5,5,2.2,2,1,0,0,0,1,23,NA,NA,5,NA +64832,7,2,1,32,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,3,6,NA,1,2,2,1,2,1,2,2,2,2,40003.013263,41663.413523,1,91,7,7,2.1,3,3,0,1,0,2,29,2,3,6,NA +64833,7,2,2,37,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,4,1,2,2,2,2,1,2,2,2,2,2,2,42456.72357,44069.75885,1,92,5,5,0.87,4,4,0,2,0,1,42,2,1,1,4 +64834,7,2,1,0,3,2,2,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,5271.338128,5219.242818,2,99,12,6,0.9,7,6,1,3,0,2,20,2,2,5,NA +64835,7,2,1,39,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,1,2,1,2,2,1,2,2,NA,25120.174741,26325.85923,2,102,3,3,0.76,3,3,0,1,1,2,66,1,2,3,NA +64836,7,2,2,0,2,2,2,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5803.542897,5681.443153,2,90,5,5,0.94,4,4,2,1,0,2,33,1,3,3,NA +64837,7,2,2,11,NA,5,6,1,11,143,NA,NA,2,1,3,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5710.045626,5965.417422,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +64838,7,2,2,18,NA,4,4,1,18,218,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,10128.026158,10853.158449,2,103,2,1,0.43,2,1,0,0,0,1,20,1,3,6,NA +64839,7,2,1,37,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,39017.692919,2,98,14,14,3.25,5,5,2,1,0,1,37,1,5,1,5 +64840,7,2,1,10,NA,4,4,2,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8655.162127,8668.652185,2,95,6,6,0.86,6,6,0,4,0,2,32,1,4,6,NA +64841,7,2,1,8,NA,1,1,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,12622.023337,12821.760042,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +64842,7,2,1,2,NA,1,1,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13968.423539,13738.28453,2,102,7,7,1.57,4,4,2,0,0,2,34,2,2,1,5 +64843,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,12764.594076,12653.781126,2,90,6,6,0.96,5,5,0,1,0,1,55,1,4,6,NA +64844,7,2,1,4,NA,4,4,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7431.820906,7890.591472,1,99,6,6,0.96,5,5,1,2,0,2,35,1,4,1,2 +64845,7,2,1,0,3,1,1,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6298.658963,6480.002411,2,94,9,9,2.29,5,5,2,1,0,2,33,2,3,1,1 +64846,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,12977.791943,13288.853946,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +64847,7,2,2,11,NA,4,4,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11784.279565,12220.817194,2,96,8,8,2.46,4,4,0,1,0,1,46,1,4,1,4 +64848,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,9535.353518,9981.414158,2,97,4,4,1.02,2,2,0,0,2,2,80,1,1,2,NA +64849,7,2,1,0,5,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20370.716701,20998.185689,1,91,14,14,3.06,5,5,2,0,0,2,30,1,5,1,5 +64850,7,2,1,19,NA,3,3,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,99014.954203,98621.869511,1,92,10,10,3.4,3,3,0,0,0,1,56,1,4,1,5 +64851,7,2,2,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,20212.648666,20286.466668,2,95,4,3,1.1,2,1,0,0,0,2,47,1,3,4,NA +64852,7,2,1,2,NA,4,4,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8009.966208,8832.297541,2,96,7,7,1.79,4,4,2,0,0,2,49,1,3,1,3 +64853,7,2,1,0,11,1,1,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,6999.189812,7438.261811,2,98,6,6,0.59,7,7,2,2,1,2,52,2,1,1,1 +64854,7,2,2,69,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,10561.745159,14124.187136,2,90,6,6,1.73,2,2,0,0,2,2,69,1,2,1,2 +64855,7,1,1,8,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9720.482616,0,2,91,4,4,0.65,5,5,1,3,0,1,43,2,3,5,NA +64856,7,2,1,34,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,1,5,NA,2,2,2,2,2,2,NA,NA,NA,NA,30626.581617,30395.433124,2,90,6,6,0.96,5,5,1,1,0,1,39,2,2,1,NA +64857,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,189736.955264,189051.893543,1,98,4,4,1.34,1,1,0,0,0,2,54,1,5,3,NA +64858,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,36148.01469,38158.744241,1,101,3,3,0.66,2,2,0,0,1,2,65,1,2,3,NA +64859,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,133853.800452,138128.446231,1,94,8,8,2.43,3,3,0,0,0,2,46,1,3,1,NA +64860,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,23605.367258,23717.233847,2,97,7,7,1.89,3,3,0,0,0,1,50,1,2,1,2 +64861,7,2,2,26,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,NA,NA,NA,NA,19266.853809,20089.582382,2,102,8,8,1.72,5,5,0,2,1,1,63,2,5,1,5 +64862,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,22911.854766,1,95,5,5,0.92,5,5,1,2,0,2,30,1,4,1,4 +64863,7,1,2,34,NA,3,3,NA,NA,NA,2,NA,2,2,2,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,81658.419251,0,2,99,15,15,5,2,1,0,0,0,2,34,2,5,5,NA +64864,7,2,1,12,NA,4,4,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,18413.211403,2,101,3,3,0.54,3,3,0,2,0,2,36,1,3,5,NA +64865,7,2,2,2,NA,4,4,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6677.461889,6849.81851,2,90,5,1,0,3,1,1,1,0,2,48,1,5,5,NA +64866,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,17794.144581,16918.878285,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +64867,7,2,1,78,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,12856.852517,14031.201295,2,98,5,5,1.24,3,3,0,0,1,2,58,1,2,5,NA +64868,7,2,1,5,NA,1,1,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17973.290893,3,92,3,3,0.54,4,4,3,0,0,2,22,1,3,5,NA +64869,7,2,2,11,NA,5,6,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7751.448366,8179.286646,1,96,15,15,4.34,4,4,1,1,0,1,36,2,5,1,5 +64870,7,2,2,80,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,2,NA,1,1,1,1,2,2,1,2,1,NA,18698.205673,19635.336647,1,97,9,9,1.78,6,6,0,1,1,1,45,2,3,1,3 +64871,7,2,2,49,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,141912.982157,152670.471787,1,97,14,14,3.36,4,4,0,2,0,2,49,1,5,1,5 +64872,7,2,2,2,NA,1,1,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12871.484115,13281.030392,2,102,5,5,0.89,4,4,1,2,0,2,36,2,5,3,NA +64873,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,111065.717962,115110.76456,2,91,15,15,5,4,4,0,2,0,1,53,1,5,1,4 +64874,7,1,1,80,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,8168.05279,0,2,98,3,3,0.56,4,4,0,0,2,2,79,1,1,1,1 +64875,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,99606.074294,100835.770786,1,93,15,15,5,2,2,0,0,0,2,34,1,5,1,5 +64876,7,2,1,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,28680.660607,28606.985896,3,91,6,3,1.33,2,1,0,0,0,1,40,1,3,5,NA +64877,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19260.892847,19199.459573,2,97,1,1,0.09,2,1,0,0,0,1,46,1,3,5,NA +64878,7,2,1,12,NA,3,3,2,12,150,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19197.94644,18945.641357,1,98,6,6,1.73,3,3,0,1,0,2,39,1,4,1,1 +64879,7,2,2,8,NA,4,4,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9153.600624,9398.485171,1,100,8,8,1.61,6,6,1,3,0,1,29,1,5,6,NA +64880,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,153565.050575,157855.235487,1,97,15,15,5,2,2,0,0,1,2,49,1,5,1,3 +64881,7,2,1,33,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15014.015332,15213.152707,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +64882,7,2,1,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,160284.827389,161788.081948,2,102,14,14,5,2,2,0,0,2,2,65,1,5,1,5 +64883,7,2,1,18,NA,2,2,2,18,218,2,NA,2,2,1,10,NA,NA,NA,2,2,2,1,2,2,2,2,2,2,13752.835112,15116.811136,3,90,7,7,1.48,5,5,0,1,0,1,43,2,1,6,NA +64884,7,2,1,8,NA,4,4,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7908.091112,7920.416775,2,93,8,8,1.67,5,5,1,1,0,2,31,1,4,5,NA +64885,7,2,1,0,7,4,4,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6275.847063,6684.003207,2,100,10,10,2.75,5,5,1,1,1,1,27,1,3,1,5 +64886,7,2,2,59,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,23476.411085,23902.152524,3,91,4,4,0.81,3,3,0,0,1,1,64,2,1,1,1 +64887,7,2,1,13,NA,3,3,2,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,32477.57544,34497.087834,1,95,7,7,1.66,5,5,0,3,0,1,34,1,2,1,4 +64888,7,2,2,2,NA,4,4,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8072.012312,8280.364646,3,91,8,8,2.24,4,4,2,0,0,1,39,2,3,1,3 +64889,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,20933.43123,22068.787492,2,95,6,6,1.19,4,4,0,1,0,1,44,1,3,1,2 +64890,7,2,1,29,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,15173.157442,14818.726738,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +64891,7,2,2,11,NA,2,2,1,11,138,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,14446.475406,15838.541371,1,103,7,7,1.03,7,7,0,3,0,1,50,2,1,1,1 +64892,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,17171.250195,2,100,5,5,1.08,3,3,0,1,0,2,50,1,4,3,NA +64893,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,76027.409363,76707.146234,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +64894,7,2,2,6,NA,2,2,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15583.587534,16935.930722,1,93,14,14,3.06,5,5,0,2,0,1,46,2,1,1,4 +64895,7,2,1,67,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7380.991723,2,100,14,14,3.58,4,4,0,1,1,2,55,1,5,1,4 +64896,7,2,2,0,0,4,4,2,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4706.214557,5182.816301,1,96,6,6,1.21,4,4,2,0,0,1,24,1,4,1,3 +64897,7,2,1,42,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,12254.763576,14641.804715,2,90,4,4,0.81,3,3,0,1,0,2,41,2,2,6,NA +64898,7,2,1,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,17036.36313,16982.025069,1,99,2,2,0.48,2,2,0,0,0,2,44,1,3,1,3 +64899,7,2,2,13,NA,5,6,1,13,157,NA,NA,2,2,2,7,NA,NA,NA,1,1,1,1,2,1,1,2,1,NA,8868.843265,9252.179416,2,92,8,8,2.43,3,3,0,1,1,2,58,NA,5,1,5 +64900,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,42894.724338,43561.362107,1,98,3,3,0.93,2,2,0,0,0,1,21,1,4,5,NA +64901,7,2,2,18,NA,4,4,1,18,216,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10143.901078,10335.966318,2,95,2,2,0.67,2,2,0,0,1,2,61,1,3,3,NA +64902,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,21490.337905,2,97,3,2,0.83,2,1,0,0,0,1,30,1,4,5,NA +64903,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23530.130278,1,95,5,5,1.84,3,1,0,0,0,1,35,1,3,6,NA +64904,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,34802.051557,36349.694696,1,95,6,4,1.7,2,1,0,0,0,1,53,1,2,6,NA +64905,7,2,2,1,12,3,3,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,41219.757096,41761.398587,1,93,15,15,5,3,3,1,0,0,1,35,1,5,1,5 +64906,7,2,1,80,NA,5,7,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,1,NA,13312.080419,14392.211707,1,102,10,10,3.22,4,4,0,0,2,2,29,2,5,5,NA +64907,7,1,1,41,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,126789.52929,0,1,101,15,15,5,4,4,0,2,0,2,40,1,4,1,3 +64908,7,2,2,60,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,13057.178942,13648.591881,1,102,6,6,2.94,1,1,0,0,1,2,60,1,4,3,NA +64909,7,2,1,74,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,12468.859946,13204.521198,2,96,7,7,1.33,6,6,0,3,1,1,74,1,1,1,NA +64910,7,2,2,15,NA,3,3,2,15,182,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71837.483011,75155.181458,1,91,14,14,3.06,5,5,0,3,0,2,46,1,5,1,5 +64911,7,2,2,15,NA,5,6,2,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5956.736263,6113.749553,2,100,15,15,5,3,3,0,1,0,1,48,2,5,1,5 +64912,7,2,2,9,NA,4,4,2,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8226.044997,8398.377256,2,95,1,1,0,4,4,2,1,0,2,27,1,4,5,NA +64913,7,2,1,12,NA,3,3,2,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26824.630008,26493.112081,1,95,1,1,0.17,2,2,0,1,0,2,47,1,2,3,NA +64914,7,2,1,31,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,3,17165.91562,17929.203991,2,96,15,7,3.67,3,1,0,0,0,1,31,2,5,1,NA +64915,7,2,1,4,NA,4,4,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8626.000813,9278.769273,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +64916,7,2,1,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15787.238477,16796.740962,2,98,4,3,1.01,2,1,0,0,0,1,46,NA,NA,77,NA +64917,7,2,1,5,NA,5,6,2,5,67,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8197.191196,8439.736714,1,93,7,7,2.32,3,3,1,0,0,1,36,2,5,1,5 +64918,7,2,1,1,16,3,3,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24594.444896,28818.16319,1,98,5,5,1.05,3,3,1,0,0,1,24,1,3,1,3 +64919,7,2,1,10,NA,5,6,2,10,127,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,9720.482616,10818.978947,2,91,12,12,NA,7,6,0,4,2,2,72,2,1,2,NA +64920,7,2,2,8,NA,4,4,2,8,103,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8395.64512,8728.346696,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +64921,7,2,2,16,NA,4,4,2,16,202,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,5,5,0.92,5,5,0,3,0,2,54,1,3,2,NA +64922,7,2,1,9,NA,5,6,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8376.521179,8870.870608,1,92,15,15,5,4,4,0,2,0,1,55,1,5,1,5 +64923,7,2,2,64,NA,4,4,2,NA,NA,2,NA,2,2,5,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9113.905743,12222.082956,3,90,8,8,3.3,2,2,0,0,1,2,64,2,2,1,NA +64924,7,2,2,10,NA,5,7,1,10,129,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,12942.575479,2,101,7,7,1.88,4,4,0,2,0,2,36,1,4,1,5 +64925,7,2,2,0,4,2,2,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7534.765808,7789.750955,1,98,3,3,0.37,5,5,2,1,0,1,44,2,4,1,3 +64926,7,2,1,14,NA,4,4,2,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13352.786991,13379.186543,2,97,7,7,1.06,7,7,1,2,0,2,40,1,4,5,NA +64927,7,2,2,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,7498.263904,2,100,3,3,0.39,7,7,3,3,0,2,30,1,2,5,NA +64928,7,2,1,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,1,2,NA,14073.595908,15970.731967,1,92,6,6,1.3,4,4,0,1,1,1,25,1,1,1,3 +64929,7,2,1,19,NA,4,4,2,19,228,2,NA,1,1,NA,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10791.290138,11351.304534,3,91,2,2,0.25,4,4,0,2,0,2,35,1,3,5,NA +64930,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,13219.758853,13936.470139,2,97,4,4,1.29,2,2,0,0,2,1,74,1,3,3,NA +64931,7,2,2,59,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26668.458882,27266.525973,2,102,6,6,2.04,2,2,0,0,1,1,64,1,3,1,4 +64932,7,2,1,6,NA,3,3,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,86609.650237,90490.601456,2,102,14,14,4.93,3,3,0,1,0,1,37,1,5,1,5 +64933,7,2,2,41,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,31301.615973,33816.788039,1,90,15,15,4.77,4,4,1,1,0,2,41,1,5,1,2 +64934,7,2,2,16,NA,5,6,2,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,5607.756021,6010.481547,3,91,6,6,1.81,3,3,0,1,0,2,47,2,3,1,3 +64935,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,73820.224093,75002.443492,2,95,9,9,2.22,5,5,1,0,0,1,55,1,4,1,5 +64936,7,2,2,6,NA,2,2,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17458.526997,17628.076413,1,94,2,2,0.26,4,4,2,1,0,2,25,1,4,5,NA +64937,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,37456.985636,43452.233213,2,98,6,6,1.7,2,2,0,0,2,2,80,1,2,1,2 +64938,7,2,1,40,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,27938.918808,28342.234566,1,100,7,7,3.4,1,1,0,0,0,1,40,1,5,5,NA +64939,7,2,1,19,NA,4,4,2,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,1,1,0.04,2,1,0,0,0,1,19,1,4,NA,NA +64940,7,2,1,13,NA,3,3,2,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,91343.020442,91081.271456,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +64941,7,2,2,2,NA,1,1,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,12710.400836,2,98,2,2,0.27,4,4,2,1,0,2,32,2,2,5,NA +64942,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,7101.739553,7433.956549,2,100,3,3,1.19,1,1,0,0,1,1,69,1,2,2,NA +64943,7,2,1,1,20,5,6,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7638.291796,7864.300119,1,93,14,14,4.86,3,3,1,0,0,1,30,2,5,1,5 +64944,7,2,2,18,NA,4,4,2,18,225,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15259.822784,15553.106132,1,90,5,5,0.74,5,5,0,2,0,2,18,1,4,NA,NA +64945,7,1,1,37,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,105412.227726,0,2,101,8,8,1.72,5,5,0,3,0,1,37,1,3,1,3 +64946,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,5866.209951,5912.09729,2,95,5,5,1.05,3,3,0,0,2,1,60,1,1,1,4 +64947,7,2,1,6,NA,5,6,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7491.978458,7984.984584,2,100,15,15,5,4,4,1,1,0,1,36,2,5,1,5 +64948,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8679.600111,2,95,5,5,1.92,1,1,0,0,1,2,61,1,4,2,NA +64949,7,2,2,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,110941.813533,112262.474161,1,97,15,15,4.77,4,4,0,0,0,1,56,1,4,1,4 +64950,7,2,2,6,NA,2,2,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11210.83392,12007.401767,2,90,6,6,1.34,4,4,1,2,0,2,36,2,3,77,NA +64951,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,107912.705683,113084.898879,3,91,4,4,1.02,2,2,0,0,0,1,22,1,5,1,5 +64952,7,2,2,8,NA,4,4,2,8,102,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7120.704736,7311.203604,1,99,8,8,1.76,5,5,0,2,1,1,37,1,4,1,3 +64953,7,2,2,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,30863.871606,31440.435679,1,101,3,3,1.12,1,1,0,0,0,2,44,1,4,1,NA +64954,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,1,3,NA,1,2,1,1,2,2,NA,NA,NA,NA,10964.859884,11022.841433,3,90,7,7,1.82,4,4,1,0,0,2,54,2,1,3,NA +64955,7,2,1,3,NA,4,4,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11342.022131,11810.675983,2,102,15,15,3.82,5,5,1,2,0,1,34,1,3,1,4 +64956,7,2,1,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,27572.205373,28421.693812,1,100,15,15,5,3,3,0,0,0,2,33,1,5,1,4 +64957,7,1,2,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11623.462338,0,1,100,3,3,0.73,3,3,1,1,0,2,32,1,3,5,NA +64958,7,2,2,8,NA,1,1,1,8,107,NA,NA,1,1,NA,3,NA,NA,NA,2,1,1,1,2,2,1,2,2,1,16217.354723,16799.750785,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +64959,7,2,2,6,NA,2,2,2,6,82,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17962.96045,18326.284291,1,97,15,15,4.52,6,6,0,4,0,2,41,1,5,1,5 +64960,7,2,2,6,NA,3,3,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13450.606713,13706.553337,3,91,5,5,1.07,4,4,0,2,0,2,36,1,5,1,4 +64961,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,141773.363283,142016.391545,1,97,15,15,4.77,4,4,0,0,0,1,56,1,4,1,4 +64962,7,2,2,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,39483.840194,39476.565757,2,102,14,14,3.25,5,5,1,1,0,2,32,1,4,1,3 +64963,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,20666.038321,20600.123288,1,96,14,14,5,1,1,0,0,0,1,55,1,5,5,NA +64964,7,2,1,80,NA,3,3,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,2,1,2,1,NA,35161.248998,42165.766203,3,91,15,15,3.33,6,6,0,2,2,1,80,2,3,1,3 +64965,7,2,1,26,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,71402.235366,73020.331081,2,97,15,15,4.97,5,5,1,0,0,1,48,1,4,1,3 +64966,7,2,1,6,NA,3,3,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57305.501166,60591.443404,1,94,15,15,5,3,3,0,1,0,1,46,1,5,1,5 +64967,7,1,2,58,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,24905.670199,0,2,101,1,1,0.15,3,3,0,2,0,2,58,1,3,5,NA +64968,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16567.527819,16240.172481,1,96,15,15,5,4,4,0,1,0,1,56,1,4,1,5 +64969,7,2,1,18,NA,3,3,1,18,224,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24849.884345,24917.808193,3,91,5,5,0.87,4,4,0,2,0,2,38,1,2,3,NA +64970,7,2,1,12,NA,2,2,1,12,149,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15626.107676,15463.700675,2,93,9,9,1.94,6,6,0,3,0,2,37,NA,NA,3,NA +64971,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,6358.062034,6381.990744,1,99,8,8,3.4,2,2,0,0,1,1,60,1,3,3,NA +64972,7,2,1,61,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7289.557268,8219.094942,3,90,1,1,0,2,2,0,0,1,1,61,2,3,1,3 +64973,7,2,1,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,35869.019314,36329.101667,3,92,4,4,1.13,2,2,0,0,2,1,64,1,3,1,4 +64974,7,2,2,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,27585.470618,27304.927199,2,102,7,7,2.65,2,2,1,0,0,2,42,1,4,5,NA +64975,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,23016.024704,24471.525432,1,96,7,7,2.78,2,2,0,0,0,1,48,1,2,6,NA +64976,7,2,1,69,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7380.991723,2,100,10,10,2.33,6,6,0,2,2,2,35,1,2,5,NA +64977,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15732.436891,17625.53878,1,97,2,2,0.72,1,1,0,0,1,2,63,1,3,5,NA +64978,7,2,2,56,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,24548.478709,25991.798892,1,93,5,5,1.43,2,2,0,0,1,1,60,2,5,1,4 +64979,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18822.975485,18307.835382,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +64980,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,33147.414266,37148.276517,2,94,99,99,NA,1,1,0,0,1,2,80,1,4,2,NA +64981,7,2,1,46,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,1,1,2,2,1,19436.026093,20775.484483,2,97,5,5,0.8,5,5,1,2,0,1,46,2,4,1,2 +64982,7,2,1,16,NA,3,3,2,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,66448.116716,66629.743791,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +64983,7,2,2,76,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,17836.372654,19170.472552,2,96,6,6,1.77,2,2,0,0,2,1,77,1,2,1,2 +64984,7,2,2,17,NA,3,3,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,76360.13568,92040.479005,1,99,NA,NA,NA,4,4,0,1,0,1,50,NA,NA,1,NA +64985,7,2,1,65,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,7410.50521,7700.344649,2,96,6,6,2.75,1,1,0,0,1,1,65,1,2,2,NA +64986,7,1,2,28,NA,5,6,NA,NA,NA,2,NA,2,1,4,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,16937.04417,0,1,95,3,3,0.43,4,4,0,1,2,1,65,2,5,1,3 +64987,7,2,1,17,NA,4,4,1,17,210,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18413.211403,2,101,1,1,0.27,3,3,0,2,0,2,36,1,3,5,NA +64988,7,2,2,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8897.78821,9699.858422,1,96,7,7,1,7,7,2,1,1,2,53,1,4,1,3 +64989,7,2,1,11,NA,2,2,2,11,138,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13217.721247,13515.808466,2,91,8,8,2.97,3,2,0,2,0,2,33,2,4,5,NA +64990,7,1,1,2,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7390.005875,0,1,91,15,15,5,5,5,2,1,0,1,40,1,5,1,5 +64991,7,2,2,10,NA,5,6,2,10,128,NA,NA,1,1,NA,5,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6198.268014,6618.822195,3,90,15,15,3.23,6,6,0,2,0,1,50,2,2,1,2 +64992,7,2,1,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,15176.622228,16064.120023,1,101,3,3,1.12,1,1,0,0,1,1,76,1,5,2,NA +64993,7,1,1,57,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,16287.780872,0,2,100,15,14,5,2,1,0,0,0,1,57,1,5,6,NA +64994,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,106239.028397,111331.003215,2,92,10,5,1.96,2,1,0,0,0,2,27,2,5,1,NA +64995,7,2,2,68,NA,3,3,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,35700.429895,37686.262589,1,93,2,2,0.41,2,2,0,0,2,2,68,2,1,1,1 +64996,7,2,1,0,6,3,3,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19091.539058,20438.314938,2,95,8,8,2.17,4,4,1,1,0,1,43,1,4,1,5 +64997,7,2,2,15,NA,2,2,2,15,184,NA,NA,1,1,NA,66,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13824.001771,15649.805677,2,90,2,2,0.3,3,3,0,1,0,2,51,2,2,5,NA +64998,7,2,1,54,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,144858.963765,145378.942103,2,97,9,9,5,1,1,0,0,0,1,54,1,5,5,NA +64999,7,2,1,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,19434.054198,2,100,5,5,1.63,3,2,0,1,0,2,50,1,2,5,NA +65000,7,2,1,4,NA,2,2,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12403.412256,12420.172189,2,90,3,3,0.54,4,4,1,2,0,2,33,2,1,4,NA +65001,7,2,2,13,NA,5,7,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8777.486283,9116.900706,1,91,15,15,5,5,5,0,3,0,1,40,1,5,1,5 +65002,7,2,1,68,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,NA,NA,NA,1,2,2,1,140267.560043,144186.249663,2,91,12,NA,NA,2,1,0,0,2,2,68,1,4,6,NA +65003,7,2,1,9,NA,3,3,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17738.769196,18719.457495,1,98,4,4,1,3,3,0,1,1,1,65,1,2,1,NA +65004,7,2,2,25,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,2,2,2,2,2,2,2,NA,NA,NA,NA,42557.597671,44940.417695,1,100,13,13,NA,4,4,1,1,0,1,28,2,1,1,1 +65005,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,73204.401173,96856.987278,2,91,12,12,NA,2,2,0,0,2,2,71,1,2,1,NA +65006,7,2,2,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,25221.447441,25652.65048,1,100,14,14,3.93,3,3,0,1,0,2,47,1,5,4,NA +65007,7,2,2,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,18801.993237,20649.846581,2,96,14,14,5,2,2,0,0,0,1,30,2,5,1,5 +65008,7,1,1,80,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11740.600601,0,3,91,13,13,NA,3,3,0,0,2,2,80,1,3,1,1 +65009,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21491.090123,20964.324934,1,97,6,6,1.41,3,3,0,1,0,2,51,1,4,5,NA +65010,7,2,1,6,NA,4,4,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10469.725162,10967.571132,1,100,15,15,3.87,6,6,1,3,0,2,39,1,4,1,4 +65011,7,2,1,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18289.793332,19321.216647,1,99,6,6,0.96,5,5,1,2,0,2,35,1,4,1,2 +65012,7,2,2,68,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,2,2,NA,1,2,1,1,2,1,1,2,1,3,12312.400687,12851.340698,1,103,2,2,0.45,1,1,0,0,1,2,68,2,2,2,NA +65013,7,2,2,7,NA,2,2,2,7,87,NA,NA,2,1,1,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9872.244853,10294.506103,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +65014,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,166234.629208,1,95,9,9,4.01,2,2,0,0,1,1,60,1,3,1,3 +65015,7,2,1,19,NA,4,4,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,99,1,0.09,4,1,0,0,0,1,18,2,4,NA,NA +65016,7,2,1,11,NA,3,3,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22651.436723,23515.701302,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +65017,7,2,1,4,NA,4,4,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10859.969359,11974.89205,1,101,2,2,0.47,3,3,1,0,0,1,35,1,2,6,NA +65018,7,2,2,14,NA,2,2,2,14,176,NA,NA,2,1,1,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18254.385443,19735.623608,2,91,12,12,NA,5,5,0,1,1,2,43,2,3,6,NA +65019,7,2,2,9,NA,4,4,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11076.064101,11269.278002,2,102,15,15,4.2,5,5,1,2,0,2,29,NA,NA,1,NA +65020,7,2,1,62,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,8609.250304,11228.904188,2,90,2,2,0.73,1,1,0,0,1,1,62,2,1,4,NA +65021,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,96524.78948,102108.384344,1,97,7,7,1.87,4,4,1,1,0,1,35,1,2,1,4 +65022,7,2,2,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,1,2,2,1,2,2,1,13358.458751,14155.588359,2,92,15,15,5,3,1,0,0,0,2,33,NA,NA,5,NA +65023,7,2,2,13,NA,4,4,2,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,6,6,0.86,6,6,0,4,0,2,32,1,4,6,NA +65024,7,2,1,9,NA,2,2,1,9,109,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16281.509392,17100.217351,2,91,6,6,0.93,5,5,1,2,0,1,34,1,2,1,3 +65025,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,22249.799905,2,97,5,5,1.08,3,3,0,0,0,1,38,1,4,5,NA +65026,7,2,2,0,11,4,4,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5058.520291,5113.753371,1,100,7,7,1.65,4,4,2,0,0,2,24,1,4,1,3 +65027,7,2,2,23,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,4,5,2,2,2,2,1,2,2,2,2,2,2,35424.746838,35270.456492,2,93,4,4,0.56,5,5,0,0,0,2,49,2,2,5,NA +65028,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,15682.233511,17550.107712,1,101,3,3,0.95,2,2,0,0,2,1,80,1,2,1,NA +65029,7,2,2,6,NA,2,2,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19936.606751,20692.800636,1,94,7,7,1.74,4,4,0,2,0,1,44,1,5,1,5 +65030,7,2,2,5,NA,4,4,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8041.669581,8652.926173,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +65031,7,2,1,16,NA,2,2,1,16,199,NA,NA,2,2,1,8,NA,NA,NA,2,2,2,2,2,2,1,2,2,2,22124.028915,23090.48094,1,100,5,1,0,6,1,1,2,0,2,40,2,1,5,NA +65032,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,72094.421241,74006.954437,2,95,6,6,1.95,2,2,0,0,2,1,80,1,1,1,3 +65033,7,2,2,7,NA,4,4,1,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9453.111053,10094.338553,1,100,8,8,1.95,4,4,0,2,0,2,42,1,4,1,4 +65034,7,2,2,16,NA,4,4,2,17,204,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12161.822321,12177.990347,2,95,5,5,1.05,3,3,0,1,1,1,63,1,2,1,3 +65035,7,1,1,19,NA,1,1,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,18042.255087,0,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +65036,7,2,2,49,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,14814.740715,14686.129879,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +65037,7,1,1,18,NA,3,3,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,26749.020961,0,1,101,4,4,0.79,3,3,0,0,0,2,47,1,5,3,NA +65038,7,2,1,13,NA,2,2,1,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21898.969807,22012.999264,2,102,15,12,NA,5,4,0,3,0,1,42,2,4,6,NA +65039,7,2,2,6,NA,5,6,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8067.514021,8614.897055,1,90,14,14,3.33,5,5,1,2,0,1,41,1,5,1,5 +65040,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18710.568399,18832.614147,2,92,12,12,NA,2,1,0,0,1,2,58,1,3,5,NA +65041,7,2,2,11,NA,5,6,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8290.163782,8692.019106,1,92,14,14,3.69,4,4,0,2,0,1,47,2,4,4,NA +65042,7,2,1,14,NA,5,7,2,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15861.375368,15958.829994,1,95,7,7,1.57,4,4,0,2,0,1,39,1,3,1,3 +65043,7,2,2,7,NA,1,1,1,7,92,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15841.451259,16252.614023,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +65044,7,2,2,15,NA,5,6,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10142.281747,10534.471105,3,91,15,15,5,4,4,0,2,0,1,44,2,5,1,5 +65045,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,NA,10479.637868,11291.375185,1,92,2,2,0.87,1,1,0,0,1,1,80,1,4,5,NA +65046,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,13704.691347,15557.045236,1,90,15,15,5,2,2,0,0,2,1,74,1,3,1,3 +65047,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,140129.484883,1,101,14,14,3.3,4,4,0,2,0,2,42,1,4,1,3 +65048,7,2,1,61,NA,1,1,1,NA,NA,2,NA,2,2,9,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,10596.142548,10802.656005,1,94,7,7,1.52,4,4,0,2,2,1,61,2,1,1,5 +65049,7,2,1,24,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,37911.437415,38428.199561,2,103,7,7,2.64,2,2,0,0,0,2,21,2,3,1,3 +65050,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,39565.288792,43332.356399,1,99,10,10,4.89,2,2,0,0,2,2,63,1,5,5,NA +65051,7,2,2,80,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,1,2,NA,2,2,2,1,2,2,1,2,2,NA,17318.187297,23904.945555,2,90,3,3,0.92,1,1,0,0,1,2,80,2,1,2,NA +65052,7,2,1,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,109309.268477,109028.475475,3,91,15,15,5,2,2,0,1,0,1,42,1,5,2,NA +65053,7,2,2,0,4,1,1,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7565.515117,7406.345541,1,100,6,6,1.57,3,3,1,0,0,1,39,1,3,1,5 +65054,7,2,1,10,NA,3,3,1,10,127,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,32654.748828,36152.216038,1,94,5,5,0.87,4,4,0,1,0,1,40,1,5,1,5 +65055,7,1,1,33,NA,5,6,NA,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,2,1,2,1,NA,NA,NA,NA,15014.015332,0,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +65056,7,2,1,76,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,8992.410435,9337.125921,2,90,9,9,3.02,3,3,0,0,2,2,70,1,4,1,2 +65057,7,2,2,3,NA,5,6,2,3,44,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,3864.413878,4049.242646,1,99,6,6,1.07,6,6,2,1,2,1,44,2,5,4,NA +65058,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,23338.32018,25560.39495,1,99,77,77,NA,2,2,0,0,2,1,80,1,5,1,4 +65059,7,2,2,0,1,4,4,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4128.726485,4173.807313,2,93,6,6,1.08,4,4,2,0,0,1,25,1,3,6,NA +65060,7,2,1,0,6,4,4,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6275.847063,6487.671462,2,93,9,9,2.86,4,4,1,1,0,1,30,1,4,6,NA +65061,7,2,1,38,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19091.246741,19659.303383,1,91,10,10,3.22,4,4,1,1,0,1,38,2,5,1,5 +65062,7,2,1,10,NA,4,4,2,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8836.464036,8942.399437,1,96,15,15,5,5,5,0,3,0,2,47,1,5,1,5 +65063,7,2,1,28,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19137.192683,18862.909907,1,96,14,14,5,2,2,0,0,0,2,47,2,4,5,NA +65064,7,2,1,7,NA,1,1,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13665.416457,13541.311863,1,94,2,2,0.27,5,5,0,4,0,2,47,2,1,4,NA +65065,7,2,2,34,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,77299.255327,80009.772488,2,92,10,10,4.89,2,2,0,0,0,2,34,2,5,1,5 +65066,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,33913.235726,1,95,7,7,2.16,3,3,0,0,1,1,45,1,3,1,4 +65067,7,2,2,42,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,118432.300444,124617.656629,2,93,9,9,3.77,2,2,0,0,0,2,42,2,4,1,5 +65068,7,2,1,0,8,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5572.446681,5657.975893,1,99,10,10,3.51,3,3,1,0,0,1,27,1,4,1,4 +65069,7,2,1,62,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,11397.665899,11580.241952,1,101,3,3,0.41,5,5,0,2,1,2,36,2,4,4,NA +65070,7,2,1,3,NA,2,2,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11186.576454,11318.825779,2,90,3,3,0.46,5,5,3,0,0,2,22,1,2,5,NA +65071,7,2,2,79,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,55250.133125,58713.117248,1,91,14,14,3.25,4,4,0,0,1,1,50,1,2,1,3 +65072,7,2,2,27,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,48991.867549,51378.468052,1,93,14,14,5,2,2,0,0,0,2,59,2,5,5,NA +65073,7,2,2,4,NA,3,3,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,52402.97499,54053.880354,1,91,15,15,4.59,4,4,2,0,0,1,35,1,5,1,5 +65074,7,2,1,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,21924.03349,22615.591521,2,98,10,10,4.76,2,2,0,0,0,1,42,1,2,6,NA +65075,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108335.731552,113413.419502,1,98,15,15,4.34,4,4,0,2,0,1,51,1,5,1,5 +65076,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16859.368198,16397.96736,1,99,8,8,1.99,5,5,1,0,0,1,55,1,5,1,2 +65077,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,5,1,NA,2,2,2,2,2,2,2,2,2,2,9068.437099,9213.701881,2,93,77,77,NA,2,2,0,0,1,2,50,NA,NA,1,5 +65078,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,51218.356583,59416.206008,2,98,2,2,0.77,1,1,0,0,1,2,80,1,1,2,NA +65079,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,29733.812317,30162.048345,1,101,4,4,0.99,2,2,0,1,0,2,35,1,3,5,NA +65080,7,2,1,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,7005.52791,7142.750358,2,99,6,6,2.24,1,1,0,0,1,1,74,1,4,2,NA +65081,7,2,1,8,NA,2,2,1,8,101,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,12577.115885,12876.06354,2,96,6,6,1.25,4,4,1,1,0,1,31,2,3,1,3 +65082,7,2,2,14,NA,1,1,1,14,173,NA,NA,1,1,NA,8,NA,NA,NA,2,1,1,1,2,2,1,2,2,1,20830.737445,21782.111761,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +65083,7,2,2,0,2,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7798.643057,7634.568742,1,102,6,6,1.73,3,3,1,0,0,2,24,2,5,1,5 +65084,7,2,2,26,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18299.168537,17535.171386,2,100,5,5,0.95,4,4,0,0,1,2,53,1,3,5,NA +65085,7,2,1,51,NA,4,4,1,NA,NA,2,NA,2,2,5,NA,3,1,NA,1,2,1,1,2,1,1,2,1,NA,18061.358948,18950.803173,2,93,4,4,0.69,4,4,0,0,0,1,23,2,3,5,NA +65086,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,98850.665857,102087.416196,1,103,15,15,5,3,3,0,1,0,1,46,1,5,1,5 +65087,7,2,2,74,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,2,NA,2,2,2,1,2,2,1,2,2,NA,17318.187297,19970.708273,2,90,7,7,1.57,4,4,0,0,1,2,20,1,2,5,NA +65088,7,2,2,37,NA,3,3,2,NA,NA,2,NA,2,2,1,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,95214.22557,102645.939709,1,97,15,1,0.4,5,1,1,1,0,2,38,NA,NA,1,5 +65089,7,2,2,3,NA,4,4,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9630.497627,10362.522874,1,96,13,13,NA,5,5,1,1,0,1,42,1,3,5,NA +65090,7,2,2,18,NA,5,7,1,18,218,2,NA,2,2,2,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6391.016092,6494.382638,1,100,99,99,NA,6,6,0,1,0,1,53,2,2,1,3 +65091,7,2,1,33,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23952.480361,1,95,5,5,1.03,4,4,0,2,0,1,33,1,3,1,3 +65092,7,2,1,8,NA,2,2,2,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8613.834494,9046.977066,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +65093,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,6,6,1.67,3,3,0,0,0,2,22,1,4,5,NA +65094,7,2,1,10,NA,4,4,1,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,14062.200951,2,101,6,6,0.96,5,5,0,4,0,2,36,1,4,4,NA +65095,7,2,2,41,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,4,1,1,2,2,2,2,2,2,2,2,1,2,33716.655399,34130.121207,1,100,7,7,1.3,5,5,0,3,0,1,43,2,2,1,4 +65096,7,2,2,7,NA,1,1,1,8,96,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15962.145468,16535.37648,2,98,3,3,0.33,7,7,2,3,0,1,40,2,1,1,1 +65097,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,28280.669788,29879.976389,1,99,14,14,5,2,2,0,0,2,2,79,1,3,1,5 +65098,7,2,2,68,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,12230.621635,1,96,7,7,1.39,5,5,0,2,2,1,69,2,2,1,2 +65099,7,2,2,1,18,4,4,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5987.067673,6442.151602,2,93,4,4,0.56,5,5,2,1,0,1,27,1,2,6,NA +65100,7,2,2,2,NA,5,6,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5520.445386,5614.569811,2,100,15,15,5,4,4,1,1,0,1,41,2,5,1,5 +65101,7,2,1,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,10310.165525,10913.082896,1,93,3,3,0.92,1,1,0,0,1,1,75,1,5,3,NA +65102,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,17884.885732,18259.455804,2,95,3,3,0.52,3,3,1,0,0,1,37,1,4,1,4 +65103,7,2,1,12,NA,4,4,2,12,149,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10453.50644,10655.928666,1,90,14,14,2.96,5,5,1,2,0,1,31,1,5,1,4 +65104,7,2,2,8,NA,3,3,2,9,108,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,80369.555824,80552.420473,1,97,15,15,3.89,5,5,0,2,0,1,50,1,4,6,NA +65105,7,2,2,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,24654.107413,23441.410215,1,100,10,10,2.59,5,5,0,1,0,2,40,1,5,1,NA +65106,7,2,1,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,20880.649884,21300.208451,1,96,14,6,2.69,2,1,0,0,0,2,29,1,5,6,NA +65107,7,2,1,14,NA,1,1,2,14,174,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,20398.562455,21727.336109,2,94,5,5,0.67,6,6,1,3,0,1,37,2,3,1,4 +65108,7,2,2,8,NA,3,3,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55469.656717,57246.428971,1,98,9,9,2.15,5,5,0,3,0,2,32,1,3,1,4 +65109,7,2,1,3,NA,5,6,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10273.602479,11522.969217,2,98,9,9,3.83,2,2,1,0,0,2,29,2,4,5,NA +65110,7,2,2,23,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,16929.836231,18593.694637,2,101,4,2,0.55,2,1,0,0,0,2,23,2,4,5,NA +65111,7,2,1,14,NA,3,3,2,14,177,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18645.590959,18737.183314,2,97,9,9,1.45,7,7,1,2,2,2,45,1,3,5,NA +65112,7,2,2,60,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,12592.413049,13033.910742,1,93,8,8,4.13,1,1,0,0,1,2,60,2,4,3,NA +65113,7,2,1,43,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,11558.146957,12085.615817,3,90,6,6,1.3,4,4,0,2,0,2,37,2,4,1,3 +65114,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,27375.405353,30621.081524,3,91,5,5,0.87,4,4,0,2,0,2,38,1,2,3,NA +65115,7,2,2,19,NA,4,4,1,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,2,1,0.23,4,1,0,0,0,2,19,1,4,NA,NA +65116,7,2,1,0,10,2,2,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4884.343512,4884.433539,3,90,7,7,2.1,3,3,1,0,0,1,34,2,3,1,2 +65117,7,2,1,16,NA,4,4,2,16,203,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11351.725436,12116.15399,2,95,14,14,4.58,3,3,0,1,1,1,61,1,4,1,5 +65118,7,2,1,8,NA,2,2,2,8,99,NA,NA,2,1,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10872.115681,10826.020253,1,99,77,77,NA,3,3,0,1,0,1,52,1,5,1,5 +65119,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,66503.043118,66707.517935,2,98,8,8,1.8,5,5,2,1,0,1,32,1,4,1,5 +65120,7,2,1,8,NA,2,2,1,8,100,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14570.588291,14577.04302,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +65121,7,2,1,3,NA,2,2,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,15745.774489,15931.923312,2,91,2,2,0.19,5,5,3,0,0,1,24,2,1,1,3 +65122,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114993.808573,120122.111367,1,98,8,8,2.62,3,3,0,0,0,1,50,NA,NA,3,NA +65123,7,2,2,13,NA,4,4,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19222.393687,19147.000359,1,92,9,7,1.74,7,4,2,1,0,1,45,1,4,2,NA +65124,7,2,2,28,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,30253.427014,31766.413225,2,90,6,6,1.62,3,3,1,0,0,2,28,1,5,1,4 +65125,7,2,2,40,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,2,3,2,2,2,2,2,2,2,2,2,2,2,25713.328161,27565.019075,2,103,5,5,0.65,6,6,1,0,1,2,61,2,1,2,NA +65126,7,2,2,63,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10598.2543,1,99,15,15,5,2,2,0,0,2,2,63,2,5,1,5 +65127,7,1,2,17,NA,2,2,NA,NA,NA,2,NA,2,1,3,12,NA,NA,NA,2,2,2,1,2,2,NA,NA,NA,NA,26657.121865,0,1,97,15,15,5,4,4,0,2,0,1,51,1,5,1,NA +65128,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26503.609729,2,101,1,1,0.09,2,1,0,0,0,1,23,1,5,5,NA +65129,7,2,2,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,23759.65375,25262.180522,3,92,4,4,1.22,2,2,0,0,0,1,51,1,2,1,3 +65130,7,1,2,38,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,95214.22557,0,1,97,15,15,5,5,5,2,0,1,1,43,1,5,1,5 +65131,7,2,1,24,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39031.957066,40864.300461,1,101,5,5,1.24,3,3,0,0,1,2,61,1,4,1,3 +65132,7,2,2,33,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,6,2,2,2,2,2,2,2,2,2,2,2,38737.690941,37692.46666,1,97,4,4,0.72,5,5,2,1,0,2,33,2,1,6,NA +65133,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,99275.150567,104459.98751,2,95,3,3,0.93,2,2,0,0,0,1,45,1,4,1,5 +65134,7,2,2,2,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6689.921427,7247.312894,1,96,15,15,4.81,5,5,1,1,0,2,35,1,5,1,5 +65135,7,2,1,55,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16499.662173,16440.055989,3,91,15,15,5,2,2,0,0,0,2,46,1,5,1,5 +65136,7,2,1,7,NA,4,4,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10311.165779,10291.779514,2,98,3,3,0.54,3,3,1,1,0,2,29,1,2,1,NA +65137,7,2,2,8,NA,3,3,2,8,103,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,48532.852397,48387.04619,1,98,14,14,3.9,4,4,0,3,0,2,31,1,4,1,NA +65138,7,2,2,0,11,5,7,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4867.693222,4920.842696,2,97,2,2,0.43,4,4,3,0,0,2,25,1,4,5,NA +65139,7,2,1,61,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,14488.953694,16384.525762,3,92,4,1,0.11,7,1,0,3,1,1,61,1,3,3,NA +65140,7,2,2,11,NA,5,6,2,11,136,NA,NA,2,2,4,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6198.268014,6649.703491,3,90,14,14,3.47,4,4,1,1,0,2,38,2,5,1,5 +65141,7,2,1,21,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,39084.166385,39616.913732,1,97,4,4,0.65,4,4,0,1,0,2,45,2,2,3,NA +65142,7,2,1,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,18076.30431,2,95,1,1,0.03,3,3,1,0,0,1,23,1,3,6,NA +65143,7,2,1,62,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,10555.964373,11135.911352,2,92,6,5,2.2,3,1,0,0,2,1,80,NA,NA,2,NA +65144,7,2,1,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,87072.438071,86848.766907,1,102,8,8,1.91,5,5,1,2,0,2,38,1,5,1,4 +65145,7,2,2,57,NA,1,1,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,28713.036659,29755.292291,1,97,10,10,3.59,3,3,0,0,0,2,57,1,3,1,NA +65146,7,2,1,14,NA,2,2,2,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15991.147079,16786.340864,2,90,6,6,1.34,4,4,1,2,0,2,36,2,3,77,NA +65147,7,1,2,36,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,97803.500399,0,1,95,14,14,3.8,4,4,1,1,0,1,36,1,4,1,5 +65148,7,2,2,12,NA,1,1,1,12,145,NA,NA,2,2,3,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18515.058419,19067.51542,2,96,5,5,0.89,4,4,1,1,0,2,36,2,4,6,NA +65149,7,2,1,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,19508.889464,19600.270833,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +65150,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,25964.813959,25700.75257,2,101,7,7,2.52,2,2,0,0,0,2,53,1,4,1,2 +65151,7,2,2,26,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,44119.608456,48674.237788,2,98,7,7,2.16,3,3,1,0,0,2,26,1,3,1,3 +65152,7,2,1,13,NA,4,4,2,13,162,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16890.963304,17218.04077,1,91,10,10,2.56,5,5,0,3,0,1,51,2,5,1,4 +65153,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,40859.270352,44024.169267,2,101,14,14,5,1,1,0,0,1,1,80,1,5,5,NA +65154,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,4,1,0.4,4,1,0,0,0,1,22,1,5,5,NA +65155,7,2,2,8,NA,5,6,1,8,100,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6273.782555,6554.366499,2,94,15,15,5,5,5,0,2,1,1,47,2,5,1,5 +65156,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,31053.116279,31557.850777,2,97,5,5,1.84,2,1,0,0,0,2,45,1,2,4,NA +65157,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,51644.110977,57877.507418,1,102,6,6,2.48,1,1,0,0,1,2,80,1,4,3,NA +65158,7,2,2,4,NA,5,6,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,6683.092466,6676.033575,3,91,13,13,NA,3,3,1,0,0,2,41,2,1,1,3 +65159,7,2,2,0,4,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,11331.751026,1,95,1,1,0.21,4,4,1,0,1,2,75,1,1,2,NA +65160,7,2,2,17,NA,4,4,2,17,211,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12209.74498,12781.910285,2,90,5,5,1.08,3,3,1,1,0,2,23,1,2,5,NA +65161,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,18344.917534,19717.054857,2,101,3,3,0.9,2,2,0,0,1,1,57,1,2,5,NA +65162,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,83819.702285,89179.486894,1,99,9,9,5,1,1,0,0,0,1,32,1,3,5,NA +65163,7,2,1,70,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,69210.206708,72962.448849,1,98,12,12,NA,2,2,0,0,2,1,70,1,2,1,3 +65164,7,2,1,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,20953.00978,22152.088593,2,97,2,2,0.3,4,4,0,2,0,1,42,1,2,6,NA +65165,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10561.526228,11375.629073,2,95,7,7,2.31,2,2,0,0,2,2,63,1,3,1,3 +65166,7,2,1,17,NA,4,4,2,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12462.601191,12584.643654,2,97,4,4,0.81,4,4,1,1,0,2,51,1,3,4,NA +65167,7,2,2,17,NA,4,4,2,17,208,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9608.885901,9632.551122,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +65168,7,2,1,16,NA,2,2,1,17,204,NA,NA,2,2,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15626.107676,15463.700675,2,93,9,9,1.94,6,6,0,3,0,2,37,NA,NA,3,NA +65169,7,2,2,59,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12649.084278,13261.522577,3,90,1,1,0,2,2,0,0,1,1,61,2,3,1,3 +65170,7,2,1,4,NA,5,6,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7580.437211,8294.186048,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +65171,7,2,2,13,NA,3,3,2,13,157,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,99340.784743,108314.70799,2,91,15,15,5,4,4,0,2,0,1,53,1,5,1,4 +65172,7,2,2,34,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,89807.047643,91549.325071,3,91,7,7,1.74,4,4,0,2,0,1,45,2,2,1,4 +65173,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,NA,NA,NA,1,2,2,1,12969.776823,13038.360257,2,90,3,3,0.65,5,3,1,2,0,1,44,2,5,1,5 +65174,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,85610.546667,92292.669073,2,91,14,14,4.19,3,3,0,1,0,2,31,1,4,1,3 +65175,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,16049.689005,2,100,5,5,1.63,3,2,0,1,0,2,50,1,2,5,NA +65176,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19130.246369,18737.157388,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +65177,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,120604.496044,126250.391527,2,92,10,10,3.51,3,3,0,0,0,1,24,1,4,5,NA +65178,7,2,2,0,10,3,3,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7569.605114,7776.819156,2,102,6,6,1.01,5,5,2,0,0,2,18,1,3,NA,NA +65179,7,2,1,48,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22433.902709,22559.455212,1,100,15,15,5,2,2,0,0,0,1,48,2,5,1,5 +65180,7,2,2,14,NA,4,4,2,14,172,NA,NA,2,2,3,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10694.834447,10900.381844,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +65181,7,1,1,3,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58618.419318,0,2,94,14,14,2.87,5,5,2,1,0,1,37,1,3,1,4 +65182,7,2,1,45,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,2,6,NA,2,2,2,1,2,2,2,2,1,2,34128.967046,33628.177065,2,93,3,3,0.43,4,4,0,0,0,1,45,2,2,6,NA +65183,7,2,1,62,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,8623.181934,10090.425838,2,103,4,4,1.34,3,1,0,0,1,1,62,2,3,1,NA +65184,7,2,2,50,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11446.604914,11655.034159,2,92,77,77,NA,4,4,0,0,0,1,27,2,2,5,NA +65185,7,2,1,6,NA,5,7,2,6,80,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9502.15317,9616.069144,2,100,9,9,2.46,4,4,0,2,0,2,36,2,4,1,3 +65186,7,2,2,0,2,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4418.651245,4685.491283,2,95,7,7,1.41,5,5,2,0,0,2,53,1,3,3,NA +65187,7,2,1,11,NA,4,4,1,11,141,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9418.975084,9571.535533,2,93,5,5,0.92,4,4,1,1,0,1,27,2,2,5,NA +65188,7,2,2,59,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14068.752668,14242.311751,1,93,15,15,5,5,5,1,0,1,1,61,2,4,1,4 +65189,7,2,1,63,NA,2,2,1,NA,NA,2,NA,77,NA,NA,NA,3,77,NA,1,2,2,1,2,2,1,2,2,1,9250.428657,10460.65091,2,92,99,99,NA,1,1,0,0,1,1,63,77,3,77,NA +65190,7,2,2,62,NA,3,3,2,NA,NA,2,NA,2,1,7,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,44636.780791,48652.73082,2,91,6,6,1.78,3,3,0,0,1,2,62,2,3,3,NA +65191,7,2,2,30,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,13124.243834,13151.042447,1,93,15,6,2.3,6,1,0,0,0,1,34,2,5,5,NA +65192,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16677.13986,16814.569762,1,97,15,15,5,4,4,0,0,0,1,51,2,5,1,5 +65193,7,2,2,3,NA,4,4,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16749.124902,17181.448234,2,101,4,4,1.16,2,2,1,0,0,2,28,1,4,5,NA +65194,7,2,1,31,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13936.822202,14121.672299,1,93,15,5,1.84,6,1,0,0,0,1,34,2,5,5,NA +65195,7,2,1,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13232.135,13189.930654,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +65196,7,2,2,1,22,3,3,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,41956.615141,45173.707461,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +65197,7,2,1,6,NA,5,7,1,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15279.821652,15716.743409,1,102,6,6,1.34,4,4,2,1,0,2,27,1,4,3,NA +65198,7,2,1,32,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,34624.133414,2,94,7,7,1.34,5,5,2,1,0,1,32,2,1,1,NA +65199,7,2,2,51,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17852.668137,18282.490034,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +65200,7,2,1,10,NA,5,6,2,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7832.194045,8303.616222,1,96,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +65201,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,56666.803206,58405.284869,1,101,15,15,5,3,3,0,0,2,1,79,1,4,1,4 +65202,7,2,1,45,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,52941.648658,52164.811575,2,102,5,5,1.08,3,3,0,0,0,1,55,2,1,5,NA +65203,7,2,2,7,NA,3,3,2,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,70999.269152,75403.63644,1,93,15,15,5,4,4,0,2,0,1,51,1,3,1,5 +65204,7,2,1,15,NA,4,4,2,15,188,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12195.546462,12314.973739,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +65205,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,171848.340208,2,91,7,7,1.61,4,4,0,0,3,1,65,1,3,6,NA +65206,7,2,2,6,NA,5,6,2,6,75,NA,NA,2,1,2,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10029.642884,10710.156898,2,91,14,14,3.69,4,4,1,1,0,1,53,1,4,1,5 +65207,7,2,2,11,NA,2,2,2,11,134,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,15583.587534,16935.930722,1,93,14,14,3.06,5,5,0,2,0,1,46,2,1,1,4 +65208,7,2,2,5,NA,3,3,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,85197.465687,87881.529962,1,92,15,15,5,4,4,2,0,0,2,46,1,5,1,5 +65209,7,2,2,71,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,28297.225791,31371.640749,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +65210,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,19333.302971,19445.46438,1,99,3,3,0.88,2,2,0,1,0,2,48,1,1,3,NA +65211,7,2,2,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6293.31819,6860.614572,1,96,7,7,1,7,7,2,1,1,2,53,1,4,1,3 +65212,7,2,1,14,NA,5,6,1,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7291.654281,7756.692286,3,91,9,9,3.24,3,3,0,1,1,1,64,2,2,1,5 +65213,7,2,2,64,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15369.196003,16553.883322,1,100,15,15,5,2,2,0,0,2,2,64,1,3,1,3 +65214,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,74517.751389,77393.175383,2,94,10,10,2.91,4,4,0,2,0,2,38,1,4,1,4 +65215,7,2,1,1,14,3,3,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37534.976354,40372.682594,1,99,14,14,4.03,4,4,1,1,0,1,40,2,4,1,5 +65216,7,1,2,1,22,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9955.153132,0,2,94,4,4,0.72,4,4,1,1,0,1,30,2,1,1,3 +65217,7,2,2,22,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,60461.427433,62051.800421,2,92,2,2,0.4,3,3,0,0,0,1,50,2,4,1,4 +65218,7,2,1,74,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,9748.579573,13410.055152,3,90,13,3,0.79,3,2,0,0,2,1,74,2,1,1,NA +65219,7,2,1,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6936.347746,7414.543244,1,98,10,10,2.59,5,5,2,1,0,1,45,1,5,1,5 +65220,7,2,1,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,1,2,NA,NA,NA,NA,9850.66662,10431.854777,2,98,3,3,1.1,1,1,0,0,1,1,80,1,1,2,NA +65221,7,2,2,2,NA,3,3,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,45222.58045,46647.274385,1,98,15,15,4.56,4,4,2,0,0,2,33,1,4,1,4 +65222,7,2,2,7,NA,1,1,2,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12958.860039,13685.571339,1,99,15,15,5,3,3,0,1,0,2,34,1,4,1,4 +65223,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,99,99,NA,2,1,0,0,0,1,21,1,4,5,NA +65224,7,1,1,58,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,16851.334496,0,2,95,3,3,0.95,2,2,0,0,1,2,65,1,2,3,NA +65225,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16411.593279,16969.580129,2,103,15,15,5,2,2,0,0,0,2,39,2,5,5,NA +65226,7,2,2,3,NA,3,3,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,71938.505792,79397.866058,3,91,8,8,1.95,4,4,2,0,0,2,30,1,5,1,4 +65227,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,19831.16853,19892.1428,1,103,3,3,0.37,5,5,1,2,0,2,30,1,4,5,NA +65228,7,2,2,44,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,16237.004863,17542.96783,1,90,15,15,5,5,5,0,2,0,1,47,2,5,1,5 +65229,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,109181.566304,112638.448741,2,91,14,14,3.93,3,3,0,0,2,1,70,NA,NA,1,NA +65230,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,25128.435397,27949.568291,2,94,5,5,1.3,3,3,0,1,0,1,43,1,3,6,NA +65231,7,2,1,31,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,34997.800447,36560.756135,2,96,6,6,1.25,4,4,1,1,0,1,31,2,3,1,3 +65232,7,2,2,0,4,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8775.375504,8590.751882,2,102,8,8,2.24,4,4,1,1,0,1,40,1,3,1,3 +65233,7,2,1,30,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,47932.213152,49254.617856,1,92,14,14,3.9,4,4,2,0,0,2,29,1,4,1,4 +65234,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,1,2,1,2,2,NA,NA,NA,NA,26773.686592,29743.160504,2,98,99,99,NA,2,2,0,0,2,2,80,1,3,1,1 +65235,7,2,2,5,NA,2,2,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12541.254112,13845.88109,2,100,14,14,3.36,4,4,1,1,0,1,45,2,5,1,2 +65236,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,12980.451176,13849.150613,1,96,7,7,3.58,1,1,0,0,1,2,73,1,2,3,NA +65237,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,53574.557692,55073.604958,1,90,4,1,0.27,2,1,0,0,0,2,25,1,5,6,NA +65238,7,2,1,19,NA,1,1,1,19,228,2,NA,2,2,4,15,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,29234.272259,29869.33924,3,92,4,4,0.46,7,7,1,2,0,2,31,2,2,1,1 +65239,7,2,2,60,NA,4,4,2,NA,NA,2,NA,2,2,8,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,15732.436891,16737.04767,1,97,3,3,0.9,1,1,0,0,1,2,60,2,4,2,NA +65240,7,2,1,73,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,1,1,2,1,1,2,1,NA,11066.512629,11628.392246,1,99,9,9,4.08,2,2,0,0,2,1,73,2,5,1,5 +65241,7,2,2,42,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,15147.212851,15611.778104,1,96,6,6,1.34,3,3,1,0,0,2,42,2,4,6,NA +65242,7,2,1,5,NA,1,1,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,17865.135763,18076.339981,3,92,6,6,0.96,5,5,2,1,0,2,26,2,1,1,1 +65243,7,2,2,35,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,49102.007191,48391.207475,3,92,10,10,3.77,3,3,0,1,0,2,52,1,4,6,NA +65244,7,2,2,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18490.479848,19120.175119,2,100,4,4,0.91,3,3,0,0,0,2,49,1,2,1,2 +65245,7,1,2,2,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9008.172545,0,1,97,15,15,5,3,3,1,0,0,1,28,1,3,6,NA +65246,7,2,1,3,NA,3,3,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,95119.048777,111454.284969,1,100,6,6,1.78,3,3,1,1,0,2,35,1,5,4,NA +65247,7,2,2,8,NA,4,4,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10221.991799,10600.655937,1,98,6,6,1.36,3,3,0,2,0,1,35,1,5,3,NA +65248,7,2,2,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,14,14,5,2,2,0,0,2,1,68,1,4,1,4 +65249,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,53401.089129,55537.639072,2,101,99,2,0.73,3,1,0,0,0,2,22,1,4,5,NA +65250,7,2,1,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,29413.309667,30038.439043,1,94,3,3,0.9,1,1,0,0,0,1,41,1,3,5,NA +65251,7,2,2,10,NA,4,4,2,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9565.802332,9920.158544,1,96,14,14,2.58,6,6,2,2,0,1,40,2,4,1,4 +65252,7,2,2,6,NA,4,4,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9089.153301,9279.567325,1,93,1,1,0,2,2,0,1,0,2,38,1,4,3,NA +65253,7,2,2,3,NA,5,6,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4919.743181,5055.947351,1,97,7,7,1.48,5,5,1,2,0,1,40,2,5,1,4 +65254,7,2,2,2,NA,4,4,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5899.406975,6225.79867,2,103,7,7,1.55,5,5,2,2,0,2,31,1,4,3,NA +65255,7,2,1,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,24022.668025,24108.898567,1,99,10,10,5,1,1,0,0,0,1,52,1,5,3,NA +65256,7,2,2,36,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85610.546667,92292.669073,2,91,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +65257,7,2,1,13,NA,3,3,2,13,163,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30100.326038,35344.542616,1,101,6,6,1.52,3,3,0,1,1,1,62,1,2,1,3 +65258,7,2,2,16,NA,1,1,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21818.047789,22469.060223,2,102,7,7,2.16,3,3,0,2,0,2,41,1,5,3,NA +65259,7,2,2,5,NA,3,3,2,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,23388.579221,24855.504015,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +65260,7,2,2,58,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13354.133365,13424.749254,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +65261,7,2,2,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,30932.175051,34795.188535,2,101,7,7,3.21,1,1,0,0,0,2,41,1,5,5,NA +65262,7,2,1,35,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,4,5,NA,1,2,2,1,2,1,1,2,2,1,20463.181443,21839.784829,1,93,7,7,2.38,2,2,0,0,0,2,46,2,3,5,NA +65263,7,2,2,13,NA,2,2,1,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20460.442471,21235.303768,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +65264,7,2,1,40,NA,5,7,2,NA,NA,2,NA,2,2,3,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,26449.318243,30106.409363,1,90,77,77,NA,2,2,0,0,0,1,40,2,2,1,5 +65265,7,2,1,56,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,6,NA,2,2,2,1,2,2,NA,NA,NA,NA,24595.31055,24234.412281,1,97,3,3,0.5,5,5,0,2,0,1,56,2,2,6,NA +65266,7,2,2,55,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,24870.513993,25871.320138,3,92,7,7,2.45,2,2,0,0,1,2,55,1,1,1,1 +65267,7,2,2,37,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,14553.261149,15099.267285,2,92,15,15,5,3,3,1,0,0,2,37,1,5,1,5 +65268,7,2,2,20,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,2,1,2,2,1,2,2,1,2,2,3,16929.836231,17652.770039,2,101,12,8,4.82,2,1,0,0,0,2,21,NA,NA,5,NA +65269,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22233.683089,22579.222386,1,102,5,1,0.21,5,4,1,1,0,2,24,1,4,5,NA +65270,7,2,1,24,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,34629.549705,1,94,5,5,1.47,2,2,0,0,0,1,24,1,4,1,4 +65271,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,36449.806171,39411.375474,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +65272,7,2,2,1,19,4,4,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7618.827213,8513.998744,2,97,2,2,0.34,2,2,1,0,0,2,20,1,3,5,NA +65273,7,2,1,5,NA,1,1,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14098.200143,14544.470341,1,102,4,4,0.61,5,5,2,2,0,2,27,2,2,5,NA +65274,7,1,1,25,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,15435.176007,0,2,99,4,4,0.78,4,4,0,2,0,2,45,1,3,5,NA +65275,7,1,1,80,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,20611.860643,0,1,99,7,7,3.9,1,1,0,0,1,1,80,1,4,2,NA +65276,7,2,2,11,NA,4,4,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11593.230877,12022.691286,2,96,8,8,1.72,5,5,0,3,0,1,39,1,5,1,4 +65277,7,2,2,2,NA,3,3,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,44626.8774,45213.2896,1,92,14,14,4.59,3,3,1,0,0,1,31,1,4,1,5 +65278,7,2,2,13,NA,1,1,2,13,157,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,18368.872199,20151.001259,2,94,6,6,1.34,4,4,0,2,0,1,37,2,4,1,2 +65279,7,2,2,6,NA,5,7,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19880.837381,19932.405693,1,95,3,3,0.45,4,4,2,1,0,2,26,1,3,4,NA +65280,7,2,1,62,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,3,3,NA,2,2,2,1,2,2,NA,NA,NA,NA,14488.953694,16384.525762,3,92,1,1,0,6,6,0,3,1,1,62,2,3,3,NA +65281,7,2,2,8,NA,3,3,2,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28912.545431,29050.529973,1,98,3,3,0.61,4,4,0,2,0,2,32,1,3,6,NA +65282,7,2,1,2,NA,1,1,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12387.68972,12183.594345,1,94,6,6,1.78,3,3,1,0,0,2,31,2,5,1,1 +65283,7,2,2,31,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,29102.738194,28317.485179,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +65284,7,2,2,6,NA,5,6,2,6,77,NA,NA,2,2,1,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5795.227223,6217.308223,1,91,14,14,4.32,3,3,0,2,0,2,37,2,5,1,NA +65285,7,2,1,44,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,2,1,2,2,1,2,2,2,34153.424332,35777.45113,1,100,8,8,2.17,4,4,1,1,0,2,40,2,2,1,2 +65286,7,2,1,30,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,1,1,2,2,1,20228.224986,20656.862173,2,102,15,15,3.82,5,5,0,1,2,1,60,2,2,1,1 +65287,7,2,1,1,15,5,7,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26781.430467,29328.277521,1,102,6,6,1.34,4,4,2,1,0,2,27,1,4,3,NA +65288,7,2,2,41,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,37512.060155,37707.682357,1,92,14,14,5,2,2,0,1,0,2,41,1,5,3,NA +65289,7,2,2,73,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,17474.843163,17732.021804,1,98,6,6,1.57,3,3,0,0,2,1,66,2,2,1,4 +65290,7,2,2,0,8,4,4,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4439.36229,4707.453058,2,100,5,5,0.88,5,5,2,1,0,2,30,1,4,6,NA +65291,7,2,1,29,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,35669.2076,37942.468331,2,94,9,9,2.51,4,4,2,0,0,2,34,2,3,1,3 +65292,7,2,1,3,NA,5,6,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7769.861689,8391.242047,1,101,8,8,1.81,5,5,2,0,1,2,37,2,4,1,2 +65293,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,10038.743429,10812.549167,1,96,6,6,1.83,2,2,0,0,1,2,64,1,3,2,NA +65294,7,2,2,15,NA,4,4,2,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11133.192774,11654.909373,3,91,2,2,0.25,4,4,0,2,0,2,35,1,3,5,NA +65295,7,2,2,17,NA,1,1,1,17,212,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18674.868029,19048.995585,2,92,8,8,1.42,7,7,0,4,0,2,37,1,1,6,NA +65296,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,38666.703155,42427.769217,2,94,9,9,3.97,2,2,0,0,2,1,80,1,5,1,5 +65297,7,2,1,72,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,1,1,2,2,NA,12375.169389,14759.280437,2,92,4,4,1.14,2,2,0,0,2,1,72,2,3,1,3 +65298,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140932.152825,151077.472396,1,97,14,14,3.36,4,4,0,2,0,2,49,1,5,1,5 +65299,7,2,1,29,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,94547.245282,99078.839738,2,94,15,10,5,2,1,0,0,0,1,29,1,4,6,NA +65300,7,2,1,1,16,3,3,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50563.666669,55372.144903,1,95,9,9,2.68,4,4,2,0,0,2,27,1,4,1,4 +65301,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10604.379638,1,99,8,8,4.13,1,1,0,0,1,2,62,1,2,3,NA +65302,7,2,1,11,NA,3,3,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21767.839187,23123.409471,1,101,5,5,1.28,3,3,0,2,0,2,44,1,5,3,NA +65303,7,2,2,19,NA,5,6,2,19,239,2,NA,2,2,2,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7588.544207,7881.983727,3,91,4,4,0.69,5,5,0,2,0,1,45,2,4,1,1 +65304,7,2,1,43,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,30596.964094,35273.693641,2,102,14,14,5,1,1,0,0,0,1,43,1,4,3,NA +65305,7,2,2,16,NA,5,7,2,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6386.337576,6452.948976,1,93,15,15,4.59,4,4,0,2,0,2,45,1,5,1,5 +65306,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,30802.731848,31491.045952,1,100,6,6,1.18,5,5,1,2,0,2,30,1,3,1,4 +65307,7,2,1,3,NA,3,3,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27608.061058,31148.453885,1,94,6,6,1.18,5,5,1,2,0,1,30,1,3,1,3 +65308,7,2,2,54,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,2,2,1,2,25483.560748,25945.701567,1,94,12,3,1.07,4,1,0,0,1,2,37,NA,NA,6,NA +65309,7,1,1,77,NA,1,1,NA,NA,NA,1,1,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,14200.083364,0,2,98,3,3,1.1,1,1,0,0,1,1,77,1,2,2,NA +65310,7,2,1,40,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,28721.124083,1,101,6,6,1.21,4,4,0,2,0,2,33,1,2,6,NA +65311,7,2,2,7,NA,1,1,1,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15510.382876,16516.802792,1,100,8,8,2.17,4,4,1,1,0,2,40,2,2,1,2 +65312,7,2,1,2,NA,5,7,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26781.430467,29328.277521,1,102,6,6,1.34,4,4,2,1,0,2,27,1,4,3,NA +65313,7,2,1,3,NA,4,4,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6946.177172,7233.19413,2,90,4,4,0.57,5,5,1,2,0,2,33,2,2,77,NA +65314,7,2,2,16,NA,4,4,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12208.965913,12707.508076,2,100,6,6,0.99,5,5,0,3,0,2,40,1,3,1,3 +65315,7,2,1,7,NA,2,2,2,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12049.155217,12263.670489,2,90,14,14,3.58,4,4,1,1,0,1,37,1,3,1,4 +65316,7,2,1,54,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,26127.59163,27234.881102,1,100,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +65317,7,2,2,26,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,15267.012422,14516.051827,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +65318,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,51433.469947,56330.524019,1,98,5,5,1.97,1,1,0,0,1,2,80,1,4,2,NA +65319,7,2,1,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11849.199361,13959.374637,1,100,4,4,1.16,2,2,0,0,2,1,73,1,3,1,3 +65320,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,109181.566304,114466.270601,2,91,15,3,0.98,7,1,0,0,1,1,49,NA,NA,5,NA +65321,7,2,1,7,NA,2,2,1,7,90,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14820.807433,15173.085782,2,102,6,6,1.12,4,4,1,1,0,1,38,2,2,1,3 +65322,7,2,2,23,NA,2,2,2,NA,NA,2,NA,2,1,4,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,30253.427014,31766.413225,2,90,6,6,1.35,3,3,1,0,0,1,31,1,3,1,4 +65323,7,2,1,0,11,2,2,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6266.985765,6267.101277,1,93,15,15,5,3,3,1,0,0,2,32,2,5,1,5 +65324,7,2,2,0,3,1,1,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7011.218293,6988.118839,2,97,8,8,2.01,4,4,2,0,0,2,24,1,4,1,1 +65325,7,2,2,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,72443.10981,74665.593008,2,102,7,7,2.72,2,2,0,0,1,2,73,1,4,2,NA +65326,7,2,2,44,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,1,1,2,1,2,2,1,2,2,NA,NA,NA,NA,12544.244874,13448.569073,1,102,5,5,0.92,5,5,1,2,0,2,44,2,1,1,2 +65327,7,2,1,38,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,22007.065507,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +65328,7,2,1,63,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,4,5,NA,2,2,2,2,2,2,2,2,2,2,10903.483462,11078.143343,1,93,2,2,0.43,2,2,0,0,2,2,80,2,1,2,NA +65329,7,2,1,21,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,43287.255521,44006.168052,1,90,6,6,1.57,3,3,0,0,0,1,50,2,2,1,2 +65330,7,2,2,0,9,3,3,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8814.114917,8994.318513,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +65331,7,2,2,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16741.034883,16282.872546,2,95,2,2,0.81,1,1,0,0,0,2,54,1,4,5,NA +65332,7,2,1,7,NA,1,1,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14880.007592,15211.324369,3,92,2,2,0.47,3,3,1,1,0,2,33,1,4,5,NA +65333,7,2,2,2,NA,5,6,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,7029.864692,7462.832472,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +65334,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,2,3,NA,2,2,2,2,2,2,2,2,2,2,13676.984152,18290.186018,2,91,2,2,0.75,1,1,0,0,1,2,60,2,2,3,NA +65335,7,2,1,55,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14288.99518,14503.461604,1,102,9,9,2.39,5,5,0,1,1,1,55,2,5,1,5 +65336,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,124037.944076,128061.498173,1,100,15,15,5,4,4,0,1,0,1,50,1,4,1,4 +65337,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,28478.57859,28745.66908,1,98,3,3,1.25,1,1,0,0,1,1,63,1,4,5,NA +65338,7,2,2,22,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16239.242782,17454.103497,2,101,99,1,0.22,3,1,0,0,0,2,22,1,4,5,NA +65339,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,4,6,NA,2,2,2,1,2,2,2,2,2,2,9911.173561,10104.337319,2,92,15,10,5,2,1,0,0,1,2,54,2,5,3,NA +65340,7,2,2,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,71351.478679,72494.161504,2,97,15,15,4.97,5,5,1,0,0,1,48,1,4,1,3 +65341,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,116464.874823,118336.754883,2,94,14,14,5,3,3,0,0,0,1,42,1,5,1,5 +65342,7,2,2,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6306.491784,7047.470907,2,90,5,5,1.08,3,3,1,1,0,2,23,1,2,5,NA +65343,7,2,2,4,NA,3,3,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,40290.055403,42817.035801,1,99,15,15,5,5,5,3,0,0,2,34,1,5,1,5 +65344,7,2,1,60,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,9745.303498,10208.81789,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +65345,7,2,2,1,13,4,4,2,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7734.994032,8078.467013,2,95,1,1,0,4,4,2,1,0,2,27,1,4,5,NA +65346,7,2,2,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18490.479848,18110.536811,2,100,14,14,3.06,5,5,1,0,0,1,50,1,5,1,5 +65347,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,17983.231494,18657.922524,3,91,10,10,3.67,3,3,1,0,0,2,30,2,4,1,4 +65348,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,99120.116925,101722.54619,2,98,15,15,5,3,3,0,1,0,1,56,1,5,1,5 +65349,7,2,1,19,NA,2,2,1,19,231,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,17555.907575,18699.509115,2,93,3,3,0.52,5,5,0,2,0,1,41,2,4,1,4 +65350,7,2,1,6,NA,4,4,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11321.293503,11517.688596,1,98,6,6,1.36,3,3,0,2,0,1,35,1,5,3,NA +65351,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,21171.267805,24852.610883,1,97,5,5,1.79,1,1,0,0,0,1,36,1,3,3,NA +65352,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11240.290931,11199.684593,2,92,12,77,NA,7,2,0,0,2,1,53,2,3,1,3 +65353,7,2,2,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,18490.479848,18110.536811,2,100,15,15,4.97,5,5,0,2,1,2,42,1,5,1,5 +65354,7,2,1,13,NA,3,3,2,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,127790.772987,128099.355719,1,97,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +65355,7,2,1,37,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19799.565045,19517.338151,1,90,5,5,0.74,5,5,0,2,0,2,18,1,4,NA,NA +65356,7,2,1,8,NA,3,3,1,8,103,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24713.905595,26080.214484,1,98,5,5,0.74,5,5,0,3,0,1,35,1,2,6,NA +65357,7,2,2,7,NA,4,4,1,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8504.389189,8822.229593,2,93,5,5,0.74,5,5,1,2,0,2,28,1,2,6,NA +65358,7,2,2,45,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,115926.402585,116948.004168,1,91,10,10,3.8,3,3,0,0,0,1,45,NA,NA,1,4 +65359,7,2,1,14,NA,2,2,2,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25622.388537,25620.13505,1,97,15,15,4.52,6,6,0,4,0,2,41,1,5,1,5 +65360,7,2,2,17,NA,3,3,2,17,205,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,111142.989658,114400.666347,1,95,NA,NA,NA,5,5,0,2,0,2,37,1,3,1,NA +65361,7,2,1,11,NA,4,4,1,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8447.917731,9106.89532,1,102,15,15,5,3,3,0,1,0,1,41,1,5,1,5 +65362,7,2,2,11,NA,2,2,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,15148.721588,15796.67129,2,91,2,2,0.22,4,4,0,3,0,2,45,2,5,4,NA +65363,7,2,1,4,NA,1,1,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,16797.750213,2,98,14,14,3.91,4,4,1,1,0,1,36,2,3,1,5 +65364,7,2,2,8,NA,1,1,2,8,98,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,9872.244853,10294.506103,2,90,6,6,1.15,5,5,0,2,0,2,47,2,1,1,5 +65365,7,2,2,17,NA,4,4,1,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11078.202838,10933.134393,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +65366,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,1,2,2,2,2,2,2,6449.12882,6755.867756,2,93,8,8,2.97,2,2,0,0,1,1,60,2,3,1,3 +65367,7,2,1,10,NA,2,2,2,10,127,NA,NA,2,2,2,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,16281.509392,17100.217351,2,91,4,4,0.43,7,7,0,1,1,1,41,2,1,4,NA +65368,7,2,1,23,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27681.749998,29590.732776,2,98,3,3,0.54,3,3,1,0,0,1,23,1,3,1,2 +65369,7,2,1,3,NA,3,3,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,71085.311148,83293.12191,2,94,14,14,3.36,4,4,2,0,0,1,31,1,3,1,5 +65370,7,2,2,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,112992.533921,121615.449738,1,94,6,6,1.57,3,3,0,1,0,2,28,1,4,1,4 +65371,7,2,1,10,NA,4,4,1,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12552.995979,12770.757918,2,96,4,4,0.65,5,5,0,3,0,1,30,1,4,1,2 +65372,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,4,3,1,2,2,1,2,2,1,2,2,1,27367.658704,37250.756368,1,91,6,6,2.04,2,2,1,0,0,2,31,1,5,4,NA +65373,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,154825.466557,160454.355913,1,91,15,15,5,4,4,0,1,0,1,45,1,5,1,5 +65374,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,32415.779658,36870.322177,2,91,4,4,1.02,2,2,0,0,2,1,80,1,4,1,2 +65375,7,2,2,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,150482.742079,154420.406935,2,98,15,15,5,2,2,0,0,0,2,52,1,3,1,4 +65376,7,1,1,2,24,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,0,2,98,5,5,1.63,2,2,1,0,0,2,31,1,1,3,NA +65377,7,2,1,19,NA,4,4,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13276.485807,13770.209619,1,96,4,4,1.29,2,2,0,0,0,2,48,1,4,3,NA +65378,7,2,2,3,NA,5,6,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5022.237557,1,91,15,15,5,4,4,1,1,0,1,43,2,5,1,5 +65379,7,2,2,12,NA,3,3,1,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39616.634313,40360.331753,2,101,3,3,0.6,3,3,0,2,0,1,39,1,4,4,NA +65380,7,2,2,17,NA,5,6,1,17,205,2,NA,2,2,1,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9884.956101,9995.989819,1,94,99,1,0.32,6,1,0,3,0,2,45,NA,NA,6,NA +65381,7,2,2,9,NA,4,4,1,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9453.111053,10094.338553,1,100,6,6,1.39,4,4,0,3,0,2,29,1,4,5,NA +65382,7,1,1,4,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6946.177172,0,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +65383,7,2,1,15,NA,1,1,2,16,193,NA,NA,2,2,2,9,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,20398.562455,20202.582308,2,94,77,77,NA,3,3,0,1,0,2,42,2,2,6,NA +65384,7,2,2,72,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,20267.042371,20898.557176,2,102,7,7,1.68,5,5,0,0,3,1,70,2,4,1,4 +65385,7,2,2,12,NA,5,6,2,12,149,NA,NA,2,1,99,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11975.458482,12414.350614,1,97,14,14,2.29,7,7,1,2,2,1,40,2,1,1,1 +65386,7,2,1,6,NA,1,1,1,6,83,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,19735.224235,20204.314213,2,102,8,8,2.24,4,4,1,1,0,1,35,2,3,1,1 +65387,7,1,2,34,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,3,3,1,2,2,1,2,2,NA,NA,NA,NA,71034.153987,0,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +65388,7,2,1,33,NA,4,4,2,NA,NA,2,NA,2,1,3,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,23454.081246,24179.640416,1,91,99,99,NA,3,3,1,0,0,1,33,2,5,5,NA +65389,7,2,1,32,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,13593.59406,16516.502952,2,90,77,77,NA,4,3,1,0,0,2,30,2,2,5,NA +65390,7,2,2,2,NA,5,6,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6796.893869,7396.552454,2,93,15,15,5,3,3,1,0,0,1,41,2,5,1,5 +65391,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,11389.795225,13662.741278,2,92,8,8,1.91,5,5,0,2,1,2,47,2,1,1,3 +65392,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,17635.020067,18381.689068,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +65393,7,2,1,78,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,15844.527135,16445.651972,1,101,4,4,1.22,2,2,0,0,2,2,77,1,4,1,3 +65394,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,28175.708676,28476.609384,1,91,4,4,1.7,1,1,0,0,1,2,71,1,4,2,NA +65395,7,2,1,77,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,14537.797299,15440.503889,3,91,2,2,0.83,1,1,0,0,1,1,77,1,5,5,NA +65396,7,2,1,54,NA,5,6,1,NA,NA,2,NA,2,7,4,NA,5,3,NA,1,2,1,1,2,1,1,2,1,NA,12983.367248,13800.313434,2,101,77,77,NA,4,1,0,0,0,1,39,NA,NA,5,NA +65397,7,1,1,65,NA,5,6,NA,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12579.986433,0,1,95,3,3,0.43,4,4,0,1,2,1,65,2,5,1,3 +65398,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,9,NA,4,2,NA,1,2,2,1,2,2,1,1,2,NA,18693.365067,19341.691824,1,92,12,12,NA,1,1,0,0,1,2,80,2,4,2,NA +65399,7,2,1,59,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18753.573091,18839.996658,2,99,15,15,4.34,4,4,0,0,0,1,59,2,4,1,5 +65400,7,2,1,16,NA,1,1,1,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22768.423624,22886.980387,3,92,7,7,1.41,5,5,1,2,0,1,40,1,3,1,4 +65401,7,2,1,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,31291.360507,35666.138476,2,91,4,4,1.4,1,1,0,0,0,1,55,1,4,5,NA +65402,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,99283.360764,105284.943086,1,94,15,15,5,4,3,0,0,1,1,33,1,2,5,NA +65403,7,2,1,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,31291.360507,35666.138476,2,91,3,3,1.16,1,1,0,0,0,1,52,1,1,4,NA +65404,7,2,2,27,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,5,5,2,1,2,2,1,2,2,1,2,2,3,16929.836231,18593.694637,2,101,8,6,2.85,2,1,0,0,0,2,27,2,5,5,NA +65405,7,2,1,17,NA,1,1,1,17,211,2,NA,1,1,NA,12,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,18635.323223,19040.145288,1,103,6,6,1.57,3,3,0,1,0,2,50,2,3,4,NA +65406,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,3,1,0.22,4,1,0,0,0,1,20,1,4,5,NA +65407,7,2,1,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18790.641284,22550.069226,2,100,6,6,0.99,5,5,0,3,0,2,40,1,3,1,3 +65408,7,2,2,19,NA,2,2,2,19,233,2,NA,2,2,4,10,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,12680.621719,14355.413798,2,90,3,3,0.46,5,5,0,2,2,1,75,2,1,1,2 +65409,7,2,1,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7701.757497,8492.447039,2,90,2,2,0.38,4,4,1,2,0,2,32,1,4,5,NA +65410,7,2,2,71,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,2,NA,1,2,1,1,2,2,1,2,1,NA,13838.805939,14318.765975,1,103,15,15,3.7,5,5,0,2,1,1,55,1,5,1,5 +65411,7,2,2,16,NA,5,6,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8391.252153,8615.174176,1,92,8,8,2.3,4,4,0,1,0,2,41,NA,NA,1,3 +65412,7,2,1,41,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18898.73153,19305.900504,1,100,8,8,2.62,3,3,0,1,0,1,41,2,5,1,5 +65413,7,2,2,1,17,2,2,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8214.128831,8731.974448,1,99,8,8,1.91,5,5,2,0,1,2,38,2,4,1,4 +65414,7,2,2,6,NA,5,6,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8290.163782,8692.019106,1,92,15,15,5,4,4,0,2,0,1,55,1,5,1,5 +65415,7,2,2,1,22,3,3,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14349.194039,14956.025029,1,103,6,6,1.11,5,5,1,1,1,1,29,1,3,1,3 +65416,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18088.213601,18580.673153,1,98,12,5,2.15,2,1,0,0,0,1,23,2,5,5,NA +65417,7,2,2,75,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,NA,29145.675285,31446.34406,3,92,10,10,2.82,4,4,0,1,1,1,36,1,3,1,5 +65418,7,2,2,7,NA,4,4,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7282.523598,7776.514874,2,99,6,6,1.11,5,5,0,4,0,2,34,1,4,5,NA +65419,7,2,1,19,NA,3,3,1,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,33505.877646,33253.482687,2,101,5,3,1.1,2,1,0,0,0,1,19,1,4,NA,NA +65420,7,2,2,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,22306.465066,21209.244743,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +65421,7,2,2,70,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,27103.875166,29389.100868,1,95,4,4,0.65,4,4,0,0,1,2,70,1,1,2,NA +65422,7,2,1,7,NA,4,4,1,7,94,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9535.948,10279.797103,2,93,4,4,0.56,5,5,2,1,0,1,27,1,2,6,NA +65423,7,2,1,50,NA,1,1,2,NA,NA,2,NA,2,2,7,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,21506.056514,21429.79108,2,95,6,6,2.24,1,1,0,0,0,1,50,2,1,4,NA +65424,7,2,1,2,NA,5,6,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8821.037035,9893.758146,1,102,15,15,4.59,4,4,1,1,0,1,35,1,5,1,5 +65425,7,2,2,2,NA,5,7,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21940.920626,22868.807624,1,95,6,6,1.15,5,5,2,1,0,1,29,1,4,6,NA +65426,7,2,2,4,NA,3,3,2,4,58,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,40064.649797,41758.993816,1,93,10,10,2.48,5,5,2,1,0,1,40,2,5,1,5 +65427,7,2,2,64,NA,3,3,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,36910.075958,37362.049791,2,97,2,2,0.38,4,4,0,2,2,2,64,2,1,1,NA +65428,7,2,2,8,NA,5,6,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9007.62445,9504.796896,2,102,15,15,3.92,5,5,1,2,0,1,34,2,5,1,5 +65429,7,2,1,17,NA,2,2,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16033.31661,16386.200415,2,90,5,5,0.8,5,5,0,3,0,2,40,2,1,5,NA +65430,7,2,2,34,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,1,2,2,2,2,2,2,2,2,2,2,2,35353.005268,36099.35979,2,94,9,9,2.51,4,4,2,0,0,2,34,2,3,1,3 +65431,7,2,1,73,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,NA,8497.912951,8664.367847,2,100,4,4,1.47,1,1,0,0,1,1,73,1,4,4,NA +65432,7,1,2,70,NA,4,4,NA,NA,NA,2,NA,2,2,6,NA,4,2,NA,1,2,1,1,2,1,NA,NA,NA,NA,12344.929687,0,1,93,2,2,0.78,1,1,0,0,1,2,70,2,4,2,NA +65433,7,2,2,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,34073.955911,34748.968506,2,92,14,14,4.03,4,4,1,1,1,2,30,1,5,4,NA +65434,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,3,15494.204758,16562.601332,2,95,15,15,5,3,3,0,1,0,2,34,2,5,1,NA +65435,7,2,2,4,NA,4,4,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8340.858072,8802.325948,2,103,7,7,1.55,5,5,2,2,0,2,31,1,4,3,NA +65436,7,2,1,28,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15196.92397,16091.373745,2,101,7,3,1.1,3,1,0,0,0,1,21,2,4,5,NA +65437,7,1,1,73,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,14077.240235,0,1,97,5,5,1.84,1,1,0,0,1,1,73,1,4,2,NA +65438,7,2,2,3,NA,4,4,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8833.042831,9629.276723,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +65439,7,2,2,15,NA,2,2,2,15,180,NA,NA,2,1,3,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16189.692833,16766.382859,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +65440,7,2,1,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7380.991723,2,100,8,8,2.67,3,3,0,0,1,1,61,1,3,1,4 +65441,7,2,2,10,NA,3,3,1,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22308.590534,22137.463018,1,95,7,2,0.35,5,4,1,2,0,1,26,1,4,6,NA +65442,7,2,1,2,NA,4,4,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5942.817425,6188.375425,2,97,13,13,NA,6,6,2,2,0,2,24,1,2,6,NA +65443,7,2,2,37,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,1,2,1,2,1,1,2,1,1,2,1,3,17978.142628,18308.053591,1,91,14,14,4.32,3,3,0,2,0,2,37,2,5,1,NA +65444,7,2,1,4,NA,1,1,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12870.245769,13452.024092,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +65445,7,2,1,1,22,2,2,1,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8742.6471,9019.39043,2,100,99,99,NA,6,6,1,1,2,1,37,2,3,1,3 +65446,7,2,1,65,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,8168.47072,10568.054811,2,90,6,6,1.73,2,2,0,0,2,2,69,1,2,1,2 +65447,7,2,1,44,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18841.134943,20530.600583,2,95,14,14,5,2,2,0,0,0,1,44,1,3,1,4 +65448,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10764.448363,1,99,13,13,NA,3,3,0,0,2,1,67,1,2,1,2 +65449,7,2,2,2,NA,4,4,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7630.869112,8210.900286,2,95,6,6,0.97,6,6,2,2,0,1,37,1,3,1,4 +65450,7,2,2,49,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,34954.173075,37266.073044,2,98,6,6,1.21,4,4,1,0,0,2,49,2,2,6,NA +65451,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,87322.7576,94138.522454,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +65452,7,2,2,16,NA,4,4,2,16,203,NA,NA,2,2,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10694.834447,10900.381844,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +65453,7,2,2,67,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,12823.794396,13219.948623,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +65454,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,11329.574648,11407.369464,1,99,10,10,4.76,2,2,1,0,0,2,36,2,5,3,NA +65455,7,2,2,14,NA,3,3,2,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,101168.631125,108085.531312,1,99,6,6,1.52,4,4,0,2,0,2,43,1,3,5,NA +65456,7,2,2,12,NA,1,1,2,13,156,NA,NA,2,2,3,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,16594.391299,17940.930507,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +65457,7,2,1,25,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13367.406737,13987.969236,1,92,15,15,4.44,5,5,0,0,1,1,65,NA,NA,1,5 +65458,7,2,1,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,152458.779794,153888.636628,2,94,15,15,5,2,2,0,0,2,1,63,1,5,1,5 +65459,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,7537.914984,2,95,1,1,0.26,2,2,1,0,0,2,20,1,2,77,NA +65460,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,2,2,NA,2,2,2,1,2,2,1,2,2,1,7608.893707,8232.851326,2,100,5,5,2.11,1,1,0,0,1,2,64,2,2,2,NA +65461,7,2,1,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,23775.734331,24432.76962,2,96,5,5,1.08,3,3,0,0,0,1,50,1,3,1,4 +65462,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,149120.841984,149985.960772,1,98,9,9,5,1,1,0,0,0,2,49,1,5,3,NA +65463,7,2,2,6,NA,4,4,2,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7814.742747,8587.431439,2,95,7,7,1.55,5,5,0,3,0,1,30,1,4,1,4 +65464,7,2,2,29,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,18601.70604,17686.717051,1,90,14,14,2.96,5,5,1,2,0,1,31,1,5,1,4 +65465,7,2,2,7,NA,5,6,1,7,89,NA,NA,2,1,3,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11141.059365,11755.98595,1,98,10,10,1.89,7,7,3,2,0,1,50,1,5,1,5 +65466,7,2,1,7,NA,4,4,1,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12221.817539,12310.445459,2,100,10,10,2.75,5,5,1,1,1,1,27,1,3,1,5 +65467,7,2,1,0,6,5,6,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9148.090461,9086.623516,1,92,6,6,1.47,3,3,1,0,0,2,32,2,3,1,3 +65468,7,2,1,7,NA,4,4,2,7,85,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8655.162127,8808.105516,2,95,4,4,0.65,4,4,1,2,0,2,27,1,3,5,NA +65469,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,180467.973037,1,95,77,77,NA,3,3,0,0,2,1,80,NA,NA,1,NA +65470,7,2,1,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14321.363328,13945.949794,2,96,77,77,NA,7,7,3,2,0,2,33,2,2,6,NA +65471,7,1,2,80,NA,5,6,NA,NA,NA,2,NA,2,2,7,NA,5,2,NA,1,1,1,1,2,1,NA,NA,NA,NA,10831.995402,0,3,90,4,4,0.92,3,3,0,0,1,2,56,2,2,1,2 +65472,7,2,1,3,NA,2,2,1,3,38,NA,NA,2,2,2,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13504.027725,14468.59111,2,93,7,7,1.52,4,4,1,1,0,1,44,2,4,1,NA +65473,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,9015.10987,2,95,2,2,0.81,1,1,0,0,1,2,60,1,2,2,NA +65474,7,2,2,63,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10644.199654,11088.440242,2,98,7,7,2.72,2,2,0,0,2,1,63,1,4,1,4 +65475,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,15520.204559,18173.553405,1,96,15,15,5,6,6,1,1,1,2,44,1,3,1,3 +65476,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,38151.592121,38761.146216,1,101,1,1,0.21,3,3,0,2,0,2,32,1,4,5,NA +65477,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,3,3,NA,1,2,2,1,2,2,1,2,2,2,26609.95229,27262.621072,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +65478,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,9680.216878,10112.428208,1,96,10,10,5,1,1,0,0,1,2,61,1,4,2,NA +65479,7,2,1,51,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21283.272729,21364.140181,1,100,15,15,3.7,5,5,0,3,0,1,51,1,5,1,5 +65480,7,2,1,10,NA,4,4,2,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8988.052978,9133.633722,2,95,8,8,1.85,5,5,1,2,0,1,55,1,2,1,3 +65481,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,12782.405209,13767.697696,1,100,2,2,0.54,1,1,0,0,1,2,62,1,3,2,NA +65482,7,1,1,78,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,81678.388584,0,1,92,9,9,3.97,2,2,0,0,2,2,67,1,3,1,5 +65483,7,1,2,52,NA,3,3,NA,NA,NA,2,NA,2,1,8,NA,5,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,119276.206757,0,1,103,15,15,5,2,2,0,1,0,2,52,2,5,3,NA +65484,7,2,1,1,14,5,7,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6328.720733,6765.026101,1,91,15,15,4.01,5,5,1,2,0,2,34,1,5,1,5 +65485,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,30407.489838,32596.441724,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +65486,7,2,2,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,10346.035773,10598.2543,1,99,7,6,1.84,3,2,0,0,2,1,70,1,2,1,4 +65487,7,2,2,1,18,5,6,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8165.183174,1,97,14,14,4.45,3,3,1,0,0,2,35,2,5,1,5 +65488,7,2,1,38,NA,3,3,2,NA,NA,2,NA,2,1,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15425.274863,16733.462521,1,90,7,7,2.1,3,3,1,0,0,2,40,2,5,1,4 +65489,7,2,1,18,NA,4,4,2,18,216,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10558.572325,11042.564542,2,99,4,4,0.41,7,7,0,2,0,2,36,1,3,5,NA +65490,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,1,1,2,2,1,2,2,NA,NA,NA,NA,22225.098465,28674.927734,2,97,1,1,0.27,2,2,1,0,0,2,20,1,2,5,NA +65491,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,24654.107413,23891.769846,1,100,5,5,0.85,5,5,0,2,0,2,54,1,2,2,NA +65492,7,2,2,65,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,11342.714991,11512.583626,1,99,6,6,1.07,6,6,2,1,2,1,44,2,5,4,NA +65493,7,2,1,9,NA,5,7,2,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9720.482616,10484.39038,2,91,15,15,3.7,5,5,1,2,0,1,50,NA,NA,1,5 +65494,7,2,1,3,NA,3,3,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,88790.489317,95503.197037,2,91,15,15,5,3,3,1,0,0,1,40,1,4,6,NA +65495,7,2,2,5,NA,1,1,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11859.546176,12772.78418,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +65496,7,2,1,5,NA,1,1,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16613.593777,17139.487274,1,92,14,14,3.15,5,5,1,2,0,1,34,1,4,1,4 +65497,7,2,1,42,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,116464.874823,129540.216925,2,94,3,3,0.54,4,4,0,1,0,2,48,1,3,1,3 +65498,7,2,2,39,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,4,2,1,2,2,1,2,2,1,2,2,1,16369.013285,16419.342576,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +65499,7,2,1,19,NA,3,3,2,19,231,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19277.921327,19518.221274,2,97,7,7,1.89,3,3,0,0,0,1,50,1,2,1,2 +65500,7,2,1,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,17787.524589,17931.023329,2,100,8,8,4.82,1,1,0,0,0,1,46,1,3,3,NA +65501,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,53634.754806,54437.113731,1,98,5,1,0,3,1,0,0,0,1,32,1,5,5,NA +65502,7,2,1,1,16,4,4,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9438.902193,9727.203655,2,102,4,4,0.72,4,4,2,0,0,1,48,1,3,1,3 +65503,7,2,2,44,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,1,2,2,2,2,2,2,2,2,2,2,2,33767.584626,34595.8104,2,102,6,4,1.02,6,2,0,4,0,2,43,2,1,5,NA +65504,7,2,1,7,NA,1,1,1,7,86,NA,NA,2,2,2,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13870.762641,14200.45921,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +65505,7,2,1,55,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17839.845235,18404.710221,3,92,15,15,5,3,3,0,1,0,1,55,2,5,1,4 +65506,7,2,1,50,NA,1,1,1,NA,NA,2,NA,99,NA,NA,NA,2,5,NA,2,2,2,1,2,2,1,2,2,2,30839.213846,30386.695922,1,95,4,4,0.68,5,5,0,1,0,2,38,2,3,4,NA +65507,7,2,2,13,NA,2,2,2,13,158,NA,NA,2,1,3,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15442.648697,16179.397194,3,90,4,4,0.63,5,5,0,3,0,1,45,2,4,1,4 +65508,7,2,1,31,NA,2,2,2,NA,NA,1,1,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,32770.630289,33645.258285,2,95,14,14,4.45,3,3,1,0,0,2,29,1,5,1,5 +65509,7,2,2,10,NA,4,4,2,10,130,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9235.947079,9749.775473,1,96,7,7,1.39,5,5,0,2,2,1,69,2,2,1,2 +65510,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,44238.530111,44780.242841,1,95,3,3,0.87,2,2,0,0,2,2,65,1,2,1,3 +65511,7,2,1,7,NA,1,1,1,7,86,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14820.807433,14905.891142,2,102,7,7,1.53,5,5,0,3,0,1,43,2,2,1,4 +65512,7,2,2,39,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,3,1,1,2,2,2,2,2,2,2,2,2,2,35353.005268,38359.582487,2,94,4,4,0.81,3,3,0,1,0,1,49,2,3,1,3 +65513,7,2,1,32,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,47932.213152,49921.729758,1,92,10,10,3.04,4,4,1,1,0,1,32,1,3,1,2 +65514,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,43425.032766,48500.713195,1,96,15,15,5,2,2,0,0,2,2,80,1,5,1,5 +65515,7,2,2,14,NA,4,4,2,14,173,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17185.945299,17434.901758,2,91,2,2,0.26,4,4,0,1,0,1,20,1,3,5,NA +65516,7,2,1,0,9,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,7527.69611,7949.840792,1,92,99,99,NA,5,5,1,0,0,1,46,2,3,1,3 +65517,7,2,2,25,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,4,1,2,1,2,2,1,2,2,2,2,2,2,39426.061521,41875.604468,2,94,8,8,2.7,3,3,1,0,0,1,27,1,3,1,4 +65518,7,2,1,45,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16052.801806,16001.600848,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +65519,7,2,1,13,NA,5,6,2,13,165,NA,NA,2,2,1,6,NA,NA,NA,1,1,1,1,2,1,1,2,1,1,10346.302718,11892.421636,2,91,99,99,NA,7,4,0,4,0,1,36,2,9,1,2 +65520,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,44274.069981,46208.106563,2,101,7,7,2.58,2,2,0,0,0,2,36,1,5,1,3 +65521,7,2,1,17,NA,3,3,1,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26457.098276,26381.28385,2,98,3,3,0.38,5,5,0,4,0,2,39,1,4,5,NA +65522,7,2,2,71,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,1,2,NA,11550.700389,12323.715655,2,93,2,2,0.54,1,1,0,0,1,2,71,1,2,2,NA +65523,7,2,2,11,NA,4,4,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8362.256577,9003.967662,2,100,8,8,1.8,5,5,0,3,0,2,43,1,3,1,3 +65524,7,2,1,63,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,1,1,2,1,2,2,1,2,10596.142548,10856.489537,1,94,7,7,1.48,5,5,0,0,1,2,52,2,1,1,1 +65525,7,2,2,69,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,11224.764345,11466.33634,1,101,5,5,1.84,1,1,0,0,1,2,69,1,5,2,NA +65526,7,2,1,4,NA,4,4,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12032.669734,13267.985975,2,96,6,6,1.48,4,4,1,1,0,2,25,1,4,5,NA +65527,7,2,1,11,NA,4,4,2,11,142,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7730.47951,9212.541007,1,99,7,7,1.53,5,5,0,3,0,1,39,1,3,1,3 +65528,7,2,1,0,0,4,4,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,5360.999096,5929.781839,2,90,8,6,1.46,4,3,1,1,0,2,21,1,5,6,NA +65529,7,2,2,1,18,5,7,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22159.470641,22857.583467,1,95,3,3,0.45,4,4,2,1,0,2,26,1,3,4,NA +65530,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,136880.768184,145646.064425,1,94,5,5,1.04,4,4,1,1,0,1,18,1,2,NA,NA +65531,7,2,1,11,NA,1,1,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11881.117946,11763.87702,1,102,15,15,4.47,4,4,0,2,0,2,30,1,4,1,4 +65532,7,2,1,18,NA,4,4,2,18,224,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11107.552941,11616.709768,2,99,4,4,1,3,3,0,1,0,2,38,1,3,5,NA +65533,7,2,1,4,NA,4,4,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11302.271106,11769.28244,3,92,6,6,0.93,5,5,2,1,0,2,37,1,5,1,3 +65534,7,2,2,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,27381.645976,28428.806364,2,95,15,1,0.18,5,1,0,0,0,1,47,1,5,1,3 +65535,7,2,2,0,10,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8383.207272,8612.693254,1,91,6,6,1.03,5,5,3,0,0,2,37,1,5,6,NA +65536,7,2,2,61,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,15876.871857,17178.834476,2,102,4,4,0.67,4,4,0,0,2,2,20,1,1,NA,NA +65537,7,2,1,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,31707.924183,33437.457992,1,97,3,3,0.73,3,3,0,0,0,2,50,1,4,1,3 +65538,7,2,2,9,NA,3,3,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,47428.012402,47285.525443,2,98,10,10,4.42,2,2,0,1,0,2,41,1,4,3,NA +65539,7,2,1,27,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13367.406737,13987.969236,1,92,15,15,4.44,5,5,0,0,1,1,65,NA,NA,1,5 +65540,7,2,1,9,NA,3,3,1,9,115,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74331.764009,78594.005469,2,91,9,9,2.6,4,4,0,2,0,1,53,1,2,1,5 +65541,7,2,2,9,NA,4,4,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,12444.673315,2,97,7,7,1.72,5,5,1,2,0,1,32,1,4,1,4 +65542,7,2,1,2,NA,3,3,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37959.146468,40828.920669,1,94,15,15,5,3,3,1,0,0,1,35,1,5,1,5 +65543,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,108373.053289,112114.199141,3,92,15,15,5,3,3,0,0,0,1,56,NA,NA,1,4 +65544,7,2,2,19,NA,4,4,2,19,234,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19113.842115,19208.656277,1,97,1,1,0.09,4,4,0,1,0,2,44,2,2,1,3 +65545,7,2,1,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,116462.885745,124577.022727,1,93,15,15,5,2,2,0,0,0,1,28,1,5,6,NA +65546,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,25052.373156,24265.266353,1,92,6,6,1.31,3,3,0,0,1,2,80,1,3,4,NA +65547,7,2,2,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,24832.705563,25238.431199,2,100,2,2,0.73,1,1,0,0,1,2,63,1,4,2,NA +65548,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,99120.116925,103753.216485,2,98,14,14,4.16,3,3,0,0,0,1,49,1,5,1,4 +65549,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,12291.154515,13189.875012,1,92,5,5,1.84,1,1,0,0,1,1,80,1,3,2,NA +65550,7,2,1,31,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,34997.800447,36838.864542,2,96,14,14,3.36,4,4,1,1,0,2,28,1,2,6,NA +65551,7,2,2,8,NA,3,3,2,9,108,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60197.256541,63931.531988,2,94,14,14,2.63,6,6,1,3,0,1,39,1,4,1,4 +65552,7,2,2,13,NA,3,3,1,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,37065.780724,38522.476457,1,98,5,5,0.74,5,5,0,3,0,1,35,1,2,6,NA +65553,7,2,2,42,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,2,4,2,2,2,2,2,2,2,NA,NA,NA,NA,32229.130119,41089.02125,2,90,13,2,0.46,2,1,0,0,1,2,80,NA,NA,77,NA +65554,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,34973.413194,1,95,5,5,1.19,3,3,1,1,0,1,47,1,2,3,NA +65555,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,53634.754806,56026.668478,1,98,5,2,0.45,3,1,0,0,0,1,32,1,5,5,NA +65556,7,2,1,5,NA,4,4,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10234.881417,10547.495238,2,97,2,2,0.33,4,4,2,1,0,2,34,1,2,5,NA +65557,7,2,2,30,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,5,5,2,2,2,2,2,2,2,NA,NA,NA,NA,27973.581456,27218.795462,2,99,99,99,NA,5,3,0,1,0,1,40,2,1,6,NA +65558,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,42489.109693,44345.173355,1,100,14,9,5,2,1,0,0,0,1,37,1,2,6,NA +65559,7,2,1,8,NA,2,2,2,8,101,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,9807.589376,10786.008845,2,90,3,3,0.38,5,5,0,4,0,2,33,2,2,5,NA +65560,7,2,1,4,NA,2,2,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11852.624029,11657.344215,2,99,99,99,NA,3,3,1,0,0,1,35,2,2,1,2 +65561,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,1,2,NA,60148.377616,67408.231176,1,92,8,8,2.17,4,4,0,1,2,2,80,1,3,2,NA +65562,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,9548.871949,9975.218868,2,95,6,6,1.36,3,3,0,1,1,2,62,1,4,5,NA +65563,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,39260.973419,41280.172031,1,91,4,2,0.55,3,1,0,0,0,2,22,1,5,6,NA +65564,7,2,2,36,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,19738.81952,19597.773568,3,90,3,3,0.37,5,5,2,2,0,2,36,2,4,4,NA +65565,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,113500.095101,1,91,15,6,2.69,3,1,0,0,0,1,27,1,3,6,NA +65566,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85444.349063,88741.398785,3,91,8,8,1.95,4,4,2,0,0,2,30,1,5,1,4 +65567,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,32375.321924,34954.784356,1,95,1,1,0.21,4,4,1,0,1,2,75,1,1,2,NA +65568,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,2,2,2,2,1,2,2,NA,NA,NA,NA,45655.090694,44423.220436,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +65569,7,2,2,16,NA,2,2,2,16,197,NA,NA,1,1,NA,9,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,20678.81116,21093.085203,1,93,5,5,0.84,5,5,1,2,0,2,52,2,1,3,NA +65570,7,2,1,16,NA,3,3,2,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,35593.481513,36275.823276,1,91,5,5,1.36,2,2,0,1,0,2,49,1,5,3,NA +65571,7,2,2,74,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,2,NA,1,2,1,1,2,1,1,2,1,NA,13446.397433,14295.858749,1,93,3,3,0.65,3,3,0,0,3,2,74,2,1,2,NA +65572,7,2,2,79,NA,5,6,1,NA,NA,2,NA,2,1,9,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,15984.880532,16163.124545,1,98,9,9,4.92,1,1,0,0,1,2,79,2,5,5,NA +65573,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,22165.906062,22485.884772,1,96,7,7,3.58,1,1,0,0,0,1,44,1,4,3,NA +65574,7,2,1,0,3,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8637.740206,8903.804193,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +65575,7,2,1,28,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,1,2,2,2,35669.2076,38557.984895,2,94,14,4,1.74,5,1,0,0,0,1,24,2,4,5,NA +65576,7,2,2,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,63207.045171,66153.523399,2,102,10,6,2.3,2,1,0,0,0,2,27,1,4,6,NA +65577,7,2,1,54,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15044.515884,15040.577827,3,90,15,15,5,3,3,0,0,0,2,55,2,4,1,4 +65578,7,2,2,1,18,1,1,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11901.705423,12408.80856,2,102,8,8,1.91,5,5,1,2,0,1,36,2,1,1,4 +65579,7,2,2,3,NA,5,6,2,3,47,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5380.83825,5375.15484,2,95,15,15,5,3,3,1,0,0,1,53,1,5,1,2 +65580,7,2,2,19,NA,2,2,1,19,233,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17338.975742,19021.185309,2,93,8,8,2.49,3,3,0,0,0,1,52,2,2,1,4 +65581,7,2,1,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,28542.421068,31101.791288,2,101,7,7,2.58,2,2,0,0,0,2,36,1,5,1,3 +65582,7,2,2,7,NA,5,6,2,7,95,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5481.728631,5853.665419,1,91,15,15,5,6,6,0,2,2,1,50,2,5,1,5 +65583,7,2,2,16,NA,4,4,2,16,202,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10694.834447,10849.760352,1,90,9,9,1.65,7,7,0,4,0,1,36,1,4,1,4 +65584,7,2,1,11,NA,4,4,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.422451,8987.382625,1,99,6,6,2.18,2,2,0,1,0,2,31,1,4,5,NA +65585,7,2,2,49,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,3,21956.01693,22136.94803,2,91,8,8,2.34,4,4,0,2,0,1,56,2,5,1,5 +65586,7,2,2,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,32501.623429,34582.098932,2,97,3,3,0.46,5,5,0,3,0,1,40,1,2,1,3 +65587,7,2,1,78,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,62466.132707,66344.89016,1,94,6,6,1.91,2,2,0,0,2,1,78,1,4,1,3 +65588,7,2,2,15,NA,3,3,2,15,184,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74165.041171,75130.242541,2,94,10,10,3.51,3,3,0,2,0,2,39,2,4,3,NA +65589,7,2,1,69,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,2,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,10288.337394,10907.668198,3,91,14,4,1.02,6,2,0,0,2,1,48,2,1,1,1 +65590,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,18795.138328,22008.372948,2,93,9,9,2.07,5,5,0,1,0,1,55,NA,NA,5,NA +65591,7,2,2,5,NA,2,2,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11429.37307,11583.084593,2,90,15,15,5,4,4,1,1,0,1,49,1,4,1,4 +65592,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,26010.201422,30173.312639,2,95,3,3,1.21,1,1,0,0,1,2,80,1,2,2,NA +65593,7,2,2,51,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,2,2,2,2,20178.078974,20795.430208,2,100,14,14,3.58,4,4,0,1,0,1,46,2,5,1,5 +65594,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10604.379638,1,99,4,4,1.74,1,1,0,0,1,2,60,1,3,4,NA +65595,7,1,2,66,NA,2,2,NA,NA,NA,2,NA,2,2,4,NA,4,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,10235.0654,0,2,93,6,6,1.3,4,4,0,0,2,2,36,2,4,1,4 +65596,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11896.060838,12427.20723,1,96,15,15,5,2,2,0,0,2,1,61,1,5,1,5 +65597,7,2,2,19,NA,4,4,1,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,2,2,0.46,1,1,0,0,0,2,19,1,4,NA,NA +65598,7,1,1,53,NA,3,3,NA,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20980.882737,0,2,93,6,6,1.48,4,4,0,1,0,1,53,2,2,1,3 +65599,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12127.194143,12676.977658,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +65600,7,2,2,19,NA,1,1,2,19,232,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20937.26435,21936.153747,1,90,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +65601,7,2,1,15,NA,4,4,2,15,190,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13366.904548,14267.035861,1,93,7,7,1.79,4,4,0,2,0,1,53,2,4,1,4 +65602,7,2,1,19,NA,4,4,2,20,NA,2,NA,2,2,3,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12548.434193,12514.39179,2,99,3,1,0.31,4,1,0,0,0,1,19,2,4,NA,NA +65603,7,2,2,63,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,1,1,2,1,NA,13656.521422,13861.04165,1,91,4,4,1.33,2,2,0,0,2,1,65,2,4,1,3 +65604,7,2,1,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9668.679611,9969.996889,1,102,15,15,3.82,5,5,1,1,0,1,29,1,4,1,4 +65605,7,2,1,68,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10274.998921,11619.264446,1,91,8,8,3.57,2,2,0,0,2,1,68,1,3,1,2 +65606,7,2,2,48,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,18215.139307,19150.911381,1,91,77,77,NA,4,4,0,2,0,1,50,2,5,1,5 +65607,7,2,2,5,NA,4,4,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8873.727797,9364.677323,2,99,5,5,0.78,5,5,2,2,0,2,30,1,3,5,NA +65608,7,2,1,5,NA,2,2,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15745.774489,16244.197679,2,91,4,4,0.67,5,4,2,0,2,2,66,2,1,1,NA +65609,7,2,2,1,19,3,3,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25257.21318,27876.153487,1,101,7,7,1.82,4,4,2,0,0,2,27,1,2,1,3 +65610,7,2,1,9,NA,4,4,1,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8714.559478,8865.734494,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +65611,7,2,2,19,NA,2,2,2,19,232,2,NA,2,2,3,12,NA,NA,NA,2,2,2,2,2,2,1,2,2,2,12680.621719,13709.581084,2,90,99,99,NA,5,5,1,1,0,2,40,2,3,1,1 +65612,7,2,1,5,NA,4,4,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,7991.632447,8596.395387,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +65613,7,2,2,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,122472.877524,125201.399718,2,94,15,15,5,3,3,0,1,1,1,63,1,5,1,3 +65614,7,2,2,10,NA,1,1,1,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15859.146626,16025.878294,1,92,1,1,0,3,1,0,2,0,2,43,1,2,4,NA +65615,7,1,1,80,NA,3,3,NA,NA,NA,2,NA,2,1,9,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,38666.703155,0,2,94,2,2,0.81,1,1,0,0,1,1,80,2,1,2,NA +65616,7,2,1,0,3,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9570.577309,9932.368407,1,95,6,6,1,6,6,3,0,0,2,23,1,4,6,NA +65617,7,2,1,41,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21571.318341,21852.480517,1,102,15,15,5,3,3,0,1,0,1,41,1,5,1,5 +65618,7,2,2,2,NA,2,2,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9955.153132,10990.75621,2,94,9,9,2.51,4,4,2,0,0,2,34,2,3,1,3 +65619,7,2,1,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,50647.682308,53126.874664,2,96,8,8,3.67,2,2,0,0,0,1,58,1,3,3,NA +65620,7,2,2,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,110849.032294,115406.960266,2,92,14,6,2.75,2,1,0,0,0,2,25,1,5,5,NA +65621,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,8748.603912,9090.779024,1,96,14,14,5,2,2,0,0,2,2,61,1,3,1,3 +65622,7,2,1,7,NA,4,4,1,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15130.588085,15393.064565,2,102,15,15,3.82,5,5,1,2,0,1,34,1,3,1,4 +65623,7,2,2,25,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18626.118419,17709.928623,1,93,15,15,5,5,5,0,1,0,2,25,1,5,5,NA +65624,7,2,2,11,NA,4,4,1,11,135,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,12444.673315,2,97,7,7,1.72,5,5,1,2,0,1,32,1,4,1,4 +65625,7,2,1,23,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14690.01297,15450.354874,3,91,2,2,0.73,1,1,0,0,0,1,23,1,5,5,NA +65626,7,2,1,11,NA,4,4,2,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8017.552697,8398.795399,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +65627,7,2,1,16,NA,4,4,2,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15970.206483,16086.518081,2,97,2,2,0.3,4,4,0,2,0,1,42,1,2,6,NA +65628,7,2,1,56,NA,1,1,2,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,25381.488007,25009.053797,2,99,6,6,2.33,1,1,0,0,0,1,56,1,4,2,NA +65629,7,2,2,51,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,2,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,13281.538492,13864.580434,3,90,5,5,1.05,3,3,0,0,0,1,53,2,1,1,2 +65630,7,2,1,4,NA,1,1,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16214.341036,15789.305867,1,98,9,9,2,7,6,3,2,0,2,32,1,4,1,4 +65631,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17014.040717,2,97,2,2,0.49,2,2,0,0,0,1,24,1,4,6,NA +65632,7,2,2,42,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,34639.996543,35471.414202,1,102,7,7,1.7,4,4,0,0,2,1,44,1,4,4,NA +65633,7,2,1,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,31699.998102,36617.55692,1,98,1,1,0.04,1,1,0,0,0,1,57,1,4,5,NA +65634,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,9113.905743,9695.883475,3,90,15,15,5,5,5,0,1,1,2,61,1,5,2,NA +65635,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,22225.098465,22243.480978,2,97,4,4,0.81,4,4,1,1,0,2,51,1,3,4,NA +65636,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,19323.414782,18794.578845,2,91,15,15,5,4,4,0,0,1,1,61,NA,NA,1,2 +65637,7,2,1,66,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,6358.062034,6283.458155,1,99,7,7,3.49,1,1,0,0,1,1,66,1,4,3,NA +65638,7,2,1,12,NA,5,7,2,12,153,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21852.102821,22875.024578,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +65639,7,1,2,14,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,91539.042546,0,1,101,15,15,5,4,4,0,2,0,2,40,1,4,1,3 +65640,7,2,2,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,12751.545122,13835.806616,2,101,1,1,0.08,2,2,0,0,2,2,80,1,1,2,NA +65641,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,74517.751389,83352.706958,2,94,5,5,0.89,4,4,0,2,0,2,51,1,2,3,NA +65642,7,2,2,41,NA,3,3,2,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,96255.674553,98150.909956,2,94,14,14,5,3,3,0,0,0,1,42,1,5,1,5 +65643,7,2,2,38,NA,3,3,2,NA,NA,2,NA,2,2,4,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,95214.22557,102645.939709,1,97,15,15,5,5,4,1,1,0,2,38,NA,NA,1,5 +65644,7,2,2,19,NA,4,4,2,19,233,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18905.695776,2,101,1,1,0.23,2,1,0,0,0,2,19,1,3,NA,NA +65645,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,38666.703155,42427.769217,2,91,7,7,1.61,4,4,0,0,3,1,65,1,3,6,NA +65646,7,2,1,8,NA,3,3,1,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18596.465852,19407.799286,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +65647,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,52701.331723,59294.433957,1,94,5,5,1.04,4,4,0,2,0,2,29,1,3,1,3 +65648,7,2,1,61,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7101.739553,7379.502561,2,100,4,4,1.74,1,1,0,0,1,1,61,1,3,3,NA +65649,7,2,2,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,26428.874559,27145.22781,2,99,14,14,4.09,3,3,0,2,0,2,37,1,5,5,NA +65650,7,2,2,79,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,20101.581228,20798.747999,3,92,77,77,NA,1,1,0,0,1,2,79,1,4,2,NA +65651,7,2,1,6,NA,5,7,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7923.925927,8546.646915,1,91,15,15,5,5,5,0,3,0,1,40,1,5,1,5 +65652,7,1,2,1,20,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24749.659974,0,1,94,1,1,0.08,7,7,2,4,0,1,31,1,2,1,4 +65653,7,2,2,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,33506.462855,33906.169633,2,96,4,4,0.65,5,5,0,3,0,1,30,1,4,1,2 +65654,7,2,1,10,NA,5,6,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6850.601671,7624.777305,3,91,6,6,1.34,4,4,0,2,0,1,52,2,3,1,1 +65655,7,2,2,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16741.034883,16786.385595,2,95,12,12,NA,3,3,0,0,0,2,29,2,5,5,NA +65656,7,2,2,2,NA,3,3,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,45341.612978,50043.120503,3,91,14,14,5,3,3,1,0,0,2,30,1,4,1,5 +65657,7,2,1,15,NA,1,1,1,16,192,NA,NA,1,1,NA,9,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,29234.272259,28953.402615,2,98,7,7,2.25,3,3,0,1,0,2,51,2,1,1,1 +65658,7,2,2,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,29448.834066,28780.798614,1,97,9,9,4.92,1,1,0,0,0,2,49,1,5,5,NA +65659,7,2,2,71,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,12344.929687,13268.288363,1,93,2,2,0.74,1,1,0,0,1,2,71,2,2,2,NA +65660,7,2,2,73,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,36122.708948,47794.076653,1,97,2,2,0.75,1,1,0,0,1,2,73,2,2,2,NA +65661,7,2,2,38,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,3,3,2,2,2,2,1,2,2,2,2,2,2,35678.162793,37949.435224,2,99,3,3,0.52,3,3,0,0,1,2,38,2,3,3,NA +65662,7,2,2,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,33506.462855,35016.985063,2,96,6,6,1.62,3,3,0,2,0,2,31,1,3,5,NA +65663,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,3,1,2,2,1,2,2,1,2,2,1,52701.331723,53172.517558,1,94,5,5,0.74,5,5,1,1,0,2,24,1,3,1,4 +65664,7,2,2,13,NA,3,3,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71837.483011,75155.181458,1,94,15,15,5,3,3,0,1,0,2,43,1,5,1,5 +65665,7,2,1,19,NA,1,1,1,19,233,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15626.107676,15463.700675,2,93,9,9,1.94,6,6,0,3,0,2,37,NA,NA,3,NA +65666,7,2,2,3,NA,2,2,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16648.051651,2,98,8,8,1.48,7,7,3,0,0,1,26,1,3,1,3 +65667,7,2,1,8,NA,4,4,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10410.106675,10534.907593,2,96,6,6,1.32,5,5,1,3,0,2,30,1,4,3,NA +65668,7,2,2,8,NA,5,7,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11541.681354,12101.149927,1,92,15,15,5,4,4,0,2,0,1,41,2,5,1,5 +65669,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,159007.057971,1,95,14,8,4.41,2,1,0,0,0,1,47,1,4,3,NA +65670,7,2,1,13,NA,1,1,1,14,169,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,17424.208904,17520.505085,1,102,5,5,0.92,5,5,0,3,0,2,39,2,3,1,3 +65671,7,2,2,2,NA,4,4,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7444.013422,7636.156038,1,90,5,5,1.32,2,2,1,0,0,2,27,2,3,5,NA +65672,7,2,2,22,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,33292.204257,2,101,3,3,0.92,1,1,0,0,0,2,22,1,4,5,NA +65673,7,2,1,2,NA,3,3,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24594.444896,28818.16319,1,98,1,1,0.16,3,3,1,0,0,1,28,1,2,6,NA +65674,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,17285.492411,17948.070756,1,102,7,7,1.8,5,4,1,0,2,1,47,1,3,5,NA +65675,7,2,1,66,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11568.876339,11794.347884,1,102,10,10,4.42,2,2,0,0,2,2,62,1,5,1,4 +65676,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,75000.659691,1,98,9,9,2.6,4,4,1,1,0,2,35,1,2,1,NA +65677,7,2,2,4,NA,1,1,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,2,NA,2,2,2,2,NA,NA,NA,NA,13193.876261,13756.035699,3,91,7,7,1.23,6,6,2,2,0,1,36,2,1,1,1 +65678,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,12697.263698,13996.985089,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +65679,7,2,1,69,NA,5,7,2,NA,NA,2,NA,2,1,7,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,10298.198778,10826.998489,1,95,2,2,0.72,1,1,0,0,1,1,69,2,4,3,NA +65680,7,2,2,44,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16162.24986,16822.942152,3,91,15,15,5,3,3,0,1,0,2,44,2,5,1,5 +65681,7,2,2,4,NA,1,1,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16462.187772,17163.602129,3,92,8,8,1.55,6,6,1,3,0,2,38,1,5,1,4 +65682,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,143785.115498,143265.966876,1,99,10,10,5,1,1,0,0,0,2,57,1,5,3,NA +65683,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,1,1,2,2,1,7879.750437,7851.284287,2,92,10,8,2.01,7,4,1,1,1,2,27,2,3,1,3 +65684,7,2,1,14,NA,1,1,1,14,179,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18242.832494,18343.652859,1,102,2,2,0.52,3,3,0,2,0,2,36,2,3,4,NA +65685,7,2,2,29,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,51746.15111,54067.303468,1,95,8,8,2.24,4,4,2,0,0,2,29,1,3,1,4 +65686,7,2,2,9,NA,4,4,1,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10085.683644,10404.203071,2,102,6,6,1.22,5,5,0,2,0,2,42,1,4,1,4 +65687,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,23128.736624,23721.941544,2,101,2,2,0.79,1,1,0,0,0,2,55,1,2,3,NA +65688,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,187291.098551,186266.152024,2,91,15,15,5,3,3,0,0,0,2,54,1,4,1,4 +65689,7,2,1,19,NA,4,4,2,19,234,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13969.457688,14694.403205,1,90,6,6,1.57,3,3,0,1,0,2,36,1,3,5,NA +65690,7,2,1,16,NA,3,3,2,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,107087.58296,107224.801212,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +65691,7,2,2,16,NA,5,6,1,16,199,NA,NA,2,2,2,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8391.252153,8753.945484,1,92,12,12,NA,7,7,1,2,1,2,45,2,3,1,3 +65692,7,2,1,14,NA,3,3,2,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26824.630008,26472.092796,1,95,6,6,1.3,4,4,0,3,0,2,46,1,4,3,NA +65693,7,2,1,7,NA,3,3,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,66868.503099,69864.859716,1,98,15,15,5,4,4,1,1,0,1,40,1,4,1,5 +65694,7,2,2,5,NA,2,2,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13366.393396,14756.857003,2,94,9,9,2.51,4,4,2,0,0,2,34,2,3,1,3 +65695,7,1,1,9,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8943.919305,0,1,92,5,5,0.63,7,7,0,4,1,1,60,NA,NA,1,NA +65696,7,2,2,8,NA,4,4,2,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6996.144083,7533.021082,2,99,5,5,0.78,5,5,2,2,0,2,30,1,3,5,NA +65697,7,2,1,16,NA,3,3,2,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26749.020961,27839.957403,1,101,6,6,1.21,4,4,0,2,0,2,33,1,2,6,NA +65698,7,2,1,8,NA,4,4,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11094.855304,11787.231447,1,90,7,7,2.1,3,3,0,1,0,1,35,1,3,6,NA +65699,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,154000.877343,1,94,6,6,2.24,1,1,0,0,0,1,50,1,3,3,NA +65700,7,2,2,18,NA,4,4,1,18,220,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14166.687432,14623.20249,1,100,13,13,NA,5,5,2,0,0,2,54,1,4,5,NA +65701,7,2,2,17,NA,4,4,2,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +65702,7,2,2,62,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,10999.00871,11458.057418,3,92,7,7,1.49,5,5,0,2,1,2,62,1,4,2,NA +65703,7,2,2,29,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,39426.061521,39893.228552,3,92,8,8,2.01,4,4,1,0,0,2,49,2,5,4,NA +65704,7,2,2,7,NA,3,3,2,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,82043.921571,82230.595899,1,97,14,14,3.9,4,4,0,2,0,1,47,1,3,1,5 +65705,7,2,2,63,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,15207.312407,15975.329738,1,92,4,4,0.99,2,2,0,0,1,1,26,1,1,5,NA +65706,7,2,2,11,NA,3,3,2,11,143,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,24097.958076,1,95,6,3,0.45,6,4,1,2,0,1,28,1,2,1,2 +65707,7,2,1,75,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,62703.997496,73870.695024,1,94,10,10,3.04,4,4,0,0,2,1,75,1,3,1,3 +65708,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35334.703093,40990.264786,1,101,3,3,1.25,1,1,0,0,1,2,80,1,2,2,NA +65709,7,2,2,17,NA,3,3,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,97212.131473,101229.4133,1,91,14,14,3.8,4,4,0,2,0,1,50,NA,NA,1,5 +65710,7,2,2,17,NA,4,4,2,17,210,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11608.900361,11982.991894,1,99,8,8,2.59,3,3,0,2,0,2,46,1,4,2,NA +65711,7,2,1,46,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11113.602843,11073.454175,3,90,77,77,NA,5,5,0,2,0,1,46,2,3,1,3 +65712,7,2,1,75,NA,2,2,2,NA,NA,1,1,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,14090.083482,14599.284236,2,90,6,6,2.24,2,2,0,0,2,1,75,2,4,1,2 +65713,7,2,1,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,14078.198261,14841.449973,1,91,1,1,0.05,2,1,0,0,2,1,72,1,1,3,NA +65714,7,2,1,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,64271.597433,68262.462992,1,94,15,15,4.95,4,4,0,0,2,1,72,1,3,1,3 +65715,7,2,1,12,NA,5,7,2,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60818.973858,62775.825513,1,99,15,15,5,4,4,0,2,0,2,44,1,5,1,5 +65716,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,42559.487719,42454.393427,1,98,6,6,1.57,3,3,0,0,0,1,58,1,3,1,3 +65717,7,2,1,10,NA,4,4,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11443.206518,12087.326286,1,100,13,13,NA,3,3,0,1,0,2,52,2,3,1,NA +65718,7,2,2,11,NA,5,7,2,11,137,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9227.090107,9736.375878,2,100,15,15,4.83,4,4,1,1,0,1,43,2,5,1,5 +65719,7,2,1,68,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,2,1,NA,1,2,2,1,2,2,1,2,2,3,11145.558675,12081.671552,2,96,4,4,0.92,3,3,0,1,1,2,41,2,2,1,2 +65720,7,2,1,5,NA,2,2,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12403.412256,13289.361067,2,90,6,6,1.62,3,3,1,0,0,2,28,1,5,1,4 +65721,7,2,2,6,NA,1,1,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14538.945634,14691.797657,2,92,8,8,1.42,7,7,0,4,0,2,37,1,1,6,NA +65722,7,2,2,39,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,37237.570046,37476.359157,2,97,4,1,0,2,1,0,0,0,1,41,1,2,6,NA +65723,7,1,1,73,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15200.416613,0,1,98,4,4,1.19,2,2,0,0,2,2,72,1,3,1,4 +65724,7,1,2,4,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,13366.393396,0,2,94,14,7,2.72,3,2,1,0,0,1,25,2,3,6,NA +65725,7,2,2,8,NA,3,3,2,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,70999.269152,75403.63644,1,93,15,15,5,4,4,0,2,0,1,51,1,3,1,5 +65726,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15196.92397,16091.373745,2,101,7,3,1.1,3,1,0,0,0,1,21,2,4,5,NA +65727,7,2,2,3,NA,1,1,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16432.24332,3,92,7,7,1.41,5,5,1,2,0,1,40,1,3,1,4 +65728,7,2,2,0,1,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4581.358327,5045.31579,2,101,4,4,0.85,4,4,1,0,1,2,61,1,4,3,NA +65729,7,2,1,9,NA,3,3,1,9,113,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23188.935049,25672.571973,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +65730,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16181.169973,16457.814273,2,100,14,14,4.86,3,3,0,0,0,2,52,1,5,1,3 +65731,7,2,1,17,NA,2,2,1,17,208,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18206.126374,18306.74388,2,93,4,4,0.84,3,3,0,1,0,2,46,2,3,1,2 +65732,7,2,1,2,NA,1,1,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10803.555682,10625.559962,2,94,6,6,1.32,4,4,2,0,0,1,29,1,3,1,3 +65733,7,1,2,29,NA,5,6,NA,NA,NA,2,NA,2,2,2,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,12636.996393,0,3,90,12,12,NA,3,3,0,0,0,2,29,2,5,1,5 +65734,7,2,2,14,NA,4,4,2,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13841.239638,13875.328502,1,96,15,15,4.52,6,6,0,4,0,1,46,1,4,1,4 +65735,7,2,2,69,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,2,NA,2,2,2,1,2,2,1,2,2,1,9104.567599,9484.550932,2,93,6,6,2.69,1,1,0,0,1,2,69,2,4,2,NA +65736,7,2,1,71,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,2,1,2,1,NA,16439.475505,17615.98168,1,100,5,5,1.18,3,3,0,0,2,2,34,2,5,5,NA +65737,7,2,2,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,33274.645943,34015.957912,2,95,14,14,3.34,4,4,0,0,0,1,43,1,3,1,3 +65738,7,2,1,35,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18025.279948,19114.89054,1,97,4,3,0.93,3,2,0,0,0,1,35,1,3,1,4 +65739,7,2,1,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,58205.324383,61609.052582,2,98,8,8,3.06,2,2,0,0,2,1,71,1,4,1,3 +65740,7,2,1,68,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10098.443227,10212.20306,1,102,9,9,5,1,1,0,0,1,1,68,1,4,3,NA +65741,7,2,1,26,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,1,2,2,2,38560.502118,39812.43256,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +65742,7,2,1,30,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,3,5,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,35069.154585,2,94,15,15,5,3,3,0,0,0,1,41,2,3,1,NA +65743,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,25569.682712,26728.878308,1,97,15,15,5,4,4,0,1,0,1,40,1,4,1,4 +65744,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,54095.581484,0,2,94,77,77,NA,2,2,0,0,2,2,80,1,5,1,5 +65745,7,2,1,27,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,69082.166945,70155.790389,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +65746,7,2,1,19,NA,3,3,1,19,234,2,NA,2,1,4,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,103364.662244,103614.262032,1,98,3,1,0.09,4,1,0,0,0,1,20,1,4,5,NA +65747,7,2,2,6,NA,4,4,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7646.649777,8233.445923,2,99,3,3,0.52,3,3,0,1,0,2,23,1,3,1,3 +65748,7,2,1,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,7907.095293,7814.315452,2,97,5,5,1.3,3,3,0,1,1,1,64,1,4,3,NA +65749,7,2,2,2,NA,2,2,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9534.013652,9566.569071,2,97,12,6,0.89,7,7,3,0,0,2,26,2,1,6,NA +65750,7,2,1,14,NA,3,3,1,14,173,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,79147.85144,78921.048453,1,98,15,15,5,5,5,0,3,0,2,44,1,5,1,5 +65751,7,2,1,54,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,3,1,NA,2,2,2,1,2,2,2,2,2,2,22446.308035,22366.708253,2,94,1,1,0.03,2,2,0,0,0,2,48,2,1,1,3 +65752,7,2,1,21,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15564.966804,2,101,6,99,NA,2,1,0,0,0,1,20,2,4,5,NA +65753,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,27738.890335,33497.780693,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +65754,7,2,2,50,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,5,NA,2,2,2,1,2,2,1,2,2,2,28701.155283,32172.514581,3,92,13,13,NA,4,4,0,2,0,2,50,2,1,5,NA +65755,7,1,2,64,NA,1,1,NA,NA,NA,2,NA,2,2,4,NA,1,2,NA,2,2,2,NA,NA,NA,NA,NA,NA,NA,16352.915834,0,3,92,NA,NA,NA,5,5,2,1,1,2,64,2,1,2,NA +65756,7,1,1,12,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7964.334824,0,1,95,6,6,1.34,4,4,0,2,0,2,32,2,3,2,NA +65757,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,21857.756498,21879.219845,2,97,9,9,1.45,7,7,1,2,2,2,45,1,3,5,NA +65758,7,2,2,67,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,12403.522912,13236.989116,1,93,3,3,0.65,3,3,0,0,3,2,74,2,1,2,NA +65759,7,2,1,11,NA,3,3,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53915.042746,57006.573447,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +65760,7,2,1,41,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,37402.70356,37784.383858,2,102,14,14,3.8,4,4,2,0,0,2,41,2,4,1,5 +65761,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,67671.21344,73410.277865,3,90,15,15,5,3,3,1,0,0,1,31,1,5,1,5 +65762,7,2,2,11,NA,5,6,2,11,140,NA,NA,2,2,2,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6834.715094,7298.452383,2,90,3,1,0,5,1,1,2,0,1,44,2,5,1,5 +65763,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8949.073879,2,95,6,6,2.69,1,1,0,0,1,2,68,1,3,2,NA +65764,7,2,2,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,63767.913736,65948.76781,1,94,6,6,1.91,2,2,0,0,2,1,78,1,4,1,3 +65765,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,128575.977224,134245.696628,1,102,6,4,1.42,2,1,0,0,0,2,23,1,5,5,NA +65766,7,1,2,67,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,36706.470429,0,1,103,3,3,0.98,1,1,0,0,1,2,67,1,5,4,NA +65767,7,2,1,1,12,3,3,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,40111.361732,44385.174851,1,98,7,7,1.48,5,5,1,1,0,1,46,1,3,1,3 +65768,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,38954.135779,39992.589933,1,91,5,5,1.3,3,3,0,1,0,2,50,1,4,2,NA +65769,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,15051.024912,14836.484643,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +65770,7,2,1,40,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,37402.70356,40836.297693,2,102,7,7,1.79,4,4,0,2,0,1,40,2,2,6,NA +65771,7,2,1,55,NA,5,7,1,NA,NA,1,2,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16575.817424,16910.393297,1,94,8,8,2.97,2,2,0,0,1,2,74,2,3,1,4 +65772,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,20131.904783,20903.590301,1,92,6,6,1.31,3,3,0,0,1,2,80,1,3,4,NA +65773,7,2,1,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22937.913723,23181.846174,1,100,14,14,3.47,4,4,2,0,0,1,34,1,5,1,5 +65774,7,2,1,24,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,37911.437415,38428.199561,2,103,6,6,1.98,2,2,0,0,0,1,24,1,2,6,NA +65775,7,2,2,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,18494.181242,18934.264494,2,99,9,9,2.43,4,4,0,2,0,2,49,1,3,3,NA +65776,7,2,1,2,NA,4,4,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5853.073657,6453.970807,2,95,2,2,0.41,3,3,2,0,0,2,19,1,2,NA,NA +65777,7,2,2,11,NA,4,4,2,12,144,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6655.097829,7106.52929,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +65778,7,2,1,11,NA,4,4,2,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,14179.490667,2,101,13,3,0.64,5,4,0,3,1,2,62,1,1,2,NA +65779,7,2,2,2,NA,5,7,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8579.211947,8800.655964,1,97,9,9,2.6,4,4,1,1,0,2,45,1,4,1,4 +65780,7,2,2,7,NA,3,3,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24070.467912,25563.654853,1,95,10,6,1.34,5,4,1,2,0,1,32,1,3,6,NA +65781,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,15091.588227,15171.391678,1,93,6,6,1.15,5,5,1,0,2,2,70,NA,NA,1,NA +65782,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22565.644629,22012.541181,1,97,15,15,5,6,6,0,1,1,2,53,1,4,1,NA +65783,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,124820.027137,131239.54259,1,91,10,10,3.78,3,3,0,0,2,1,62,1,5,1,5 +65784,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,17622.141982,17298.28124,2,95,7,7,2.58,2,2,0,0,0,2,57,1,4,3,NA +65785,7,2,1,0,8,1,1,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,2,NA,2,2,2,2,NA,NA,NA,NA,6217.36354,6396.366428,3,91,7,7,1.23,6,6,2,2,0,1,36,2,1,1,1 +65786,7,2,1,8,NA,3,3,1,8,104,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49922.147265,51884.389986,1,98,7,7,1.66,5,5,2,1,0,2,37,1,5,1,3 +65787,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,86986.68246,91060.136414,2,94,7,7,2.38,2,2,0,1,0,1,39,1,4,3,NA +65788,7,2,2,5,NA,5,6,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7143.995395,7265.801592,3,91,15,15,5,4,4,1,1,0,1,40,2,5,1,5 +65789,7,2,1,5,NA,4,4,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7430.518669,8193.361877,2,99,1,1,0.07,4,4,1,1,0,2,24,1,2,5,NA +65790,7,2,2,5,NA,2,2,2,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11429.37307,11793.034101,2,90,2,2,0.49,3,3,2,0,0,2,26,1,4,1,NA +65791,7,2,1,24,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19775.099106,19464.255682,1,96,15,15,5,3,3,0,0,0,1,55,1,4,1,5 +65792,7,2,1,0,6,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6999.189812,6930.018579,3,92,4,4,0.43,7,7,2,2,0,2,36,1,2,6,NA +65793,7,2,2,16,NA,3,3,2,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25543.162298,26253.778018,2,95,6,6,1.19,4,4,0,1,0,1,44,1,3,1,2 +65794,7,2,1,9,NA,5,6,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5062.43381,5485.75338,3,91,6,6,1.22,5,5,1,2,0,2,37,1,4,1,2 +65795,7,2,1,9,NA,4,4,1,9,111,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14792.384662,15048.994189,2,102,5,3,0.63,5,4,2,1,0,1,24,1,4,6,NA +65796,7,2,1,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,28479.463721,2,101,1,1,0.1,2,2,0,0,0,1,56,1,3,6,NA +65797,7,2,2,52,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19735.328357,19287.640039,1,90,8,8,4.48,1,1,0,0,0,2,52,2,4,3,NA +65798,7,2,2,26,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,3,1,2,1,2,2,2,2,2,1,2,2,1,42621.881199,43251.535191,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +65799,7,2,1,21,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15572.117537,16108.231355,2,94,15,15,4.44,5,5,0,1,1,2,74,1,5,2,NA +65800,7,2,2,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,153418.292529,156457.542801,1,92,15,15,5,3,3,0,0,2,2,61,1,5,1,5 +65801,7,2,2,9,NA,4,4,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.490652,8919.477637,2,97,6,6,1,6,6,1,2,2,2,60,1,2,2,NA +65802,7,1,2,9,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7710.907339,0,2,99,6,6,0.94,7,7,0,4,0,2,32,1,3,1,3 +65803,7,2,2,15,NA,3,3,2,15,189,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38400.791741,41869.717003,1,95,7,7,1.66,5,5,0,3,0,1,34,1,2,1,4 +65804,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,185033.990584,192737.162475,1,97,14,14,4.96,2,2,0,0,0,1,59,1,4,1,5 +65805,7,2,2,11,NA,3,3,2,11,139,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19824.800404,20630.46787,1,101,6,6,1.21,4,4,0,2,0,2,33,1,2,6,NA +65806,7,2,1,5,NA,1,1,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16632.464801,17158.955649,3,91,3,3,0.39,6,6,1,1,0,1,39,2,1,6,NA +65807,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108408.375382,108975.782069,2,98,14,14,4.16,3,3,0,0,0,1,49,1,5,1,4 +65808,7,2,1,65,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7610.147862,2,100,9,9,2.46,4,4,1,1,1,2,59,1,3,1,3 +65809,7,2,1,0,8,3,3,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22795.485282,22401.400888,1,92,9,9,3.24,3,3,1,0,0,1,30,1,5,6,NA +65810,7,2,2,2,NA,3,3,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,44572.321124,49194.06017,1,98,8,8,2.46,3,3,1,0,0,1,29,1,4,6,NA +65811,7,2,2,11,NA,1,1,2,11,136,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13085.954443,13661.915968,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +65812,7,2,1,30,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14894.763298,16100.128566,2,92,6,6,1.35,3,3,1,0,0,2,32,1,5,1,5 +65813,7,2,1,11,NA,1,1,2,11,138,NA,NA,2,1,3,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,13285.093011,14158.005149,2,94,7,7,1.57,4,4,0,2,0,1,30,2,3,1,4 +65814,7,2,1,11,NA,4,4,1,11,134,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13213.679978,13442.903072,2,96,7,7,1.49,5,5,2,1,0,1,51,1,5,1,3 +65815,7,1,2,65,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,10033.449917,0,2,95,3,3,0.95,2,2,0,0,1,2,65,1,2,3,NA +65816,7,2,1,6,NA,3,3,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23796.980721,24835.204126,1,92,4,4,0.61,5,5,1,2,0,1,34,1,3,6,NA +65817,7,2,2,19,NA,3,3,2,19,235,2,NA,2,1,5,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,77001.138762,79232.910414,1,98,15,15,5,3,3,0,0,0,1,56,1,5,1,5 +65818,7,2,1,17,NA,5,6,2,17,211,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6852.192992,7202.81544,2,100,15,15,5,3,3,0,1,0,1,58,2,5,1,5 +65819,7,2,1,9,NA,1,1,1,9,108,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11159.151566,11335.739115,1,102,6,6,1.03,6,6,0,4,0,1,34,2,2,1,1 +65820,7,2,1,77,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,2,2,NA,1,2,1,1,2,1,1,2,1,NA,9681.885604,10696.882276,1,93,2,2,0.74,1,1,0,0,1,1,77,2,2,2,NA +65821,7,2,2,5,NA,5,6,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8171.700571,8311.029296,1,92,15,15,5,4,4,1,1,0,1,38,2,5,1,5 +65822,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,88617.795432,89088.673687,1,91,5,5,2.2,1,1,0,0,1,1,63,1,2,2,NA +65823,7,2,1,37,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,2,2,2,1,2,2,1,46446.757775,47702.387865,1,102,1,1,0.33,2,2,0,0,0,1,37,1,2,4,NA +65824,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,104228.438447,104101.346681,2,95,10,10,5,1,1,0,0,0,1,57,1,5,5,NA +65825,7,2,2,8,NA,4,4,1,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7619.934086,8032.046596,2,103,7,7,1.55,5,5,2,2,0,2,31,1,4,3,NA +65826,7,2,1,15,NA,1,1,1,16,192,NA,NA,2,2,4,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,29234.272259,28953.402615,3,92,13,13,NA,4,4,0,2,0,2,50,2,1,5,NA +65827,7,2,1,42,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,4,6,NA,1,2,2,1,2,2,1,2,2,2,37402.70356,37112.276585,2,102,15,14,5,5,1,0,3,0,1,42,2,4,6,NA +65828,7,2,2,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,118761.81384,123645.102237,3,91,7,4,1.74,2,1,0,0,0,1,23,NA,NA,6,NA +65829,7,2,2,3,NA,3,3,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,69494.442609,71683.798234,1,98,15,15,4.56,4,4,2,0,0,2,33,1,4,1,4 +65830,7,2,1,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15546.999135,15568.006794,3,92,5,5,0.87,4,4,2,0,0,2,28,1,3,1,3 +65831,7,2,2,19,NA,4,4,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12531.903464,13043.632492,2,100,1,1,0.08,5,5,1,2,0,2,19,1,3,NA,NA +65832,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,1,2,1,2,2,1,1,2,NA,15852.523312,16085.826144,2,97,6,6,2.04,2,2,0,0,2,2,80,1,3,2,NA +65833,7,2,2,1,13,1,1,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11901.705423,12652.027961,2,102,4,4,0.65,5,5,1,0,0,2,58,2,1,4,NA +65834,7,2,1,6,NA,4,4,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10229.206765,10406.656985,1,96,15,15,4.52,6,6,0,4,0,1,46,1,4,1,4 +65835,7,2,1,18,NA,5,6,2,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,77,77,NA,5,5,0,2,0,1,46,2,3,1,3 +65836,7,2,2,18,NA,5,7,2,18,216,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,58352.457563,59447.870488,1,99,77,77,NA,3,3,0,0,0,1,42,1,4,6,NA +65837,7,2,1,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,11212.469396,11300.176858,1,100,15,99,NA,5,2,0,0,3,2,50,1,4,6,NA +65838,7,2,1,63,NA,2,2,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11061.174348,11020.288023,1,95,7,7,2.65,2,2,0,0,1,1,63,1,4,1,NA +65839,7,2,1,4,NA,1,1,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14318.290734,14771.527769,3,91,15,14,4.03,5,4,2,0,0,1,42,2,4,1,5 +65840,7,2,1,21,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,12395.607222,12971.055335,1,102,9,9,2.39,5,5,0,1,1,1,55,2,5,1,5 +65841,7,2,1,63,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,85242.614785,86042.075041,1,93,15,15,5,1,1,0,0,1,1,63,1,5,5,NA +65842,7,2,1,0,3,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9064.168162,9064.335231,3,92,14,14,4.71,3,3,1,0,0,1,29,1,5,1,5 +65843,7,2,1,9,NA,1,1,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12477.812875,13297.681754,2,94,5,5,0.67,6,6,1,3,0,1,37,2,3,1,4 +65844,7,2,1,69,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,2,1,2,1,2,2,2,1,2,NA,12118.033999,12538.522644,2,91,3,3,0.66,2,2,0,0,1,1,69,2,5,1,1 +65845,7,2,1,13,NA,5,6,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7350.524832,7855.79983,2,90,8,8,2.59,3,3,0,1,0,2,41,2,4,1,4 +65846,7,2,2,61,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,7278.790659,7582.574348,2,93,15,15,5,4,4,0,0,1,1,57,2,5,1,4 +65847,7,2,1,3,NA,2,2,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14004.176901,13773.448831,2,93,3,3,0.66,2,2,1,0,0,2,31,2,3,5,NA +65848,7,1,1,11,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7803.43213,0,1,93,15,15,5,3,3,0,2,0,2,40,2,5,4,NA +65849,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,17753.406962,18715.910687,1,101,4,4,1.29,2,2,0,0,2,2,74,1,3,1,3 +65850,7,2,1,58,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,25118.469449,25612.281104,3,92,5,5,1.56,2,2,0,0,1,1,58,1,3,1,2 +65851,7,2,2,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,50915.06085,56529.78018,3,92,4,4,0.65,4,4,2,0,0,2,20,1,3,5,NA +65852,7,2,2,29,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,40212.914634,41314.674899,2,92,15,10,5,2,1,0,0,0,2,29,1,5,6,NA +65853,7,2,2,14,NA,3,3,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,97212.131473,101229.4133,1,91,14,14,4.03,4,4,0,2,0,1,52,1,4,1,5 +65854,7,2,1,56,NA,5,7,2,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11690.444016,12008.407525,3,90,9,9,3.14,3,3,0,0,0,1,56,2,3,1,3 +65855,7,2,1,8,NA,3,3,2,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23796.980721,24835.204126,1,95,5,5,1.03,4,4,0,2,0,1,33,1,3,1,3 +65856,7,2,1,63,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,8060.574062,8123.626407,1,93,7,7,1.61,4,4,0,0,1,2,27,2,3,5,NA +65857,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,97050.018399,96721.703127,1,99,14,14,5,1,1,0,0,1,2,64,1,5,3,NA +65858,7,2,2,5,NA,1,1,2,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13366.393396,14209.054666,2,94,7,7,1.23,6,6,2,1,0,1,33,2,1,6,NA +65859,7,2,2,0,10,3,3,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25770.951107,25070.954843,2,91,15,15,4.34,4,4,2,0,0,1,39,1,5,1,5 +65860,7,2,2,5,NA,4,4,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11142.946789,11989.935044,2,96,5,5,0.67,6,6,1,2,1,1,34,1,4,1,4 +65861,7,2,1,8,NA,2,2,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,10248.861635,10307.698588,1,96,15,15,5,4,4,0,2,0,1,36,2,3,1,4 +65862,7,2,1,54,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,27227.937106,27194.736507,1,101,3,3,1.1,1,1,0,0,0,1,54,1,4,3,NA +65863,7,2,2,33,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,15817.041096,15849.338176,2,92,15,8,4.59,2,1,0,0,0,2,25,2,5,5,NA +65864,7,2,1,0,1,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13392.309303,13898.571164,1,99,14,14,3.44,5,5,3,0,0,1,30,1,4,1,5 +65865,7,2,2,34,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,NA,NA,NA,NA,39561.667842,39822.148122,2,98,12,12,NA,3,3,0,1,0,2,34,1,4,1,3 +65866,7,2,2,6,NA,4,4,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9209.511624,9916.240201,1,100,5,5,0.85,5,5,0,2,0,2,54,1,2,2,NA +65867,7,2,2,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,37934.469637,38685.959862,1,94,6,6,1.98,2,2,0,0,1,2,60,1,4,3,NA +65868,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,NA,53069.077479,57205.244401,2,90,15,15,5,2,1,0,0,2,1,67,1,5,6,NA +65869,7,2,2,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,10252.529496,2,100,4,4,1.16,2,2,0,0,1,2,18,1,2,NA,NA +65870,7,2,2,1,12,5,6,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,4488.195848,4764.622817,2,92,99,2,0.31,7,4,3,3,1,1,61,2,1,1,3 +65871,7,2,2,6,NA,1,1,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18721.371751,18903.185351,1,95,6,6,1.37,3,3,1,1,0,2,28,1,4,5,NA +65872,7,2,1,1,15,1,1,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10666.404974,11148.562293,2,96,8,8,1.33,7,7,2,1,1,1,62,2,1,1,1 +65873,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,18018.210636,21650.053885,2,91,14,14,3.47,4,4,1,1,0,2,36,2,3,1,5 +65874,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,127315.335607,127929.014806,1,91,10,10,2.77,5,5,0,3,0,1,43,1,5,1,5 +65875,7,2,2,4,NA,1,1,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16648.051651,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +65876,7,2,1,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21288.18311,20984.737161,1,102,1,1,0,5,5,0,3,0,2,41,1,4,1,4 +65877,7,2,1,76,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,1,1,2,2,1,2,2,NA,10123.333237,10321.62644,1,93,2,2,0.54,2,2,0,0,2,1,76,2,4,1,1 +65878,7,2,1,29,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,1,NA,NA,NA,NA,9177.295801,9603.338468,2,92,7,7,1.89,3,3,0,0,1,1,36,2,3,5,NA +65879,7,2,2,32,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,45655.090694,45995.96139,3,92,15,15,5,3,3,1,0,0,1,34,1,5,1,5 +65880,7,2,2,26,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,53638.260635,61764.513393,2,96,4,4,1.47,1,1,0,0,0,2,26,1,4,5,NA +65881,7,2,1,1,13,4,4,2,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6992.24593,7710.094516,2,97,2,2,0.27,3,3,1,0,0,2,21,1,3,6,NA +65882,7,2,2,11,NA,2,2,2,11,140,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10762.400563,11222.736057,2,90,12,12,NA,4,4,0,2,0,2,38,2,4,1,4 +65883,7,2,1,79,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,7199.330978,7568.243922,1,93,2,2,0.64,1,1,0,0,1,1,79,2,3,4,NA +65884,7,2,1,2,NA,5,6,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6672.795321,7206.439819,2,102,15,15,3.92,5,5,1,2,0,1,34,2,5,1,5 +65885,7,2,1,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,21941.544332,21717.573526,1,99,4,4,1.16,2,2,0,0,2,2,63,1,5,6,NA +65886,7,2,2,2,NA,5,7,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8692.478172,9353.203477,1,100,6,6,1.18,5,5,1,2,0,2,30,1,3,1,4 +65887,7,2,1,0,1,1,1,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,5875.721278,6205.225081,2,97,6,6,1.1,5,5,2,1,0,2,29,2,2,6,NA +65888,7,2,2,11,NA,4,4,1,11,134,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9139.784234,9759.758014,2,100,14,14,3.58,4,4,0,1,1,2,55,1,5,1,4 +65889,7,2,1,30,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,2,2,2,1,2,2,1,2,2,1,37080.526463,37488.446325,1,103,6,6,1.57,3,3,0,1,0,2,50,2,3,4,NA +65890,7,2,1,3,NA,2,2,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15915.595287,17052.411707,2,96,14,14,3.36,4,4,1,1,0,2,28,1,2,6,NA +65891,7,2,1,3,NA,4,4,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8961.738846,9235.465849,1,93,10,10,2.91,4,4,2,0,0,2,27,1,5,1,4 +65892,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,25840.959268,28861.347345,1,101,3,3,0.86,2,2,0,0,1,2,80,1,1,2,NA +65893,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16058.142925,16013.018639,2,95,5,5,1.18,3,3,0,1,0,2,55,1,4,5,NA +65894,7,2,1,12,NA,4,4,1,12,150,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13653.432599,13787.136512,2,96,6,6,1.62,3,3,0,2,0,2,31,1,3,5,NA +65895,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,26922.241442,27209.395492,1,90,7,7,1.55,5,5,0,3,0,1,51,2,3,1,2 +65896,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,89807.047643,92868.804281,1,94,15,1,0.44,4,1,0,0,1,1,33,1,2,5,NA +65897,7,2,1,13,NA,1,1,1,14,168,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23389.620035,23146.524434,1,94,10,10,2.94,4,4,0,2,0,2,52,1,5,2,NA +65898,7,2,1,66,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,5950.975297,5997.525697,2,99,6,6,1.11,5,5,0,0,1,1,66,2,4,1,4 +65899,7,2,2,12,NA,4,4,2,12,147,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17426.123122,17678.558809,1,91,10,10,2.56,5,5,0,3,0,1,51,2,5,1,4 +65900,7,2,2,18,NA,3,3,1,18,218,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,76992.7514,81576.336255,1,100,15,15,4.07,5,5,0,2,0,2,41,1,5,1,4 +65901,7,2,1,22,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,11164.358128,11468.312676,2,93,1,1,0.09,1,1,0,0,0,1,22,1,4,5,NA +65902,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,1,1,2,2,1,2,2,1,2,2,1,18723.98095,21433.166124,2,95,7,7,1.41,5,5,2,0,0,2,53,1,3,3,NA +65903,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4912.962876,5216.242891,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +65904,7,2,2,4,NA,2,2,1,4,48,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13201.625134,13621.675873,2,92,15,15,5,4,4,1,1,0,2,47,1,5,1,5 +65905,7,2,1,54,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,1,1,NA,1,2,1,1,2,2,1,2,1,NA,15728.666463,15671.845555,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +65906,7,2,2,7,NA,2,2,1,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15009.847173,16312.401192,2,93,15,15,4.34,4,4,0,2,0,1,33,2,5,1,5 +65907,7,1,2,47,NA,2,2,NA,NA,NA,2,NA,2,7,77,NA,3,1,NA,2,1,2,1,2,2,NA,NA,NA,NA,23968.560941,0,2,90,99,99,NA,4,4,0,2,0,1,39,NA,NA,4,NA +65908,7,2,1,17,NA,4,4,2,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18526.8521,18563.481203,1,97,6,6,1.41,3,3,0,1,0,2,51,1,4,5,NA +65909,7,2,1,35,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19091.246741,19659.303383,1,91,10,10,3.78,3,3,1,0,0,1,35,2,5,1,5 +65910,7,2,1,36,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13601.994691,14414.229968,2,100,15,15,5,4,4,1,1,0,1,36,2,5,1,5 +65911,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,38833.86357,44548.098777,3,92,5,5,1.59,2,2,0,0,2,1,64,1,3,1,3 +65912,7,2,1,18,NA,5,6,1,18,220,2,NA,2,2,1,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9948.022697,10353.284725,2,101,99,99,NA,4,1,0,0,0,1,18,2,4,NA,NA +65913,7,2,2,19,NA,4,4,2,19,239,2,NA,2,1,4,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11478.437608,11446.094627,1,96,7,7,1.69,4,4,0,1,0,2,19,2,4,NA,NA +65914,7,2,2,79,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,17087.605763,2,90,2,2,0.87,1,1,0,0,1,2,79,1,2,2,NA +65915,7,2,1,37,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,30626.581617,36447.669921,2,90,3,3,0.58,4,4,0,2,0,2,36,2,3,1,3 +65916,7,2,1,9,NA,4,4,2,9,117,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9738.268689,9808.886868,2,99,9,9,1.78,6,6,1,1,0,1,46,1,3,6,NA +65917,7,2,2,6,NA,5,7,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18348.624469,20109.577944,2,90,77,77,NA,6,6,0,4,0,2,41,NA,NA,4,NA +65918,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,2,77,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,15792.287872,16329.218615,1,103,12,12,NA,2,2,0,0,0,1,34,2,5,1,5 +65919,7,2,2,73,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,1,2,NA,1,2,1,1,2,2,1,2,1,NA,15825.056964,16318.16087,2,94,15,15,5,3,3,0,0,1,2,40,2,5,1,5 +65920,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,31552.004994,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +65921,7,2,2,41,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,19711.72366,19172.260632,1,96,5,5,1.45,2,2,0,1,0,2,41,1,4,3,NA +65922,7,2,1,10,NA,4,4,2,10,121,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8861.237416,9017.822314,2,95,2,2,0.26,3,3,0,2,0,2,31,1,3,5,NA +65923,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,138075.879417,141933.339512,2,91,14,14,5,1,1,0,0,1,1,62,1,5,3,NA +65924,7,2,2,19,NA,4,4,1,19,238,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15006.987722,14964.702287,1,98,2,1,0.21,4,1,0,0,0,2,19,1,4,NA,NA +65925,7,2,1,23,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,29738.952706,30589.306008,2,94,6,3,0.68,3,2,0,0,0,1,26,1,4,5,NA +65926,7,2,2,14,NA,4,4,1,14,170,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11791.755593,11820.79689,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +65927,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,111378.575836,111001.787784,2,97,8,8,3.06,2,2,0,0,2,1,68,1,2,1,4 +65928,7,2,2,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,17884.885732,18357.680967,1,98,6,6,1.73,3,3,0,1,0,2,39,1,4,1,1 +65929,7,2,1,64,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,35869.019314,40296.63257,3,92,5,5,1.59,2,2,0,0,2,1,64,1,3,1,3 +65930,7,2,2,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,59902.67172,68981.485025,1,101,3,3,1.3,1,1,0,0,1,2,80,1,3,2,NA +65931,7,2,1,22,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,2,5,NA,1,2,2,1,2,2,1,2,2,NA,10141.381563,10817.596093,3,90,12,12,NA,4,4,0,0,1,1,62,2,4,3,NA +65932,7,2,1,17,NA,2,2,1,17,215,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18242.832494,18053.229058,1,102,77,77,NA,6,6,0,2,1,2,37,1,4,1,4 +65933,7,2,1,11,NA,3,3,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,54897.892683,57357.850008,2,98,15,15,5,3,3,0,1,0,1,56,1,5,1,5 +65934,7,2,1,3,NA,3,3,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,75551.990912,88526.885345,1,90,14,14,3.93,3,3,1,0,0,1,35,1,2,1,5 +65935,7,2,1,18,NA,4,4,2,18,223,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12530.944806,12773.594654,2,90,8,8,1.67,6,6,1,1,0,1,52,1,3,1,5 +65936,7,2,1,7,NA,3,3,2,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64387.576177,71283.768751,1,95,8,8,2.7,3,3,0,1,2,1,69,1,5,1,3 +65937,7,2,2,61,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,3,4,NA,2,2,2,2,2,2,2,2,2,2,9716.805546,10855.679158,2,90,12,12,NA,3,3,0,0,2,2,61,2,3,4,NA +65938,7,2,1,0,2,1,1,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9064.168162,9064.335231,3,92,4,4,0.89,3,3,1,0,0,2,24,2,4,1,3 +65939,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17207.598344,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +65940,7,2,2,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,13851.686232,14498.558979,3,91,15,3,0.92,5,1,2,0,0,1,42,2,4,1,5 +65941,7,2,1,6,NA,2,2,1,6,74,NA,NA,2,1,3,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10212.603023,10439.995832,2,92,15,15,5,4,4,1,1,0,2,47,1,5,1,5 +65942,7,2,2,3,NA,1,1,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19235.084509,19847.108514,3,92,15,8,2.62,4,3,1,1,0,1,30,1,2,6,NA +65943,7,2,1,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8009.966208,8254.622305,2,96,3,3,0.54,4,4,2,1,0,2,25,1,4,2,NA +65944,7,2,2,64,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,10308.451947,2,90,9,9,5,1,1,0,0,1,2,64,2,4,3,NA +65945,7,2,2,2,NA,1,1,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13464.808163,14038.51136,1,101,2,2,0.26,5,5,3,0,0,2,26,1,2,1,3 +65946,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,15415.338508,15856.841729,1,93,4,4,1.65,1,1,0,0,0,1,34,1,5,4,NA +65947,7,2,2,3,NA,5,6,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5485.572703,5823.427887,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +65948,7,2,1,5,NA,4,4,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9388.597537,2,100,3,3,0.38,5,5,2,1,0,2,28,1,2,5,NA +65949,7,1,1,48,NA,2,2,NA,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,35393.002863,0,2,93,4,4,0.84,3,3,0,1,0,2,46,2,3,1,2 +65950,7,2,1,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,23471.353577,23675.625296,1,100,14,6,1.85,3,2,1,0,0,1,33,1,5,5,NA +65951,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,102085.27025,105869.935801,1,99,14,14,4.86,3,3,0,1,0,1,56,1,5,1,5 +65952,7,2,1,17,NA,2,2,1,17,212,2,NA,2,2,1,13,NA,NA,NA,2,2,2,1,2,2,2,2,2,2,24228.858782,24791.594558,2,102,6,6,1,6,6,1,3,0,1,35,2,3,1,3 +65953,7,2,2,24,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,5,1,2,2,2,2,2,2,1,2,2,1,36169.442288,36681.102865,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +65954,7,2,2,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10440.656902,1,99,12,12,NA,1,1,0,0,1,2,66,1,5,1,NA +65955,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,29016.444561,32518.702589,3,91,4,4,1.16,2,2,0,0,2,1,80,1,5,1,5 +65956,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,86986.68246,89821.123051,2,94,12,12,NA,5,5,1,1,0,1,37,1,4,1,3 +65957,7,2,2,47,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,30039.01139,30195.662279,2,95,8,8,3.44,2,2,0,0,0,2,24,1,4,5,NA +65958,7,2,2,13,NA,3,3,1,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,34778.638222,37920.357213,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +65959,7,2,1,13,NA,1,1,1,13,159,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,1,1,2,2,1,20560.901695,20875.182272,2,96,3,3,0.46,5,5,1,2,0,1,37,1,1,1,2 +65960,7,2,2,0,4,4,4,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4137.127382,4386.966342,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +65961,7,2,2,0,0,3,3,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17773.146728,17119.196492,2,98,99,99,NA,7,7,1,1,1,1,19,1,3,NA,NA +65962,7,2,2,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,16966.723528,16502.38463,2,92,2,2,0.57,2,2,0,0,0,2,56,1,3,2,NA +65963,7,2,2,60,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,3,2,NA,1,2,1,NA,NA,NA,1,2,1,3,7575.470578,7867.856697,2,92,12,NA,NA,7,1,0,0,2,1,53,2,3,1,3 +65964,7,2,1,13,NA,4,4,2,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18526.8521,18563.481203,1,97,7,7,1.74,4,4,0,3,0,2,32,1,4,5,NA +65965,7,2,1,6,NA,2,2,1,6,77,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8635.515602,8675.270774,2,93,4,4,0.56,5,5,0,2,0,1,37,NA,NA,1,1 +65966,7,2,1,19,NA,4,4,2,19,230,2,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16658.161391,16980.73087,2,91,2,2,0.26,4,4,0,1,0,1,20,1,3,5,NA +65967,7,2,2,36,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,35353.005268,35616.958386,2,94,8,8,2.01,4,4,1,1,0,1,44,2,4,1,4 +65968,7,2,2,8,NA,2,2,1,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12307.832776,12427.36095,2,93,14,14,3.25,4,4,0,2,0,2,46,2,5,1,4 +65969,7,2,1,14,NA,1,1,2,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20398.562455,20202.582308,2,94,14,14,4.03,4,4,0,2,0,2,33,2,2,1,NA +65970,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,20901.316439,20413.081322,2,91,14,14,3.42,5,5,1,0,0,2,28,NA,NA,1,NA +65971,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,80069.373466,86138.346669,1,98,6,6,1.31,3,3,1,0,0,1,30,1,5,1,5 +65972,7,2,2,1,17,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,11667.597427,3,92,6,6,1.7,2,2,1,0,0,2,20,1,3,4,NA +65973,7,2,2,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9287.93089,10379.213194,2,90,7,7,1.61,4,4,1,1,1,2,65,1,3,2,NA +65974,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,10,10,4.49,2,2,0,0,2,1,60,1,5,1,4 +65975,7,2,2,30,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,5,4,2,2,2,2,2,2,2,1,2,2,1,19486.670926,20613.901312,2,90,5,5,1.19,3,3,1,0,1,2,60,2,1,4,NA +65976,7,2,1,13,NA,4,4,1,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13523.666124,13550.403519,2,98,3,3,0.88,2,2,0,1,0,2,38,1,4,5,NA +65977,7,2,1,3,NA,2,2,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11992.176902,12455.795985,1,96,10,10,2.59,5,5,1,0,0,1,32,2,4,1,2 +65978,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,145224.318312,145047.237897,1,98,6,6,2.86,1,1,0,0,0,1,57,1,4,5,NA +65979,7,2,2,2,NA,5,7,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6443.362832,6553.223138,1,98,14,14,3.9,4,4,2,0,0,1,39,1,5,1,4 +65980,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,13076.210481,14300.146605,2,97,5,5,1.19,3,3,0,1,0,2,41,1,3,1,2 +65981,7,2,1,8,NA,2,2,1,8,102,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,13742.678011,2,98,7,7,2.16,3,3,0,1,0,2,51,1,1,1,2 +65982,7,2,2,4,NA,3,3,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78165.891242,86270.974005,1,101,6,6,1.28,4,4,2,0,0,1,44,1,4,1,4 +65983,7,2,1,9,NA,4,4,2,9,112,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,8017.552697,8398.795399,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +65984,7,2,2,16,NA,5,6,2,16,196,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11225.761275,11659.847432,2,91,8,8,2.34,4,4,0,2,0,1,56,2,5,1,5 +65985,7,2,2,7,NA,5,6,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5139.061504,5511.809249,2,103,77,77,NA,5,5,0,2,0,2,39,2,5,1,5 +65986,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,82864.936499,86441.088971,1,99,15,15,5,4,4,0,2,0,2,44,1,5,1,5 +65987,7,2,2,29,NA,5,7,1,NA,NA,2,NA,2,1,6,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,47970.616628,49304.059008,1,102,10,10,3.22,4,4,0,0,2,2,29,2,5,5,NA +65988,7,2,1,20,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21763.209029,22385.504537,2,92,4,1,0.23,4,1,0,0,0,1,21,1,4,5,NA +65989,7,2,1,1,18,2,2,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8326.330571,8424.765655,2,93,3,3,0.37,5,5,3,0,0,1,28,2,1,6,NA +65990,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,1,1,2,2,1,2,1,NA,17232.67865,17489.495288,1,100,99,99,NA,6,6,0,1,0,1,53,2,2,1,3 +65991,7,2,2,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,118761.81384,121363.708734,3,91,15,6,2.75,3,1,0,0,0,2,26,1,4,5,NA +65992,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11699.431733,12601.246533,1,96,14,14,5,2,2,0,0,2,2,61,1,3,1,3 +65993,7,2,2,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,149765.47604,152732.36321,1,92,8,8,2.17,4,4,0,1,2,2,80,1,3,2,NA +65994,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7903.072331,7964.892648,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +65995,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,21756.194073,0,1,93,2,2,0.59,1,1,0,0,1,2,80,1,3,2,NA +65996,7,2,2,9,NA,3,3,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20242.832328,19974.015949,2,93,6,6,2.05,2,2,0,1,0,2,30,1,4,3,NA +65997,7,2,2,17,NA,4,4,1,17,209,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13620.028009,14467.639304,2,93,9,9,2.07,5,5,0,1,0,1,55,NA,NA,5,NA +65998,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,7869.59899,8220.968168,2,100,3,3,1.1,1,1,0,0,1,2,67,1,4,5,NA +65999,7,2,1,69,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,3,NA,2,2,2,1,2,2,1,2,2,2,9404.30514,9554.950099,2,93,6,6,1.72,2,2,0,0,2,1,69,2,4,3,NA +66000,7,2,2,54,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,24287.448154,24414.10513,2,92,15,10,5,2,1,0,0,1,2,54,2,5,3,NA +66001,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,100988.137931,99957.29004,1,99,15,15,5,2,2,0,0,2,1,62,1,5,1,4 +66002,7,2,1,11,NA,1,1,1,11,143,NA,NA,2,7,77,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11367.678664,11216.859778,2,96,77,77,NA,7,7,3,2,0,2,33,2,2,6,NA +66003,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,4,2,0.64,2,1,0,0,0,1,24,1,4,5,NA +66004,7,2,1,2,NA,1,1,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13305.770449,13463.073191,3,92,6,6,1.06,5,5,2,0,0,2,54,2,1,77,NA +66005,7,2,2,18,NA,2,2,2,18,219,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,6,6,1.21,4,4,0,0,0,2,59,2,1,6,NA +66006,7,2,2,18,NA,3,3,2,18,218,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,36586.371708,44099.282264,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +66007,7,2,2,9,NA,3,3,2,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,23750.822126,1,95,7,7,1.17,6,6,1,3,0,2,44,1,4,1,NA +66008,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,154825.466557,160454.355913,1,91,15,14,5,3,2,0,0,2,2,73,1,4,3,NA +66009,7,2,2,0,6,4,4,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4581.358327,5045.31579,2,97,3,3,0.66,3,3,2,0,0,2,19,1,3,NA,NA +66010,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,27934.372045,28826.461363,1,101,6,6,1.17,4,4,0,1,0,1,41,1,3,6,NA +66011,7,2,2,12,NA,4,4,2,13,156,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10848.628906,11198.221038,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +66012,7,2,1,2,NA,1,1,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11160.282155,11175.362327,2,97,8,8,2.01,4,4,2,0,0,2,24,1,4,1,1 +66013,7,2,1,23,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,35338.972549,35820.670014,2,90,2,2,0.25,5,5,0,1,0,2,41,2,4,1,NA +66014,7,2,2,5,NA,4,4,2,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10389.292229,10964.092156,2,95,1,1,0.09,5,5,3,1,0,2,31,1,2,1,NA +66015,7,2,1,64,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,7926.298973,8333.304577,2,96,8,8,3.06,2,2,0,0,1,1,64,2,5,1,5 +66016,7,2,2,4,NA,5,6,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7349.373527,7474.681451,2,91,7,7,1.56,4,4,1,1,0,2,37,2,5,1,5 +66017,7,2,2,11,NA,3,3,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,48532.852397,48387.04619,1,98,15,15,5,5,5,0,3,0,2,41,1,5,6,NA +66018,7,2,2,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10788.880391,11608.95565,2,95,6,6,0.97,6,6,2,2,0,1,37,1,3,1,4 +66019,7,2,1,12,NA,4,4,1,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16089.133406,15900.017206,2,102,3,3,0.76,3,3,0,1,1,2,66,1,2,3,NA +66020,7,2,2,9,NA,1,1,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,NA,15225.935813,15373.8033,2,94,7,7,1.79,4,4,1,1,0,2,32,1,4,1,4 +66021,7,2,1,33,NA,5,7,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,25461.575888,25330.616054,1,93,15,15,5,2,2,0,0,0,2,34,1,5,1,5 +66022,7,2,2,35,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,28958.579549,28751.652767,1,96,12,12,NA,5,5,1,2,0,2,35,1,5,1,4 +66023,7,2,1,2,NA,5,6,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10123.286306,10611.741928,1,100,10,10,3.04,4,4,2,0,0,1,30,2,5,1,5 +66024,7,2,2,11,NA,1,1,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15841.451259,16252.614023,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +66025,7,2,1,8,NA,4,4,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9468.438225,10001.401449,2,99,6,6,1.57,3,3,0,2,0,2,31,1,3,77,NA +66026,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,65748.417123,66365.048213,2,99,15,15,5,1,1,0,0,1,1,65,1,5,3,NA +66027,7,2,2,40,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,5,1,3,1,2,2,1,2,2,1,2,2,1,31235.666551,32148.463094,2,94,6,6,2.94,1,1,0,0,0,2,40,2,5,1,NA +66028,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,96499.801072,98371.919459,1,92,14,14,3.93,3,3,1,0,0,1,20,1,4,1,4 +66029,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,112153.23206,1,91,8,8,2.17,4,4,0,0,0,1,59,1,4,1,5 +66030,7,2,1,13,NA,1,1,1,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,29234.272259,29395.83763,3,92,10,1,0,5,1,2,1,1,2,68,1,3,1,1 +66031,7,2,2,56,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,19183.115011,19284.554221,1,92,4,4,1.75,1,1,0,0,0,2,56,1,5,5,NA +66032,7,2,1,36,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,30626.581617,32055.135325,2,90,14,14,3.45,4,4,1,1,0,2,34,2,5,6,NA +66033,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,64581.191728,67036.946354,2,94,99,99,NA,2,2,0,0,0,2,37,1,2,1,4 +66034,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,26847.643051,29218.940922,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +66035,7,2,1,0,5,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4461.618312,4741.503802,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +66036,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,94,9,9,3.97,2,2,0,0,2,1,74,1,4,1,4 +66037,7,2,2,14,NA,4,4,2,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,12440.215685,1,98,10,10,3.77,3,3,0,1,0,1,48,NA,NA,1,4 +66038,7,2,2,2,NA,1,1,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10271.907274,2,94,77,77,NA,4,4,2,0,0,1,26,2,2,1,4 +66039,7,2,1,8,NA,3,3,2,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15653.970322,16628.805574,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +66040,7,2,2,24,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,NA,NA,NA,1,2,2,1,40149.982555,41250.018596,2,103,6,6,1.98,2,2,0,0,0,1,24,1,2,6,NA +66041,7,2,1,58,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,31872.125984,32498.709833,2,96,8,8,3.67,2,2,0,0,0,1,58,1,3,3,NA +66042,7,2,1,15,NA,2,2,2,15,186,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18909.886675,20785.327762,2,90,8,8,1.72,5,5,1,2,0,1,20,2,1,1,2 +66043,7,2,2,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,166028.936087,173980.461474,2,101,12,12,NA,1,1,0,0,1,2,64,1,3,1,NA +66044,7,2,1,14,NA,5,6,1,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12013.02156,13498.577364,3,92,12,12,NA,5,5,0,2,0,1,47,1,3,1,3 +66045,7,2,1,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,22506.522055,23661.545768,1,98,4,4,0.75,4,4,0,1,0,2,48,1,2,1,3 +66046,7,2,2,0,0,1,1,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9767.083234,10416.172562,3,92,8,8,2,4,4,2,0,0,1,30,1,4,1,4 +66047,7,2,2,0,1,4,4,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3594.351671,3811.412689,2,99,6,6,1.11,5,5,1,2,0,2,41,1,2,5,NA +66048,7,2,2,6,NA,5,6,1,6,72,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10387.513218,11140.943027,1,92,77,77,NA,4,4,1,1,0,2,40,2,4,1,4 +66049,7,2,1,73,NA,2,2,2,NA,NA,2,NA,2,2,8,NA,5,1,NA,2,2,2,2,2,2,2,2,2,NA,12343.565567,12789.649007,3,90,10,10,3.04,4,4,0,0,2,2,80,2,1,3,NA +66050,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,10072.885959,10423.387676,2,100,2,2,0.78,1,1,0,0,1,2,80,1,4,2,NA +66051,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,30451.148148,30372.925419,2,101,4,4,0.73,5,5,1,2,0,1,40,1,5,1,5 +66052,7,2,2,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,138322.767578,145546.941919,1,101,7,7,2.31,2,2,0,1,0,2,43,1,4,3,NA +66053,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,133492.667054,133041.068157,1,95,14,14,5,2,2,0,0,2,2,65,1,4,1,4 +66054,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,95214.22557,100722.009256,1,97,15,15,5,4,4,1,1,0,2,33,1,5,1,3 +66055,7,2,1,4,NA,4,4,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7311.663111,7763.016267,2,93,4,4,0.56,5,5,2,1,0,1,27,1,2,6,NA +66056,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,23325.73926,22943.576186,1,101,10,10,5,1,1,0,0,0,2,57,1,3,3,NA +66057,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,24004.078396,24148.434886,2,99,2,2,0.81,1,1,0,0,0,2,48,1,2,5,NA +66058,7,2,2,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,64463.340883,65151.773075,1,91,8,8,3.4,2,2,0,0,2,2,74,1,4,1,2 +66059,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,11019.434708,11234.197915,3,91,15,15,4.47,4,4,0,1,2,2,79,1,4,3,NA +66060,7,2,2,8,NA,2,2,2,8,102,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15148.721588,15796.67129,2,91,8,1,0,3,1,0,2,0,2,33,2,4,5,NA +66061,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,22295.761589,23482.073935,3,92,4,4,1.34,1,1,0,0,0,1,34,1,1,6,NA +66062,7,2,1,7,NA,3,3,2,8,96,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23729.905536,29042.69522,1,101,3,3,0.61,4,4,1,2,0,1,38,1,2,4,NA +66063,7,2,1,0,0,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4944.997189,5222.307037,2,103,13,13,NA,5,5,2,1,0,1,32,2,2,1,2 +66064,7,2,2,3,NA,1,1,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,21465.084926,22148.063325,1,92,4,4,0.74,4,4,1,1,0,1,42,2,3,1,4 +66065,7,2,2,2,NA,5,6,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8894.95474,1,97,14,14,4.5,3,3,1,0,0,1,30,1,5,1,5 +66066,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,34718.816885,38024.444986,1,91,15,15,5,3,3,0,0,2,1,60,1,5,1,3 +66067,7,2,2,7,NA,4,4,2,7,95,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10994.192555,11605.838362,2,97,3,3,0.46,5,5,0,3,0,1,40,1,2,1,3 +66068,7,2,1,76,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,6945.351825,7467.825932,1,103,5,5,0.65,6,6,0,0,1,2,26,2,4,5,NA +66069,7,1,2,55,NA,2,2,NA,NA,NA,2,NA,2,1,7,NA,2,4,NA,2,2,2,2,2,2,NA,NA,NA,NA,24902.414229,0,1,90,77,77,NA,2,2,0,0,0,2,55,2,2,4,NA +66070,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,12174.606153,16326.594828,1,90,7,7,1.3,5,5,1,2,1,2,62,1,2,2,NA +66071,7,2,2,65,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11862.436765,13289.857171,1,90,7,7,3.85,1,1,0,0,1,2,65,1,3,1,NA +66072,7,1,1,77,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,38226.070503,0,1,99,NA,NA,NA,2,2,0,0,2,1,77,1,3,1,NA +66073,7,2,1,80,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,2,NA,2,2,2,1,2,2,2,2,2,NA,8388.502332,8563.888023,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +66074,7,1,1,42,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,18790.641284,0,2,100,15,15,5,4,3,0,2,0,1,42,1,3,5,NA +66075,7,2,1,69,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,3,12579.986433,13271.133625,1,92,7,7,2.1,3,3,0,0,2,1,37,2,5,5,NA +66076,7,2,1,17,NA,2,2,1,17,213,2,NA,2,2,3,11,NA,NA,NA,2,2,2,1,2,2,2,2,2,2,22721.243258,23068.545411,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +66077,7,2,1,63,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22234.74698,22519.946154,2,94,15,15,5,2,2,0,0,1,1,63,1,5,1,4 +66078,7,2,1,3,NA,3,3,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,32718.806351,38337.758985,1,94,6,6,1.21,4,4,2,0,0,1,27,1,2,1,2 +66079,7,2,1,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,26946.665552,2,101,4,4,1.65,1,1,0,0,0,1,54,1,3,5,NA +66080,7,2,1,8,NA,4,4,2,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10651.061092,11315.742189,1,90,6,6,1.57,3,3,0,1,0,2,36,1,3,5,NA +66081,7,1,1,8,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14610.93355,0,2,102,14,14,3.8,4,4,0,2,0,1,47,1,4,1,4 +66082,7,2,2,9,NA,4,4,1,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10332.067017,12551.283611,1,100,9,9,2.6,4,4,0,1,0,1,45,1,3,1,3 +66083,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,36038.266622,37278.43838,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +66084,7,2,2,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,73204.401173,80916.420945,2,91,7,7,3.13,1,1,0,0,1,2,76,1,3,3,NA +66085,7,2,2,5,NA,5,7,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27969.562936,30869.748923,3,91,7,7,1.57,4,4,2,0,0,2,29,2,3,1,3 +66086,7,1,2,80,NA,2,2,NA,NA,NA,2,NA,2,1,4,NA,1,2,NA,2,1,2,1,2,2,NA,NA,NA,NA,10430.111347,0,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +66087,7,2,2,18,NA,2,2,2,18,223,2,NA,2,1,5,12,NA,NA,NA,1,2,2,2,2,1,1,2,2,1,19458.108146,21037.021471,2,91,4,4,0.94,3,3,0,1,0,2,50,2,1,4,NA +66088,7,2,1,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5662.231921,5835.178913,1,99,5,5,1.13,3,3,1,1,0,2,30,1,1,4,NA +66089,7,2,1,34,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17802.31438,18635.96967,1,102,3,3,0.92,1,1,0,0,0,1,34,1,4,5,NA +66090,7,2,2,25,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,NA,NA,NA,NA,50915.06085,51518.363256,3,92,7,7,2.1,3,3,1,1,0,2,25,1,4,5,NA +66091,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,33092.243754,1,95,3,3,0.76,3,3,0,0,1,1,41,1,2,1,4 +66092,7,2,2,68,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17243.546687,17909.086027,1,92,9,9,3.64,2,2,0,0,2,1,77,1,5,1,4 +66093,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29010.447112,32633.46257,1,100,5,5,2.15,1,1,0,0,0,2,41,1,4,5,NA +66094,7,2,1,25,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,5,5,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15564.966804,2,101,8,6,2.8,2,1,0,0,0,1,24,2,5,5,NA +66095,7,2,2,72,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,64368.917314,67563.498341,1,90,8,8,3.3,2,2,0,0,2,1,77,2,2,1,5 +66096,7,2,2,26,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,34906.069211,35828.732314,1,103,1,1,0.03,3,3,0,0,0,1,50,1,2,3,NA +66097,7,2,2,11,NA,5,7,2,11,134,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16195.492817,16951.263709,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +66098,7,2,1,29,NA,4,4,2,NA,NA,1,1,2,1,3,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15920.644312,16085.139317,1,96,7,7,2.23,3,3,1,0,0,1,29,2,5,1,5 +66099,7,2,1,15,NA,5,6,1,16,192,NA,NA,2,2,2,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10346.302718,11006.15627,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +66100,7,2,2,16,NA,4,4,2,16,203,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,11743.959438,2,95,4,4,0.84,3,3,0,1,0,2,40,1,3,3,NA +66101,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,48943.054903,67007.111083,2,98,1,1,0.23,2,2,1,0,0,2,20,1,3,6,NA +66102,7,2,2,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11846.491502,12833.518532,2,101,3,3,0.46,5,5,1,2,0,1,34,1,2,6,NA +66103,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,101419.325386,103801.228657,1,100,6,6,1.31,3,3,0,0,2,1,65,1,5,1,5 +66104,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,32467.087681,32793.115,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +66105,7,2,1,6,NA,3,3,2,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,68423.584566,71489.623895,1,98,15,15,3.7,5,5,2,1,0,1,34,1,5,1,5 +66106,7,2,2,2,NA,2,2,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7660.112391,8143.030995,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +66107,7,2,1,16,NA,4,4,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13756.125082,1,96,14,14,2.19,7,7,0,2,0,1,39,1,2,1,3 +66108,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,1,1,2,2,1,2,1,3,20111.196953,20296.097622,1,92,4,4,0.76,4,4,0,0,0,2,53,2,1,1,1 +66109,7,2,1,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,15561.574634,17154.493542,1,98,6,6,0.81,6,6,0,4,0,2,34,NA,NA,1,2 +66110,7,2,1,63,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105578.507837,104500.803223,1,99,15,15,5,2,2,0,0,2,1,63,1,5,1,NA +66111,7,2,2,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,26311.803433,25091.046888,1,97,15,15,5,6,6,0,1,1,2,53,1,4,1,NA +66112,7,1,2,33,NA,4,4,NA,NA,NA,2,NA,2,2,2,NA,3,5,3,1,2,1,1,2,1,NA,NA,NA,NA,29610.008111,0,2,93,1,1,0.2,2,2,1,0,0,2,33,2,3,5,NA +66113,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,105141.812429,109679.354704,1,98,15,15,5,4,4,1,1,0,1,40,1,4,1,5 +66114,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,21306.824647,21522.187676,2,98,3,3,0.38,5,5,0,4,0,2,39,1,4,5,NA +66115,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,202246.928022,1,91,10,10,3.51,3,3,0,0,1,1,21,1,4,5,NA +66116,7,2,1,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,28542.421068,28714.346279,2,101,5,5,1.36,2,2,0,0,1,1,79,1,4,2,NA +66117,7,2,2,16,NA,3,3,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,65698.166619,66553.178083,2,95,15,15,5,2,2,0,1,0,2,52,1,5,3,NA +66118,7,2,1,10,NA,1,1,1,10,126,NA,NA,2,2,2,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13581.60325,14182.420159,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +66119,7,2,1,14,NA,3,3,1,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,59545.101745,58762.542429,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +66120,7,2,2,3,NA,4,4,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8451.169331,8918.740308,2,99,13,13,NA,5,5,2,0,0,2,21,1,3,5,NA +66121,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,146181.198007,146233.940601,2,91,15,15,5,3,2,0,0,1,1,47,1,5,5,NA +66122,7,2,1,2,NA,3,3,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47507.757497,52569.646909,1,101,8,8,1.85,5,5,3,0,0,2,31,1,2,1,2 +66123,7,2,2,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,35250.588028,36394.049804,2,95,4,4,0.79,3,3,1,0,0,1,50,1,4,6,NA +66124,7,2,2,37,NA,1,1,1,NA,NA,2,NA,2,1,5,NA,1,1,2,2,2,2,1,2,2,1,2,2,2,38218.668882,37878.487888,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +66125,7,2,2,46,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,37411.196266,38309.127338,1,102,14,14,4.59,3,3,0,0,1,2,46,1,4,1,1 +66126,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12751.545122,13320.887973,2,101,9,9,4.08,2,2,0,0,2,2,67,1,5,1,3 +66127,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,11982.125462,2,97,7,7,2.65,2,2,0,1,1,2,61,1,4,3,NA +66128,7,2,2,1,14,2,2,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8230.248767,8808.52375,2,100,15,15,4.26,5,5,1,1,0,1,54,1,4,1,5 +66129,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,97050.018399,96721.703127,1,99,12,12,NA,1,1,0,0,1,2,60,1,5,3,NA +66130,7,2,2,0,1,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24719.075551,24047.650564,2,91,10,10,3.4,3,3,1,0,0,2,32,1,5,1,5 +66131,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,78018.093799,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +66132,7,2,1,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,29738.952706,30589.306008,2,94,6,3,0.68,3,2,0,0,0,1,26,1,4,5,NA +66133,7,2,1,40,NA,2,2,1,NA,NA,1,1,2,1,7,NA,3,6,NA,1,2,2,2,2,2,1,2,2,1,39096.402803,46193.238956,2,91,14,7,3.94,3,1,0,1,0,1,40,2,3,6,NA +66134,7,2,1,4,NA,1,1,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14505.510202,15541.607306,2,94,8,8,2.7,3,3,1,0,0,1,27,1,3,1,4 +66135,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,NA,NA,NA,1,2,2,1,12861.670836,12561.234288,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +66136,7,2,1,27,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,76458.986322,98479.173389,3,90,9,9,3.64,2,2,0,0,0,1,27,2,4,1,5 +66137,7,2,1,20,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,12135.693667,13397.909622,1,90,15,15,5,5,5,0,2,0,1,47,2,5,1,5 +66138,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16579.134475,17201.146893,3,91,15,15,5,4,4,1,1,0,1,39,2,5,1,5 +66139,7,2,1,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,21571.318341,25887.074025,1,102,7,7,1.8,5,4,1,0,2,1,47,1,3,5,NA +66140,7,2,2,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,11879.290971,12794.969668,2,96,77,77,NA,1,1,0,0,1,2,63,1,3,5,NA +66141,7,2,1,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,1,2,1,2,2,1,2,2,NA,69210.206708,71835.969778,1,98,14,14,4.96,2,2,0,0,2,1,71,1,5,1,5 +66142,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,27271.751091,27454.884133,2,101,6,2,0.46,3,1,0,0,0,1,21,1,4,5,NA +66143,7,2,2,2,24,2,2,1,2,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9611.087345,9740.345081,2,93,9,9,2.6,4,4,2,0,0,2,20,1,5,1,3 +66144,7,2,2,4,NA,1,1,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19235.084509,21236.049482,3,92,7,7,1.65,4,4,1,1,0,1,27,1,3,1,3 +66145,7,2,2,5,NA,4,4,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13130.790087,14128.876607,2,102,5,3,0.63,5,4,2,1,0,1,24,1,4,6,NA +66146,7,2,2,6,NA,3,3,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21910.300386,22800.721264,1,99,3,3,0.88,2,2,0,1,0,2,48,1,1,3,NA +66147,7,2,2,57,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,2,NA,1,2,1,1,2,1,1,2,2,NA,13697.309651,14098.608838,1,103,2,2,0.53,2,2,0,0,0,1,29,2,4,5,NA +66148,7,2,1,0,6,4,4,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7434.326058,7971.593122,1,100,8,8,1.7,5,5,2,0,0,2,26,1,3,5,NA +66149,7,2,1,18,NA,4,4,2,18,227,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,14,14,4.03,4,4,0,1,0,2,40,1,5,1,5 +66150,7,2,2,72,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,1,2,1,2,2,1,2,2,NA,17029.680467,17622.254657,1,101,6,6,1.43,4,4,0,1,2,2,72,1,2,1,NA +66151,7,2,2,74,NA,4,4,2,NA,NA,2,NA,2,1,9,NA,2,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,16291.303936,17381.577792,1,93,2,2,0.61,2,2,0,0,1,2,45,2,3,5,NA +66152,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,13093.362366,12735.028157,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +66153,7,2,1,78,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,15176.622228,16064.120023,1,101,4,4,1.11,2,2,0,0,1,1,78,1,4,2,NA +66154,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,68074.313029,74840.450144,1,101,3,3,1.16,1,1,0,0,1,1,74,1,2,2,NA +66155,7,2,2,19,NA,4,4,1,19,230,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11078.202838,10933.134393,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +66156,7,2,2,15,NA,4,4,2,15,189,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,6,6,0.86,6,6,0,4,0,2,32,1,4,6,NA +66157,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,47098.572584,50542.386793,1,95,7,7,2.72,2,2,0,0,2,1,80,1,3,1,3 +66158,7,2,1,11,NA,5,6,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9175.735601,9896.833095,3,91,15,15,5,4,4,1,1,0,1,40,2,5,1,5 +66159,7,2,2,6,NA,5,6,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9007.62445,9504.796896,2,102,8,8,1.72,5,5,0,2,1,1,63,2,5,1,5 +66160,7,2,2,36,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,NA,NA,NA,NA,27627.442402,28606.852107,1,99,14,14,5,2,2,0,0,1,2,64,1,3,3,NA +66161,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,14979.892428,16276.055879,1,92,3,3,0.98,2,1,0,0,1,1,53,NA,NA,5,NA +66162,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,2,2,2,2,2,2,2,2,2,2,10614.141896,11057.12801,2,93,15,15,5,2,2,0,0,2,1,60,2,5,1,5 +66163,7,2,1,12,NA,1,1,1,12,147,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18242.832494,18521.680571,1,102,6,6,1.03,6,6,0,4,0,1,34,2,2,1,1 +66164,7,2,2,6,NA,4,4,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8292.876947,8466.609309,1,102,1,1,0,5,5,0,3,0,2,41,1,4,1,4 +66165,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,26847.643051,28699.104328,1,98,5,5,1.05,3,3,1,0,0,1,24,1,3,1,3 +66166,7,2,2,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,8211.623817,2,101,2,2,0.22,4,4,1,1,0,2,41,1,2,4,NA +66167,7,2,2,23,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,11717.478547,12264.683949,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +66168,7,2,2,8,NA,3,3,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,53931.048037,53769.024148,2,96,7,7,2.38,2,2,0,1,0,2,30,1,4,3,NA +66169,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105295.506815,106646.104223,2,94,15,15,5,3,3,0,1,1,1,63,1,5,1,3 +66170,7,1,1,2,24,5,7,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25107.382643,0,1,101,13,13,NA,3,3,1,0,0,2,20,1,2,6,NA +66171,7,2,2,6,NA,4,4,2,6,80,NA,NA,2,1,3,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9235.947079,9578.084112,1,96,9,9,2.78,4,4,0,2,0,1,54,2,5,4,NA +66172,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,53634.754806,54437.113731,1,98,3,3,0.73,3,3,0,0,0,1,52,1,4,1,3 +66173,7,2,2,32,NA,1,1,1,NA,NA,2,NA,2,1,99,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,39561.667842,40925.159766,2,98,2,2,0.27,4,4,2,1,0,2,32,2,2,5,NA +66174,7,2,2,4,NA,4,4,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11231.392369,2,100,5,5,0.88,5,5,2,1,0,2,30,1,4,6,NA +66175,7,2,1,13,NA,3,3,2,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30943.024697,32205.010072,1,98,3,3,0.5,5,5,0,3,0,2,56,1,3,3,NA +66176,7,2,1,0,5,3,3,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30452.785006,32601.018115,3,92,15,15,5,4,4,2,0,0,1,38,1,5,1,5 +66177,7,2,1,44,NA,4,4,1,NA,NA,2,NA,2,2,1,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,22480.961662,23102.216297,1,98,6,6,1.57,3,3,0,0,2,1,66,2,2,1,4 +66178,7,2,1,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10420.275705,10827.833191,2,96,14,14,3.06,5,5,1,1,1,2,54,1,3,6,NA +66179,7,2,2,23,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,1,NA,NA,NA,1,2,2,1,16937.04417,17660.28577,1,92,2,2,0.33,5,5,0,1,0,1,51,2,1,4,NA +66180,7,2,2,15,NA,5,6,2,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,7284.336217,7807.466703,3,90,2,2,0.45,3,3,0,1,0,1,55,2,1,1,3 +66181,7,2,2,11,NA,3,3,2,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58907.362493,59749.51689,1,91,14,14,4.03,4,4,0,2,0,1,52,1,4,1,5 +66182,7,2,1,7,NA,3,3,2,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25019.74954,25881.463934,1,101,3,3,0.44,5,5,0,3,0,1,35,1,3,1,4 +66183,7,2,2,14,NA,4,4,2,14,173,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14143.201945,13910.07431,2,97,2,2,0.33,4,4,2,1,0,2,34,1,2,5,NA +66184,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25807.688156,25402.018879,1,100,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +66185,7,2,2,2,NA,3,3,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23729.271287,24041.081904,1,94,3,3,0.65,3,3,1,0,0,2,20,1,4,6,NA +66186,7,2,2,45,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,1,1,2,1,2,2,2,2,40337.933888,43242.784835,2,98,13,13,NA,5,5,0,2,0,1,48,2,1,1,2 +66187,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,26847.643051,28699.104328,1,98,5,3,1.07,4,1,2,0,0,1,24,1,3,6,NA +66188,7,2,1,7,NA,2,2,1,7,88,NA,NA,2,1,2,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11778.213296,12552.114189,2,93,5,5,0.87,4,4,1,1,0,1,41,2,5,1,3 +66189,7,2,1,47,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,31640.296506,32716.968709,2,94,12,12,NA,4,4,0,2,0,1,47,2,2,1,2 +66190,7,2,2,1,18,5,7,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7280.108168,7886.672866,3,91,14,14,3.17,6,6,1,3,0,1,39,1,4,1,5 +66191,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,24382.996387,23715.691726,1,92,3,3,0.98,2,2,0,0,1,1,70,1,2,1,2 +66192,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,32785.873783,35446.092694,1,94,9,9,3.8,2,2,0,0,2,1,80,1,4,1,4 +66193,7,2,2,25,NA,4,4,2,NA,NA,2,NA,2,2,1,NA,4,1,2,1,2,1,1,2,2,NA,NA,NA,NA,21640.010524,20942.104189,1,93,6,6,1.35,3,3,0,1,0,1,32,2,4,1,4 +66194,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,149804.257477,155051.140087,1,97,15,15,5,3,3,0,1,2,2,63,1,5,1,NA +66195,7,2,2,9,NA,4,4,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7619.934086,8032.046596,2,103,6,6,1.3,4,4,1,1,0,2,26,1,4,1,3 +66196,7,2,2,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,NA,NA,NA,NA,36053.766709,35796.14047,1,100,5,5,0.85,5,5,0,2,0,2,54,1,2,2,NA +66197,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,10536.096735,10975.825598,2,93,5,5,1.32,2,2,0,0,2,1,71,2,4,1,1 +66198,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,11762.034222,11824.231183,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +66199,7,2,2,58,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,2,2,2,1,2,2,1,19676.781212,20033.616894,2,103,12,12,NA,3,3,0,0,1,1,60,2,2,1,2 +66200,7,2,1,10,NA,1,1,1,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12577.115885,12876.06354,2,96,7,7,1.79,4,4,0,2,0,1,43,2,3,1,2 +66201,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,159455.333031,1,101,8,8,2.24,4,4,0,1,0,1,45,1,4,1,NA +66202,7,2,1,61,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,5201.567667,6086.620135,2,92,99,77,NA,7,3,3,3,1,1,61,2,1,1,3 +66203,7,2,1,17,NA,5,7,2,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13748.325141,13775.506705,1,97,15,15,5,6,6,0,1,1,2,53,1,4,1,NA +66204,7,2,2,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,36053.766709,37031.002154,1,100,14,14,3.47,4,4,2,0,0,1,34,1,5,1,5 +66205,7,2,2,28,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,112991.277498,114001.49655,1,93,14,14,5,1,1,0,0,0,2,28,1,5,3,NA +66206,7,2,1,62,NA,4,4,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,7973.883342,8036.257566,1,100,9,9,2.88,3,3,0,0,1,1,62,2,5,1,4 +66207,7,2,1,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,7663.797586,8115.960731,1,96,7,7,3.58,1,1,0,0,1,1,80,1,1,2,NA +66208,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,35958.875702,38183.099815,1,98,8,8,2.62,4,3,0,0,0,1,53,1,2,1,3 +66209,7,2,1,15,NA,4,4,1,16,192,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13731.625553,14242.275028,1,100,14,14,5,3,3,0,1,1,2,44,1,4,5,NA +66210,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9113.905743,10210.592308,3,90,3,3,0.78,3,3,0,1,2,1,80,2,3,1,2 +66211,7,2,2,8,NA,5,7,1,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7877.267255,8558.823016,2,94,15,15,4.44,5,5,0,1,1,2,74,1,5,2,NA +66212,7,2,1,8,NA,1,1,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,16747.549238,17012.570163,2,96,4,4,0.81,4,4,1,1,0,1,36,2,1,6,NA +66213,7,2,1,18,NA,5,7,1,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,93641.872053,93270.118243,2,98,10,10,3.04,4,4,0,0,0,1,55,1,4,1,4 +66214,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,1,2,NA,30548.472436,31485.669458,1,101,7,7,1.83,3,3,0,0,2,1,67,1,1,1,2 +66215,7,2,1,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,28739.023279,1,94,3,3,1.16,2,1,0,0,0,2,36,1,3,5,NA +66216,7,2,2,8,NA,5,6,1,8,105,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9620.269705,11100.236566,2,91,6,6,1.26,5,5,0,2,0,2,47,2,1,1,1 +66217,7,2,2,51,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,1,1,2,1,2,2,2,2,28701.155283,32172.514581,2,98,7,7,2.25,3,3,0,1,0,2,51,2,1,1,1 +66218,7,2,2,43,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,3,1,2,2,1,2,2,1,2,2,1,34666.955582,39600.756419,1,97,6,6,2.24,2,1,0,0,0,2,43,1,4,3,NA +66219,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,138322.767578,143283.052066,1,101,7,7,2.64,2,2,0,0,0,1,57,1,2,1,2 +66220,7,2,1,19,NA,3,3,2,20,NA,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,56223.281913,55799.760014,1,99,8,8,2.81,3,3,0,1,0,1,19,1,4,NA,NA +66221,7,2,2,59,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11446.604914,11655.034159,2,92,3,3,0.7,3,3,0,0,0,1,58,2,1,1,1 +66222,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16382.74577,17320.281883,2,99,7,7,1.63,4,4,0,2,0,1,53,1,3,3,NA +66223,7,2,2,9,NA,3,3,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,43528.185872,44344.05334,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +66224,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,42992.537371,49508.460769,2,95,2,2,0.54,1,1,0,0,1,2,80,1,3,2,NA +66225,7,2,2,0,4,4,4,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4439.36229,4707.453058,2,100,14,14,3.06,5,5,1,0,0,1,50,1,5,1,5 +66226,7,1,1,2,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11853.772636,0,2,96,3,3,0.54,4,4,1,1,0,1,29,1,2,1,2 +66227,7,2,1,66,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,6357.471593,6706.752466,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +66228,7,2,1,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,115391.113177,120921.742093,1,102,14,8,4.41,2,1,0,0,0,1,27,1,4,5,NA +66229,7,2,1,71,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,51668.474366,53628.722404,1,99,15,15,5,2,2,0,0,2,2,68,1,3,1,5 +66230,7,2,2,64,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,3,4,NA,2,2,2,2,2,2,1,2,1,2,13676.984152,14509.761798,2,91,8,8,1.85,5,5,0,2,1,1,39,2,3,1,4 +66231,7,2,1,0,4,1,1,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5323.166653,5657.098649,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +66232,7,2,2,17,NA,5,7,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,15,15,5,6,6,0,3,0,1,47,1,5,1,5 +66233,7,2,2,25,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,16937.04417,18839.574737,1,92,14,14,3.3,4,4,2,0,0,1,28,1,4,1,4 +66234,7,2,1,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108504.032354,111983.725775,1,92,6,6,1.62,3,3,1,0,0,2,26,1,5,1,5 +66235,7,2,2,33,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,17978.142628,18308.053591,1,91,5,5,0.89,4,4,2,0,0,1,39,1,4,1,5 +66236,7,2,1,3,NA,1,1,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20874.345556,20902.551716,3,92,12,12,NA,4,4,2,0,0,1,30,1,3,1,4 +66237,7,2,1,52,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,1,2,2,2,2,1,2,26554.904329,26165.252043,2,93,8,8,2.49,3,3,0,0,0,1,52,2,2,1,4 +66238,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,7869.59899,8538.749518,2,100,6,6,2.39,1,1,0,0,1,2,61,1,2,2,NA +66239,7,2,1,80,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,14765.705646,15876.477147,3,91,14,14,5,1,1,0,0,1,1,80,1,5,2,NA +66240,7,2,1,47,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,18194.001026,18423.321012,1,92,14,14,3.69,4,4,0,2,0,1,47,2,4,4,NA +66241,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,4,4,NA,2,2,2,1,2,2,1,2,2,2,18341.621382,19145.40337,2,90,5,5,1.19,3,3,0,0,0,2,50,2,4,4,NA +66242,7,2,2,14,NA,1,1,1,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16781.078148,17378.8338,2,103,2,2,0.22,7,7,0,3,0,2,39,2,1,5,NA +66243,7,2,2,39,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,26465.930618,27183.288271,2,97,15,15,5,4,4,0,2,0,1,47,NA,NA,6,NA +66244,7,2,2,3,NA,1,1,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13366.393396,14756.857003,2,94,4,4,0.81,4,4,2,0,0,1,26,2,2,1,2 +66245,7,2,1,47,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18094.847125,18029.478224,3,91,10,10,4.42,2,2,0,0,0,1,47,2,2,1,NA +66246,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,NA,NA,NA,1,2,2,1,152858.509804,163392.947883,1,95,NA,NA,NA,5,5,0,2,0,2,37,1,3,1,NA +66247,7,2,1,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,9850.66662,10431.854777,2,98,2,2,0.75,1,1,0,0,1,1,70,1,2,2,NA +66248,7,1,1,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,81508.607355,0,1,91,8,8,2.51,3,3,1,0,0,2,24,1,4,1,3 +66249,7,2,2,27,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18801.993237,20649.846581,2,96,8,6,2.39,2,1,0,0,0,1,26,2,5,5,NA +66250,7,2,2,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,1,2,2,1,55628.505329,57174.814545,3,92,4,3,0.52,5,4,0,0,0,2,57,1,4,1,2 +66251,7,2,1,33,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,53303.690379,52901.390578,1,100,4,4,0.78,4,4,0,0,1,1,33,2,1,1,1 +66252,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11017.136221,11794.318892,1,101,1,1,0,2,2,1,0,0,2,32,1,3,3,NA +66253,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,80709.488833,1,101,9,9,2.6,4,4,0,2,0,2,38,1,4,1,4 +66254,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,1,2,NA,2,5,NA,2,2,2,2,2,2,2,2,2,2,10235.0654,10662.230581,2,93,7,7,2.31,2,2,0,0,1,2,40,2,4,5,NA +66255,7,2,1,12,NA,1,1,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,32326.52031,34735.818434,2,98,13,13,NA,5,5,0,2,0,1,48,2,1,1,2 +66256,7,2,2,49,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,5,4,NA,2,2,2,1,2,2,2,2,2,2,31235.666551,31909.585756,3,92,8,8,2.01,4,4,1,0,0,2,49,2,5,4,NA +66257,7,2,1,15,NA,4,4,2,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9509.185342,11220.147089,2,99,2,2,0.2,7,7,1,2,1,1,63,1,1,2,NA +66258,7,2,1,14,NA,5,6,1,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7721.59541,8116.704638,2,96,8,8,2.7,3,3,0,1,0,1,49,2,5,1,5 +66259,7,2,1,45,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,3,16898.996353,17358.625105,1,92,8,8,2.3,4,4,0,1,0,2,41,NA,NA,1,3 +66260,7,2,2,4,NA,5,6,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5373.703942,1,91,10,10,3.78,3,3,1,0,0,1,35,2,5,1,5 +66261,7,2,1,52,NA,3,3,2,NA,NA,2,NA,2,2,7,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,169896.236244,2,91,15,3,0.9,7,1,0,0,1,1,49,NA,NA,5,NA +66262,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,52209.836905,0,1,98,6,6,1.95,2,2,0,0,2,1,80,1,3,1,3 +66263,7,2,1,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,105401.67423,106753.633419,2,92,14,14,5,1,1,0,0,1,1,65,1,5,5,NA +66264,7,2,2,64,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,16352.915834,17178.789759,3,92,5,5,1.26,3,3,0,0,1,1,59,2,1,1,1 +66265,7,2,1,16,NA,4,4,2,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11462.850569,11753.30805,2,100,4,4,0.69,5,5,0,3,0,1,38,1,3,6,NA +66266,7,2,2,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,25052.373156,28677.21758,1,95,9,9,2.3,5,5,2,1,0,1,28,1,3,1,3 +66267,7,2,1,0,9,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17196.879565,17385.815001,2,94,14,14,2.63,6,6,1,3,0,1,39,1,4,1,4 +66268,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,167183.296853,2,91,15,15,5,3,3,0,0,0,2,54,1,4,1,4 +66269,7,2,1,19,NA,3,3,2,19,229,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,88582.269653,92728.90632,1,91,15,15,5,3,3,0,0,0,2,57,1,3,1,3 +66270,7,2,1,76,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12101.489198,12967.543396,1,93,13,13,NA,2,2,0,0,2,1,76,2,5,1,5 +66271,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,14337.499427,15385.847212,1,95,3,3,0.82,2,2,0,0,2,2,80,1,3,1,2 +66272,7,2,2,29,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,4,1,3,1,2,2,1,2,2,1,2,2,1,11408.12687,12544.799584,2,90,5,5,1.08,3,3,0,1,0,2,29,2,4,1,5 +66273,7,2,2,13,NA,2,2,2,13,161,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13824.001771,14551.102227,2,90,8,8,2.7,3,3,0,1,0,2,31,1,5,4,NA +66274,7,2,1,5,NA,1,1,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11776.305841,11467.607256,1,90,4,4,0.46,7,7,2,3,0,2,34,2,1,6,NA +66275,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18626.118419,18025.412332,1,93,7,7,1.79,4,4,0,0,0,2,37,2,4,6,NA +66276,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26595.398371,26621.513872,1,94,3,3,0.79,2,2,0,0,0,1,51,NA,NA,1,4 +66277,7,2,2,19,NA,5,7,1,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9200.381964,9723.240452,2,101,2,1,0,4,1,0,0,0,2,19,1,4,NA,NA +66278,7,2,2,36,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,6,2,2,2,2,1,2,2,2,2,2,2,26494.281052,25779.409691,3,90,7,7,1.48,5,5,0,1,0,1,43,2,1,6,NA +66279,7,2,1,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,8074.676044,8165.637965,2,92,12,12,NA,1,1,0,0,1,1,62,1,4,5,NA +66280,7,2,2,69,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,19159.496319,19898.984475,1,92,77,77,NA,4,4,0,0,2,1,59,2,5,1,5 +66281,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,175997.804296,174522.064022,1,101,7,7,2.31,2,2,0,0,0,1,44,1,3,1,2 +66282,7,2,2,1,16,5,7,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7143.995395,7265.801592,3,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +66283,7,2,2,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,32620.612627,33141.797376,2,98,14,14,3.36,4,4,0,2,0,1,37,1,4,1,4 +66284,7,2,1,12,NA,4,4,1,12,148,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13523.666124,13550.403519,2,98,8,8,2.43,3,3,0,2,0,2,31,1,4,1,NA +66285,7,2,1,51,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17493.087649,18732.743426,1,97,15,15,4.81,5,5,0,1,1,1,51,2,5,1,5 +66286,7,2,1,11,NA,4,4,1,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8714.559478,8865.734494,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +66287,7,2,1,47,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15341.871992,16429.080873,1,90,15,15,5,5,5,0,2,0,1,47,2,5,1,5 +66288,7,2,2,4,NA,5,7,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7143.995395,7265.801592,3,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +66289,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,118219.690774,2,94,7,7,3.21,1,1,0,0,0,1,41,1,5,5,NA +66290,7,2,2,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,162373.29329,165026.206299,2,102,9,9,4.08,2,2,0,0,2,1,70,1,5,1,5 +66291,7,2,2,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,26426.249254,26363.744856,1,99,8,8,4.59,1,1,0,0,0,2,33,1,5,5,NA +66292,7,2,2,9,NA,2,2,1,9,110,NA,NA,2,2,2,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,9897.093392,10755.962815,2,93,6,6,0.93,5,5,1,2,0,1,40,2,4,1,4 +66293,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,106709.949255,125265.093735,1,97,7,7,3.76,1,1,0,0,0,1,33,1,3,5,NA +66294,7,2,1,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,53149.251154,56449.488341,2,91,12,12,NA,2,2,0,0,2,1,76,1,5,1,2 +66295,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,46927.876098,52201.899738,1,91,7,7,4.02,1,1,0,0,1,2,80,1,3,2,NA +66296,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,24213.568265,24151.368594,1,99,3,3,1.1,1,1,0,0,0,1,43,1,5,3,NA +66297,7,2,1,68,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,6358.062034,6381.990744,1,99,7,7,3.03,2,2,0,0,2,1,68,1,3,1,3 +66298,7,2,2,61,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,3,NA,2,2,2,2,2,2,1,2,2,1,8725.210615,9089.36131,2,93,8,8,3.3,2,2,0,0,1,2,61,2,5,3,NA +66299,7,2,2,22,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,5,2,1,2,1,1,2,1,1,2,2,3,11232.759507,11862.956868,1,103,4,4,0.82,3,3,0,0,0,1,48,2,4,1,1 +66300,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,27738.890335,29287.813784,2,101,3,3,0.59,4,3,0,2,0,1,39,1,1,6,NA +66301,7,2,1,12,NA,4,4,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,7,7,2.16,3,3,0,1,0,2,44,1,4,6,NA +66302,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,34922.33705,36456.366148,2,97,5,1,0,2,1,0,0,0,2,45,1,2,4,NA +66303,7,2,2,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28103.729242,2,101,8,8,2.43,3,3,0,1,0,1,35,1,4,6,NA +66304,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,114838.671743,120356.919439,1,91,15,15,5,2,1,0,0,0,1,30,1,5,6,NA +66305,7,2,2,13,NA,4,4,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,12440.215685,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +66306,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,16058.142925,15728.179634,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +66307,7,2,1,44,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,25454.275893,28114.898546,2,102,15,15,5,4,4,0,2,0,1,44,1,3,1,1 +66308,7,2,1,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,32461.799549,34082.06298,1,101,3,3,0.86,2,2,0,0,1,2,80,1,1,2,NA +66309,7,2,2,30,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,26546.087356,27263.66872,1,102,4,4,1.02,2,2,0,1,0,2,30,1,2,5,NA +66310,7,2,2,53,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12649.084278,13204.362319,3,90,3,3,0.75,3,3,0,0,0,1,55,2,4,1,3 +66311,7,2,1,39,NA,5,7,1,NA,NA,1,1,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13833.910151,14953.425412,2,103,15,15,5,3,3,0,1,0,2,37,2,5,1,5 +66312,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,28280.669788,29879.976389,1,99,14,14,5,2,2,0,0,2,1,80,1,4,1,4 +66313,7,2,2,1,17,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,15816.39252,3,92,4,4,0.65,4,4,2,0,0,2,20,1,3,5,NA +66314,7,1,1,2,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13968.423539,0,2,102,3,3,0.7,3,3,1,0,0,1,28,2,2,1,2 +66315,7,2,1,2,NA,1,1,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13281.490378,14230.158403,1,98,8,8,1.95,4,4,1,1,1,2,59,1,3,1,1 +66316,7,2,2,0,8,3,3,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11902.236733,11578.945551,2,97,5,5,1.24,3,3,1,0,0,2,27,1,3,1,3 +66317,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,126435.397679,126594.17356,1,91,10,10,2.77,5,5,0,3,0,1,43,1,5,1,5 +66318,7,2,2,6,NA,4,4,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7746.357421,7953.594257,1,99,6,6,1.34,4,4,0,2,0,1,40,1,4,1,4 +66319,7,1,2,76,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,76025.86855,0,2,98,14,14,5,2,2,0,0,2,1,78,1,5,1,3 +66320,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,14519.343202,14452.61667,2,90,6,6,0.96,5,5,0,1,0,1,55,1,4,6,NA +66321,7,2,2,71,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,56693.798097,58632.718368,1,103,12,6,2.51,3,1,0,0,1,2,71,1,5,3,NA +66322,7,1,1,56,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17796.910402,0,2,103,8,8,4.83,1,1,0,0,0,1,56,1,5,5,NA +66323,7,2,2,49,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,34954.173075,37355.359293,2,98,5,5,1.07,4,4,0,1,0,1,53,2,1,1,1 +66324,7,2,1,1,13,4,4,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5853.073657,6453.970807,2,95,2,2,0.41,3,3,2,0,0,2,19,1,2,NA,NA +66325,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,18670.751147,19670.682386,1,96,10,10,2.95,4,4,0,1,0,2,34,2,3,1,5 +66326,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16429.782444,20771.252762,3,90,14,14,5,2,2,0,0,0,1,47,1,2,5,NA +66327,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,2,2,2,2,2,2,2,2,1,2,9404.30514,9554.950099,2,93,15,15,5,2,2,0,0,2,1,60,2,5,1,5 +66328,7,2,2,12,NA,5,6,2,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,15,15,4.81,5,5,0,1,1,1,51,2,5,1,5 +66329,7,2,1,6,NA,5,7,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7482.593572,7851.213843,1,101,4,4,0.78,4,4,1,2,0,2,31,1,4,3,NA +66330,7,2,2,2,NA,3,3,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,55441.113009,56169.627907,1,92,9,9,3.04,3,3,1,0,0,1,48,1,3,1,4 +66331,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,36067.495928,36452.676481,1,95,2,2,0.83,1,1,0,0,1,2,77,1,4,2,NA +66332,7,2,1,19,NA,4,4,1,19,238,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14848.504688,14956.646891,1,98,2,1,0.36,2,1,0,0,0,1,19,1,4,NA,NA +66333,7,2,1,6,NA,2,2,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10738.959181,10632.988891,2,93,9,9,3.14,3,3,0,2,0,2,34,2,5,3,NA +66334,7,2,1,37,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,1,1,2,2,1,2,2,2,40003.013263,42339.292617,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +66335,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,15262.313583,15991.170182,1,98,5,5,0.74,5,5,0,3,0,1,35,1,2,6,NA +66336,7,2,1,71,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,43078.255639,45597.38383,1,93,12,12,NA,1,1,0,0,1,1,71,1,5,5,NA +66337,7,2,2,9,NA,5,6,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3972.173341,4164.719478,1,103,77,77,NA,6,6,0,2,2,1,70,NA,NA,1,1 +66338,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,71034.153987,76359.172033,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +66339,7,2,1,18,NA,1,1,2,18,220,2,NA,2,2,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26704.187335,28443.712885,1,95,9,9,2.46,4,4,0,0,0,1,42,2,2,1,3 +66340,7,2,1,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8143.831412,8871.858164,2,102,10,10,3.04,4,4,2,0,0,2,31,2,2,1,NA +66341,7,2,1,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,142634.419514,148973.13954,1,100,15,15,4.63,5,5,0,0,0,1,51,1,5,1,3 +66342,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,29733.812317,40471.383048,1,101,1,1,0,2,2,1,0,0,2,32,1,3,3,NA +66343,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114993.808573,116714.079488,1,98,7,1,0.27,4,1,0,0,0,2,20,1,4,5,NA +66344,7,2,2,7,NA,4,4,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8610.003992,8918.857984,2,93,6,6,1.15,5,5,3,1,0,1,29,1,3,5,NA +66345,7,1,2,25,NA,5,6,NA,NA,NA,2,NA,2,2,2,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,16021.911789,0,1,91,9,9,2.97,3,3,1,0,0,1,31,2,5,1,5 +66346,7,2,2,17,NA,5,7,1,17,207,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8111.892084,8425.568811,3,91,15,15,5,4,4,0,2,0,1,38,2,5,1,5 +66347,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,29265.714405,31405.602677,1,95,12,12,NA,3,3,0,0,2,2,56,1,3,5,NA +66348,7,2,2,13,NA,5,7,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8164.811332,8249.972742,1,93,15,15,5,5,5,1,2,0,2,40,1,5,1,5 +66349,7,2,2,24,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,10550.607376,12189.917123,2,100,6,6,1.62,3,3,1,0,0,1,32,1,3,1,3 +66350,7,2,1,14,NA,1,1,2,14,171,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,19483.203262,19562.510174,2,94,7,7,1.23,6,6,2,1,0,1,33,2,1,6,NA +66351,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,53612.939104,58717.503545,1,95,15,15,5,2,2,0,0,2,2,80,1,4,1,4 +66352,7,2,2,18,NA,2,2,1,18,224,2,NA,2,2,3,12,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,12970.724558,13432.752316,2,103,5,5,0.65,6,6,1,0,1,2,61,2,1,2,NA +66353,7,2,1,5,NA,1,1,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,14716.463544,14890.443704,2,96,4,4,0.69,5,5,2,0,0,2,57,2,1,4,NA +66354,7,2,2,6,NA,1,1,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,20753.369981,21498.66298,1,97,6,3,0.45,7,6,2,1,0,1,29,2,2,1,1 +66355,7,2,1,62,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,1,1,2,2,1,2,1,NA,7576.466116,7992.718813,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +66356,7,1,1,0,1,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8390.245917,0,1,92,7,7,1.83,3,3,1,1,0,2,28,1,3,5,NA +66357,7,1,1,52,NA,1,1,NA,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,1,1,2,1,NA,NA,NA,NA,26478.915067,0,1,102,99,99,NA,5,5,0,2,1,1,52,2,1,1,1 +66358,7,2,1,64,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,131818.641085,133509.443669,1,102,15,15,5,2,2,0,0,2,2,63,1,4,1,4 +66359,7,2,2,10,NA,3,3,2,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,72263.168327,73296.260667,2,91,15,15,5,3,3,0,2,0,1,44,2,5,3,NA +66360,7,2,2,6,NA,1,1,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10118.363218,10311.586628,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +66361,7,2,1,4,NA,2,2,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,17306.08847,2,98,6,6,1.07,5,5,3,0,0,2,24,1,3,1,3 +66362,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,36187.441698,36468.041201,1,92,5,5,1.05,3,3,0,0,0,2,55,1,4,4,NA +66363,7,2,2,4,NA,2,2,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16921.080098,17459.476859,1,91,7,7,1.66,4,4,2,0,0,1,32,2,5,1,4 +66364,7,1,2,2,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10806.348349,0,2,91,6,6,0.93,5,5,1,2,0,2,50,2,1,5,NA +66365,7,2,1,4,NA,3,3,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23328.816247,26320.448782,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +66366,7,2,2,26,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,1,1,2,2,1,2,2,1,2,2,1,26388.213487,25090.218308,2,96,6,2,0.64,2,1,0,0,0,2,26,1,2,5,NA +66367,7,2,2,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9399.281543,9696.12347,2,96,6,6,1.32,5,5,1,3,0,2,30,1,4,3,NA +66368,7,2,1,7,NA,1,1,2,7,91,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10591.186197,11647.778431,1,90,4,4,0.46,7,7,2,3,0,2,34,2,1,6,NA +66369,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19943.783243,19397.969296,2,95,9,9,5,1,1,0,0,0,2,48,1,4,3,NA +66370,7,2,1,2,NA,1,1,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12413.685227,13300.367814,1,102,5,5,0.98,4,4,1,1,0,2,42,2,2,6,NA +66371,7,2,1,77,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,10244.849903,10769.823368,2,99,6,6,1.98,2,2,0,0,2,1,77,1,3,1,3 +66372,7,2,1,5,NA,4,4,2,5,67,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7246.488236,7794.862746,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +66373,7,2,2,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,38724.771087,39491.917359,1,94,3,3,0.86,2,2,0,0,2,1,68,1,4,1,2 +66374,7,2,2,3,NA,1,1,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9468.006743,10197.085534,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +66375,7,2,1,31,NA,3,3,2,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,59510.728426,64240.841943,1,99,77,77,NA,4,4,1,1,0,1,31,2,3,1,3 +66376,7,2,1,10,NA,3,3,2,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23796.980721,24835.204126,1,95,5,5,1.03,4,4,0,2,0,1,33,1,3,1,3 +66377,7,2,1,43,NA,3,3,2,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,20650.777724,21846.156397,2,97,1,1,0.21,4,4,2,0,0,2,34,2,1,1,2 +66378,7,2,2,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,162969.911481,163428.386694,1,101,6,6,2.42,1,1,0,0,0,2,59,1,3,3,NA +66379,7,2,2,1,22,2,2,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11346.120897,12219.822862,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +66380,7,2,2,0,0,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,29555.41642,28752.625674,3,92,14,14,5,3,3,1,0,0,2,36,1,5,6,NA +66381,7,2,1,66,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,5854.547456,5900.343568,2,99,3,3,1.24,1,1,0,0,1,1,66,1,4,2,NA +66382,7,2,2,40,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,40337.933888,43255.958723,3,92,10,10,2.82,4,4,0,1,1,1,36,1,3,1,5 +66383,7,2,2,3,NA,5,6,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6184.163292,6565.044513,1,91,12,2,0.48,7,2,2,2,0,2,54,NA,NA,1,NA +66384,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,17246.716674,18154.82322,1,99,6,6,1.12,4,4,0,2,0,1,39,1,3,1,3 +66385,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,37453.906829,43130.398676,2,100,3,3,0.65,3,3,0,0,2,2,62,1,3,3,NA +66386,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,4,4,NA,2,2,2,2,2,2,NA,NA,NA,NA,17465.336559,18230.717255,3,90,10,10,3.04,4,4,0,0,2,2,80,2,1,3,NA +66387,7,2,2,2,NA,1,1,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,11414.885224,12293.882349,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +66388,7,2,2,7,NA,4,4,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7814.742747,8106.808519,2,95,1,1,0.25,3,3,1,1,0,2,26,1,2,5,NA +66389,7,2,1,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,145342.530024,151393.302038,1,99,12,12,NA,2,2,0,0,0,1,55,1,5,1,4 +66390,7,2,2,9,NA,1,1,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17053.854294,17778.314301,3,92,5,5,0.95,4,4,0,2,0,2,51,2,5,1,1 +66391,7,2,2,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,122655.643802,126707.897291,3,91,15,15,5,2,2,0,0,0,2,28,1,5,1,5 +66392,7,2,1,14,NA,5,6,2,14,170,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8305.829479,8595.334823,1,93,15,15,5,3,3,0,2,0,2,48,2,5,3,NA +66393,7,2,2,43,NA,5,7,1,NA,NA,2,NA,2,1,7,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20577.778251,21052.363481,1,92,14,5,2.06,2,1,0,0,0,2,43,2,4,5,NA +66394,7,2,2,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7051.674614,7594.685042,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +66395,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,12969.776823,15634.514863,2,90,4,4,0.81,3,3,0,1,0,2,41,2,2,6,NA +66396,7,2,2,46,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,19299.941018,19401.997997,2,102,5,5,1.08,3,3,0,1,0,2,46,2,1,5,NA +66397,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,14699.320127,14652.436145,2,90,6,6,0.96,5,5,0,1,0,1,55,1,4,6,NA +66398,7,2,1,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,1,2,1,1,2,1,2,2,NA,17113.447343,18123.138698,2,101,77,77,NA,2,2,0,0,2,1,70,1,2,5,NA +66399,7,2,1,61,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,6815.198656,6994.794831,3,90,15,15,5,2,2,0,0,2,1,61,1,5,1,5 +66400,7,2,2,11,NA,5,7,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10699.45895,11230.540406,1,97,8,8,2.51,3,3,0,2,0,2,39,2,4,2,NA +66401,7,2,2,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14414.529053,14783.957167,2,96,1,1,0.06,5,5,2,1,0,1,27,2,3,1,4 +66402,7,2,1,60,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,15,6,2.3,3,1,0,0,2,2,73,1,4,3,NA +66403,7,2,2,5,NA,1,1,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,17887.570772,19748.358154,1,92,4,4,0.74,4,4,1,1,0,1,51,2,1,1,1 +66404,7,2,2,35,NA,3,3,2,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,59095.849383,59277.549533,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +66405,7,2,1,58,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,15601.50288,15551.741356,2,99,99,3,0.9,7,1,1,0,1,1,60,NA,NA,1,NA +66406,7,2,1,10,NA,5,6,2,10,120,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7923.925927,8546.646915,1,91,77,77,NA,4,4,0,2,0,1,50,2,5,1,5 +66407,7,2,2,9,NA,2,2,2,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,15148.721588,15796.67129,2,91,2,2,0.22,4,4,0,3,0,2,45,2,5,4,NA +66408,7,2,2,0,6,4,4,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3756.765605,4035.952682,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +66409,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,31552.004994,1,95,6,6,1.09,5,5,0,3,0,1,31,1,4,1,4 +66410,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,27356.080541,28721.124083,1,101,6,6,1.31,3,3,0,2,0,1,43,1,3,4,NA +66411,7,2,2,11,NA,4,4,2,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7814.742747,8587.431439,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +66412,7,2,2,41,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,4,1,2,2,2,2,2,2,2,NA,NA,NA,NA,32606.880052,32776.922157,2,93,6,6,0.93,5,5,1,2,0,1,40,2,4,1,4 +66413,7,2,2,4,NA,5,7,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11412.589323,11707.167617,3,91,6,6,1.75,3,3,1,1,1,1,63,1,5,4,NA +66414,7,1,2,4,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8937.555666,0,2,99,15,15,5,3,3,1,0,0,2,34,1,5,1,5 +66415,7,2,1,1,20,2,2,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,15546.999135,16657.487532,3,92,NA,NA,NA,4,4,1,0,1,1,67,NA,NA,77,NA +66416,7,2,2,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,131590.908764,1,98,8,8,3.3,2,2,0,0,1,1,50,NA,NA,1,3 +66417,7,2,2,5,NA,4,4,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12819.235788,13388.4749,1,98,5,5,1.26,3,3,1,1,0,2,27,1,5,5,NA +66418,7,2,2,26,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,1,3,1,2,2,1,2,2,1,2,2,1,16844.740449,17564.040518,1,94,10,10,4.76,2,2,0,0,0,1,58,1,5,1,4 +66419,7,2,2,7,NA,1,1,1,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16664.698857,1,92,6,6,1.12,4,4,0,2,0,1,20,1,2,1,2 +66420,7,2,1,12,NA,5,6,1,12,152,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6747.259224,7022.128717,2,94,15,15,5,5,5,0,2,1,1,47,2,5,1,5 +66421,7,2,1,73,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,12146.092906,13015.339209,1,96,9,9,4.23,2,2,0,0,2,2,71,2,5,1,5 +66422,7,2,2,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,29248.061332,30978.18811,1,102,7,7,1.57,4,4,0,2,0,2,33,1,4,1,4 +66423,7,2,1,7,NA,5,6,2,7,91,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6620.63733,7182.792631,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +66424,7,2,2,14,NA,1,1,1,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18674.868029,19048.995585,2,92,8,8,1.42,7,7,0,4,0,2,37,1,1,6,NA +66425,7,2,1,79,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9257.537917,9255.717695,1,99,5,5,1.69,2,2,0,0,2,1,79,1,1,1,4 +66426,7,2,2,2,NA,1,1,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10990.75621,2,94,14,14,3.58,4,4,1,0,1,1,80,1,3,2,NA +66427,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,1,8746.76562,8644.133303,2,97,15,15,5,3,3,0,0,3,2,80,1,3,2,NA +66428,7,2,2,1,15,5,7,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7483.230909,7475.326886,2,96,15,15,5,3,3,1,0,0,1,39,1,4,1,4 +66429,7,2,2,69,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,2,2,2,2,2,2,1,2,2,2,9716.805546,10308.451947,2,90,2,2,0.73,1,1,0,0,1,2,69,2,4,3,NA +66430,7,2,1,11,NA,1,1,1,11,142,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11036.458246,10927.552283,1,102,13,13,NA,6,6,1,2,0,2,36,2,4,6,NA +66431,7,2,2,23,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,85402.868381,88914.492385,2,94,15,6,2.94,2,1,0,0,0,1,29,1,4,6,NA +66432,7,2,2,9,NA,3,3,2,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17668.551726,18764.602322,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +66433,7,2,2,11,NA,3,3,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16950.724686,16668.200588,2,98,5,5,0.8,5,5,1,3,0,2,37,NA,NA,4,NA +66434,7,2,2,17,NA,2,2,2,17,210,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17848.732433,18700.272027,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +66435,7,2,1,3,NA,2,2,2,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15372.687224,15393.459347,1,90,6,6,1.68,3,3,1,1,0,2,36,2,4,4,NA +66436,7,2,2,74,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,1,1,2,2,1,2,1,NA,18266.489157,18835.667339,1,100,5,5,1.18,3,3,0,0,2,2,34,2,5,5,NA +66437,7,2,1,9,NA,5,7,1,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8439.403196,8726.876152,1,103,3,3,0.37,5,5,1,2,0,2,30,1,4,5,NA +66438,7,2,1,44,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,4,3,NA,2,2,2,2,2,2,2,2,1,2,35393.002863,35146.477046,2,93,3,3,0.58,4,4,0,1,1,1,65,2,1,3,NA +66439,7,2,2,48,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,34954.173075,42301.098402,2,98,7,7,1.53,5,5,0,0,0,2,48,1,3,5,NA +66440,7,2,1,8,NA,2,2,2,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12477.812875,13297.681754,2,94,8,8,2.01,4,4,1,1,0,1,44,2,4,1,4 +66441,7,2,1,74,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,11550.158096,12419.035396,2,94,8,8,1.8,6,6,0,1,2,1,74,2,5,1,5 +66442,7,2,1,48,NA,3,3,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,79677.823556,83116.431703,1,99,15,15,4.47,4,4,0,2,0,2,52,2,5,1,5 +66443,7,2,2,38,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,5,2,2,2,1,2,2,1,2,2,2,2,45655.090694,60280.136423,3,92,4,4,1.12,2,2,0,1,0,2,38,2,1,5,NA +66444,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,21969.841763,21746.409123,1,96,15,15,5,1,1,0,0,0,2,43,1,5,5,NA +66445,7,2,2,11,NA,1,1,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17053.854294,17496.484818,2,98,8,8,2.26,4,4,0,1,0,2,43,1,3,1,2 +66446,7,2,1,4,NA,4,4,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7466.078788,7482.321895,1,96,3,2,0.16,7,6,1,4,0,2,32,1,2,5,NA +66447,7,2,1,27,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16598.645683,2,100,5,5,0.88,5,5,2,1,0,2,30,1,4,6,NA +66448,7,2,1,44,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,11113.602843,11073.454175,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +66449,7,2,1,62,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,7289.557268,7804.776102,3,90,77,77,NA,2,1,0,0,1,1,62,2,5,3,NA +66450,7,2,2,7,NA,3,3,2,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,74327.830279,75742.187091,2,91,6,6,1.34,4,4,1,2,0,2,33,1,4,3,NA +66451,7,2,2,52,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,24902.414229,25152.803056,1,90,9,9,5,1,1,0,0,0,2,52,2,3,5,NA +66452,7,2,1,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6992.24593,7205.816818,2,97,3,1,0.44,3,1,2,0,0,2,20,1,2,5,NA +66453,7,2,2,22,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16021.911789,17903.386129,1,91,12,2,0.48,7,2,2,2,0,2,54,NA,NA,1,NA +66454,7,2,1,13,NA,4,4,1,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19401.033367,19892.636678,2,102,15,15,5,4,4,0,2,0,1,44,1,3,1,1 +66455,7,2,2,2,NA,1,1,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9132.13761,9422.704955,2,103,9,9,2.6,4,4,2,0,0,2,35,1,4,1,3 +66456,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,12842.559946,13702.031196,2,101,7,7,2.64,2,2,0,0,1,2,70,1,3,4,NA +66457,7,2,1,70,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,16066.082986,17530.388953,1,90,3,3,0.79,2,2,0,0,1,1,70,2,2,1,NA +66458,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,20137.117895,21220.947807,1,97,3,3,1.16,1,1,0,0,1,2,70,1,4,3,NA +66459,7,2,2,15,NA,1,1,1,15,191,NA,NA,2,2,4,9,NA,NA,NA,2,1,1,2,2,1,1,2,2,1,13963.420591,15453.171136,2,103,13,13,NA,3,3,0,1,0,1,47,2,1,1,1 +66460,7,2,1,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,83081.99261,85461.503598,2,92,15,15,5,2,2,0,0,0,1,37,1,5,1,5 +66461,7,2,1,0,11,5,7,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6751.596541,7305.608189,2,92,6,6,1.35,3,3,1,0,0,2,32,1,5,1,5 +66462,7,2,1,57,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,28017.200708,28243.226144,2,102,8,8,4.87,1,1,0,0,0,1,57,1,3,3,NA +66463,7,1,2,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,10683.855206,0,1,96,NA,NA,NA,4,4,1,1,0,2,37,NA,NA,1,4 +66464,7,2,1,21,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37911.437415,38922.114085,2,103,4,4,0.79,3,3,0,0,0,2,42,2,2,5,NA +66465,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,74517.751389,74746.868777,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +66466,7,2,1,6,NA,1,1,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,2,1,1,1,2,2,NA,NA,NA,NA,14150.136224,14374.05449,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +66467,7,2,2,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,25511.973394,27084.821435,1,98,4,4,0.75,4,4,0,1,0,2,48,1,2,1,3 +66468,7,2,1,9,NA,5,7,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24259.597356,25770.339373,3,91,1,1,0.19,3,3,0,2,0,2,50,1,4,3,NA +66469,7,2,1,18,NA,3,3,2,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26749.020961,27839.957403,1,101,1,1,0.08,3,3,1,0,0,2,19,1,2,NA,NA +66470,7,2,2,31,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,3,3,3,1,2,2,1,2,2,1,2,2,1,35353.005268,35220.675513,2,94,7,7,3.21,1,1,0,0,0,2,31,2,3,3,NA +66471,7,2,1,10,NA,4,4,2,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7886.48532,7943.675078,1,99,10,10,3.13,4,4,0,2,0,1,35,1,4,1,5 +66472,7,2,1,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,113655.661464,115113.492348,1,103,15,15,5,2,2,0,0,1,1,61,1,4,1,5 +66473,7,2,1,56,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,144757.450849,145711.976748,1,101,15,15,5,3,3,0,0,2,1,75,1,2,1,2 +66474,7,2,2,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,33331.144292,34526.406365,1,91,1,1,0.2,2,2,0,0,0,1,44,1,2,1,2 +66475,7,2,2,61,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,12403.522912,12838.398002,1,93,12,12,NA,4,4,0,0,2,1,66,2,4,1,2 +66476,7,2,1,60,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,131445.986898,130104.237054,1,101,9,9,5,1,1,0,0,1,1,60,1,4,3,NA +66477,7,1,2,32,NA,2,2,NA,NA,NA,2,NA,2,7,77,NA,2,77,3,2,2,2,2,2,2,NA,NA,NA,NA,27127.983961,0,2,90,77,77,NA,2,2,0,1,0,2,32,2,2,77,NA +66478,7,2,1,14,NA,1,1,1,14,172,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22768.423624,22944.003607,2,98,14,14,2.87,5,5,0,3,0,2,34,1,2,1,2 +66479,7,2,2,2,NA,3,3,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46813.021927,48287.821192,1,91,8,8,2.17,4,4,2,0,0,2,28,1,4,1,5 +66480,7,2,2,13,NA,1,1,1,13,162,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,21818.047789,22992.945413,2,102,7,7,1.79,4,4,0,2,0,1,40,2,2,6,NA +66481,7,2,1,12,NA,2,2,2,12,152,NA,NA,2,2,2,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14081.782012,15478.382268,2,90,3,3,0.46,5,5,0,2,2,1,75,2,1,1,2 +66482,7,2,2,9,NA,1,1,1,9,109,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,16986.005478,17733.622754,2,102,6,6,1,6,6,1,3,0,1,35,2,3,1,3 +66483,7,1,2,13,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,55,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12531.903464,0,2,100,2,2,0.25,4,4,2,1,0,2,39,1,2,5,NA +66484,7,2,1,6,NA,3,3,2,6,80,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23796.980721,25112.597396,1,95,5,5,1.19,3,3,1,1,0,1,47,1,2,3,NA +66485,7,2,2,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,27338.92927,27355.916385,1,96,15,15,5,3,3,0,0,1,2,62,1,4,3,NA +66486,7,2,1,1,23,2,2,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13002.944731,13931.716845,2,91,4,4,0.76,4,4,1,0,0,2,25,2,4,77,NA +66487,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,12556.207754,12615.022145,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +66488,7,2,2,10,NA,5,7,2,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9620.269705,10273.007637,2,91,12,12,NA,4,4,0,2,0,1,40,1,5,1,5 +66489,7,2,1,4,NA,3,3,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,81508.607355,89259.872051,1,91,8,8,2.17,4,4,2,0,0,2,28,1,4,1,5 +66490,7,1,2,57,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,42475.69088,0,1,97,9,5,1.97,2,1,0,0,1,1,61,1,5,3,NA +66491,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,22138.245498,30132.880506,2,93,6,6,2.05,2,2,0,1,0,2,30,1,4,3,NA +66492,7,2,1,13,NA,2,2,2,13,157,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,1,2,NA,19186.411189,19608.692738,1,90,6,6,0.81,6,6,0,3,0,2,45,1,4,1,2 +66493,7,2,2,19,NA,4,4,2,19,238,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16363.914542,16162.453075,1,101,13,13,NA,3,3,1,0,0,2,19,1,2,NA,NA +66494,7,2,1,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,32719.762791,34375.255008,1,101,6,6,1.65,2,2,0,0,0,1,47,1,4,1,2 +66495,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,2,NA,2,2,2,2,2,2,2,2,2,NA,18241.877822,20223.807162,2,93,8,8,2.57,3,3,0,0,1,1,59,2,3,1,3 +66496,7,2,2,2,NA,5,7,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7734.994032,7934.647352,2,95,2,2,0.56,2,2,1,0,0,2,22,1,3,5,NA +66497,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,17794.144581,16918.878285,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +66498,7,2,2,14,NA,3,3,1,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,113907.203714,124196.980527,1,94,8,8,1.67,5,5,1,2,0,1,52,1,4,1,4 +66499,7,2,1,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,114943.792804,135002.90259,2,101,1,1,0.37,1,1,0,0,0,1,21,1,4,5,NA +66500,7,2,1,15,NA,5,6,2,15,189,NA,NA,2,2,2,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7291.654281,7756.692286,3,91,4,4,0.69,5,5,0,2,0,1,45,2,4,1,1 +66501,7,2,1,0,6,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7237.392208,7237.525607,1,102,6,6,1.43,4,4,2,0,0,1,39,2,3,1,3 +66502,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,25212.845431,2,101,2,2,0.46,1,1,0,0,0,1,20,1,4,5,NA +66503,7,2,1,50,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16117.991297,17802.733496,1,96,15,15,5,4,4,1,1,0,1,50,1,3,1,4 +66504,7,2,1,70,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,53028.045147,56320.756196,2,94,8,8,3.23,2,2,0,0,1,1,70,1,4,3,NA +66505,7,2,1,34,NA,1,1,1,NA,NA,2,NA,2,1,5,NA,3,1,NA,2,2,2,1,2,2,1,2,2,2,41155.167164,40844.556107,1,102,5,5,0.92,5,5,0,3,0,2,39,2,3,1,3 +66506,7,2,2,25,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,39833.117645,41470.989238,2,94,4,4,1.16,2,2,0,0,0,1,39,1,2,1,5 +66507,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,53028.045147,62471.592039,2,94,8,8,4.59,1,1,0,0,1,1,74,1,3,3,NA +66508,7,2,2,13,NA,4,4,2,13,159,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16363.914542,16149.629998,1,95,12,12,NA,2,2,0,1,0,2,41,1,4,5,NA +66509,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,51433.805604,53192.834838,1,94,9,9,5,1,1,0,0,1,2,70,1,4,2,NA +66510,7,2,1,11,NA,4,4,1,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10199.928366,10684.945227,1,100,9,9,2.22,5,5,1,2,0,2,40,2,4,1,4 +66511,7,2,2,52,NA,2,2,2,NA,NA,2,NA,2,1,4,NA,4,5,NA,2,2,2,1,2,2,2,2,2,2,27285.659216,28272.553853,1,93,4,4,0.92,3,3,0,0,1,1,60,NA,NA,1,4 +66512,7,2,2,8,NA,1,1,1,8,103,NA,NA,2,2,2,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,21075.336925,21477.798111,1,92,5,5,0.87,4,4,0,2,0,1,42,2,1,1,4 +66513,7,2,1,69,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,2,NA,1,2,1,1,2,1,1,2,1,3,7289.557268,7804.776102,3,90,77,77,NA,4,4,0,0,2,1,69,2,5,2,NA +66514,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,38589.695298,44311.547931,2,96,8,8,4.59,1,1,0,0,0,2,36,1,5,5,NA +66515,7,2,2,70,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,14786.399759,15527.475853,1,90,15,15,5,1,1,0,0,1,2,70,2,5,3,NA +66516,7,2,1,6,NA,1,1,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13927.458372,14007.413517,2,98,14,14,3.91,4,4,1,1,0,1,36,2,3,1,5 +66517,7,2,1,2,NA,4,4,1,2,27,NA,NA,2,1,1,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7366.629832,7382.656579,1,98,10,10,1.89,7,7,3,2,0,1,50,1,5,1,5 +66518,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,10634.832821,11430.282078,2,95,6,6,1.65,2,2,0,0,1,2,80,1,1,2,NA +66519,7,2,2,9,NA,4,4,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11116.391625,11717.604707,1,92,5,5,0.95,4,4,0,2,0,2,33,1,4,5,NA +66520,7,2,2,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,21143.964074,22787.585902,1,100,8,8,2.36,3,3,1,0,0,2,37,1,3,4,NA +66521,7,2,2,8,NA,3,3,2,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15442.305642,15459.941839,2,94,7,7,1.62,5,5,0,3,0,1,30,1,2,1,9 +66522,7,2,2,46,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,154664.071516,157709.344695,3,92,15,15,5,3,3,0,1,0,1,45,1,5,1,5 +66523,7,2,2,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10440.656902,1,99,9,9,5,1,1,0,0,1,2,66,1,5,2,NA +66524,7,2,1,51,NA,3,3,2,NA,NA,2,NA,2,2,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,22746.832388,23155.578286,1,90,7,7,1.55,5,5,0,3,0,1,51,2,3,1,2 +66525,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,151649.038926,156529.976221,1,101,6,6,1.98,2,2,0,0,1,1,80,1,1,2,NA +66526,7,2,1,0,7,3,3,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11414.210614,12219.404134,1,93,6,6,1.16,4,4,2,0,0,2,33,1,5,1,4 +66527,7,2,2,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,14534.533756,15040.28544,1,96,14,14,5,2,2,0,0,1,2,74,1,5,5,NA +66528,7,2,2,13,NA,4,4,2,13,163,NA,NA,2,2,2,6,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,14105.705847,14983.542191,1,93,5,5,0.64,7,7,0,2,1,1,21,2,4,5,NA +66529,7,2,1,0,0,4,4,2,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5360.999096,5443.282885,2,90,6,6,1.4,3,3,1,1,0,2,33,1,4,5,NA +66530,7,2,2,3,NA,5,6,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7143.995395,7774.277146,3,91,15,15,5,4,4,2,0,0,2,33,2,5,1,5 +66531,7,2,2,57,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,24217.957803,24014.890408,2,94,15,15,5,2,2,0,0,1,1,63,1,5,1,4 +66532,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17501.079959,17489.07354,1,90,9,9,2.6,4,4,0,1,0,2,49,2,2,1,5 +66533,7,2,1,79,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,17113.447343,17448.661073,2,101,5,5,1.36,2,2,0,0,1,1,79,1,4,2,NA +66534,7,2,1,3,NA,4,4,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,9588.632035,2,100,1,1,0.06,3,3,1,1,0,2,30,1,4,5,NA +66535,7,2,1,23,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11743.336654,12063.054146,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +66536,7,2,2,52,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,2,2,2,1,2,2,1,2,2,1,19132.515566,20057.4089,3,90,77,77,NA,2,2,0,0,1,1,60,2,5,1,5 +66537,7,2,1,15,NA,3,3,1,15,182,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39918.077466,39803.689785,1,98,9,9,4.03,2,2,0,1,0,2,49,1,5,3,NA +66538,7,2,1,69,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,92913.469106,93784.871586,2,100,8,8,3.4,2,2,0,0,2,1,69,1,4,1,4 +66539,7,2,2,9,NA,3,3,2,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,43531.157975,45562.561553,1,91,7,7,2.05,3,3,0,1,0,2,32,1,3,1,NA +66540,7,2,2,0,4,4,4,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5264.07765,5655.281842,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +66541,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,15783.902141,16840.218806,2,95,5,5,1.45,2,2,0,0,2,1,72,1,3,1,3 +66542,7,2,1,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,8883.099096,8952.58549,2,96,8,8,2.7,3,3,0,0,2,2,52,1,3,1,4 +66543,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18724.594661,18534.166088,2,99,15,15,5,2,2,0,0,0,1,57,1,4,1,5 +66544,7,2,2,37,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,2,1,2,2,1,2,2,1,2,2,1,36053.766709,39664.262913,1,100,8,8,2.36,3,3,1,0,0,2,37,1,3,4,NA +66545,7,2,2,6,NA,4,4,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7814.742747,8106.808519,2,95,1,1,0.09,5,5,3,1,0,2,31,1,2,1,NA +66546,7,2,2,2,NA,2,2,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8867.166874,8986.419761,2,90,6,6,1.12,4,4,1,1,0,2,35,2,4,1,3 +66547,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140586.349952,144513.945685,2,91,15,15,5,2,2,0,0,2,1,65,1,5,1,5 +66548,7,1,2,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,68579.013834,0,1,92,4,4,1.29,2,2,1,0,0,2,24,1,4,3,NA +66549,7,2,2,9,NA,1,1,1,9,117,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14414.529053,14932.182215,2,96,6,6,1.12,4,4,0,3,0,1,26,1,2,77,NA +66550,7,2,2,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,30932.175051,30363.701754,2,101,6,6,1.9,2,2,0,1,0,2,42,1,5,5,NA +66551,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,33109.285968,36756.097052,2,98,3,3,0.75,2,2,0,0,0,1,22,1,2,5,NA +66552,7,2,1,45,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,34825.476578,34314.466393,2,93,6,6,2.69,1,1,0,0,0,1,45,2,4,1,NA +66553,7,2,1,61,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,2,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,6967.511455,7138.703058,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +66554,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,167711.394252,169284.299948,1,101,3,3,0.73,2,2,0,0,1,1,60,1,3,1,5 +66555,7,2,2,1,16,4,4,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6398.740074,6885.115697,1,93,6,6,0.83,6,6,3,1,0,1,37,NA,NA,1,3 +66556,7,2,1,60,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,10,10,3.51,3,3,0,0,1,1,21,1,4,5,NA +66557,7,2,1,13,NA,1,1,2,13,159,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21399.234084,21870.218555,1,91,6,6,1.35,3,3,0,2,0,2,38,1,4,3,NA +66558,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,159097.269198,162641.73095,1,97,15,15,5,3,3,0,0,1,1,64,1,3,1,3 +66559,7,2,1,47,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,38543.316567,38089.298859,1,90,15,15,5,6,6,0,4,0,2,48,1,5,1,5 +66560,7,2,2,5,NA,2,2,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13366.393396,14756.857003,2,94,8,8,2.01,4,4,1,1,0,1,44,2,4,1,4 +66561,7,2,2,42,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,3,2,2,2,2,1,2,2,2,2,2,2,32208.300114,36103.843028,1,102,3,3,0.54,3,3,0,2,0,2,42,2,2,3,NA +66562,7,2,2,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,97925.559493,98801.080755,1,94,10,10,4.3,2,2,0,0,0,1,27,1,5,1,5 +66563,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,15226.654411,15756.489509,1,96,7,7,2.64,2,2,0,0,2,1,68,NA,NA,1,4 +66564,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,105873.555835,105977.518969,1,98,9,9,2.88,6,3,1,3,0,1,51,1,2,1,3 +66565,7,2,2,66,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,37934.469637,38685.959862,1,94,3,3,0.8,2,2,0,0,1,2,66,1,4,3,NA +66566,7,2,1,17,NA,5,6,2,17,204,2,NA,2,1,4,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9099.599144,9679.941995,1,90,15,15,5,3,3,0,1,0,1,39,2,5,1,NA +66567,7,2,2,2,NA,1,1,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7677.363986,8161.370187,2,90,6,6,0.96,5,5,1,1,0,1,39,2,2,1,NA +66568,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,126314.769628,126413.297707,2,95,15,15,5,2,2,0,1,0,2,52,1,5,3,NA +66569,7,2,2,62,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,12994.252166,2,90,2,2,0.64,1,1,0,0,1,2,62,2,2,3,NA +66570,7,2,2,28,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,15665.259727,17204.835995,2,93,77,77,NA,2,2,0,0,0,2,28,2,5,1,5 +66571,7,2,1,13,NA,3,3,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61475.445782,62636.42019,2,92,15,15,5,5,5,0,3,0,2,46,1,5,1,5 +66572,7,1,2,2,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8474.492088,0,1,102,9,9,3.24,3,3,1,0,0,1,40,1,2,1,4 +66573,7,2,1,63,NA,1,1,2,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,9145.939054,9651.644596,1,101,5,5,0.87,4,4,0,0,2,1,63,2,1,1,NA +66574,7,2,1,6,NA,2,2,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14820.807433,14905.891142,2,102,15,15,4.47,4,4,1,1,0,1,32,1,5,1,4 +66575,7,2,1,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,107347.639721,114331.46987,3,92,15,15,5,4,4,2,0,0,1,38,1,5,1,5 +66576,7,2,1,15,NA,4,4,2,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11252.388648,11670.840662,1,99,6,6,1.35,3,3,1,1,0,2,42,1,4,4,NA +66577,7,2,2,11,NA,4,4,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7868.372593,8159.849106,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +66578,7,2,2,18,NA,2,2,1,18,223,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16781.078148,17658.768186,2,103,12,12,NA,4,4,0,1,0,2,50,2,3,1,4 +66579,7,2,1,13,NA,5,6,2,13,162,NA,NA,2,1,3,6,NA,NA,NA,1,1,1,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,99,99,NA,4,4,0,1,0,1,40,2,3,6,NA +66580,7,2,1,1,19,4,4,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7084.261593,7811.556831,1,93,3,3,0.7,3,3,1,0,0,1,23,2,4,1,2 +66581,7,2,2,17,NA,5,6,1,17,209,2,NA,2,1,5,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7534.59005,7613.178065,1,102,15,15,5,3,3,0,1,0,2,49,1,5,1,5 +66582,7,2,1,55,NA,5,6,2,NA,NA,2,NA,2,1,9,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,15215.995952,15234.024078,1,90,10,10,5,1,1,0,0,0,1,55,2,5,2,NA +66583,7,2,1,64,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9611.684527,9576.156071,1,98,12,6,1.98,3,2,0,0,1,1,64,1,4,1,3 +66584,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,122586.881737,126968.15893,1,90,7,7,1.89,3,3,0,0,1,2,75,1,4,3,NA +66585,7,2,1,40,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15271.238172,15463.719206,3,91,15,15,5,3,3,1,0,0,1,40,2,5,1,5 +66586,7,2,1,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17265.374984,16862.072044,2,93,8,8,1.67,5,5,1,1,0,2,31,1,4,5,NA +66587,7,2,1,47,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,36610.126289,37722.018472,1,96,8,8,2.17,4,4,0,0,2,1,80,NA,NA,1,NA +66588,7,2,2,4,NA,1,1,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,9468.006743,10197.085534,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +66589,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,136372.590634,138491.991585,1,98,8,8,2.97,2,2,0,0,0,1,23,1,3,1,5 +66590,7,2,2,7,NA,5,6,2,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,6347.955472,6765.486426,1,93,8,8,1.2,7,7,1,1,1,1,24,2,2,5,NA +66591,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,80355.847074,82974.223453,1,98,15,15,3.7,5,5,2,1,0,1,34,1,5,1,5 +66592,7,2,2,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7588.605543,8103.359102,1,99,14,14,4.21,4,4,0,2,0,2,44,1,5,1,5 +66593,7,2,1,13,NA,1,1,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20638.769105,20614.097145,2,92,15,15,3.37,7,7,0,4,0,1,42,2,3,1,1 +66594,7,2,1,61,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,2,2,2,2,2,2,1,2,2,1,9430.93681,9879.499027,2,98,3,3,1.19,1,1,0,0,1,1,61,1,3,3,NA +66595,7,2,1,16,NA,5,7,2,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11834.781205,12120.23702,2,90,5,5,1.43,2,2,0,1,0,2,38,2,4,5,NA +66596,7,2,2,7,NA,5,6,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7231.974056,7722.665474,3,91,15,15,5,4,4,1,1,0,1,39,2,5,1,5 +66597,7,2,2,54,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,30236.240945,31437.061964,2,96,7,7,4.04,1,1,0,0,0,2,54,1,2,4,NA +66598,7,2,1,37,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,69324.74001,85851.040558,2,95,15,15,4.63,5,5,1,2,0,2,36,1,5,1,3 +66599,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,66503.043118,73915.916489,2,98,7,7,1.61,4,4,1,1,0,1,43,NA,NA,6,NA +66600,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10325.56467,10786.590089,1,96,14,14,5,3,2,0,0,1,2,64,1,4,3,NA +66601,7,2,2,1,20,5,6,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3600.631978,3772.844478,3,90,10,10,2.41,5,5,1,2,0,1,44,2,4,1,5 +66602,7,2,2,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,105873.555835,110835.841786,1,98,15,15,4.34,4,4,1,1,0,1,41,1,5,1,5 +66603,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,2,1,2,2,1,2,2,1,2,2,1,24919.497762,30093.052062,1,98,3,3,0.5,5,5,0,3,0,2,56,1,3,3,NA +66604,7,2,2,1,19,5,7,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8892.555701,9937.38353,1,98,7,7,1.52,4,4,2,0,0,1,30,1,3,1,4 +66605,7,2,2,11,NA,4,4,2,11,142,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9122.654131,9410.759793,1,96,15,15,5,2,2,0,1,0,2,47,1,5,3,NA +66606,7,2,2,0,5,3,3,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20261.925369,19711.566478,2,103,15,15,5,3,3,1,0,0,1,31,1,5,1,5 +66607,7,1,1,67,NA,2,2,NA,NA,NA,2,NA,2,2,8,NA,3,1,NA,1,2,2,2,2,2,NA,NA,NA,NA,7379.175826,0,1,96,14,14,5,2,2,0,0,1,1,67,2,3,1,NA +66608,7,2,2,18,NA,5,6,2,18,219,2,NA,2,2,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8501.305782,9245.625446,1,93,7,7,1.64,5,5,0,2,0,1,47,2,5,1,1 +66609,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,26792.151435,27749.707744,1,97,3,3,0.73,3,3,0,0,0,2,50,1,4,1,3 +66610,7,2,2,3,NA,5,6,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7483.230909,7475.326886,2,96,14,14,4.32,3,3,1,0,0,2,33,2,5,1,5 +66611,7,2,2,15,NA,2,2,1,15,189,NA,NA,2,2,3,10,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,18556.092615,19088.608674,1,103,6,6,0.93,5,5,0,1,0,1,39,2,3,1,3 +66612,7,2,1,64,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10739.724778,10911.761454,2,99,15,15,5,2,2,0,0,2,1,64,2,5,1,4 +66613,7,2,1,9,NA,5,6,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9928.619925,10708.884665,1,91,12,12,NA,4,4,0,2,0,1,43,2,5,1,5 +66614,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,126334.218747,128844.689973,1,95,9,9,4.08,2,2,0,0,0,1,51,NA,NA,1,3 +66615,7,2,2,16,NA,4,4,2,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14085.742306,14155.614592,1,96,8,8,2.17,4,4,1,1,0,2,41,1,3,1,3 +66616,7,2,1,5,NA,1,1,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,10274.893484,10739.35317,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +66617,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12754.235811,13157.031697,1,97,7,7,1.74,4,4,0,3,0,2,32,1,4,5,NA +66618,7,2,2,11,NA,5,6,2,12,145,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10699.45895,11230.540406,1,97,14,14,2.87,5,5,0,3,0,2,40,2,5,1,5 +66619,7,2,2,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,72551.269339,74475.92188,1,95,6,6,2.04,2,2,0,0,2,2,72,1,3,1,NA +66620,7,2,1,64,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,157269.814945,159287.072954,1,92,15,15,5,3,3,0,0,2,2,61,1,5,1,5 +66621,7,2,1,0,2,3,3,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9570.577309,9932.368407,1,95,1,1,0.1,5,5,2,1,0,1,35,1,9,1,3 +66622,7,2,1,9,NA,5,7,1,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41342.668304,42524.849071,1,102,8,8,1.91,5,5,1,2,0,2,38,1,5,1,4 +66623,7,2,1,62,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,7289.557268,7804.776102,3,90,12,12,NA,4,4,0,0,1,1,62,2,4,3,NA +66624,7,2,2,6,NA,4,4,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8504.389189,8682.552645,2,93,6,6,1.72,2,2,0,1,0,2,29,1,4,3,NA +66625,7,2,1,4,NA,5,6,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7812.10492,8436.863602,1,95,4,4,0.62,5,5,2,0,2,2,29,2,3,5,NA +66626,7,2,1,6,NA,5,6,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8095.170809,8542.249827,1,100,15,15,5,3,3,0,1,0,1,38,1,5,1,5 +66627,7,2,1,17,NA,4,4,2,17,206,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11023.237662,11433.168046,1,99,6,6,0.96,5,5,1,2,0,2,35,1,4,1,2 +66628,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,133853.800452,133985.238945,3,91,8,8,3.4,2,2,0,0,0,1,33,2,5,1,4 +66629,7,1,2,0,11,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,5263.118333,0,3,90,4,4,0.74,4,4,1,1,0,1,32,2,4,1,2 +66630,7,2,1,58,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,14897.510053,15360.906039,1,101,14,14,5,2,2,0,0,0,1,58,2,3,1,1 +66631,7,2,2,69,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10604.379638,1,99,3,3,1.01,1,1,0,0,1,2,69,1,2,3,NA +66632,7,2,1,58,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,181786.280703,1,95,8,8,3.47,2,2,0,0,0,1,58,1,2,1,4 +66633,7,2,1,41,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19564.598892,20184.074944,3,92,15,15,5,3,3,1,0,0,1,41,2,5,1,3 +66634,7,2,1,9,NA,5,6,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10810.913614,11522.32071,1,97,15,15,4.07,5,5,0,3,0,1,42,2,5,1,5 +66635,7,2,1,78,NA,5,6,2,NA,NA,2,NA,2,2,8,NA,5,1,NA,1,2,1,1,2,1,1,2,2,NA,8637.841003,9256.016034,1,96,9,9,3.97,2,2,0,0,1,1,78,2,5,1,5 +66636,7,2,2,19,NA,4,4,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16537.460749,16413.673958,2,100,8,8,2.67,3,3,0,0,1,1,61,1,3,1,4 +66637,7,2,2,1,16,4,4,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,7498.263904,2,100,3,3,0.39,7,7,3,3,0,2,30,1,2,5,NA +66638,7,2,2,9,NA,1,1,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15225.935813,15598.502882,2,94,77,77,NA,5,5,1,1,0,1,41,2,2,1,2 +66639,7,2,1,10,NA,1,1,1,10,130,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,8828.580268,9491.612368,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +66640,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,85420.170155,90189.982607,1,91,7,7,2.05,3,3,0,1,0,2,32,1,3,1,NA +66641,7,2,2,46,NA,3,3,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21224.321717,21245.16306,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +66642,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,126717.185106,132638.866244,2,91,14,14,4.19,3,3,0,1,0,2,31,1,4,1,3 +66643,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,15875.759889,17102.194972,1,96,6,6,1.34,3,3,1,0,0,2,42,2,4,6,NA +66644,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,32647.160346,32536.716665,1,99,4,4,1.16,2,2,0,0,2,2,63,1,5,6,NA +66645,7,2,1,13,NA,5,6,2,13,157,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,13,13,NA,3,3,0,2,0,2,41,2,3,4,NA +66646,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,81416.374938,85457.008484,1,97,15,15,5,1,1,0,0,1,2,70,1,4,2,NA +66647,7,2,1,19,NA,3,3,1,19,229,2,NA,2,1,99,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,110478.18082,109645.964567,2,101,3,3,1.15,2,1,0,0,0,1,20,2,4,5,NA +66648,7,2,2,7,NA,4,4,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10654.944111,10939.993817,1,100,4,4,0.99,2,2,0,1,0,1,36,2,4,4,NA +66649,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15096.339697,2,100,7,7,1.34,5,5,0,2,0,2,53,1,4,4,NA +66650,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16088.355002,16260.034828,1,96,1,1,0.2,2,2,0,0,0,1,25,1,2,5,NA +66651,7,2,1,10,NA,2,2,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19735.224235,20204.314213,2,102,8,8,1.91,5,5,0,3,0,1,39,1,3,1,3 +66652,7,2,1,17,NA,4,4,2,17,215,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9313.795042,9381.627752,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +66653,7,2,1,42,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,19436.026093,20405.866121,2,97,5,5,1.08,3,3,0,1,0,2,45,1,4,6,NA +66654,7,2,1,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,28542.421068,28714.346279,2,101,5,5,1.5,2,2,0,0,0,1,47,1,4,3,NA +66655,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,3,6,2,1,2,2,1,2,2,NA,NA,NA,NA,11608.998717,11632.703325,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +66656,7,1,2,41,NA,2,2,NA,NA,NA,2,NA,2,1,4,NA,2,3,3,2,2,2,1,2,2,NA,NA,NA,NA,34999.007145,0,1,90,1,1,0.32,2,2,0,1,0,2,41,2,2,3,NA +66657,7,2,2,16,NA,3,3,2,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,58352.457563,59447.870488,1,99,8,8,2.81,3,3,0,1,0,1,19,1,4,NA,NA +66658,7,2,2,14,NA,5,6,2,14,171,NA,NA,2,1,4,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10963.340882,11440.408955,2,91,15,15,5,4,4,0,2,1,2,56,1,5,1,5 +66659,7,2,1,7,NA,1,1,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18107.947773,18211.90239,1,97,10,10,2.32,6,6,0,4,0,1,42,1,4,1,4 +66660,7,2,1,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18289.793332,19167.642325,1,99,2,2,0.31,4,4,1,0,1,2,67,1,3,3,NA +66661,7,2,1,68,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20250.944593,20440.871021,2,95,6,6,1.36,3,3,0,0,2,2,60,1,5,1,4 +66662,7,2,1,36,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,18955.147124,22251.142446,1,90,2,2,0.63,2,2,0,0,1,1,36,1,4,5,NA +66663,7,2,1,62,NA,5,6,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9355.567184,9645.104203,2,97,15,15,5,2,2,0,0,1,2,58,2,5,1,5 +66664,7,2,2,0,8,4,4,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4439.36229,4769.277094,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +66665,7,2,2,27,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,116919.871791,121727.422593,2,92,10,8,4.59,2,1,0,0,0,2,27,2,5,1,NA +66666,7,2,1,1,17,3,3,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,28617.223132,30780.732491,1,101,3,3,0.63,3,3,1,0,0,2,47,1,1,3,NA +66667,7,2,2,11,NA,3,3,2,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,80369.555824,80128.103294,1,97,15,15,5,4,4,1,1,0,2,33,1,5,1,3 +66668,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,99831.393624,101809.075589,1,100,15,15,5,2,2,0,0,2,1,79,1,5,1,4 +66669,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,137143.403965,141946.841153,2,91,15,15,5,2,2,0,0,2,1,65,1,5,1,5 +66670,7,2,1,53,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,1,1,2,2,1,2,1,3,13537.092442,13488.188749,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +66671,7,2,1,46,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,28726.575428,29019.719154,2,100,14,14,3.58,4,4,0,1,0,1,46,2,5,1,5 +66672,7,2,1,60,NA,1,1,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,2,2,2,2,8961.035147,9135.681188,2,94,15,15,5,2,2,0,0,1,1,60,1,5,1,5 +66673,7,2,2,25,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,50915.06085,50887.683329,3,92,9,9,2.22,5,5,1,0,2,1,66,2,1,1,1 +66674,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,35334.703093,40990.264786,1,101,3,3,0.9,1,1,0,0,1,2,80,1,1,3,NA +66675,7,2,1,4,NA,2,2,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,18754.85406,20094.472571,2,102,6,6,1.12,4,4,1,1,0,1,38,2,2,1,3 +66676,7,2,2,10,NA,4,4,1,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,1,2,1,2,2,1,8362.256577,9003.967662,2,100,5,1,0,3,1,0,1,0,2,50,1,2,5,NA +66677,7,2,2,18,NA,2,2,2,18,219,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,18368.872199,19023.186366,2,91,10,10,2.95,4,4,0,1,0,2,18,1,3,NA,NA +66678,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,137038.746155,146586.432966,2,101,4,3,0.92,2,1,0,0,0,1,21,1,4,5,NA +66679,7,2,1,30,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21280.199633,23174.199432,1,97,15,15,4.84,6,6,2,0,0,1,53,NA,NA,1,NA +66680,7,2,2,56,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15892.013862,19604.056525,3,90,12,12,NA,2,2,0,0,0,2,56,2,4,1,5 +66681,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,1,1,2,2,1,2,2,1,2,2,1,26999.643202,25671.572746,2,102,5,3,0.63,5,4,2,1,0,1,24,1,4,6,NA +66682,7,2,2,6,NA,2,2,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14580.994397,14937.78024,2,93,4,4,0.97,3,3,0,1,0,1,38,2,3,1,3 +66683,7,2,1,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,NA,27609.8026,29259.766266,2,101,10,10,2.91,4,4,0,1,0,2,51,1,2,5,NA +66684,7,2,1,16,NA,5,6,1,16,193,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7669.677276,8194.5967,2,92,15,15,4.59,4,4,0,2,0,2,48,1,5,1,5 +66685,7,2,1,29,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,33592.259589,37970.446859,1,103,13,13,NA,4,4,2,0,0,2,27,2,2,6,NA +66686,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,130229.183917,130070.387937,2,103,77,77,NA,2,1,0,0,0,1,50,1,5,5,NA +66687,7,2,2,53,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,22969.116046,23497.145655,2,93,10,10,5,1,1,0,0,0,2,53,2,5,5,NA +66688,7,2,2,19,NA,5,7,1,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,15318.952876,15275.788411,1,98,2,1,0.18,4,1,0,0,0,2,20,NA,NA,5,NA +66689,7,1,2,71,NA,1,1,NA,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,22927.30561,0,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +66690,7,2,1,65,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,14067.170863,14844.985608,2,102,4,4,0.67,4,4,0,0,2,2,20,1,1,NA,NA +66691,7,2,1,1,20,4,4,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,10655.495346,2,97,7,7,1.72,5,5,1,2,0,1,32,1,4,1,4 +66692,7,2,2,1,17,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11582.174418,12474.053558,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +66693,7,2,1,18,NA,5,6,2,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11506.937395,12095.740214,1,97,9,9,1.78,6,6,0,1,1,1,45,2,3,1,3 +66694,7,2,1,1,13,2,2,2,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10487.35151,11236.440262,2,95,14,14,4.45,3,3,1,0,0,2,29,1,5,1,5 +66695,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,21102.441005,21214.570635,1,98,2,2,0.67,1,1,0,0,1,1,60,1,3,3,NA +66696,7,2,1,11,NA,3,3,2,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,19926.440922,21167.339982,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +66697,7,2,2,13,NA,3,3,1,13,161,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61800.07471,62604.355485,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +66698,7,2,1,21,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,100807.076657,102674.431164,1,97,15,15,5,4,4,0,0,1,1,60,1,5,1,5 +66699,7,2,1,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105412.227726,111169.022023,2,101,7,7,1.88,4,4,0,2,0,2,36,1,4,1,5 +66700,7,2,1,10,NA,4,4,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7005.767895,7244.406666,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +66701,7,2,1,75,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,13928.293734,14290.365569,2,92,5,5,1.36,2,2,0,0,2,1,75,2,1,1,1 +66702,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,18533.049642,19445.722605,1,99,13,13,NA,4,4,1,0,0,2,26,1,4,4,NA +66703,7,2,1,2,NA,5,7,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8375.75457,9394.325143,2,95,15,15,5,3,3,1,0,0,1,50,1,5,1,NA +66704,7,1,2,28,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,NA,NA,NA,NA,15967.106149,0,2,103,1,1,0.04,2,2,0,1,0,2,28,1,4,5,NA +66705,7,2,2,3,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9727.363166,10265.541082,2,97,3,3,0.4,6,6,2,3,0,2,25,1,2,5,NA +66706,7,2,1,8,NA,5,6,2,8,102,NA,NA,2,1,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7923.925927,8546.646915,1,94,7,7,1.79,4,4,0,1,0,1,59,2,4,1,4 +66707,7,2,1,13,NA,1,1,1,13,161,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24902.864049,25040.491572,1,94,5,5,0.94,4,4,0,2,0,2,37,2,3,1,2 +66708,7,2,2,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20842.960361,20272.538073,3,91,12,12,NA,2,2,0,0,0,1,52,1,5,1,5 +66709,7,1,1,57,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19478.845078,0,2,95,2,2,0.46,3,3,0,0,0,2,48,1,2,1,2 +66710,7,2,1,66,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9082.311855,9548.677283,1,96,7,7,1.83,3,3,0,0,1,1,66,2,5,1,3 +66711,7,1,2,11,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5885.567617,0,1,93,9,9,1.77,7,7,0,2,0,2,56,NA,NA,5,NA +66712,7,2,1,31,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14221.330587,14963.406508,3,90,12,12,NA,4,4,0,0,1,1,62,2,4,3,NA +66713,7,2,2,60,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,35354.773526,36055.159401,2,103,5,5,1.2,3,3,0,0,2,1,66,2,2,1,2 +66714,7,2,2,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,54951.692454,55140.36098,2,102,15,15,3.92,5,5,0,0,0,1,19,1,4,NA,NA +66715,7,2,1,64,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,9535.353518,9609.942052,2,101,9,9,4.08,2,2,0,0,2,2,67,1,5,1,3 +66716,7,2,1,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21317.283165,21013.422419,2,96,4,4,0.65,5,5,0,3,0,1,30,1,4,1,2 +66717,7,2,2,23,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,6,3,1,2,2,1,2,2,1,2,2,1,35710.33222,42634.350272,1,90,3,3,0.43,4,4,2,0,0,1,31,1,3,6,NA +66718,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,36950.912612,36817.49814,1,97,3,3,1.16,1,1,0,0,0,2,56,1,3,3,NA +66719,7,2,2,9,NA,3,3,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55469.656717,57246.428971,1,101,9,9,2.6,4,4,0,2,0,2,38,1,4,1,4 +66720,7,2,1,58,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15044.515884,14996.530888,3,90,15,15,4.89,5,5,0,0,0,2,57,2,3,1,3 +66721,7,2,2,47,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12977.791943,13644.504126,2,100,15,15,5,3,3,0,1,0,1,48,2,5,1,5 +66722,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,110070.015649,114078.798472,3,91,15,15,5,4,4,1,1,0,2,41,1,5,1,5 +66723,7,2,1,14,NA,4,4,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,18260.901254,2,101,6,6,0.96,5,5,0,4,0,2,36,1,4,4,NA +66724,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23630.941535,1,95,6,6,1.35,3,3,1,0,0,1,31,1,5,1,5 +66725,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,124263.643735,125259.229556,2,95,8,8,3.53,2,2,0,0,0,1,57,1,4,1,4 +66726,7,2,1,18,NA,5,7,2,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21852.102821,22875.024578,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +66727,7,2,1,11,NA,5,7,2,11,135,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8246.426933,9050.014459,1,99,10,10,3.51,3,3,0,1,0,2,44,1,3,1,5 +66728,7,2,2,71,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,1,1,2,1,NA,13750.49328,15781.175386,2,92,4,4,1.14,2,2,0,0,2,1,72,2,3,1,3 +66729,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,137143.403965,141946.841153,2,91,15,15,5,2,2,0,0,2,1,68,1,5,1,5 +66730,7,2,1,9,NA,5,7,1,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11661.909323,12350.149476,1,92,15,15,5,4,4,0,2,0,1,41,2,5,1,5 +66731,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,117009.557742,134978.408148,2,99,14,14,5,1,1,0,0,0,1,46,1,5,5,NA +66732,7,2,1,16,NA,5,6,1,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9099.087557,9564.682199,2,102,12,12,NA,3,3,0,1,0,1,57,2,5,1,5 +66733,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20131.904783,20903.590301,1,92,15,15,5,2,2,0,0,2,2,80,1,5,1,NA +66734,7,2,2,16,NA,5,6,1,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,5760.953091,5914.685125,2,92,8,8,1.91,5,5,0,2,1,2,47,2,1,1,3 +66735,7,2,1,24,NA,5,7,1,NA,NA,2,NA,2,1,4,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,27271.751091,27454.884133,2,101,6,4,1.74,3,1,0,0,0,1,21,1,4,5,NA +66736,7,2,2,55,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16178.54595,16391.328992,1,93,15,15,5,3,3,0,0,1,1,63,1,5,1,5 +66737,7,2,2,14,NA,2,2,2,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,15087.58237,15620.049499,1,96,15,15,5,4,4,0,2,0,1,36,2,3,1,4 +66738,7,2,1,59,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,27240.276328,26969.79863,1,90,15,15,5,2,2,0,0,1,2,63,1,5,1,5 +66739,7,2,1,9,NA,5,6,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5438.768263,5891.907372,2,92,15,15,5,4,4,0,2,0,2,41,1,5,1,5 +66740,7,2,2,0,7,3,3,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20899.681083,21326.972731,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +66741,7,2,2,73,NA,3,3,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,19901.857177,20582.498016,2,94,1,1,0.08,1,1,0,0,1,2,73,2,4,3,NA +66742,7,2,1,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7431.820906,7738.904727,1,99,7,7,1.53,5,5,2,0,0,2,37,1,4,1,3 +66743,7,2,2,68,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,1,4,NA,2,2,2,2,2,2,2,2,1,2,8725.210615,9440.710379,2,93,4,4,0.94,3,3,0,1,1,2,68,2,1,4,NA +66744,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,10479.637868,11727.843054,2,98,77,77,NA,1,1,0,0,1,1,80,1,2,2,NA +66745,7,2,2,16,NA,1,1,1,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26325.414456,27702.295836,3,92,10,10,3.77,3,3,0,1,0,2,52,1,4,6,NA +66746,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,97925.559493,100647.602701,1,94,6,6,1.31,3,3,0,0,0,2,46,1,5,6,NA +66747,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,157587.268357,1,94,9,9,3.97,2,2,0,0,0,1,59,1,3,5,NA +66748,7,2,1,73,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,9662.124837,9885.036833,2,92,3,3,1.01,1,1,0,0,1,1,73,1,4,3,NA +66749,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,16741.034883,16841.712651,2,95,2,2,0.7,1,1,0,0,0,2,56,1,3,4,NA +66750,7,2,2,73,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,3,NA,2,2,2,1,2,2,2,2,2,NA,20922.745102,23195.943223,1,93,15,15,2.96,7,7,0,1,1,2,18,1,2,NA,NA +66751,7,2,2,9,NA,5,6,2,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,7722.982971,8635.133042,1,93,8,8,2.24,4,4,0,2,0,1,44,2,5,1,4 +66752,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21491.090123,20964.324934,1,97,14,14,5,3,3,0,0,0,2,51,1,5,1,4 +66753,7,2,2,2,NA,3,3,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20820.221848,22126.060024,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +66754,7,2,1,47,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,19371.546331,19651.186711,2,95,12,12,NA,2,2,0,1,0,1,47,1,4,2,NA +66755,7,2,2,33,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,6,3,2,2,2,2,2,2,1,2,2,2,27127.983961,26396.013964,2,90,6,6,0.96,5,5,1,1,0,1,39,2,2,1,NA +66756,7,1,1,11,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11567.189008,0,2,90,14,14,3.06,5,5,1,2,0,1,42,1,4,1,5 +66757,7,1,2,59,NA,5,6,NA,NA,NA,2,NA,2,1,99,NA,5,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12649.084278,0,3,90,77,77,NA,2,2,0,0,1,1,65,2,3,1,5 +66758,7,2,2,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,60071.993203,65791.533402,1,95,99,99,NA,1,1,0,0,1,2,80,1,4,2,NA +66759,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,12449.932013,12144.773422,3,90,7,7,2.23,3,3,0,0,0,2,51,1,4,3,NA +66760,7,1,2,32,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,1,3,1,2,2,1,2,2,NA,NA,NA,NA,25241.487585,0,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +66761,7,2,1,2,NA,2,2,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10057.661774,10071.252045,2,93,12,77,NA,3,1,1,1,0,2,43,1,5,3,NA +66762,7,2,1,16,NA,4,4,2,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11252.388648,11221.862262,1,99,7,7,1.89,3,3,0,1,0,1,50,1,5,1,2 +66763,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,54095.581484,61529.339683,2,91,7,7,1.61,4,4,0,0,3,1,65,1,3,6,NA +66764,7,2,1,2,NA,1,1,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12005.116852,11690.420322,3,92,14,14,2.29,7,7,2,0,0,2,50,2,1,1,9 +66765,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,1,2,1,1,2,NA,NA,NA,NA,40859.270352,45390.978638,2,101,8,8,4.22,1,1,0,0,1,1,80,1,3,2,NA +66766,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,94698.084211,103561.845332,1,101,14,14,4.5,3,3,0,1,0,1,39,1,2,1,5 +66767,7,2,2,1,21,1,1,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12260.86913,13033.834526,3,92,5,5,0.81,5,5,3,0,0,2,23,1,4,5,NA +66768,7,2,2,7,NA,4,4,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8282.497467,8610.715242,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +66769,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18101.423817,17611.874146,2,99,9,9,2.43,4,4,0,2,0,2,49,1,3,3,NA +66770,7,2,2,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,59974.233027,60510.443557,2,97,6,6,2.85,2,1,0,0,0,1,22,1,3,6,NA +66771,7,2,2,31,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,37439.743351,39040.415193,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +66772,7,2,1,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7907.070371,7770.374311,2,95,2,2,0.26,3,3,1,0,0,2,54,1,3,2,NA +66773,7,1,1,24,NA,4,4,NA,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,16052.583048,0,2,99,77,77,NA,3,3,0,1,0,2,46,NA,NA,77,NA +66774,7,2,2,17,NA,1,1,1,18,216,2,NA,2,2,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26325.414456,26852.811114,3,92,13,13,NA,4,4,0,2,0,2,50,2,1,5,NA +66775,7,2,1,7,NA,1,1,2,7,95,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15039.041447,16539.35823,3,91,7,7,1.23,6,6,2,2,0,1,36,2,1,1,1 +66776,7,2,2,2,NA,4,4,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,8250.113235,2,100,14,14,4.59,3,3,1,0,0,1,30,NA,NA,1,4 +66777,7,2,1,39,NA,2,2,1,NA,NA,2,NA,2,1,3,NA,1,1,NA,2,2,2,1,2,2,2,2,1,2,37631.514869,37347.497931,2,93,3,3,0.43,4,4,0,0,0,1,45,2,2,6,NA +66778,7,2,1,11,NA,4,4,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14125.862146,14370.909235,1,97,15,15,5,4,4,0,1,0,1,40,1,4,1,4 +66779,7,2,1,14,NA,5,6,1,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,1,1,2,2,1,6121.087833,6878.034577,2,92,3,3,0.4,6,6,0,1,2,1,78,2,1,1,1 +66780,7,2,1,0,2,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,5588.585837,5533.355248,1,102,6,6,0.8,7,7,3,3,0,2,34,2,3,1,1 +66781,7,2,1,68,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11243.205109,11633.337706,1,90,4,4,1.12,2,2,0,0,2,1,68,2,4,1,1 +66782,7,2,2,19,NA,4,4,2,19,236,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10848.628906,11198.221038,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +66783,7,2,2,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,11331.751026,1,101,4,4,0.78,4,4,1,2,0,2,32,1,3,3,NA +66784,7,2,1,9,NA,4,4,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9261.557132,9701.953496,2,100,7,7,1.34,5,5,0,2,0,2,53,1,4,4,NA +66785,7,2,2,60,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,1,1,2,1,1,2,2,NA,18002.759054,18633.946783,2,102,15,15,3.82,5,5,0,1,2,1,60,2,2,1,1 +66786,7,2,1,13,NA,5,6,2,13,163,NA,NA,2,1,3,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7046.884472,7540.251296,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +66787,7,2,2,8,NA,2,2,1,8,99,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12307.832776,12608.996083,2,93,5,5,0.89,4,4,0,2,0,1,42,NA,NA,6,NA +66788,7,2,1,31,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,39049.131011,2,98,99,99,NA,4,4,1,0,1,2,68,1,9,2,NA +66789,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,30505.56355,32886.600907,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +66790,7,2,1,4,NA,4,4,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,11070.778245,1,100,3,3,0.73,3,3,2,0,0,2,39,1,3,5,NA +66791,7,2,2,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,12,77,NA,4,1,0,0,0,1,21,1,4,6,NA +66792,7,2,2,4,NA,2,2,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11429.37307,12618.334582,2,90,6,6,1.35,3,3,1,0,0,1,31,1,3,1,4 +66793,7,2,1,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,16851.334496,17382.882475,2,101,7,7,2.64,2,2,0,0,1,2,70,1,3,4,NA +66794,7,2,1,10,NA,5,6,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6850.601671,7388.972861,3,91,14,14,4.03,4,4,0,2,0,1,51,2,4,1,5 +66795,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,34810.007519,37700.123082,1,94,3,3,0.37,5,5,0,3,0,2,29,1,4,4,NA +66796,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,79632.40863,82653.579173,1,95,9,9,4.08,2,2,0,0,2,2,65,1,5,1,3 +66797,7,2,2,30,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,27303.803575,27793.15685,1,96,7,7,1.52,4,4,0,2,0,2,30,2,4,1,5 +66798,7,2,2,56,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,4,1,NA,1,2,2,1,2,2,2,2,2,2,34082.505027,35315.234687,2,92,2,2,0.4,3,3,0,0,0,1,50,2,4,1,4 +66799,7,2,1,6,NA,4,4,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10665.048307,10792.905577,1,96,8,8,2.78,3,3,0,2,0,2,34,1,4,3,NA +66800,7,2,1,11,NA,1,1,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,13742.678011,2,98,4,4,0.75,4,4,0,2,0,2,33,1,2,5,NA +66801,7,2,1,7,NA,3,3,2,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57057.523607,61384.115788,1,101,14,14,4.21,4,4,1,1,0,2,37,1,5,1,5 +66802,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,26763.110196,28578.287397,2,94,5,5,1.3,3,3,0,1,0,1,43,1,3,6,NA +66803,7,2,2,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,1,1,2,2,1,2,2,NA,NA,NA,NA,43813.24867,44924.427845,1,98,4,4,0.66,4,4,2,0,0,2,22,1,4,6,NA +66804,7,2,1,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,12824.368043,13581.00423,2,101,3,3,1.13,1,1,0,0,1,1,74,1,1,2,NA +66805,7,2,2,2,NA,4,4,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,8048.181894,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +66806,7,1,2,29,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,14698.806915,0,2,99,15,15,5,2,2,0,0,0,1,30,NA,NA,1,5 +66807,7,2,1,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,1,1,2,2,1,9177.295801,9603.338468,2,92,3,3,0.45,4,4,0,0,1,1,64,2,1,1,1 +66808,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,5950.162866,6182.885443,2,95,5,5,1.05,3,3,0,1,1,1,63,1,2,1,3 +66809,7,1,1,68,NA,2,2,NA,NA,NA,2,NA,2,1,6,NA,3,2,NA,2,2,2,1,2,2,NA,NA,NA,NA,9693.846555,0,2,93,5,5,1.04,4,4,0,1,1,1,68,2,3,2,NA +66810,7,2,1,14,NA,4,4,1,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16147.713323,16532.569027,1,92,NA,1,0.18,4,3,0,2,0,2,56,1,4,4,NA +66811,7,2,1,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,9177.295801,9548.31812,2,92,77,77,NA,4,4,0,0,1,1,20,1,2,5,NA +66812,7,2,1,15,NA,4,4,1,15,186,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10569.808278,10821.723266,2,92,10,10,4.76,2,2,0,1,0,2,40,1,5,4,NA +66813,7,2,1,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8655.162127,9330.305761,2,95,10,10,3.67,3,3,0,1,0,1,43,1,4,1,4 +66814,7,1,1,34,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,23284.536512,0,1,97,7,7,1.74,4,4,2,0,0,1,34,1,5,1,5 +66815,7,1,1,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58116.402634,0,1,97,15,15,5,5,5,2,0,1,1,43,1,5,1,5 +66816,7,2,1,0,8,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,4461.618312,4741.503802,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +66817,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,22820.082463,26177.958982,1,94,2,2,0.83,1,1,0,0,1,2,72,1,3,2,NA +66818,7,2,2,8,NA,3,3,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39976.778207,40067.73727,2,100,15,15,5,3,3,0,1,0,1,38,1,4,1,4 +66819,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,102928.893739,104528.537732,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +66820,7,1,2,11,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7710.907339,0,2,99,6,6,0.94,7,7,0,4,0,2,32,1,3,1,3 +66821,7,2,2,30,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,3,1,2,2,2,2,1,2,2,2,2,2,2,41791.57979,45058.092516,2,102,6,6,1.12,4,4,1,1,0,1,38,2,2,1,3 +66822,7,2,1,19,NA,5,6,1,19,230,2,NA,2,1,3,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8431.995003,8807.000735,1,95,3,3,0.71,3,3,0,0,0,1,57,2,2,1,4 +66823,7,2,2,5,NA,5,6,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8894.95474,1,97,15,15,5,4,4,1,1,0,1,44,2,5,1,5 +66824,7,2,2,14,NA,2,2,1,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18728.878486,20545.934985,2,93,10,10,3.4,3,3,0,1,0,1,51,1,3,1,4 +66825,7,2,1,8,NA,2,2,2,8,107,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11546.167056,12698.029578,1,90,7,7,1.56,4,4,1,1,0,2,37,1,2,77,NA +66826,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11355.3308,11862.334174,1,96,9,9,3.97,2,2,0,0,2,1,72,1,4,1,5 +66827,7,2,1,11,NA,5,6,2,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9175.735601,9896.833095,3,91,15,15,5,4,4,0,2,0,1,44,2,5,1,5 +66828,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,116839.212439,120894.200639,2,97,9,9,4.08,2,2,0,0,0,2,24,1,4,1,3 +66829,7,2,1,8,NA,5,6,2,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6262.834446,6786.531245,3,90,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +66830,7,2,2,12,NA,5,6,1,12,154,NA,NA,2,1,4,6,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,5668.184078,6218.795289,2,92,99,2,0.31,7,4,3,3,1,1,61,2,1,1,3 +66831,7,2,1,0,0,1,1,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7222.23638,7675.3005,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +66832,7,2,1,75,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,7608.031426,7606.53553,1,99,5,5,1.84,1,1,0,0,1,1,75,1,5,2,NA +66833,7,2,2,39,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,3,1,2,2,2,2,1,2,2,1,2,2,2,41067.133288,41493.788594,2,91,3,3,0.73,3,3,0,0,0,2,22,2,2,5,NA +66834,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14366.887416,15220.688498,3,90,15,15,5,5,5,0,1,1,2,61,1,5,2,NA +66835,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,15800.216306,15663.050285,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +66836,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,35522.958395,37225.553122,1,102,13,1,0,2,1,0,0,0,1,22,1,4,5,NA +66837,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16489.238752,16479.116235,1,96,6,6,1.21,4,4,2,0,0,1,24,1,4,1,3 +66838,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,152978.138087,155477.549686,1,101,7,7,3.13,1,1,0,0,1,2,65,1,4,2,NA +66839,7,2,2,25,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,11696.173591,12195.620792,1,93,15,1,0.41,6,1,0,0,0,1,34,2,5,5,NA +66840,7,2,2,10,NA,3,3,1,10,123,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61059.578287,60876.138307,1,98,15,15,4.34,4,4,0,2,0,2,52,1,3,1,5 +66841,7,2,1,3,NA,5,7,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26980.605125,29855.353305,1,94,2,2,0.3,5,5,1,2,0,1,23,1,1,6,NA +66842,7,1,2,0,9,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3861.876549,0,1,96,15,15,4.81,5,5,1,2,0,1,33,1,5,1,3 +66843,7,2,1,5,NA,5,7,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10859.969359,11974.89205,1,98,7,7,1.52,4,4,2,0,0,1,30,1,3,1,4 +66844,7,2,1,18,NA,4,4,1,18,221,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16147.713323,16270.487634,1,92,77,77,NA,5,5,1,2,0,2,41,1,3,5,NA +66845,7,2,1,1,15,3,3,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47507.757497,53600.040598,1,101,14,14,3.15,5,5,2,1,0,1,35,1,4,1,5 +66846,7,2,1,2,NA,4,4,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,7031.647494,2,100,8,8,2.7,3,3,1,0,0,2,41,1,4,1,3 +66847,7,2,1,31,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16505.268729,17550.815541,3,91,14,14,4.32,3,3,1,0,0,1,31,2,3,1,4 +66848,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,141821.601523,151144.430607,1,90,15,15,5,4,4,0,2,1,2,52,1,5,1,NA +66849,7,2,1,0,11,5,7,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7317.981812,7846.84086,1,97,15,15,3.7,5,5,1,1,0,2,21,1,4,5,NA +66850,7,2,2,71,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19603.448069,21893.680196,2,98,5,5,0.59,7,7,2,1,2,2,71,1,2,1,1 +66851,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,143866.32507,144700.959982,1,97,15,15,5,1,1,0,0,0,2,46,1,4,2,NA +66852,7,2,1,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8569.438441,9098.434789,2,99,7,7,1.19,6,6,1,3,0,2,38,1,3,5,NA +66853,7,2,1,2,NA,2,2,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11030.983881,11818.903113,2,93,7,7,1.56,4,4,1,1,0,1,35,2,4,1,4 +66854,7,2,2,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,26021.868354,25835.926172,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +66855,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17606.560681,17743.688949,2,95,6,6,1.7,2,2,0,0,0,2,54,1,4,2,NA +66856,7,2,2,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12871.484115,13281.030392,2,102,5,5,0.89,4,4,1,1,0,2,28,2,2,1,2 +66857,7,2,2,15,NA,5,6,2,15,181,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6486.356303,6952.179218,1,91,7,7,1.57,4,4,0,3,0,2,38,2,2,3,NA +66858,7,2,2,6,NA,4,4,1,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8362.256577,8929.488766,2,100,7,7,2.37,3,3,0,1,1,2,45,1,5,1,NA +66859,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6441.733603,6839.385512,1,91,6,6,0.99,5,5,3,0,0,2,33,2,3,1,4 +66860,7,2,1,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,51965.135941,60918.873896,2,101,2,1,0.37,2,1,0,0,0,1,21,1,4,5,NA +66861,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,17478.873252,2,95,6,6,1.36,3,3,0,1,1,2,62,1,4,5,NA +66862,7,2,1,10,NA,4,4,2,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9699.683862,9681.447258,2,101,2,2,0.27,6,6,0,3,0,2,45,1,2,5,NA +66863,7,2,1,77,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,70642.066815,74773.070249,2,96,12,12,NA,2,2,0,0,2,1,77,1,5,1,4 +66864,7,2,1,16,NA,4,4,1,16,196,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11666.009872,12200.765691,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +66865,7,2,2,15,NA,1,1,1,15,184,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22424.988432,22856.096824,1,94,5,5,0.87,4,4,0,2,0,2,41,2,4,1,1 +66866,7,2,1,5,NA,4,4,1,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8385.172131,8641.288503,2,93,5,5,1.04,4,4,1,1,0,1,29,1,3,6,NA +66867,7,1,1,18,NA,1,1,NA,NA,NA,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,22721.243258,0,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +66868,7,2,1,8,NA,5,6,2,8,100,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9928.619925,10708.884665,1,91,15,15,5,4,4,1,1,0,1,43,2,5,1,5 +66869,7,2,2,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,24719.680932,24496.884814,1,97,15,15,5,2,2,0,0,0,1,59,1,5,1,5 +66870,7,2,2,12,NA,1,1,1,12,153,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22424.988432,24600.637711,1,94,15,15,4.37,7,7,0,4,1,1,58,1,4,1,5 +66871,7,2,1,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,32375.321924,32878.474997,1,95,7,6,2.6,5,1,1,2,0,1,26,1,4,6,NA +66872,7,2,1,37,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22424.102245,23525.946014,1,92,14,14,3.47,4,4,0,2,0,1,37,1,5,1,5 +66873,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,163102.567998,168673.834909,1,99,12,12,NA,2,2,0,0,0,1,55,1,5,1,4 +66874,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,53955.606082,55085.619185,2,100,15,15,5,4,4,1,1,0,1,29,1,4,1,4 +66875,7,2,2,69,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,10760.495249,11342.54557,3,90,4,4,1.22,2,2,0,0,2,2,69,2,4,1,1 +66876,7,2,2,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,134694.414609,139412.076132,2,91,15,15,5,3,3,0,0,2,2,62,1,4,1,4 +66877,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,56180.550638,64695.241485,2,98,5,5,1.63,2,2,0,0,2,1,80,1,3,1,3 +66878,7,2,2,15,NA,1,1,1,15,180,NA,NA,2,2,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21062.314667,21780.985882,3,91,3,3,0.39,6,6,1,1,0,1,39,2,1,6,NA +66879,7,2,2,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,139800.409559,144765.126463,1,100,15,15,4.56,4,4,0,2,0,2,42,1,4,1,3 +66880,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18452.546861,18969.498532,1,93,12,12,NA,3,3,0,1,0,2,48,1,3,5,NA +66881,7,2,2,40,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,20303.639991,20411.004471,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +66882,7,2,2,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,50922.951701,51648.728485,1,92,15,15,5,3,3,0,0,1,1,57,1,3,1,4 +66883,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,109181.566304,117126.933999,2,91,7,7,2.31,2,2,0,0,0,2,58,1,5,3,NA +66884,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,20691.085146,20754.703375,2,91,4,4,1.22,2,2,0,0,0,1,53,1,4,1,4 +66885,7,2,1,76,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,6856.239408,7260.756717,2,95,5,5,0.87,4,4,0,0,2,2,77,1,2,1,1 +66886,7,2,1,5,NA,2,2,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14318.290734,14771.527769,3,91,6,6,0.83,6,6,1,3,0,1,37,1,4,1,4 +66887,7,1,2,6,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9122.654131,0,1,96,9,9,2.18,5,5,1,1,0,1,26,1,4,1,4 +66888,7,2,2,1,18,4,4,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7281.670423,7938.059494,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +66889,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,19541.667675,22573.12843,2,95,1,1,0.36,1,1,0,0,0,1,59,1,5,5,NA +66890,7,2,1,14,NA,1,1,2,14,178,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,22044.437334,22214.434256,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +66891,7,2,2,15,NA,3,3,2,15,191,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,132630.209478,136474.31291,1,97,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +66892,7,2,2,1,16,3,3,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46281.468826,49830.1764,1,92,9,4,1,7,3,2,1,0,1,45,1,4,2,NA +66893,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,168185.448935,169079.116739,1,95,9,9,4.01,2,2,0,0,1,1,60,1,3,1,3 +66894,7,1,2,1,12,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,0,1,91,9,9,2.97,3,3,1,0,0,1,31,2,5,1,5 +66895,7,2,1,10,NA,2,2,2,10,121,NA,NA,2,2,3,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10490.055059,10676.813132,3,90,4,4,0.63,5,5,0,3,0,1,45,2,4,1,4 +66896,7,2,1,64,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,8886.717016,9234.294003,2,101,3,3,0.78,3,3,0,0,1,1,64,1,2,1,3 +66897,7,2,2,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,18097.801029,17642.065425,2,100,9,9,3.24,3,3,1,0,0,1,32,1,3,1,4 +66898,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,24056.374863,23398.009058,2,99,6,6,2.6,1,1,0,0,0,2,45,1,5,5,NA +66899,7,2,2,11,NA,1,1,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,22662.992756,24846.804377,2,98,13,13,NA,5,5,0,2,0,1,48,2,1,1,2 +66900,7,2,2,10,NA,4,4,1,10,121,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,13050.526646,2,101,1,1,0.15,3,3,0,2,0,2,58,1,3,5,NA +66901,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11449.435533,12331.980143,2,99,6,6,1.98,2,2,0,0,2,1,77,1,3,1,3 +66902,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,25691.564623,26900.812132,1,90,3,3,0.63,3,3,1,1,0,2,32,1,4,5,NA +66903,7,2,2,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,74517.751389,74746.868777,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +66904,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,11507.810748,11238.9991,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +66905,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18801.993237,20649.846581,2,96,8,5,2.2,2,1,0,0,0,2,25,2,5,5,NA +66906,7,2,2,11,NA,4,4,2,11,135,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10888.493631,11627.08662,1,101,1,1,0.21,3,3,0,2,0,2,32,1,4,5,NA +66907,7,2,2,37,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,11105.558187,11128.234812,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +66908,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,17824.805721,17767.952896,2,92,2,2,0.57,2,2,0,0,0,2,56,1,3,2,NA +66909,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,52280.406546,52747.829022,1,95,3,1,0.28,2,1,0,0,0,1,27,1,3,5,NA +66910,7,1,2,8,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14465.997114,0,2,96,3,3,0.24,7,7,2,3,1,2,40,1,3,3,NA +66911,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,1,22697.846242,22639.540149,2,100,4,4,1.47,2,1,0,0,0,2,38,1,3,2,NA +66912,7,2,2,14,NA,5,7,2,14,172,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6386.337576,6452.948976,1,93,15,15,4.59,4,4,0,2,0,2,45,1,5,1,5 +66913,7,2,1,9,NA,2,2,2,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8516.07921,8708.134582,3,90,14,14,3.69,4,4,0,2,0,2,49,1,4,1,4 +66914,7,2,2,51,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12162.017722,12226.329772,2,92,12,9,5,7,1,0,0,2,1,53,2,3,1,3 +66915,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32461.799549,32422.216998,1,101,4,4,0.99,2,2,0,0,0,2,51,1,5,1,2 +66916,7,2,1,1,23,4,4,1,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6859.539552,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +66917,7,2,1,7,NA,1,1,1,7,89,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16747.549238,17012.570163,2,96,7,7,1.34,5,5,0,2,0,1,24,2,2,5,NA +66918,7,2,1,72,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,32916.648979,34960.567692,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +66919,7,2,2,13,NA,1,1,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,27070.679378,27847.54398,1,92,14,14,3.15,5,5,1,2,0,1,34,1,4,1,4 +66920,7,2,1,77,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,17113.447343,18123.138698,2,101,6,6,2.04,2,2,0,0,2,1,77,1,1,1,2 +66921,7,2,2,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,38679.12951,52110.643741,1,98,3,3,0.86,2,2,0,1,0,2,34,1,4,5,NA +66922,7,2,2,12,NA,4,4,2,12,149,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12180.874919,12414.982997,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +66923,7,2,2,47,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17623.300255,17855.084956,1,100,15,15,5,3,3,0,0,0,1,47,2,5,1,5 +66924,7,2,1,36,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,2,2,2,NA,NA,NA,NA,28519.067294,31362.329476,1,96,15,15,5,4,4,0,2,0,1,36,2,3,1,4 +66925,7,2,2,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,46764.716703,54568.74353,1,99,2,2,0.46,1,1,0,0,0,2,23,1,5,5,NA +66926,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,175544.769665,178639.415011,1,91,15,15,5,2,1,0,0,0,1,51,1,3,1,NA +66927,7,2,1,20,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,51965.135941,52673.460841,2,101,1,1,0.11,2,1,0,0,0,1,19,NA,NA,NA,NA +66928,7,2,2,64,NA,5,6,1,NA,NA,2,NA,2,1,1,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,7118.69664,7393.452915,1,103,77,77,NA,6,6,0,2,2,1,70,NA,NA,1,1 +66929,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12331.419303,12882.003985,2,95,14,14,5,2,2,0,0,2,1,73,1,5,1,4 +66930,7,2,1,41,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,31640.296506,31576.726829,2,94,15,15,5,3,3,0,0,0,1,41,2,3,1,NA +66931,7,2,1,16,NA,3,3,2,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,68148.957861,67253.324127,1,93,15,15,3.92,5,5,0,1,0,2,54,1,5,1,5 +66932,7,2,1,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,10420.275705,10501.786379,2,96,7,7,2.58,2,2,0,0,1,2,55,1,4,3,NA +66933,7,2,1,34,NA,5,6,1,NA,NA,2,NA,2,7,77,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16770.056318,16992.484825,1,103,12,12,NA,2,2,0,0,0,1,34,2,5,1,5 +66934,7,2,2,12,NA,5,6,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7952.410952,8162.028124,2,98,9,9,2.29,5,5,0,2,0,1,36,1,4,1,4 +66935,7,2,1,1,19,5,7,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6370.584728,7024.611386,2,94,10,10,3.51,3,3,1,0,0,2,30,2,5,1,NA +66936,7,2,1,28,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,2,1,2,1,1,2,2,3,14313.345971,14892.009983,3,91,6,6,1.12,4,4,0,0,2,1,69,2,3,1,1 +66937,7,2,1,37,NA,3,3,1,NA,NA,2,NA,2,2,6,NA,2,5,NA,1,2,2,2,2,2,1,2,2,1,63557.943986,66218.577849,2,103,12,12,NA,3,3,0,0,1,1,60,2,2,1,2 +66938,7,2,2,62,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,NA,NA,NA,1,2,1,NA,17248.011865,22917.917651,1,97,14,14,2.29,7,7,1,2,2,1,40,2,1,1,1 +66939,7,1,2,15,NA,2,2,NA,NA,NA,NA,NA,2,2,3,10,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,18053.382334,0,1,90,10,10,3.67,3,3,0,1,0,2,40,2,2,77,NA +66940,7,2,2,14,NA,1,1,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20117.170449,20520.192725,1,94,2,2,0.27,5,5,0,4,0,2,47,2,1,4,NA +66941,7,2,1,25,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,42077.383821,43345.097117,1,102,14,14,4.32,3,3,1,0,0,1,25,1,4,1,4 +66942,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,2,1,2,2,1,2,2,1,2,2,1,20562.749362,20582.941069,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +66943,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,27934.372045,29727.618806,1,101,7,2,0.67,3,1,0,0,1,2,69,1,4,2,NA +66944,7,2,1,72,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,79754.311902,85970.307401,1,97,6,6,2.15,2,2,0,0,2,1,72,1,5,1,NA +66945,7,2,2,57,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,24646.971819,24775.50368,1,102,6,6,1.48,3,3,0,0,1,2,57,2,1,1,4 +66946,7,2,1,32,NA,5,7,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,21271.615575,1,94,6,6,1.33,4,4,2,0,0,2,29,1,2,1,4 +66947,7,2,1,51,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,29883.483388,30470.971906,1,102,9,9,3.74,2,2,0,0,0,2,45,1,4,1,2 +66948,7,2,1,14,NA,5,6,1,15,180,NA,NA,2,1,3,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6140.97758,6391.148404,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +66949,7,2,2,54,NA,5,7,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21760.356138,21875.42365,1,92,14,14,5,2,2,0,0,0,1,56,2,4,1,4 +66950,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,111065.717962,123974.675785,2,94,3,3,0.54,4,4,0,1,0,2,48,1,3,1,3 +66951,7,2,2,8,NA,1,1,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,2,2,2,2,17053.854294,17496.484818,3,92,7,7,0.93,7,7,1,3,0,2,20,1,3,1,1 +66952,7,2,2,4,NA,3,3,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28409.87702,1,101,6,6,0.87,6,6,2,2,0,2,23,1,4,6,NA +66953,7,2,1,10,NA,1,1,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13837.588743,14876.800627,1,92,8,8,2.62,3,3,0,1,0,1,41,2,3,1,9 +66954,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,81857.569857,83650.947594,2,92,15,10,5,4,1,0,0,0,1,28,1,5,5,NA +66955,7,2,1,38,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,39049.131011,2,98,15,15,5,3,3,0,1,0,1,38,1,4,1,3 +66956,7,2,2,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,41018.498876,43893.586815,2,98,3,3,0.54,3,3,1,0,0,1,23,1,3,1,2 +66957,7,2,1,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,136361.754972,134969.826866,1,98,6,6,1.75,2,2,0,0,2,1,62,1,4,1,3 +66958,7,2,1,52,NA,3,3,1,NA,NA,2,NA,2,2,5,NA,3,1,NA,2,2,2,1,2,2,2,2,2,2,24127.240234,24937.486066,2,93,6,6,1.65,2,2,0,0,0,1,52,2,3,1,5 +66959,7,2,2,43,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,5,2,2,2,2,2,2,2,1,2,2,2,33767.584626,33943.679708,2,102,6,3,0.54,6,4,0,4,0,2,43,2,1,5,NA +66960,7,2,1,1,20,5,6,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8674.760516,9729.693026,1,94,10,10,3.04,4,4,2,0,0,2,30,1,4,1,5 +66961,7,2,1,36,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19144.719218,19850.422567,1,101,10,10,3.67,3,3,1,0,0,1,36,2,5,1,5 +66962,7,2,1,1,22,4,4,1,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5930.749873,6003.089312,2,93,7,7,1.83,3,3,1,0,0,2,34,2,3,1,3 +66963,7,1,2,70,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,64383.454106,0,1,90,12,12,NA,2,2,0,0,2,1,75,1,5,1,4 +66964,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,100264.332334,101647.830414,1,99,7,7,4.09,1,1,0,0,0,2,27,1,5,5,NA +66965,7,2,1,2,NA,3,3,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21718.301271,24503.405153,1,94,5,5,0.74,5,5,1,1,0,2,24,1,3,1,4 +66966,7,2,2,14,NA,1,1,2,14,170,NA,NA,2,2,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19850.979841,20551.555585,1,97,3,3,0.5,5,5,0,2,0,1,56,2,2,6,NA +66967,7,2,1,33,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,2,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,39073.76885,38778.866765,2,99,99,3,0.79,4,2,0,0,0,2,42,2,4,5,NA +66968,7,2,2,11,NA,1,1,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21075.336925,21477.798111,1,92,14,14,3.15,5,5,1,2,0,1,34,1,4,1,4 +66969,7,2,1,10,NA,1,1,1,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8828.580268,8822.70874,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +66970,7,2,1,18,NA,1,1,2,18,222,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26704.187335,27112.370182,1,95,8,5,1.36,3,2,0,0,0,1,50,1,9,6,NA +66971,7,2,2,8,NA,5,6,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9620.269705,10273.007637,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +66972,7,1,1,1,13,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,0,2,100,2,2,0.25,4,4,2,1,0,2,39,1,2,5,NA +66973,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,111065.717962,111174.779569,2,94,10,10,4.42,2,2,0,0,0,2,49,1,4,1,1 +66974,7,2,1,72,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11034.04089,11599.454609,2,95,5,5,1.45,2,2,0,0,2,1,72,1,3,1,3 +66975,7,2,1,17,NA,2,2,1,17,205,2,NA,2,1,4,9,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,18206.126374,19392.083527,2,93,3,3,0.58,4,4,0,1,1,1,65,2,1,3,NA +66976,7,2,1,24,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,35338.972549,37196.45724,2,90,6,6,1.21,4,4,0,0,0,2,59,2,1,6,NA +66977,7,2,2,10,NA,4,4,2,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.490652,8919.477637,2,97,4,4,0.57,5,5,1,3,0,2,33,1,3,5,NA +66978,7,2,1,7,NA,5,6,2,7,86,NA,NA,2,2,3,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9928.619925,10758.848877,1,91,14,14,3.69,4,4,1,1,0,2,29,2,5,1,5 +66979,7,2,2,16,NA,5,6,2,16,200,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,7588.544207,8133.521636,3,91,6,6,1.34,4,4,0,2,0,1,52,2,3,1,1 +66980,7,2,1,7,NA,5,6,2,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9928.619925,10758.848877,1,91,2,2,0.32,3,3,1,1,0,2,28,1,4,77,NA +66981,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,27921.272721,1,101,4,4,0.84,3,3,0,1,0,1,42,1,4,1,4 +66982,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,21924.837493,22597.469895,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +66983,7,2,2,9,NA,4,4,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,8362.256577,9003.967662,2,100,1,1,0.08,5,5,1,2,0,2,19,1,3,NA,NA +66984,7,2,1,75,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,53663.609619,56801.747638,2,93,10,10,3.61,3,3,0,0,2,1,75,1,4,1,4 +66985,7,2,2,77,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,3,2,NA,1,2,2,1,2,2,2,2,1,NA,18241.877822,19614.829564,2,93,3,3,0.66,2,2,0,0,2,2,69,2,4,3,NA +66986,7,2,1,9,NA,5,6,1,9,116,NA,NA,1,1,NA,4,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6254.093492,6623.185563,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +66987,7,2,1,0,8,5,6,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5507.575232,5738.278852,1,97,15,15,4.84,6,6,2,0,0,1,53,NA,NA,1,NA +66988,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,19870.689174,19326.875638,1,96,3,3,0.93,2,2,0,1,0,2,40,1,5,5,NA +66989,7,2,2,1,14,1,1,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,11879.078775,2,98,2,2,0.35,3,3,2,0,0,2,20,1,4,5,NA +66990,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17527.360027,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +66991,7,2,1,24,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,14313.345971,14703.033095,3,91,10,10,4.42,2,2,0,0,0,1,47,2,2,1,NA +66992,7,2,1,7,NA,3,3,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,42986.51011,44926.997612,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +66993,7,2,2,38,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,2,6,2,2,2,2,2,2,2,NA,NA,NA,NA,32982.479382,32092.542799,2,99,99,3,0.79,4,2,0,0,0,2,42,2,4,5,NA +66994,7,2,1,52,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,25264.512558,25333.955786,2,93,15,15,5,2,2,0,0,0,1,52,2,5,1,5 +66995,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,76827.086279,81170.917712,2,99,15,15,5,2,2,0,0,0,2,37,1,5,1,5 +66996,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,25651.892165,25827.388922,1,97,14,14,5,3,3,0,0,0,2,51,1,5,1,4 +66997,7,2,2,15,NA,4,4,1,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19770.196972,20174.150218,2,102,10,10,3.78,3,3,0,1,0,1,33,1,3,5,NA +66998,7,2,2,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10771.85499,12037.490455,2,97,4,4,0.81,4,4,1,1,0,2,51,1,3,4,NA +66999,7,2,2,15,NA,4,4,1,15,191,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13801.622751,14246.373765,1,100,10,10,2.59,5,5,0,1,0,2,40,1,5,1,NA +67000,7,2,1,49,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19320.837782,1,99,15,8,4.59,4,1,0,2,0,1,49,1,4,6,NA +67001,7,2,1,76,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,63147.363155,65543.108264,1,91,8,8,3.4,2,2,0,0,2,2,74,1,4,1,2 +67002,7,2,1,39,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,21317.283165,22287.043754,2,96,5,5,1.08,3,3,0,1,0,2,41,1,3,1,NA +67003,7,2,1,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,105401.67423,106753.633419,2,92,15,15,5,1,1,0,0,1,1,68,1,5,3,NA +67004,7,2,2,4,NA,1,1,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18078.669459,18848.958225,1,101,2,2,0.26,5,5,3,0,0,2,26,1,2,1,3 +67005,7,2,1,19,NA,4,4,2,19,239,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +67006,7,2,2,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,7906.792868,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +67007,7,2,2,40,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,19247.348846,19527.962249,2,101,9,9,3.74,2,2,0,0,0,2,40,2,4,1,2 +67008,7,2,2,17,NA,4,4,1,17,210,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16659.324602,16705.662179,1,92,77,77,NA,5,5,1,2,0,2,41,1,3,5,NA +67009,7,2,2,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,90299.161173,96625.186997,1,92,6,6,1.57,3,3,0,1,0,1,29,1,4,6,NA +67010,7,2,2,3,NA,2,2,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11009.851855,11478.955249,1,93,13,3,0.54,6,3,2,1,0,1,23,NA,NA,5,NA +67011,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,7869.59899,8538.749518,2,100,2,2,0.72,1,1,0,0,1,2,67,1,1,4,NA +67012,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,14138.631841,14167.501749,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +67013,7,2,1,11,NA,4,4,2,11,132,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9699.683862,9867.948233,2,97,14,14,3.91,4,4,1,1,0,1,38,1,4,1,5 +67014,7,2,2,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18696.216547,18746.863759,2,100,5,5,0.95,4,4,0,0,1,2,53,1,3,5,NA +67015,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,14516.765165,13843.248577,3,90,7,7,2.23,3,3,0,0,0,2,51,1,4,3,NA +67016,7,2,2,11,NA,3,3,2,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,98,14,14,3.9,4,4,0,3,0,2,31,1,4,1,NA +67017,7,2,1,11,NA,3,3,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,82670.203859,85919.643529,1,97,15,15,5,5,5,0,3,0,2,47,2,5,1,5 +67018,7,1,1,5,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,17458.543556,0,2,91,6,6,1.3,4,4,1,1,0,2,27,1,4,6,NA +67019,7,2,1,6,NA,5,7,1,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7101.095162,7528.512272,2,96,15,15,5,4,4,1,1,0,2,35,2,5,1,5 +67020,7,2,1,78,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,74473.849242,78828.927467,2,98,14,14,5,2,2,0,0,2,1,78,1,5,1,3 +67021,7,2,1,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15599.953109,16099.73574,1,99,7,7,1.89,3,3,0,1,0,1,50,1,5,1,2 +67022,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,35813.944922,38588.040359,1,100,8,8,2.97,2,2,0,0,1,2,54,1,4,3,NA +67023,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,8746.76562,8644.133303,2,97,15,15,5,3,3,0,0,3,2,80,1,3,2,NA +67024,7,2,2,12,NA,3,3,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71303.309206,77744.474592,2,94,15,15,5,5,5,0,2,0,1,53,1,5,1,5 +67025,7,2,2,78,NA,2,2,2,NA,NA,2,NA,2,1,NA,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,17318.187297,23904.945555,2,90,2,2,0.89,1,1,0,0,1,2,78,2,1,1,NA +67026,7,2,1,40,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,35406.972937,38657.357615,2,98,12,12,NA,3,3,0,1,0,2,34,1,4,1,3 +67027,7,2,2,15,NA,1,1,2,16,192,NA,NA,2,1,4,10,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18166.909002,19929.443801,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +67028,7,2,2,6,NA,1,1,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10118.363218,10311.586628,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +67029,7,2,2,2,NA,5,6,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5373.703942,1,91,5,5,0.89,4,4,2,0,0,1,39,1,4,1,5 +67030,7,2,1,6,NA,4,4,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8714.559478,8865.734494,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +67031,7,2,2,18,NA,4,4,2,18,219,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,5,5,0.92,5,5,0,3,0,2,54,1,3,2,NA +67032,7,2,2,32,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,21351.921325,21766.153521,2,92,6,6,1.35,3,3,1,0,0,2,32,1,5,1,5 +67033,7,2,1,3,NA,4,4,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10615.626123,11270.93481,1,100,8,8,1.61,6,6,1,3,0,1,29,1,5,6,NA +67034,7,2,2,37,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,2,1,2,2,1,2,2,2,2,2,2,35353.005268,34399.106917,2,94,12,12,NA,4,4,0,2,0,1,47,2,2,1,2 +67035,7,2,2,3,NA,1,1,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13196.707564,14212.912965,2,96,8,8,1.33,7,7,2,1,1,1,62,2,1,1,1 +67036,7,2,2,16,NA,2,2,2,16,202,NA,NA,1,1,NA,11,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,12536.713942,13553.99602,3,90,12,12,NA,2,2,0,1,0,2,40,2,2,1,NA +67037,7,2,2,66,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,13676.984152,18290.186018,2,91,4,4,0.67,5,4,2,0,2,2,66,2,1,1,NA +67038,7,2,1,11,NA,3,3,2,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13713.949705,16784.308768,1,99,6,6,1.12,4,4,0,2,0,1,39,1,3,1,3 +67039,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,63630.652053,80950.199865,3,90,9,9,3.64,2,2,0,0,0,1,27,2,4,1,5 +67040,7,2,2,19,NA,1,1,2,19,232,2,NA,1,1,NA,15,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,18368.872199,18722.003928,2,94,9,1,0.14,3,1,0,0,0,2,48,2,2,6,NA +67041,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,42468.064168,44382.588967,2,101,3,3,0.54,3,3,0,2,0,2,36,1,3,5,NA +67042,7,2,2,9,NA,5,6,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8022.905544,9049.556422,2,92,6,6,1.34,4,4,1,1,0,1,40,2,3,1,3 +67043,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,17703.992112,2,95,15,15,5,3,3,0,0,0,1,59,NA,NA,6,NA +67044,7,2,2,19,NA,5,7,2,19,231,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11975.458482,12291.118947,1,97,15,15,5,6,6,0,3,0,1,47,1,5,1,5 +67045,7,2,2,1,13,3,3,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19168.30863,20370.539296,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +67046,7,2,1,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,7514.993062,7713.03043,2,90,7,7,2.38,2,2,0,0,1,1,66,1,4,5,NA +67047,7,2,2,54,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,35630.227837,35816.036445,2,102,8,8,4.59,1,1,0,0,0,2,54,2,5,5,NA +67048,7,2,2,12,NA,5,7,1,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12427.929278,12265.18624,1,102,15,15,5,4,4,0,2,0,2,40,2,5,1,4 +67049,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,10072.885959,10826.303506,2,100,13,13,NA,1,1,0,0,1,2,78,1,2,2,NA +67050,7,2,2,8,NA,1,1,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,13231.432201,13813.796743,2,97,13,13,NA,3,3,0,1,0,1,28,2,2,1,1 +67051,7,2,2,37,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,13379.422066,13458.148951,2,103,14,14,3.48,5,5,0,2,1,1,43,1,4,1,5 +67052,7,2,1,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,28585.875492,29232.915291,1,94,2,2,0.75,1,1,0,0,0,1,56,1,2,3,NA +67053,7,2,1,67,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,1,2,2,1,2,1,2,8017.002318,8145.424458,2,93,7,7,1.74,4,4,0,0,1,2,44,2,3,1,4 +67054,7,2,2,8,NA,1,1,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17458.526997,18973.577367,1,94,6,6,0.97,6,6,1,3,0,1,40,1,3,1,4 +67055,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,28244.319428,29210.271354,1,94,4,4,1.24,2,2,0,0,2,2,71,1,2,1,4 +67056,7,2,1,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,11551.71585,11723.869749,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +67057,7,2,1,0,2,4,4,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6423.674397,6522.268756,1,96,14,14,4.19,3,3,1,0,0,1,44,1,4,6,NA +67058,7,2,1,42,NA,4,4,2,NA,NA,2,NA,2,2,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17602.101156,18151.242681,1,96,15,15,5,4,4,0,1,0,1,42,2,4,1,4 +67059,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,NA,NA,NA,NA,53799.276134,54280.27834,1,94,3,3,0.37,5,5,0,3,0,2,29,1,4,4,NA +67060,7,2,2,16,NA,4,4,2,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11478.437608,11446.094627,1,96,6,6,1.21,4,4,0,2,0,2,41,1,4,4,NA +67061,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,36955.110877,37344.656251,1,100,14,14,4.45,3,3,1,0,0,1,33,1,4,1,4 +67062,7,2,2,1,14,3,3,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46813.021927,47428.160802,1,94,8,8,2.62,3,3,1,0,0,2,26,1,4,5,NA +67063,7,2,1,15,NA,3,3,1,15,188,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,84860.612577,85065.529717,2,98,15,15,5,4,4,0,2,0,1,48,1,3,1,4 +67064,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,94433.586146,97510.682342,1,91,14,14,3.06,5,5,2,0,0,2,30,1,5,1,5 +67065,7,2,1,36,NA,4,4,1,NA,NA,2,NA,2,2,4,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,23654.723526,31640.766843,1,100,4,4,0.99,2,2,0,1,0,1,36,2,4,4,NA +67066,7,2,1,65,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26087.95381,26422.577042,1,94,4,4,1.24,2,2,0,0,2,2,71,1,2,1,4 +67067,7,2,1,23,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,3,6,NA,2,2,2,NA,NA,NA,2,2,1,2,38474.772527,42632.210531,2,93,3,3,0.43,4,4,0,0,0,1,45,2,2,6,NA +67068,7,2,1,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,17879.023129,20112.694262,2,90,2,2,0.87,1,1,0,0,0,1,32,1,5,5,NA +67069,7,2,1,19,NA,3,3,2,19,235,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,69216.263169,70543.167563,1,91,15,15,5,3,3,0,0,0,2,50,1,4,1,4 +67070,7,2,2,64,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,14809.997435,15471.247979,2,95,4,4,0.76,4,4,0,1,2,1,80,1,1,2,NA +67071,7,2,2,16,NA,3,3,2,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,135393.338842,139317.527763,1,97,14,14,3.9,4,4,0,2,0,1,47,1,3,1,5 +67072,7,2,1,11,NA,2,2,1,11,133,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11971.590477,11920.833512,2,100,14,14,3.58,4,4,0,1,0,1,46,2,5,1,5 +67073,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,42894.724338,43561.362107,1,98,6,3,0.9,2,1,0,0,0,1,24,1,5,5,NA +67074,7,2,2,37,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,4,1,2,2,2,2,1,2,2,NA,NA,NA,NA,41791.57979,40949.069487,2,102,7,7,1.53,5,5,1,2,0,2,37,2,4,1,4 +67075,7,2,2,14,NA,3,3,1,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,114661.989457,116814.464785,2,101,14,14,4.86,3,3,0,1,0,1,53,1,4,1,5 +67076,7,2,2,10,NA,3,3,1,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23170.920553,22863.220381,3,91,2,2,0.33,4,4,0,3,0,2,31,1,4,4,NA +67077,7,1,2,4,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5878.066175,0,1,91,15,15,5,5,5,2,1,0,1,40,1,5,1,5 +67078,7,2,2,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,28175.708676,28476.609384,1,94,3,3,0.92,1,1,0,0,1,2,75,1,4,1,NA +67079,7,2,1,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,20397.472757,21204.731618,1,90,6,6,2.15,2,2,0,0,1,2,79,NA,NA,77,NA +67080,7,2,2,11,NA,3,3,2,11,140,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14287.66096,14320.169639,2,97,7,7,1.92,3,3,0,1,0,1,57,1,4,1,4 +67081,7,2,2,50,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,22916.776688,24567.079865,1,102,5,5,0.62,7,7,1,3,0,1,49,2,2,1,1 +67082,7,2,1,18,NA,1,1,1,18,224,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22768.423624,22766.421142,2,98,5,5,1.61,2,2,0,0,0,2,44,2,4,3,NA +67083,7,2,1,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,111284.977736,116509.217288,3,91,15,15,5,4,4,0,0,1,1,60,NA,NA,4,NA +67084,7,2,2,5,NA,3,3,2,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27528.66901,30383.138359,1,95,5,5,1.19,3,3,1,1,0,1,47,1,2,3,NA +67085,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,46498.414015,0,1,90,6,6,1.65,2,2,0,0,1,1,55,1,4,77,NA +67086,7,2,1,8,NA,1,1,1,9,108,NA,NA,2,2,3,2,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,17882.621856,17720.218058,2,98,3,3,0.4,6,6,1,2,0,2,29,2,1,4,NA +67087,7,2,2,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,15267.012422,14516.051827,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +67088,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,51218.356583,59416.206008,2,98,12,12,NA,2,2,0,0,1,2,80,1,2,2,NA +67089,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,24654.107413,23987.341621,1,100,6,6,1.39,4,4,0,3,0,2,29,1,4,5,NA +67090,7,2,2,0,4,2,2,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6752.982789,6610.907942,1,93,12,7,2,4,3,1,0,0,1,43,2,1,1,5 +67091,7,2,2,12,NA,2,2,1,12,149,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15809.066118,17342.845429,2,93,3,3,0.52,5,5,0,2,0,1,41,2,4,1,4 +67092,7,2,1,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,NA,63054.867183,67969.319596,1,90,14,8,4.03,2,1,0,0,2,1,76,1,5,6,NA +67093,7,2,1,10,NA,1,1,1,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,16288.924956,16868.808147,1,101,3,3,0.41,5,5,0,2,1,2,36,2,4,4,NA +67094,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,6038.685119,6085.921613,1,96,15,15,5,2,2,0,0,2,1,60,1,5,1,3 +67095,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,28585.875492,28917.983006,1,91,5,5,1.2,3,3,0,0,1,1,58,1,2,1,2 +67096,7,2,1,11,NA,1,1,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11399.23838,11295.714433,1,103,5,5,0.71,6,6,2,2,0,2,31,2,2,1,2 +67097,7,2,2,7,NA,1,1,2,7,85,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15225.935813,15373.8033,2,94,7,7,1.88,4,4,0,2,0,2,28,1,4,4,NA +67098,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,9793.924718,10548.859356,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +67099,7,2,1,7,NA,2,2,1,7,94,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12231.897958,14410.652577,1,100,3,3,0.39,5,5,1,2,0,1,32,2,1,6,NA +67100,7,2,2,29,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,20247.768461,26123.76716,2,93,6,6,1.72,2,2,0,1,0,2,29,1,4,3,NA +67101,7,2,2,8,NA,1,1,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20495.125801,21365.773499,3,92,4,4,0.46,7,7,1,2,0,2,31,2,2,1,1 +67102,7,2,2,13,NA,3,3,2,13,162,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,133500.800632,137370.136946,1,98,5,5,1.39,2,2,0,1,0,1,46,1,4,3,NA +67103,7,2,2,3,NA,2,2,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11429.37307,12618.334582,2,90,5,5,1.19,3,3,1,0,1,2,60,2,1,4,NA +67104,7,2,1,8,NA,4,4,2,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9699.683862,9892.534359,2,97,5,5,1.08,3,3,1,1,0,2,27,1,3,5,NA +67105,7,2,2,43,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,34954.173075,36984.739503,2,98,2,2,0.35,3,3,0,1,0,2,43,1,3,1,3 +67106,7,2,1,21,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,35338.972549,36508.861705,2,90,2,2,0.25,5,5,0,1,0,2,41,2,4,1,NA +67107,7,2,1,77,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,9662.124837,10964.58979,2,95,2,2,0.6,1,1,0,0,1,1,77,1,3,3,NA +67108,7,2,1,6,NA,1,1,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11881.117946,11935.814841,1,102,6,6,0.96,5,5,0,2,0,1,32,2,2,1,3 +67109,7,2,2,29,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,47348.206546,48810.979214,1,92,14,14,3.9,4,4,2,0,0,2,29,1,4,1,4 +67110,7,2,2,7,NA,4,4,1,7,90,NA,NA,2,1,3,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7140.212598,7289.797115,2,93,12,12,NA,4,4,1,1,0,2,27,2,4,1,4 +67111,7,2,1,11,NA,1,1,1,11,141,NA,NA,2,2,2,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,13870.762641,14200.45921,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +67112,7,2,2,64,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9581.703872,9981.600708,2,96,15,15,5,2,2,0,0,2,1,66,1,5,1,5 +67113,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,183805.817006,191979.640064,1,93,15,15,5,2,2,0,0,0,1,58,2,5,1,5 +67114,7,2,1,6,NA,5,6,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7241.695104,8178.415743,1,102,15,15,4.59,4,4,1,1,0,1,35,1,5,1,5 +67115,7,2,1,59,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,28247.128624,28689.709737,2,93,9,9,2.6,4,4,0,0,0,2,58,2,4,4,NA +67116,7,2,2,31,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,43270.789623,48694.023669,2,99,10,10,5,2,1,0,0,0,2,31,1,5,5,NA +67117,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,47973.37979,50072.031476,1,101,2,2,0.22,4,4,1,0,0,2,25,1,4,6,NA +67118,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,88056.562286,93150.302158,2,91,6,6,1.34,4,4,1,2,0,2,33,1,4,3,NA +67119,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,110369.721342,112542.856633,1,94,6,6,1.31,3,3,0,0,0,2,46,1,5,6,NA +67120,7,1,2,30,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,19305.389921,0,1,93,10,10,5,1,1,0,0,0,2,30,1,5,5,NA +67121,7,2,1,39,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19091.246741,19659.303383,1,91,5,5,0.89,4,4,2,0,0,1,39,1,4,1,5 +67122,7,2,1,17,NA,4,4,1,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12296.68269,12194.010773,1,102,7,7,2.72,2,2,0,1,0,2,49,1,4,5,NA +67123,7,2,2,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,32501.623429,43787.968887,2,97,5,5,1.63,2,2,1,0,0,2,33,1,3,5,NA +67124,7,2,2,8,NA,3,3,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23170.920553,22863.220381,1,94,4,4,1.06,2,2,0,1,0,2,26,1,4,5,NA +67125,7,2,1,2,NA,2,2,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8331.647763,8595.381151,2,90,15,15,4.2,5,5,1,0,0,2,50,NA,NA,6,NA +67126,7,2,2,22,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16239.242782,17454.103497,2,101,99,99,NA,3,1,0,0,0,2,22,1,4,5,NA +67127,7,2,1,18,NA,4,4,1,19,228,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,14650.502937,14679.468181,2,102,14,14,3.25,5,5,1,1,0,2,32,1,4,1,3 +67128,7,2,2,47,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,18811.641937,20880.310604,2,90,3,3,1.04,1,1,0,0,0,2,47,2,4,5,NA +67129,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18723.98095,17927.802584,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +67130,7,2,2,10,NA,2,2,1,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15352.601806,15746.071667,2,102,15,12,NA,5,4,0,3,0,1,42,2,4,6,NA +67131,7,2,1,8,NA,3,3,1,8,103,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18834.739821,20852.023287,1,94,5,5,1.2,3,3,0,1,0,1,49,1,4,5,NA +67132,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,36598.587714,38321.205688,1,97,7,7,1.74,4,4,0,3,0,2,32,1,4,5,NA +67133,7,2,1,33,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32856.012738,32608.038024,2,103,77,77,NA,5,5,1,2,0,2,30,1,2,1,2 +67134,7,2,1,29,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,40333.47326,40883.249623,2,99,9,9,4.92,1,1,0,0,0,1,29,1,5,5,NA +67135,7,2,2,58,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,1,2,NA,1,2,1,1,2,2,NA,NA,NA,NA,17277.829496,17117.256291,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +67136,7,2,2,11,NA,5,7,2,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18348.624469,20109.577944,2,90,77,77,NA,6,6,0,4,0,2,41,NA,NA,4,NA +67137,7,2,1,67,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,8479.54701,8948.405799,2,98,6,6,2.04,2,2,0,0,2,2,66,1,1,1,1 +67138,7,2,2,8,NA,2,2,2,8,102,NA,NA,2,1,3,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15583.587534,16935.930722,1,93,15,15,5,4,4,0,2,0,1,50,1,5,1,5 +67139,7,2,2,0,1,1,1,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8907.98929,8720.575629,1,95,1,1,0,3,3,1,0,0,2,21,1,2,6,NA +67140,7,1,2,12,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5268.765205,0,1,99,9,9,2.68,4,4,0,2,0,1,43,2,3,1,NA +67141,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,72114.232586,74326.626155,2,96,12,12,NA,2,2,0,0,2,1,77,1,5,1,4 +67142,7,2,1,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6992.24593,7710.094516,2,97,1,1,0.33,2,2,1,0,0,2,24,1,2,5,NA +67143,7,2,1,33,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,3,5,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,34624.133414,2,94,14,8,3.06,5,2,0,0,0,1,24,2,4,5,NA +67144,7,2,1,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,13629.653758,14595.525499,1,90,15,15,5,5,5,0,3,0,2,46,2,4,1,5 +67145,7,2,2,0,9,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3320.8855,3567.679794,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +67146,7,2,2,7,NA,3,3,2,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24070.467912,25563.654853,1,95,6,6,1.09,5,5,0,3,0,1,31,1,4,1,4 +67147,7,2,1,1,22,4,4,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6347.215153,6541.084247,2,95,6,6,1.3,4,4,1,1,0,1,38,1,4,1,4 +67148,7,2,2,68,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,3,2,NA,2,2,2,2,2,2,1,2,2,2,9716.805546,10855.679158,2,90,2,2,0.64,1,1,0,0,1,2,68,2,3,2,NA +67149,7,2,2,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,9943.806181,2,100,6,6,2.31,2,2,0,0,2,2,65,1,4,1,2 +67150,7,2,1,0,7,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6246.568228,6909.306675,2,95,1,1,0.13,2,2,1,0,0,2,22,1,3,5,NA +67151,7,2,1,5,NA,4,4,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,10162.494907,1,100,1,1,0.26,2,2,1,0,0,2,28,1,3,5,NA +67152,7,2,2,10,NA,1,1,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,14414.529053,14932.182215,2,96,3,3,0.46,5,5,1,2,0,1,37,1,1,1,2 +67153,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17538.193115,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +67154,7,2,1,4,NA,5,7,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10276.262805,11525.953064,1,97,15,15,4.77,4,4,1,1,0,1,41,2,4,1,5 +67155,7,2,2,2,NA,5,6,1,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7128.631964,7757.55827,3,91,15,15,5,4,4,1,1,0,1,39,2,5,1,5 +67156,7,2,2,10,NA,2,2,1,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12307.832776,13375.906079,2,93,10,10,2.26,6,6,0,4,0,1,34,1,4,1,3 +67157,7,2,2,18,NA,5,6,2,18,222,2,NA,2,1,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6937.463063,7435.682574,3,90,99,99,NA,4,4,0,1,0,1,40,2,3,6,NA +67158,7,2,1,14,NA,2,2,1,14,178,NA,NA,2,2,3,9,NA,NA,NA,2,1,2,1,2,2,1,2,1,2,14117.225999,14174.690553,2,93,4,4,0.56,5,5,0,2,0,1,37,NA,NA,1,1 +67159,7,2,1,80,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,1,1,2,1,1,2,2,NA,11550.158096,12419.035396,2,92,5,5,1.08,3,3,0,0,2,1,46,NA,NA,5,NA +67160,7,2,2,15,NA,4,4,2,15,185,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12209.74498,12444.407921,2,90,14,14,4.25,4,4,0,2,1,2,45,2,5,5,NA +67161,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,48113.658256,0,1,90,5,5,2.15,1,1,0,0,1,2,80,1,3,2,NA +67162,7,2,1,4,NA,5,6,2,4,54,NA,NA,2,2,1,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8402.098771,9423.873047,3,91,5,5,1.08,3,3,1,0,0,1,29,2,5,1,5 +67163,7,2,1,4,NA,1,1,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14505.510202,14964.673559,2,94,4,4,0.73,5,5,2,1,0,1,35,2,1,6,NA +67164,7,2,2,13,NA,5,6,1,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10142.281747,10534.471105,3,91,15,15,5,4,4,0,2,0,1,44,2,5,1,5 +67165,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,35126.205635,35160.69801,1,101,2,2,0.66,1,1,0,0,0,2,46,1,4,3,NA +67166,7,2,2,9,NA,2,2,2,9,116,NA,NA,2,1,3,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,16099.075547,16268.329655,1,93,5,5,0.84,5,5,1,2,0,2,52,2,1,3,NA +67167,7,2,1,8,NA,2,2,2,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9390.522479,10327.334743,2,90,3,3,0.7,3,3,1,1,0,2,25,1,1,1,NA +67168,7,2,2,11,NA,3,3,1,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18800.96526,18551.296274,1,94,3,3,0.37,5,5,0,3,0,2,29,1,4,4,NA +67169,7,2,1,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,27572.205373,27179.185736,1,100,7,7,3.58,1,1,0,0,0,1,30,1,5,5,NA +67170,7,2,1,13,NA,2,2,2,13,163,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16033.31661,17623.465787,2,90,5,5,0.76,5,5,0,4,0,2,32,1,2,3,NA +67171,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,19060.786733,19662.793534,2,97,4,4,0.81,4,4,1,0,0,2,51,1,2,4,NA +67172,7,2,1,5,NA,1,1,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19885.456648,19912.326587,1,92,10,10,3.04,4,4,2,0,0,2,37,2,5,1,5 +67173,7,2,2,21,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,1,2,2,1,19463.594852,21649.931723,3,92,6,6,1.6,3,3,0,0,1,2,77,1,3,99,NA +67174,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,1,1,2,2,1,2,2,1,2,2,1,100264.332334,116996.29597,1,99,7,7,3.63,1,1,0,0,0,2,25,1,5,5,NA +67175,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,31540.022655,31610.470938,2,94,NA,77,NA,2,1,0,0,0,1,49,1,3,3,NA +67176,7,2,1,17,NA,4,4,2,17,206,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11834.781205,12120.23702,2,90,8,8,2.59,3,3,0,2,0,2,35,1,4,6,NA +67177,7,2,2,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,66567.821082,69187.508251,1,94,3,3,0.88,2,2,0,0,1,2,74,1,2,2,NA +67178,7,2,1,4,NA,1,1,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17865.135763,18430.646082,3,92,3,3,0.51,5,5,1,2,0,2,34,2,1,6,NA +67179,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,NA,NA,NA,NA,30275.274308,28786.080652,2,101,2,2,0.51,1,1,0,0,0,2,20,1,4,5,NA +67180,7,2,2,78,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,14534.533756,15507.238104,1,96,6,6,2.06,2,2,0,0,2,1,68,2,3,1,2 +67181,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,28721.124083,1,101,7,7,1.82,4,4,2,0,0,2,27,1,2,1,3 +67182,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,19130.246369,19076.4893,1,98,10,10,3.77,3,3,0,1,0,1,48,NA,NA,1,4 +67183,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21143.964074,20709.49715,1,100,15,15,3.7,5,5,0,3,0,1,51,1,5,1,5 +67184,7,2,1,42,NA,1,1,2,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,31640.296506,31176.023929,2,94,15,9,5,2,1,0,0,0,1,42,1,4,6,NA +67185,7,2,2,51,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,1,1,2,2,NA,24178.173487,24760.288626,1,92,7,7,2.1,3,3,0,0,0,1,24,2,4,5,NA +67186,7,2,1,6,NA,2,2,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11971.590477,11920.833512,2,100,14,14,3.58,4,4,1,1,0,1,33,1,4,1,5 +67187,7,2,2,15,NA,1,1,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12996.753859,13369.730018,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +67188,7,2,2,13,NA,4,4,1,13,161,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14166.687432,14623.20249,1,100,6,6,1.39,4,4,0,3,0,2,29,1,4,5,NA +67189,7,2,2,70,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,3,2,NA,1,2,1,1,2,1,1,2,2,NA,12813.709202,14706.046404,2,103,4,4,1.43,1,1,0,0,1,2,70,2,3,2,NA +67190,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,79987.938327,1,101,14,14,4.5,3,3,0,1,0,1,39,1,2,1,5 +67191,7,2,2,33,NA,3,3,1,NA,NA,2,NA,2,7,2,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,29733.812317,32603.623062,1,101,6,6,1.65,2,2,0,0,0,1,47,1,4,1,2 +67192,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126117.5094,130777.186989,2,98,8,8,2.7,3,3,0,0,1,2,71,NA,NA,2,NA +67193,7,2,1,37,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18289.793332,19321.216647,1,99,8,8,1.76,5,5,0,2,1,1,37,1,4,1,3 +67194,7,2,1,51,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21762.20618,21775.974398,1,91,10,10,2.56,5,5,0,3,0,1,51,2,5,1,4 +67195,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,133542.212862,137840.368471,1,94,9,9,3.97,2,2,0,0,0,1,49,1,3,1,3 +67196,7,2,2,5,NA,1,1,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11859.546176,12772.78418,1,102,8,8,1.33,7,7,1,4,0,2,32,1,3,1,2 +67197,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,66253.989241,66961.54455,1,101,15,15,5,2,2,0,0,2,2,73,1,4,1,4 +67198,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32461.799549,32721.879701,1,101,3,3,0.66,2,2,0,0,1,1,67,1,2,3,NA +67199,7,2,1,41,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15574.704266,15518.439557,2,92,15,15,5,2,2,0,0,0,2,36,1,5,1,5 +67200,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,97074.465027,101633.534325,1,93,15,8,4.41,3,1,0,0,0,1,30,1,5,5,NA +67201,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,20953.00978,22383.074498,2,97,3,3,0.46,5,5,0,3,0,1,40,1,2,1,3 +67202,7,2,1,11,NA,5,6,2,11,133,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8423.270513,9127.622487,1,90,15,15,5,5,5,0,3,0,2,46,2,4,1,5 +67203,7,2,1,33,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17879.023129,20112.694262,2,90,5,5,2.02,1,1,0,0,0,1,33,2,3,5,NA +67204,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,20333.447198,20233.229833,1,98,6,6,1.72,2,2,0,0,0,2,53,1,5,2,NA +67205,7,2,1,5,NA,5,7,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8100.706553,8491.571292,1,98,14,14,3.9,4,4,2,0,0,1,39,1,5,1,4 +67206,7,2,1,8,NA,5,7,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21087.869274,22876.159598,1,101,5,5,1.26,3,3,0,1,1,2,42,1,3,5,NA +67207,7,2,2,10,NA,4,4,2,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7136.421849,7489.546444,1,90,9,9,1.65,7,7,0,4,0,1,36,1,4,1,4 +67208,7,2,1,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7117.971973,7173.650989,2,100,6,6,2.31,2,2,0,0,2,2,65,1,4,1,2 +67209,7,2,2,80,NA,3,3,1,NA,NA,2,NA,2,1,9,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,51644.110977,57877.507418,1,102,5,5,1.84,1,1,0,0,1,2,80,2,5,2,NA +67210,7,2,2,63,NA,4,4,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,2,1,1,1,NA,10585.751811,11058.394307,2,93,6,6,1.13,4,4,0,0,2,1,60,2,3,1,3 +67211,7,2,1,3,NA,4,4,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8973.990262,9895.291699,2,95,3,3,0.43,4,4,2,0,0,2,23,1,2,5,NA +67212,7,1,2,67,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,125706.50355,0,3,91,14,14,5,2,1,0,0,1,2,67,1,5,5,NA +67213,7,2,1,4,NA,4,4,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,10259.663981,2,97,1,1,0.27,2,2,1,0,0,2,20,1,2,5,NA +67214,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,99283.360764,103932.649449,3,91,14,14,5,1,1,0,0,0,1,39,1,5,5,NA +67215,7,2,1,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,2,2,2,1,2,2,1,40899.412129,44211.773156,1,94,5,5,0.57,7,7,2,1,0,1,58,2,1,1,1 +67216,7,2,2,0,7,1,1,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6744.839779,7193.080406,1,103,5,5,1.02,4,4,2,0,0,1,25,1,2,1,4 +67217,7,2,1,41,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,37402.70356,39087.586144,2,102,7,7,1.89,3,3,0,1,0,1,41,2,2,6,NA +67218,7,2,1,0,8,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13392.309303,13804.825901,1,99,15,15,5,5,5,3,0,0,2,34,1,5,1,5 +67219,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,61212.189461,64753.083655,3,90,15,15,5,3,3,1,0,0,1,31,1,5,1,5 +67220,7,2,1,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,106105.629898,111686.437619,1,100,14,9,4.92,3,1,1,0,0,1,33,1,5,5,NA +67221,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,17293.36291,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +67222,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,62796.637452,70136.543572,2,102,6,6,1.15,5,5,0,0,2,1,80,1,5,1,1 +67223,7,2,1,40,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18898.73153,22670.159935,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +67224,7,2,1,2,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6760.288309,6966.774293,1,96,99,99,NA,4,4,1,1,0,2,35,2,3,1,3 +67225,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,8318.523894,9127.657215,3,90,3,3,1.07,1,1,0,0,1,1,80,1,5,2,NA +67226,7,2,2,43,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,14831.744106,14871.922635,3,90,5,5,0.87,4,4,0,0,0,2,43,2,3,5,NA +67227,7,2,2,17,NA,4,4,2,17,208,2,NA,2,2,4,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11072.776368,11285.58755,3,90,9,9,4.1,2,2,0,1,0,2,41,2,5,5,NA +67228,7,2,1,41,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,14823.307875,15546.691363,1,96,8,8,2.62,3,3,0,1,0,1,41,2,3,1,5 +67229,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,138075.879417,141933.339512,2,91,7,7,1.61,4,4,0,0,3,1,65,1,3,6,NA +67230,7,2,1,59,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,25969.864445,26997.658596,1,97,15,15,5,2,2,0,0,0,1,59,1,5,1,5 +67231,7,2,1,18,NA,4,4,1,18,219,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16147.713323,16532.569027,1,92,5,5,0.95,4,4,0,2,0,2,33,1,4,5,NA +67232,7,2,2,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,35933.117795,36141.582386,1,98,1,1,0.18,1,1,0,0,0,2,48,1,5,1,NA +67233,7,2,2,7,NA,4,4,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8757.841043,9034.425418,2,97,2,2,0.49,3,3,0,1,0,2,27,1,4,5,NA +67234,7,2,1,12,NA,1,1,1,12,149,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20705.832333,21431.576705,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +67235,7,2,1,6,NA,4,4,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14125.862146,14295.209168,1,97,5,5,0.91,4,4,0,3,0,2,44,1,4,5,NA +67236,7,2,2,48,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,43535.993088,43763.029589,2,102,77,77,NA,3,3,0,0,0,2,48,2,2,1,3 +67237,7,2,2,51,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,23953.14388,24078.057488,1,90,12,12,NA,4,4,0,0,0,1,54,2,4,1,2 +67238,7,2,2,15,NA,5,6,1,15,189,NA,NA,2,1,4,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7382.152016,8028.485773,1,94,14,14,2.78,6,5,0,2,1,1,61,1,4,1,5 +67239,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,1,4,NA,2,2,2,2,2,1,NA,NA,NA,NA,24004.6026,28934.42641,2,91,4,4,0.94,3,3,0,1,0,2,50,2,1,4,NA +67240,7,2,2,5,NA,1,1,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19235.084509,21236.049482,3,92,8,8,2,4,4,2,0,0,1,30,1,4,1,4 +67241,7,1,1,80,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,99,NA,1,1,2,1,2,2,NA,NA,NA,NA,14359.447628,0,1,97,4,4,0.81,3,3,0,0,2,1,80,1,3,99,NA +67242,7,2,1,2,NA,4,4,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8009.966208,8832.297541,2,96,6,6,1.35,3,3,1,1,0,2,23,1,2,5,NA +67243,7,2,2,68,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,7869.59899,8538.749518,1,96,3,3,0.68,2,2,0,0,1,2,68,1,2,3,NA +67244,7,2,2,13,NA,3,3,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28650.637159,30356.286382,2,100,2,2,0.38,3,3,0,2,0,2,35,1,4,5,NA +67245,7,2,1,27,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,2,5,NA,1,2,2,1,2,1,1,2,2,1,9177.295801,9548.31812,2,92,77,77,NA,4,4,0,0,0,1,27,2,2,5,NA +67246,7,2,1,15,NA,3,3,2,15,185,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,68701.580401,72973.564721,2,94,15,15,5,5,5,0,2,0,1,53,1,5,1,5 +67247,7,2,1,8,NA,5,6,2,8,102,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8151.552109,8792.161653,1,90,14,14,3.33,5,5,1,2,0,1,41,1,5,1,5 +67248,7,2,2,14,NA,1,1,1,14,174,NA,NA,2,2,4,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15690.47168,16407.081535,1,102,5,5,0.62,7,7,1,3,0,1,49,2,2,1,1 +67249,7,2,2,58,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16663.192678,16751.306683,2,92,NA,4,1.65,2,1,0,0,1,2,58,2,4,5,NA +67250,7,2,2,43,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,42424.587753,44729.774642,2,102,4,4,1.38,2,1,0,0,0,2,43,1,5,6,NA +67251,7,2,2,7,NA,4,4,2,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,1,2,NA,NA,NA,NA,7814.742747,7984.793423,2,95,2,2,0.26,4,4,0,2,0,2,44,NA,NA,5,NA +67252,7,2,2,24,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16844.740449,17983.530016,3,91,3,3,1.1,1,1,0,0,0,2,24,1,5,5,NA +67253,7,2,2,10,NA,3,3,2,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,44941.581862,44344.776378,2,94,10,10,2.91,4,4,0,2,0,2,38,1,4,1,4 +67254,7,2,1,8,NA,1,1,1,9,108,NA,NA,2,2,2,2,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,13870.762641,13985.149896,2,102,6,4,1.02,6,2,0,4,0,2,43,2,1,5,NA +67255,7,2,2,38,NA,3,3,2,NA,NA,2,NA,2,1,4,NA,3,1,2,1,2,2,1,2,2,1,1,2,NA,53830.599426,56664.989337,1,99,77,77,NA,4,4,1,1,0,1,31,2,3,1,3 +67256,7,2,1,10,NA,1,1,1,11,132,NA,NA,2,2,3,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15456.524105,16140.282926,1,100,99,99,NA,6,6,0,1,0,2,22,2,3,1,3 +67257,7,2,2,9,NA,5,6,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8556.454265,9137.012028,1,90,15,15,5,5,5,0,2,0,1,47,2,5,1,5 +67258,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,54256.870337,62240.534341,2,94,6,6,2.04,2,2,0,0,2,1,75,1,3,1,3 +67259,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,90081.78624,90194.909743,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +67260,7,2,1,3,NA,3,3,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27542.701065,31074.71228,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +67261,7,2,1,57,NA,3,3,2,NA,NA,2,NA,2,1,99,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,20160.790176,25538.533486,3,90,77,99,NA,2,1,0,0,1,1,62,2,5,3,NA +67262,7,1,2,68,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,1,1,2,1,NA,NA,NA,NA,9793.924718,0,2,100,2,2,0.39,3,3,0,0,1,2,45,1,2,5,NA +67263,7,2,2,3,NA,1,1,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15979.952759,16987.381382,2,102,6,6,1.03,5,5,1,1,0,1,37,1,2,1,2 +67264,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,81062.798322,86779.337922,1,101,4,4,1.61,1,1,0,0,1,2,77,1,2,2,NA +67265,7,2,2,0,5,4,4,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4681.626184,4732.744026,1,96,6,6,1.31,4,3,1,0,0,2,27,2,4,1,3 +67266,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,51543.062078,51154.050295,3,92,7,7,1.3,5,5,1,2,0,2,33,2,2,1,1 +67267,7,1,1,10,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10524.718724,0,1,96,77,77,NA,2,2,0,1,0,2,35,1,3,3,NA +67268,7,2,2,18,NA,3,3,2,18,217,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,100004.689924,107460.712122,1,90,12,12,NA,2,2,0,0,0,2,45,2,3,4,NA +67269,7,2,1,59,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21762.20618,22687.256739,1,91,15,15,5,4,4,0,1,0,2,51,2,4,1,5 +67270,7,2,2,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,34874.122648,36144.248604,3,92,6,6,1.41,4,3,0,1,0,1,41,1,4,1,4 +67271,7,2,2,4,NA,4,4,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8833.042831,9629.276723,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +67272,7,2,2,11,NA,3,3,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18417.272091,18465.044105,1,94,5,5,1.04,4,4,0,2,0,2,29,1,3,1,3 +67273,7,2,1,44,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,31740.385214,31855.807763,2,96,5,5,0.78,5,5,0,2,0,1,37,2,1,5,NA +67274,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,19150.604366,19251.871661,3,91,14,9,2.68,6,4,0,0,2,1,48,2,1,1,1 +67275,7,2,1,77,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,16603.347511,18119.902269,2,98,3,3,0.88,2,2,0,0,2,1,77,1,1,1,3 +67276,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,3,NA,2,2,2,2,2,2,1,2,2,2,9716.805546,10855.679158,2,90,7,7,1.34,5,5,0,1,2,1,61,2,1,4,NA +67277,7,2,2,4,NA,5,6,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5307.591514,5454.53335,2,102,3,3,0.38,5,5,3,0,0,2,30,2,2,1,4 +67278,7,2,1,2,NA,2,2,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,1,1,0.14,3,2,2,0,0,2,27,1,3,6,NA +67279,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,21765.629914,22790.091994,2,90,2,2,0.38,4,4,1,2,0,2,32,1,4,5,NA +67280,7,2,1,27,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37911.437415,38428.199561,2,103,12,6,2.24,2,1,0,0,0,1,27,1,4,5,NA +67281,7,2,2,42,NA,1,1,2,NA,NA,2,NA,2,2,77,NA,2,6,2,2,2,2,2,2,2,2,2,2,2,31235.666551,35013.570975,2,94,77,77,NA,3,3,0,1,0,2,42,2,2,6,NA +67282,7,2,2,8,NA,1,1,1,8,102,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,13028.403003,13395.598637,2,96,6,6,1.11,5,5,0,3,0,2,32,2,3,1,2 +67283,7,2,2,56,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12441.719186,12605.354834,1,96,15,15,5,5,5,0,0,0,1,58,2,5,1,5 +67284,7,2,2,12,NA,5,6,1,12,147,NA,NA,2,2,1,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6370.316505,6496.587233,2,94,8,8,1.8,6,6,0,1,2,1,74,2,5,1,5 +67285,7,2,2,70,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,22166.463682,23916.215243,3,91,6,6,2.89,1,1,0,0,1,2,70,2,5,2,NA +67286,7,2,2,6,NA,4,4,2,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6655.097829,7106.52929,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +67287,7,2,2,10,NA,5,6,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7932.110938,8316.610099,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +67288,7,2,1,24,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,17446.328105,17921.312041,1,92,15,15,5,2,2,0,0,0,2,49,1,5,3,NA +67289,7,2,1,5,NA,5,6,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7042.228842,7898.630137,2,103,14,14,3.47,4,4,1,0,1,1,47,2,5,1,5 +67290,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,34099.599202,35276.751365,1,94,7,1,0.09,5,1,0,0,0,1,46,1,4,1,4 +67291,7,2,2,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,35160.494695,36239.184013,1,100,4,4,1.16,2,2,0,0,2,1,74,1,3,1,5 +67292,7,2,1,8,NA,4,4,1,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9022.8939,9530.778148,2,100,6,6,0.99,5,5,0,3,0,2,40,1,3,1,3 +67293,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,132969.642582,137509.365878,2,91,15,15,5,4,4,0,2,0,1,53,1,5,1,4 +67294,7,1,2,44,NA,2,2,NA,NA,NA,2,NA,2,1,5,NA,3,1,3,1,2,2,1,2,2,NA,NA,NA,NA,32606.880052,0,2,93,6,6,1.48,4,4,0,1,0,1,53,2,2,1,3 +67295,7,2,2,4,NA,5,6,2,4,52,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,4932.827461,1,91,14,14,4.32,3,3,1,0,0,1,34,2,5,1,3 +67296,7,2,2,15,NA,4,4,2,15,182,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12265.19283,12230.632995,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +67297,7,2,1,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,123110.069898,136669.986833,1,101,8,4,1.34,2,1,0,0,0,2,20,1,4,6,NA +67298,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,17377.366864,16840.035727,2,99,6,6,1.11,5,5,1,2,0,2,41,1,2,5,NA +67299,7,2,2,7,NA,2,2,2,7,84,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15148.721588,16225.089736,2,91,2,2,0.42,3,3,1,1,0,2,27,1,3,5,NA +67300,7,2,1,72,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,71709.98031,77299.00621,2,91,9,9,2.6,4,4,0,0,2,1,72,1,4,1,5 +67301,7,1,2,18,NA,3,3,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,45824.798023,0,1,97,1,1,0.09,2,1,0,0,0,1,24,1,3,6,NA +67302,7,2,2,3,NA,4,4,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16749.124902,18717.057678,2,97,1,1,0.13,4,4,2,0,1,2,62,1,2,4,NA +67303,7,2,1,8,NA,3,3,2,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,82670.203859,85919.643529,1,97,15,15,5,5,5,0,3,0,2,47,2,5,1,5 +67304,7,2,2,12,NA,2,2,1,12,151,NA,NA,2,2,2,5,NA,NA,NA,2,1,2,2,2,2,1,2,1,2,12712.538972,13945.896408,2,93,6,6,0.93,5,5,1,2,0,1,40,2,4,1,4 +67305,7,2,2,20,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,3,1,0.22,3,1,0,0,0,2,20,2,4,5,NA +67306,7,2,1,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,19186.370211,20284.349464,2,97,2,2,0.27,4,4,0,2,0,1,51,1,2,4,NA +67307,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,21022.682584,21611.637105,1,100,3,3,0.43,4,4,2,0,0,1,20,1,3,6,NA +67308,7,2,1,21,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,10131.732483,10407.573345,2,103,12,3,1.07,5,1,0,1,0,2,47,NA,NA,3,NA +67309,7,2,1,72,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,2,2,1,2,2,2,2,2,2,NA,15435.262366,15704.333986,2,93,9,9,3.14,3,3,0,0,2,1,43,NA,NA,5,NA +67310,7,2,1,46,NA,2,2,1,NA,NA,2,NA,2,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,49060.272708,48961.70392,1,92,14,5,1.88,3,1,0,1,0,2,39,2,4,6,NA +67311,7,2,2,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,50915.06085,52488.027702,3,92,8,8,2,4,4,2,0,0,1,30,1,4,1,4 +67312,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,160001.813639,1,95,9,9,2.66,4,4,0,2,0,1,45,1,3,1,3 +67313,7,2,1,11,NA,1,1,1,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17882.621856,18280.794545,3,92,8,8,1.55,6,6,1,3,0,2,38,1,5,1,4 +67314,7,2,1,62,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,40561.050563,40941.458273,2,101,3,3,0.98,2,2,0,0,2,1,62,1,4,1,3 +67315,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15890.452621,2,100,7,7,1.79,4,4,0,1,0,2,51,1,3,3,NA +67316,7,2,2,48,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,32208.300114,33976.532975,1,102,6,6,1.34,4,4,0,1,0,2,48,2,3,1,1 +67317,7,2,1,0,10,4,4,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6275.847063,6372.172481,2,100,14,14,3.58,4,4,1,1,0,2,31,1,5,1,4 +67318,7,2,1,26,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,12364.328404,12075.509308,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +67319,7,2,1,6,NA,4,4,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8065.706636,8519.712345,2,99,1,1,0.03,3,3,0,1,0,2,56,1,3,5,NA +67320,7,2,1,19,NA,2,2,2,19,230,2,NA,1,1,NA,12,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,14081.782012,14782.02856,2,90,7,7,1.34,5,5,0,1,2,1,61,2,1,4,NA +67321,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,24930.322327,24899.923342,2,91,4,4,1.22,2,2,0,0,0,1,53,1,4,1,4 +67322,7,2,1,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,NA,NA,NA,1,2,2,1,20308.910079,25155.898326,1,90,NA,NA,NA,2,2,0,0,0,2,40,NA,NA,5,NA +67323,7,2,2,10,NA,1,1,1,10,122,NA,NA,2,2,3,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20495.125801,21027.07407,3,92,3,3,0.52,5,5,2,1,0,2,29,2,1,1,3 +67324,7,2,1,7,NA,5,6,2,7,95,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7193.657603,7758.988679,2,90,14,14,4.32,3,3,0,1,0,1,48,2,4,1,5 +67325,7,2,2,15,NA,1,1,1,15,182,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16781.078148,17658.768186,2,103,77,77,NA,5,5,0,2,0,2,45,2,4,5,NA +67326,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,24126.537834,25148.058527,2,97,5,5,0.76,5,5,1,1,0,2,47,1,4,5,NA +67327,7,2,1,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53149.251154,62614.383127,2,94,6,6,2.04,2,2,0,0,2,1,75,1,3,1,3 +67328,7,2,2,6,NA,5,6,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9007.62445,9504.796896,2,102,15,15,3.92,5,5,1,2,0,1,34,2,5,1,5 +67329,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,13934.943848,14557.124186,2,96,3,3,0.47,4,4,1,0,1,2,61,1,4,3,NA +67330,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,108408.375382,114958.410267,2,98,6,6,1.25,4,4,1,0,1,1,46,1,2,6,NA +67331,7,2,2,15,NA,4,4,2,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14417.957956,14453.467189,1,96,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +67332,7,2,2,45,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,1,1,2,1,1,2,1,3,13749.025709,14311.068456,1,103,7,7,1.89,3,3,0,1,0,2,45,2,5,5,NA +67333,7,2,1,42,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17602.101156,17988.968846,1,96,7,7,1.52,4,4,0,2,0,2,30,2,4,1,5 +67334,7,1,2,32,NA,1,1,NA,NA,NA,2,NA,2,2,3,NA,3,1,3,2,2,2,2,2,2,NA,NA,NA,NA,35353.005268,0,2,94,4,4,0.72,4,4,1,1,0,1,30,2,1,1,3 +67335,7,2,2,30,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,26074.980194,26960.560427,1,93,12,2,0.69,4,1,0,0,0,2,25,2,5,5,NA +67336,7,2,2,7,NA,5,6,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9054.387575,9459.329211,2,100,14,14,4.03,4,4,0,2,0,1,48,2,5,1,5 +67337,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,64463.340883,65151.773075,1,91,15,14,5,3,2,0,0,2,2,73,1,4,3,NA +67338,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15971.744676,15898.343344,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +67339,7,2,1,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,86445.94283,91501.124576,2,102,9,9,4.08,2,2,0,0,2,1,70,1,5,1,5 +67340,7,2,2,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,15521.115746,15096.339697,2,100,5,5,1.07,4,4,0,1,0,2,36,1,3,5,NA +67341,7,2,1,74,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,14472.233702,14665.217659,1,98,8,8,3.3,2,2,0,0,2,1,74,1,1,1,3 +67342,7,2,2,48,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,12770.403552,13002.937616,1,103,4,4,0.82,3,3,0,0,0,1,48,2,4,1,1 +67343,7,2,1,58,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,29903.342494,29807.964765,1,95,6,4,1.74,2,1,0,0,0,2,48,1,4,3,NA +67344,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,2,2,2,1,2,2,1,2,2,1,9691.985299,9847.238527,1,93,5,5,1.43,2,2,0,0,1,1,60,2,5,1,4 +67345,7,2,2,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6555.231326,6846.316857,1,99,6,6,1.35,3,3,1,1,0,2,42,1,4,4,NA +67346,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,40859.270352,45390.978638,2,101,12,12,NA,1,1,0,0,1,1,80,1,3,3,NA +67347,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,38321.717684,40488.857872,1,92,6,6,2.04,2,2,0,0,2,2,71,1,4,1,1 +67348,7,2,1,16,NA,5,6,2,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6666.045669,7317.485505,3,90,77,77,NA,5,5,0,2,0,1,46,2,3,1,3 +67349,7,2,1,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23160.426103,23797.470648,2,98,10,10,3.78,3,3,0,0,0,2,46,1,4,1,4 +67350,7,2,1,2,NA,4,4,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8431.543376,9297.155306,2,96,14,14,3.58,4,4,2,0,0,1,36,1,4,1,5 +67351,7,2,1,10,NA,5,7,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20857.728985,21677.56405,2,98,3,3,0.38,5,5,0,4,0,2,39,1,4,5,NA +67352,7,2,2,40,NA,3,3,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,25784.374025,27218.997103,1,90,7,7,2.1,3,3,1,0,0,2,40,2,5,1,4 +67353,7,2,1,61,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,8883.460927,9371.520203,2,92,15,15,5,2,2,0,0,2,1,61,1,5,1,5 +67354,7,1,2,18,NA,5,6,NA,NA,NA,2,NA,2,1,4,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,9758.609905,0,3,91,14,2,0.83,2,1,0,0,1,2,67,1,5,5,NA +67355,7,2,2,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,32455.694722,32314.335903,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +67356,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,80418.665565,96911.831087,2,97,15,15,4.97,5,5,1,0,0,1,48,1,4,1,3 +67357,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,36154.496177,37370.445999,2,101,1,1,0.14,3,1,0,0,0,1,23,1,4,5,NA +67358,7,2,1,7,NA,4,4,2,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9554.261994,9836.582126,2,90,8,8,1.67,6,6,1,1,0,1,52,1,3,1,5 +67359,7,2,1,74,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,59027.291951,62692.518829,1,103,15,15,5,2,2,0,0,2,1,74,1,5,1,5 +67360,7,2,1,10,NA,1,1,1,10,131,NA,NA,2,2,4,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11159.151566,11226.781631,1,102,5,5,0.98,4,4,1,1,0,2,42,2,2,6,NA +67361,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,32185.399379,40770.619238,2,91,4,4,1.19,2,2,0,0,0,1,59,1,1,1,3 +67362,7,2,2,47,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,13219.753222,13289.658517,2,92,8,8,1.91,5,5,0,2,1,2,47,2,1,1,3 +67363,7,2,1,61,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,4,NA,2,2,2,2,2,2,1,2,2,2,8609.250304,9380.869295,2,90,7,7,1.34,5,5,0,1,2,1,61,2,1,4,NA +67364,7,2,2,19,NA,3,3,1,19,231,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22916.593117,23588.294062,1,102,4,4,0.97,3,3,0,1,0,2,19,1,2,NA,NA +67365,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16033.091438,16307.204086,1,96,15,15,5,3,3,0,0,1,2,62,1,4,3,NA +67366,7,2,2,5,NA,3,3,1,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64434.313673,68475.614831,1,101,5,5,0.89,5,5,1,2,0,1,31,1,2,1,1 +67367,7,2,2,32,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,1,2,2,2,2,2,2,2,NA,NA,NA,NA,35464.8385,41544.401264,2,96,6,6,1.11,5,5,0,3,0,2,32,2,3,1,2 +67368,7,2,2,23,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,3,5,2,2,2,2,2,2,2,1,2,2,1,41646.508203,41998.067158,3,91,4,4,0.81,3,3,0,0,1,1,64,2,1,1,1 +67369,7,2,2,3,NA,4,4,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9445.424546,10163.382174,2,99,6,6,1.15,5,5,1,2,0,2,34,1,4,77,NA +67370,7,2,1,41,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,1,1,2,1,1,2,2,3,19184.316833,20543.822351,1,97,15,15,5,4,4,2,0,0,2,35,2,4,1,4 +67371,7,2,1,13,NA,4,4,1,13,163,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9188.45337,9407.445906,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +67372,7,2,2,0,8,1,1,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6588.463421,6449.849868,2,95,12,6,1.98,4,2,1,0,0,2,25,1,4,77,NA +67373,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,10746.81867,11542.921605,2,100,99,99,NA,6,6,1,1,2,1,37,2,3,1,3 +67374,7,1,1,10,NA,5,6,NA,NA,NA,NA,NA,2,1,3,4,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,8014.738552,0,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +67375,7,2,2,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,18490.479848,18318.636758,2,100,7,7,1.38,5,5,1,0,0,2,45,1,2,3,NA +67376,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,38254.514187,37933.750372,1,98,2,2,0.72,1,1,0,0,0,2,57,1,4,3,NA +67377,7,2,1,0,2,3,3,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9570.577309,9932.368407,1,95,2,2,0.18,6,6,1,2,2,2,69,1,2,1,2 +67378,7,2,1,9,NA,2,2,2,9,108,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,1,NA,NA,NA,NA,13217.721247,13882.368076,2,91,4,4,0.94,3,3,0,1,0,2,50,2,1,4,NA +67379,7,2,2,12,NA,2,2,1,12,148,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,23968.380373,25913.276293,2,91,14,7,2.91,3,2,0,1,0,1,40,2,3,6,NA +67380,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16165.962054,15723.538094,2,99,12,5,1.88,6,1,0,0,0,2,57,1,5,2,NA +67381,7,2,1,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32680.7991,1,95,2,2,0.74,1,1,0,0,0,1,50,1,4,3,NA +67382,7,2,2,18,NA,4,4,1,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18905.695776,2,101,4,4,0.86,3,3,0,1,0,2,18,1,2,NA,NA +67383,7,2,2,13,NA,4,4,2,13,165,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10401.399206,10736.579564,2,99,9,9,2.43,4,4,0,2,0,2,49,1,3,3,NA +67384,7,2,1,19,NA,3,3,2,20,NA,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,99249.131685,98501.502244,1,101,14,14,3.25,4,4,0,1,0,1,48,1,4,1,2 +67385,7,2,1,47,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18116.816149,18405.984579,2,90,99,4,1.16,5,2,0,0,1,1,43,NA,NA,1,NA +67386,7,2,2,46,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,1,2,2,NA,NA,NA,NA,27654.660303,28156.17371,2,103,77,77,NA,4,4,0,0,0,2,46,2,1,4,NA +67387,7,1,1,74,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,8601.453077,0,2,97,4,4,0.53,7,7,0,2,2,1,74,1,2,1,2 +67388,7,2,1,35,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,2,2,2,2,54095.173154,55399.110059,1,92,10,10,4.63,2,2,0,0,0,1,35,2,5,1,4 +67389,7,2,1,62,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,2,NA,2,2,2,2,2,2,1,2,2,2,10585.549682,13806.559103,1,90,13,13,NA,2,2,0,0,1,1,62,2,1,2,NA +67390,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,121463.203322,122574.38549,2,95,9,9,4.92,1,1,0,0,0,2,56,1,5,3,NA +67391,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,73849.700988,79023.338367,3,91,14,14,5,3,3,1,0,0,2,30,1,4,1,5 +67392,7,2,1,41,NA,2,2,1,NA,NA,2,NA,2,2,1,NA,5,1,NA,2,2,2,2,2,2,2,2,2,2,33029.272844,32544.619181,2,93,9,9,1.49,7,7,0,3,0,2,41,2,5,1,5 +67393,7,2,2,29,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,5,2,1,2,2,2,2,2,1,2,2,1,35424.746838,35546.372478,2,93,10,10,3.67,3,3,0,0,0,2,56,2,4,6,NA +67394,7,2,2,8,NA,5,7,2,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8746.306586,9472.024073,1,91,3,3,0.66,4,4,1,2,0,2,33,1,3,5,NA +67395,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16741.034883,16850.233711,2,95,3,3,0.66,2,2,0,0,0,2,55,1,2,1,NA +67396,7,2,1,4,NA,1,1,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16118.799226,16847.423074,3,92,4,4,0.46,7,7,1,2,0,2,31,2,2,1,1 +67397,7,2,1,20,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,12364.328404,12075.509308,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +67398,7,2,2,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5847.515059,6374.625564,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +67399,7,2,2,55,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11428.6913,11636.794359,2,103,7,7,1.65,4,4,0,1,1,2,55,2,3,1,NA +67400,7,2,1,61,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,9355.567184,9645.104203,2,100,14,14,3.06,5,5,1,0,1,2,31,2,5,1,5 +67401,7,2,1,5,NA,1,1,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17865.135763,18076.339981,3,92,1,1,0,5,5,3,0,0,1,26,1,2,1,2 +67402,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,16181.169973,15883.791498,2,100,7,7,2.72,2,2,0,0,0,2,59,1,4,3,NA +67403,7,2,1,15,NA,1,1,1,15,191,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,24325.638415,24460.075857,3,92,5,5,1.05,3,3,1,1,0,2,38,2,3,5,NA +67404,7,1,2,63,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,18002.759054,0,2,102,5,5,1.36,2,2,0,0,2,1,70,2,5,1,4 +67405,7,2,1,5,NA,1,1,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11388.091908,11522.723578,2,103,5,5,0.89,5,5,1,3,0,2,34,2,1,99,NA +67406,7,2,1,48,NA,1,1,2,NA,NA,2,NA,2,2,2,NA,5,5,NA,2,2,2,1,2,2,1,2,2,2,36475.684097,37047.191703,1,93,15,15,5,3,2,0,1,0,2,46,2,5,5,NA +67407,7,2,1,64,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,153565.050575,166235.02721,1,97,15,15,5,3,3,0,0,1,1,64,1,3,1,3 +67408,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,14647.161643,15007.506342,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +67409,7,2,2,45,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,3,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,123440.03559,156711.394658,1,90,12,12,NA,2,2,0,0,0,2,45,2,3,4,NA +67410,7,2,2,18,NA,1,1,2,18,220,2,NA,2,2,2,11,NA,NA,NA,2,2,2,1,2,2,2,2,2,2,19557.287652,19949.093379,2,94,99,99,NA,3,3,1,0,0,2,18,2,2,NA,NA +67411,7,2,1,43,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,6,NA,2,2,2,1,2,2,2,2,2,2,27127.17615,26729.126657,3,90,7,7,1.48,5,5,0,1,0,1,43,2,1,6,NA +67412,7,2,1,77,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,1,1,1,1,2,1,2,1,NA,17775.981268,18879.758897,1,92,4,4,1.1,2,2,0,0,2,2,69,2,4,1,4 +67413,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,32485.015568,36087.933902,2,101,6,6,1.62,3,3,0,0,2,1,80,1,3,1,3 +67414,7,2,2,77,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,13045.741791,13445.321496,1,99,3,3,1.07,1,1,0,0,1,2,77,1,2,2,NA +67415,7,1,1,5,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,9016.053035,0,2,100,NA,NA,NA,3,3,1,0,0,1,29,NA,NA,1,NA +67416,7,2,1,4,NA,4,4,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,9417.927146,2,97,2,2,0.45,3,3,1,0,0,1,24,1,2,1,3 +67417,7,2,2,58,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19329.435508,19798.346555,2,97,15,15,5,2,2,0,0,1,2,58,2,5,1,5 +67418,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,39416.921733,1,95,2,2,0.87,1,1,0,0,1,2,80,1,2,2,NA +67419,7,2,1,4,NA,4,4,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10291.033925,11347.547701,1,100,14,14,4.45,3,3,1,0,0,1,33,1,4,1,4 +67420,7,2,1,22,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,49741.714519,52356.235161,2,91,14,14,4.71,3,3,0,0,0,1,28,2,1,1,2 +67421,7,2,2,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16664.698857,2,98,9,9,3.08,3,3,0,1,0,1,35,2,1,1,3 +67422,7,2,1,19,NA,3,3,2,19,238,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,83180.831932,83381.692822,2,100,14,14,3.06,5,5,0,0,0,1,55,1,5,1,5 +67423,7,2,2,3,NA,3,3,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25881.48305,27865.988236,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +67424,7,2,2,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,42468.064168,46720.900929,2,101,3,3,0.65,3,3,0,1,0,2,54,1,3,5,NA +67425,7,2,1,37,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,2,2,2,1,2,2,1,2,2,1,41241.224595,41716.316195,2,102,6,6,1.03,5,5,1,1,0,1,37,1,2,1,2 +67426,7,1,2,24,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,3,1,2,2,1,2,2,NA,NA,NA,NA,112992.533921,0,1,91,8,8,2.51,3,3,1,0,0,2,24,1,4,1,3 +67427,7,2,1,24,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,14977.822328,3,91,15,15,5,3,3,0,0,2,2,61,1,5,1,5 +67428,7,1,1,72,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,68460.271241,0,1,102,9,9,4.08,2,2,0,0,1,1,44,1,3,3,NA +67429,7,2,2,65,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,2,6,NA,2,2,2,1,2,2,1,2,2,2,9716.805546,12994.252166,2,90,4,4,1.47,1,1,0,0,1,2,65,2,2,6,NA +67430,7,2,1,8,NA,5,6,2,8,99,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10105.916709,10900.114748,1,91,6,6,1.25,4,4,1,1,0,1,26,2,4,6,NA +67431,7,2,1,61,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,1,NA,NA,NA,1,2,1,3,5526.665646,5830.301859,2,92,12,NA,NA,7,1,0,0,2,1,53,2,3,1,3 +67432,7,2,2,10,NA,4,4,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11195.065587,11638.702248,2,96,2,2,0.43,3,3,0,2,0,2,50,1,2,5,NA +67433,7,2,1,65,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,5,3,NA,2,2,2,NA,NA,NA,2,2,2,2,13473.930124,13736.530204,2,98,4,4,0.48,6,6,2,0,2,2,65,2,1,2,NA +67434,7,2,1,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,184986.088848,184760.524604,1,92,15,15,5,2,2,0,0,0,2,56,1,4,1,5 +67435,7,2,1,80,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,1,NA,12101.489198,12967.543396,1,93,3,3,0.82,2,2,0,0,2,1,80,2,5,1,1 +67436,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,19783.396474,19410.189178,2,92,14,4,1.38,2,1,0,0,0,1,29,1,5,6,NA +67437,7,2,2,0,2,3,3,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16423.151355,15977.062092,1,99,9,9,3.24,3,3,1,0,0,1,29,1,5,1,5 +67438,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,6943.972932,7268.809657,2,92,5,5,1.32,2,2,0,0,1,2,51,1,2,1,2 +67439,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21619.283038,21663.427812,2,102,8,8,1.72,5,5,0,2,1,1,63,2,5,1,5 +67440,7,1,2,61,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,16913.219568,0,2,98,77,77,NA,1,1,0,0,1,2,61,1,4,2,NA +67441,7,2,1,80,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,36829.543424,39682.305625,1,93,15,15,5,2,2,0,0,2,2,75,1,5,1,5 +67442,7,2,2,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,28187.999204,29187.28099,1,99,7,7,2.72,2,2,0,0,0,2,39,1,5,5,NA +67443,7,2,1,4,NA,1,1,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16169.123686,17324.04909,1,100,13,13,NA,4,4,1,1,0,1,28,2,1,1,1 +67444,7,2,1,3,NA,5,6,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9459.753034,9916.192713,2,91,10,10,3.04,4,4,1,1,0,1,37,2,5,1,5 +67445,7,2,2,38,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,2,1,2,1,2,2,1,2,2,2,2,2,2,32097.38481,33203.6204,2,100,4,4,0.81,4,4,0,2,0,1,56,1,4,1,2 +67446,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19835.707828,24564.335286,1,94,6,6,1.18,5,5,1,2,0,1,30,1,3,1,3 +67447,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,140431.173819,139253.659476,1,94,8,8,3.47,2,2,0,0,1,2,80,1,1,2,NA +67448,7,2,1,4,NA,4,4,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7629.74403,7646.343205,1,99,4,4,0.53,7,7,3,1,0,2,26,1,1,5,NA +67449,7,2,2,48,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,111065.717962,115110.76456,2,91,15,15,5,4,4,0,2,0,2,48,1,5,1,5 +67450,7,2,1,55,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,166693.693828,2,91,15,6,2.24,7,1,0,0,1,1,49,NA,NA,5,NA +67451,7,2,2,18,NA,1,1,2,19,228,2,NA,2,2,3,12,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,16594.391299,17940.930507,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +67452,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,134694.414609,139412.076132,2,91,15,10,5,3,1,0,0,1,1,47,1,5,5,NA +67453,7,2,1,0,1,3,3,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23912.171644,23498.78217,1,94,9,9,2.39,4,4,2,0,0,2,30,2,4,1,3 +67454,7,2,2,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53103.835249,56432.29308,2,92,6,6,2.02,2,2,0,0,2,2,76,1,3,1,NA +67455,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,87101.243392,95057.097172,1,101,6,6,1.65,2,2,0,0,2,1,70,1,3,1,1 +67456,7,2,1,7,NA,4,4,2,7,93,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9699.683862,9681.447258,2,100,13,13,NA,4,4,0,2,0,2,28,1,2,6,NA +67457,7,2,1,49,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,31010.243793,30930.584862,3,92,6,6,0.74,7,7,2,1,0,2,46,1,2,1,4 +67458,7,2,1,9,NA,5,6,1,10,121,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7921.96624,8581.996701,1,92,7,7,2.31,2,2,0,1,0,2,26,1,4,5,NA +67459,7,2,2,24,NA,4,4,1,NA,NA,2,NA,2,2,4,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,17427.779559,17080.798702,2,93,6,6,1.13,4,4,0,0,2,1,60,2,3,1,3 +67460,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,44341.489734,49693.466543,2,103,5,5,1.79,1,1,0,0,1,2,80,1,4,2,NA +67461,7,2,2,0,11,3,3,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,11331.751026,1,101,1,1,0.08,3,3,1,0,0,2,19,1,2,NA,NA +67462,7,2,2,38,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,3,2,1,2,1,1,2,1,2,2,2,NA,35464.8385,46825.562506,2,96,3,3,0.95,2,2,0,1,0,2,38,2,3,3,NA +67463,7,2,1,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,124091.929364,131797.624562,1,95,15,15,5,3,3,1,0,0,1,28,1,5,1,5 +67464,7,2,1,10,NA,3,3,1,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41165.805324,42583.611962,2,100,10,10,3.13,4,4,0,2,0,1,45,1,4,1,4 +67465,7,1,2,58,NA,4,4,NA,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15519.323571,0,2,99,10,10,3.67,3,3,0,0,1,1,64,2,4,1,5 +67466,7,2,1,55,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,23431.677775,24302.344664,2,93,5,5,1.26,3,3,0,1,0,1,55,2,2,1,2 +67467,7,1,1,80,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,39280.460347,0,2,91,4,4,1.39,1,1,0,0,1,1,80,1,3,2,NA +67468,7,2,2,17,NA,5,6,1,17,212,2,NA,2,1,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9416.499309,9568.799193,1,100,15,15,5,4,4,0,1,0,1,44,2,5,1,5 +67469,7,2,1,23,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,14703.033095,3,91,7,7,2.58,2,2,0,0,0,2,55,2,5,3,NA +67470,7,2,2,37,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,22326.231285,22166.696692,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +67471,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,155208.037885,157114.920604,2,102,8,8,4.32,1,1,0,0,0,2,45,1,3,4,NA +67472,7,2,1,2,NA,3,3,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,40111.361732,45255.148434,1,98,15,15,3.7,5,5,2,1,0,1,34,1,5,1,5 +67473,7,2,2,79,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,29145.675285,31446.34406,3,92,7,7,2.31,2,2,0,0,2,1,77,1,4,1,4 +67474,7,2,1,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18423.855809,18161.238545,1,96,12,12,NA,5,5,1,2,0,2,35,1,5,1,4 +67475,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16793.056025,2,100,10,10,5,1,1,0,0,0,1,52,1,3,3,NA +67476,7,2,1,6,NA,3,3,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57218.802967,58901.688698,1,95,9,9,2.13,6,6,0,4,0,2,44,1,1,1,1 +67477,7,2,2,57,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12449.932013,12109.206963,3,90,15,15,4.89,5,5,0,0,0,2,57,2,3,1,3 +67478,7,2,1,2,NA,3,3,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37959.146468,40828.920669,1,94,99,99,NA,3,3,1,0,0,1,31,1,4,6,NA +67479,7,2,2,5,NA,4,4,2,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10771.85499,11250.180007,2,97,2,2,0.38,3,3,1,1,0,2,27,1,2,5,NA +67480,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,6503.357568,6816.933235,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +67481,7,2,2,69,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10235.0654,10662.230581,2,93,3,3,0.66,2,2,0,0,2,2,69,2,4,3,NA +67482,7,2,2,14,NA,2,2,1,14,173,NA,NA,1,1,NA,11,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18515.058419,19360.671834,2,96,2,2,0.27,6,6,1,3,0,1,34,NA,NA,1,NA +67483,7,2,2,64,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,2,2,2,2,2,2,2,2,2,2,9570.416297,10355.226074,1,92,2,2,0.66,1,1,0,0,1,2,64,1,1,3,NA +67484,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,NA,NA,NA,NA,14289.513581,13586.634632,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +67485,7,2,1,1,22,3,3,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22261.258803,25115.990281,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +67486,7,2,2,41,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,36924.381422,38054.088192,2,102,14,14,3.8,4,4,2,0,0,2,41,2,4,1,5 +67487,7,2,2,75,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,16494.288293,17728.004854,2,101,3,3,0.92,1,1,0,0,1,2,75,1,2,2,NA +67488,7,2,1,29,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,3,12241.196357,12961.680012,2,96,15,7,3.21,3,1,0,0,0,1,31,2,5,1,NA +67489,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,24158.28574,25084.308361,1,92,14,9,3.97,3,2,0,0,2,1,51,1,4,5,NA +67490,7,2,1,34,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,1,2,2,2,2,2,2,41241.224595,41716.316195,2,102,4,4,0.61,5,5,0,3,0,1,34,2,3,1,3 +67491,7,2,1,2,NA,1,1,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13968.423539,13738.28453,2,102,3,3,0.54,4,4,1,1,0,1,28,2,2,6,NA +67492,7,2,2,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85444.349063,87754.040572,1,94,14,14,5,2,2,0,0,0,1,50,1,3,1,5 +67493,7,2,1,76,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,8517.336599,8684.171961,2,100,9,9,4.35,2,2,0,0,2,2,79,1,5,1,3 +67494,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,21265.137164,1,94,4,4,0.56,5,5,1,2,0,1,34,1,2,3,NA +67495,7,2,1,11,NA,2,2,1,11,142,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,13898.598114,14013.214919,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +67496,7,2,1,2,NA,1,1,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13305.770449,13463.073191,3,92,4,4,0.59,5,5,2,1,0,1,20,2,1,1,3 +67497,7,2,2,6,NA,5,6,1,6,74,NA,NA,2,2,2,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5064.232234,5712.276567,2,92,99,77,NA,7,4,3,3,1,1,61,2,1,1,3 +67498,7,2,2,16,NA,4,4,1,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14166.687432,14745.171396,1,100,1,1,0.04,4,4,1,1,0,2,51,1,3,3,NA +67499,7,2,1,73,NA,2,2,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,13345.06742,13314.236759,1,99,15,15,5,2,2,0,0,2,1,73,1,4,1,5 +67500,7,2,2,9,NA,5,7,2,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,18348.624469,20109.577944,2,90,77,77,NA,6,6,0,4,0,2,41,NA,NA,4,NA +67501,7,2,2,62,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,164066.603708,163511.57474,1,95,10,10,4.76,2,2,0,0,2,1,65,1,4,1,4 +67502,7,2,1,56,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10976.758665,11141.51106,2,103,15,15,5,3,3,0,0,0,2,52,2,4,1,5 +67503,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,154825.466557,154977.498295,1,94,12,7,3.67,2,1,0,0,0,2,45,1,5,5,NA +67504,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,1,1,2,2,1,2,2,1,2,2,1,27532.825087,28471.490951,1,101,6,6,1.3,4,4,0,2,0,1,43,2,1,1,3 +67505,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,163604.158578,166277.181905,1,101,10,10,4.63,2,2,0,0,2,1,62,1,5,1,5 +67506,7,2,2,6,NA,3,3,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21658.223225,22668.915202,1,90,7,7,1.55,5,5,0,3,0,1,51,2,3,1,2 +67507,7,2,1,28,NA,4,4,1,NA,NA,2,NA,2,2,4,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17840.217575,17960.016751,2,93,6,6,1.13,4,4,0,0,2,1,60,2,3,1,3 +67508,7,2,1,18,NA,5,7,2,19,228,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13547.769361,13874.542578,1,91,9,9,4.35,2,2,0,0,0,2,40,1,4,3,NA +67509,7,2,1,79,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,68266.732554,70856.701199,1,95,7,7,3.67,1,1,0,0,1,1,79,1,5,5,NA +67510,7,2,1,4,NA,4,4,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7311.663111,7613.781996,2,93,6,6,1.15,5,5,3,1,0,1,29,1,3,5,NA +67511,7,1,2,21,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,3,6,3,1,2,2,1,2,2,NA,NA,NA,NA,44119.608456,0,1,92,6,6,1.51,3,3,0,0,0,1,46,1,3,3,NA +67512,7,2,1,3,NA,4,4,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,10259.663981,2,97,13,13,NA,4,4,1,0,1,2,45,1,2,5,NA +67513,7,2,1,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,20286.317046,20915.633712,2,99,2,2,0.5,2,2,0,0,0,1,53,1,3,1,NA +67514,7,2,1,6,NA,1,1,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11036.458246,10936.228943,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +67515,7,2,2,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,18174.62037,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +67516,7,2,2,47,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20773.573942,20827.234538,2,93,6,6,1.47,3,3,0,0,0,2,47,1,4,5,NA +67517,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,23660.610934,25318.185975,3,91,5,5,1.07,4,4,0,2,0,2,36,1,5,1,4 +67518,7,2,2,5,NA,1,1,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11009.851855,11478.955249,1,93,13,3,0.54,6,3,2,1,0,1,23,NA,NA,5,NA +67519,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,6612.194774,6921.511029,2,99,6,6,1.98,2,2,0,0,1,1,63,1,2,2,NA +67520,7,2,1,79,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11245.778093,11855.469704,1,98,4,4,1.19,2,2,0,0,2,1,79,1,3,1,3 +67521,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,81062.798322,86779.337922,1,101,4,4,1.48,1,1,0,0,1,2,76,1,2,3,NA +67522,7,2,2,26,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,63207.045171,63513.398112,2,102,15,15,5,2,2,0,0,0,1,41,2,4,6,NA +67523,7,1,1,54,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,31699.998102,0,1,98,5,5,2.15,1,1,0,0,0,1,54,1,3,3,NA +67524,7,2,1,6,NA,2,2,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9807.589376,10786.008845,2,90,5,5,0.76,5,5,0,4,0,2,32,1,2,3,NA +67525,7,2,1,67,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,1,1,2,2,1,2,1,3,10497.261485,11239.197739,1,90,2,2,0.33,2,2,0,0,2,2,65,2,3,1,5 +67526,7,2,1,33,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,34887.439952,36924.956604,2,94,7,7,1.23,6,6,2,1,0,1,33,2,1,6,NA +67527,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,17399.722435,17053.300185,2,99,6,3,1.27,3,1,0,0,0,1,41,1,3,6,NA +67528,7,2,1,2,NA,3,3,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,38457.282261,42554.855377,1,100,6,6,1.18,5,5,2,2,0,2,40,1,5,3,NA +67529,7,2,2,11,NA,3,3,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,80369.555824,80552.420473,1,97,15,15,4.07,5,5,0,3,0,1,36,1,5,1,5 +67530,7,2,1,52,NA,1,1,2,NA,NA,2,NA,2,2,7,NA,5,4,NA,2,2,2,2,2,2,1,2,2,2,22446.308035,22508.005013,2,94,4,4,1.38,1,1,0,0,0,1,52,2,5,4,NA +67531,7,2,2,1,15,4,4,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6880.068407,7403.030352,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +67532,7,2,2,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,88916.414931,94489.544183,1,101,6,6,1.65,2,2,0,0,2,1,70,1,3,1,1 +67533,7,2,1,0,4,1,1,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6298.658963,6298.775059,2,94,7,7,1.57,4,4,2,0,0,2,27,1,4,1,2 +67534,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,31070.966983,31355.213599,1,102,2,2,0.66,1,1,0,0,0,2,56,1,4,2,NA +67535,7,2,2,63,NA,4,4,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9113.905743,9695.883475,3,90,9,9,3.14,3,3,0,1,1,2,63,2,4,3,NA +67536,7,2,2,14,NA,3,3,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,91797.787708,92992.465808,1,95,15,15,5,4,4,0,2,0,2,42,1,5,1,5 +67537,7,2,1,33,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19638.748956,20390.674215,2,99,15,15,5,2,1,0,0,0,2,31,1,5,1,NA +67538,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,25645.251384,25368.119207,1,92,6,6,1.3,4,4,0,1,1,1,25,1,1,1,3 +67539,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,2,1,2,2,1,2,2,1,2,2,1,102855.726146,103775.32646,1,101,5,5,0.89,5,5,1,2,0,1,31,1,2,1,1 +67540,7,2,2,12,NA,1,1,2,12,155,NA,NA,2,2,4,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13824.001771,14945.739837,2,90,3,3,0.58,4,4,0,2,0,2,36,2,3,1,3 +67541,7,2,1,11,NA,5,6,2,11,143,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10810.913614,11522.32071,1,97,15,15,4.07,5,5,0,3,0,1,42,2,5,1,5 +67542,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,3,1,2,1,2,1,1,2,1,NA,NA,NA,NA,11032.714892,11055.242776,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +67543,7,2,2,16,NA,2,2,2,16,194,NA,NA,1,1,NA,9,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,12680.621719,13709.581084,2,90,7,7,1.34,5,5,0,1,2,1,61,2,1,4,NA +67544,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,17521.481386,17363.561951,2,101,1,1,0.2,2,2,0,0,1,2,55,1,4,4,NA +67545,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,124604.441853,125718.490512,1,92,9,4,1,7,3,2,1,0,1,45,1,4,2,NA +67546,7,2,2,30,NA,2,2,1,NA,NA,2,NA,2,1,3,NA,4,1,2,2,2,2,1,2,2,NA,NA,NA,NA,40476.413979,40301.503085,2,93,7,7,1.83,3,3,1,0,0,1,40,2,5,1,4 +67547,7,2,1,8,NA,3,3,2,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,16549.21669,17579.802509,1,91,12,8,2.15,6,4,1,1,0,2,29,1,4,6,NA +67548,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,12532.471503,12837.991566,2,97,4,4,0.84,3,3,1,0,1,2,68,1,4,2,NA +67549,7,2,1,25,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,36391.614555,41134.650764,1,103,5,5,1.02,4,4,2,0,0,1,25,1,2,1,4 +67550,7,2,2,13,NA,4,4,1,13,159,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15483.914568,16116.18632,1,100,4,4,1.23,2,2,0,1,0,2,47,1,2,4,NA +67551,7,2,2,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,17427.779559,17328.063231,2,93,12,12,NA,4,4,0,0,2,1,72,1,2,1,4 +67552,7,2,2,16,NA,3,3,1,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,76992.7514,81576.336255,1,100,15,15,4.07,5,5,0,2,0,2,41,1,5,1,4 +67553,7,2,2,9,NA,4,4,2,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7388.61397,8001.678046,3,90,2,2,0.39,2,2,0,1,0,2,32,1,3,5,NA +67554,7,1,2,61,NA,4,4,NA,NA,NA,2,NA,2,1,99,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9024.164523,0,2,93,15,15,5,1,1,0,0,1,2,61,2,5,1,NA +67555,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,31785.728924,32871.467684,1,95,4,4,1.22,2,2,0,0,1,1,79,1,1,1,3 +67556,7,2,1,14,NA,4,4,2,14,178,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13251.602554,13095.83949,1,96,9,9,3.14,3,3,0,2,0,2,39,NA,NA,3,NA +67557,7,2,2,15,NA,4,4,2,15,187,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9728.028593,10125.263908,2,99,6,6,1.11,5,5,1,2,0,2,41,1,2,5,NA +67558,7,2,2,0,7,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4476.23918,4525.114437,1,90,3,3,0.43,4,4,2,0,0,1,46,1,3,1,4 +67559,7,2,1,9,NA,3,3,2,9,118,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30554.050397,31755.009616,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +67560,7,2,1,68,NA,5,6,1,NA,NA,2,NA,2,2,8,NA,1,5,NA,1,2,2,2,2,2,1,2,2,1,13527.667075,14341.996991,2,98,6,6,0.59,7,7,2,2,1,2,52,2,1,1,1 +67561,7,2,2,12,NA,4,4,1,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14086.017075,14046.326674,2,96,5,5,1.07,4,4,0,3,0,2,46,1,4,3,NA +67562,7,2,1,2,NA,4,4,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6347.215153,6609.482921,2,95,1,1,0.09,5,5,3,1,0,2,31,1,2,1,NA +67563,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,39416.921733,1,92,2,2,0.64,1,1,0,0,1,2,80,1,3,2,NA +67564,7,2,2,43,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,37512.060155,39042.669235,1,92,15,15,4.99,4,4,0,2,0,2,43,1,4,1,4 +67565,7,2,1,10,NA,3,3,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58429.74688,62860.392832,1,100,15,15,4.56,4,4,0,2,0,2,42,1,4,1,3 +67566,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,30796.941649,33729.162412,1,98,4,4,1.26,2,2,0,0,1,2,80,1,4,2,NA +67567,7,2,1,69,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9618.837002,9727.194029,3,91,14,14,3.53,5,5,0,1,1,1,69,1,4,3,NA +67568,7,2,2,7,NA,3,3,2,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22933.149195,22757.230737,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +67569,7,2,1,7,NA,3,3,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23188.935049,25672.571973,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +67570,7,2,2,6,NA,2,2,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13720.541363,13932.536034,2,100,14,14,3.36,4,4,1,1,0,1,45,2,5,1,2 +67571,7,2,2,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,28747.860416,30588.052168,1,99,6,6,0.96,5,5,1,2,0,2,35,1,4,1,2 +67572,7,2,2,1,23,3,3,1,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,59617.625426,65799.423913,3,92,15,15,5,4,4,2,0,0,1,38,1,5,1,5 +67573,7,2,2,80,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,2,2,2,2,2,2,2,2,2,NA,25315.905293,28273.512517,2,98,4,4,1.15,2,2,0,0,2,1,80,1,1,1,1 +67574,7,2,2,12,NA,4,4,2,12,147,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11608.900361,11982.991894,1,99,8,8,2.59,3,3,0,2,0,2,46,1,4,2,NA +67575,7,2,2,6,NA,1,1,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17458.526997,17642.073401,1,94,6,6,1.11,5,5,1,2,0,2,41,2,1,1,1 +67576,7,2,2,8,NA,1,1,2,8,97,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,15225.935813,15621.122955,2,94,77,77,NA,6,6,0,3,0,2,58,1,3,1,9 +67577,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,118933.861968,118531.514768,1,91,8,8,4.82,1,1,0,0,1,2,60,1,4,3,NA +67578,7,2,2,10,NA,3,3,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,73810.484644,75214.997077,1,94,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +67579,7,2,1,10,NA,1,1,1,10,121,NA,NA,1,1,NA,2,NA,NA,NA,2,1,1,2,2,1,1,2,2,1,14880.007592,14744.872501,3,92,4,4,1.12,2,2,0,1,0,2,38,2,1,5,NA +67580,7,2,2,67,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,37934.469637,42910.885175,1,94,3,3,0.95,2,2,0,0,1,2,67,1,2,2,NA +67581,7,2,2,19,NA,2,2,2,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,5,5,0.8,5,5,0,3,0,2,40,2,1,5,NA +67582,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,NA,22306.465066,22494.734848,2,98,3,3,0.54,3,3,1,1,0,2,29,1,2,1,NA +67583,7,1,1,6,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14456.751936,0,1,90,15,15,5,5,5,1,1,0,1,32,2,1,1,4 +67584,7,2,1,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19008.083201,19380.210545,2,97,7,7,3.67,1,1,0,0,0,1,38,1,3,5,NA +67585,7,2,2,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16181.169973,16286.716901,2,100,10,10,4.42,2,2,0,0,0,2,55,1,2,1,4 +67586,7,2,2,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,17622.141982,17728.11858,2,95,2,2,0.75,1,1,0,0,0,2,54,1,2,5,NA +67587,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,33147.414266,37148.276517,2,94,7,7,3.49,1,1,0,0,1,2,80,1,5,2,NA +67588,7,2,1,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7814.415054,8296.803376,1,93,6,6,0.83,6,6,3,1,0,1,37,NA,NA,1,3 +67589,7,2,1,79,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,8517.336599,8684.171961,2,100,6,6,2.11,2,2,0,0,2,1,79,1,3,1,4 +67590,7,2,1,31,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,36150.793885,43021.850084,1,90,3,3,0.43,4,4,2,0,0,1,31,1,3,6,NA +67591,7,2,1,40,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11113.602843,11678.105413,3,90,14,14,3.47,4,4,1,1,0,2,38,2,5,1,5 +67592,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17810.743272,17839.416552,1,99,15,15,5,2,2,0,0,0,2,46,1,5,1,5 +67593,7,2,1,4,NA,4,4,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9035.668246,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +67594,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,100867.796959,104079.392539,2,99,15,15,5,3,3,1,0,0,1,43,1,5,1,5 +67595,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25128.435397,25532.311821,2,94,6,5,2.11,3,1,0,0,0,1,26,1,4,5,NA +67596,7,2,1,63,NA,5,7,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9314.746352,9205.449493,1,91,15,15,5,3,3,0,0,1,1,63,2,5,1,5 +67597,7,2,2,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,21077.085361,20500.255628,2,99,12,12,NA,1,1,0,0,0,2,41,1,5,5,NA +67598,7,2,2,80,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,3,NA,2,2,2,2,2,2,2,2,2,NA,16490.79781,18057.97943,3,90,10,10,3.04,4,4,0,0,2,2,80,2,1,3,NA +67599,7,2,2,4,NA,4,4,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13130.790087,13857.266639,2,102,5,5,0.76,5,5,1,3,0,2,30,1,4,4,NA +67600,7,2,2,15,NA,3,3,2,15,181,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,34552.42011,37128.535405,1,90,7,7,1.55,5,5,0,3,0,1,51,2,3,1,2 +67601,7,1,2,8,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7842.234542,0,1,91,15,15,5,5,5,2,1,0,1,40,1,5,1,5 +67602,7,2,1,43,NA,1,1,1,NA,NA,1,2,2,2,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,31740.385214,32919.784432,2,96,7,7,1.79,4,4,0,2,0,1,43,2,3,1,2 +67603,7,2,2,62,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17243.546687,17909.086027,1,92,14,14,5,2,2,0,0,2,2,62,1,4,1,4 +67604,7,2,2,24,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,13820.210756,14410.358083,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +67605,7,2,2,19,NA,1,1,1,19,230,2,NA,2,7,77,10,NA,NA,NA,2,2,2,2,2,2,2,2,2,1,18581.167701,19429.800436,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +67606,7,2,1,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,28542.421068,29427.85637,2,101,2,2,0.74,1,1,0,0,0,1,48,1,2,5,NA +67607,7,2,2,63,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,3,1,NA,1,2,1,1,2,1,1,2,1,1,17248.011865,19146.123826,1,97,14,14,4.96,2,2,0,0,1,1,50,1,3,1,3 +67608,7,2,1,4,NA,5,6,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10273.602479,11522.969217,1,92,15,15,5,3,3,1,0,0,1,50,1,4,1,4 +67609,7,2,2,6,NA,4,4,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9399.281543,9563.245188,2,96,6,6,1.35,3,3,1,1,0,2,23,1,2,5,NA +67610,7,2,1,2,NA,4,4,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,5652.403121,6080.146007,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +67611,7,2,2,14,NA,3,3,2,14,175,NA,NA,2,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,76360.13568,77793.595093,1,99,15,15,5,3,3,0,1,0,1,50,1,4,1,4 +67612,7,2,1,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17882.621856,18280.794545,3,92,7,7,2.1,3,3,1,1,0,2,25,1,4,5,NA +67613,7,2,2,21,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,11739.283384,12617.501315,1,96,7,7,1.83,3,3,0,0,1,1,66,2,5,1,3 +67614,7,2,1,53,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,25118.469449,26312.875816,2,98,5,5,1.07,4,4,0,1,0,1,53,2,1,1,1 +67615,7,2,2,17,NA,5,7,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12821.227649,2,100,9,9,2.46,4,4,0,2,0,2,36,2,4,1,3 +67616,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,167711.394252,175827.980982,1,101,4,2,0.81,2,1,0,0,1,1,63,1,2,6,NA +67617,7,2,2,13,NA,2,2,1,13,162,NA,NA,2,2,4,6,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,15809.066118,17342.845429,2,93,7,7,1.52,4,4,1,1,0,1,44,2,4,1,NA +67618,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,39565.288792,43332.356399,1,99,14,14,5,2,2,0,0,2,1,80,1,4,1,4 +67619,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,120041.937453,120355.294586,1,98,15,15,5,5,5,0,1,0,1,53,1,5,1,5 +67620,7,2,1,54,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,28017.200708,32299.614806,2,102,3,3,0.92,1,1,0,0,0,1,54,1,4,3,NA +67621,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,43813.24867,44204.968982,1,98,4,4,0.67,5,5,1,2,0,1,29,1,4,1,3 +67622,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,18246.235208,18261.326779,2,99,1,1,0.07,4,4,1,1,0,2,24,1,2,5,NA +67623,7,2,1,8,NA,3,3,2,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,74331.764009,78960.699825,2,91,14,14,4.19,3,3,0,1,0,2,31,1,4,1,3 +67624,7,2,1,30,NA,3,3,2,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,99283.360764,104566.027434,3,91,1,1,0.09,1,1,0,0,0,1,30,2,5,5,NA +67625,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,25359.946386,29418.979823,2,95,2,2,0.88,1,1,0,0,1,2,80,1,1,2,NA +67626,7,2,1,1,15,2,2,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13305.770449,13726.956753,3,92,9,9,2.22,5,5,1,0,2,1,66,2,1,1,1 +67627,7,2,1,25,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,23064.54207,22591.937434,2,91,15,15,5,4,4,0,0,1,1,61,NA,NA,1,2 +67628,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,53634.754806,54437.113731,1,98,99,99,NA,3,2,0,0,0,2,22,1,4,5,NA +67629,7,2,2,70,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,18698.205673,19635.336647,1,97,12,12,NA,5,5,0,1,1,2,40,2,9,1,NA +67630,7,2,1,12,NA,3,3,1,12,147,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,26749.020961,27839.957403,1,98,6,6,1.11,5,5,1,2,0,2,32,1,2,1,2 +67631,7,2,1,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,22007.065507,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +67632,7,2,2,51,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,24646.971819,25093.941214,1,102,7,7,1.89,3,3,0,0,0,1,53,2,1,1,1 +67633,7,2,2,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7944.571197,8483.470772,2,99,15,15,5,3,3,0,1,0,2,48,1,5,4,NA +67634,7,2,2,8,NA,4,4,2,8,104,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8184.286585,8442.757341,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +67635,7,2,1,65,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,10298.484448,10551.517983,1,94,6,6,1.98,2,2,0,0,2,1,65,2,1,1,1 +67636,7,1,1,7,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17227.332856,0,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +67637,7,1,2,9,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7489.549692,0,2,100,10,10,2.33,6,6,0,2,2,2,35,1,2,5,NA +67638,7,2,2,19,NA,4,4,1,19,232,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11437.338051,11296.529267,2,95,2,2,0.41,3,3,2,0,0,2,19,1,2,NA,NA +67639,7,2,1,0,2,4,4,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6476.58432,6575.990772,2,97,3,3,0.75,2,2,1,0,0,2,22,1,4,4,NA +67640,7,2,1,58,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27595.50738,27352.795749,1,98,6,6,1.57,3,3,0,0,0,1,58,1,3,1,3 +67641,7,2,1,5,NA,1,1,2,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16074.564008,16583.394837,1,97,4,4,0.72,5,5,2,1,0,2,33,2,1,6,NA +67642,7,2,2,24,NA,1,1,2,NA,NA,2,NA,2,1,4,NA,2,6,2,1,2,2,1,2,2,NA,NA,NA,NA,39426.061521,43773.817687,2,94,8,8,2.33,4,4,2,0,0,1,24,1,2,6,NA +67643,7,2,1,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,51472.063256,53424.859661,2,95,15,15,5,2,2,0,0,2,1,76,1,4,1,5 +67644,7,2,1,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,23005.210125,23019.76475,1,95,14,14,3.04,6,6,0,4,0,1,56,1,5,1,4 +67645,7,2,1,15,NA,4,4,2,15,187,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11386.695644,11908.648036,2,99,6,6,1.18,5,5,0,3,0,2,38,1,2,5,NA +67646,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11113.602843,11678.105413,3,90,5,5,0.93,4,4,1,0,0,1,48,2,4,1,NA +67647,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,16494.288293,17598.146607,2,95,3,3,1.1,1,1,0,0,1,2,70,1,3,4,NA +67648,7,1,2,2,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6662.138091,0,2,95,14,14,3.58,4,4,1,0,0,1,39,1,3,1,3 +67649,7,2,2,41,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,2,1,2,1,2,1,1,2,2,1,2,1,3,16378.162652,17998.555773,2,96,4,4,0.92,3,3,0,1,1,2,41,2,2,1,2 +67650,7,2,2,11,NA,3,3,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16950.724686,16899.799988,2,98,2,2,0.34,2,2,0,1,0,2,30,1,4,4,NA +67651,7,2,2,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20430.250572,20111.803159,2,97,5,5,0.76,5,5,0,0,0,2,50,1,4,5,NA +67652,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,108408.375382,118202.807654,1,92,6,6,1.51,3,3,0,0,0,1,46,1,3,3,NA +67653,7,2,2,39,NA,3,3,2,NA,NA,2,NA,2,1,7,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,74517.751389,77393.175383,2,94,10,10,3.51,3,3,0,2,0,2,39,2,4,3,NA +67654,7,2,2,16,NA,1,1,1,16,193,NA,NA,1,1,NA,8,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,20460.442471,21235.303768,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +67655,7,2,2,8,NA,4,4,2,8,99,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9326.540969,10100.402919,1,91,8,8,1.76,5,5,0,3,0,2,42,1,3,6,NA +67656,7,2,1,53,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15599.953109,16217.343339,1,99,14,1,0.23,2,1,0,0,0,2,51,1,5,1,NA +67657,7,2,1,1,20,3,3,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,32956.344514,37182.588634,2,97,15,15,4.97,5,5,1,0,0,1,48,1,4,1,3 +67658,7,2,1,77,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,52501.717941,55571.910913,2,102,8,8,4.13,1,1,0,0,1,1,77,1,5,2,NA +67659,7,2,2,15,NA,5,6,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8272.446168,8996.728356,1,102,15,15,3.82,5,5,1,1,0,1,29,1,4,1,4 +67660,7,2,1,16,NA,5,7,2,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9136.388281,9764.423514,3,91,15,15,4.47,4,4,0,1,0,2,45,2,5,1,5 +67661,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,13408.721263,15005.802731,2,98,4,4,1.22,2,2,0,0,2,1,80,1,1,1,1 +67662,7,2,2,11,NA,5,6,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,5064.232234,5431.552443,2,92,10,8,2.01,7,4,1,1,1,2,27,2,3,1,3 +67663,7,2,1,3,NA,4,4,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9319.143734,9894.41982,2,95,8,8,1.85,5,5,1,2,0,1,55,1,2,1,3 +67664,7,2,1,11,NA,1,1,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11399.23838,11468.323492,2,103,77,77,NA,5,5,1,2,0,2,30,1,2,1,2 +67665,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,19498.713386,19633.661812,2,97,5,5,0.84,5,5,0,2,0,2,33,1,4,1,3 +67666,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,10816.310126,11253.74147,1,99,14,14,5,2,2,0,0,1,2,64,1,3,3,NA +67667,7,1,1,35,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,79582.971419,0,2,99,15,15,5,1,1,0,0,0,1,35,1,5,5,NA +67668,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,26302.518039,27109.453365,1,101,5,3,0.98,2,1,0,0,2,2,70,1,4,2,NA +67669,7,2,2,2,NA,5,6,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8818.200077,8968.551716,2,102,6,6,1.52,4,4,2,0,0,1,30,2,4,1,4 +67670,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15497.844354,15146.281728,1,99,7,7,3.21,1,1,0,0,0,2,52,1,4,1,NA +67671,7,2,2,5,NA,3,3,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,59321.981286,63042.638464,1,94,8,8,1.67,5,5,1,2,0,1,52,1,4,1,4 +67672,7,2,1,12,NA,3,3,2,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,27702.556686,27838.63939,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +67673,7,2,2,13,NA,4,4,1,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14166.687432,14623.20249,1,100,15,15,3.87,6,6,1,3,0,2,39,1,4,1,4 +67674,7,2,2,0,4,4,4,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4964.196196,5466.923926,1,93,4,4,1.09,2,2,1,0,0,2,39,2,3,4,NA +67675,7,2,1,66,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,11924.931067,12067.158788,1,98,8,8,1.95,4,4,1,1,1,2,59,1,3,1,1 +67676,7,1,1,6,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10651.061092,0,1,90,99,99,NA,2,2,0,1,0,2,26,1,4,5,NA +67677,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17342.255821,20631.425049,1,93,3,3,1.29,1,1,0,0,0,1,36,1,4,5,NA +67678,7,2,2,6,NA,3,3,1,7,85,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22308.590534,22137.463018,1,95,7,2,0.35,5,4,1,2,0,1,26,1,4,6,NA +67679,7,2,1,9,NA,1,1,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14820.807433,14905.891142,2,102,7,7,1.53,5,5,0,3,0,1,43,2,2,1,4 +67680,7,2,2,10,NA,3,3,2,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,63555.637461,64464.244761,1,90,15,15,5,4,4,0,2,0,1,44,1,5,1,5 +67681,7,2,2,33,NA,4,4,2,NA,NA,2,NA,2,1,3,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,28747.860416,29850.909164,1,99,14,14,3.8,4,4,1,1,0,1,48,2,5,1,5 +67682,7,2,2,13,NA,1,1,2,13,157,NA,NA,2,2,3,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,19850.979841,20602.760063,1,97,4,4,0.72,5,5,2,1,0,2,33,2,1,6,NA +67683,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,31785.728924,32633.084965,1,95,7,7,2.16,3,3,0,0,1,1,45,1,3,1,4 +67684,7,2,1,8,NA,2,2,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14820.807433,14943.02937,2,102,5,5,0.89,4,4,0,3,0,2,44,2,2,4,NA +67685,7,2,1,9,NA,5,6,2,9,113,NA,NA,2,2,2,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9720.482616,10533.307174,2,91,14,14,3.47,4,4,1,1,0,2,36,2,3,1,5 +67686,7,2,1,12,NA,1,1,1,12,147,NA,NA,2,2,3,5,NA,NA,NA,2,1,1,1,2,2,1,2,2,1,32326.52031,34735.818434,3,92,7,7,1.41,5,5,1,2,0,1,20,2,1,1,1 +67687,7,2,2,8,NA,5,7,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,10422.423011,10751.577119,1,98,5,5,1.26,3,3,1,1,0,2,27,1,5,5,NA +67688,7,2,2,0,10,5,7,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8303.503441,8530.807571,1,94,7,7,1.23,6,6,3,1,0,1,32,1,4,1,4 +67689,7,2,2,18,NA,1,1,2,18,219,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,19557.287652,21454.715555,2,94,9,9,2.37,5,5,0,1,0,1,48,2,4,1,2 +67690,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20480.890987,19920.377678,2,93,3,3,1.07,1,1,0,0,0,2,40,1,4,5,NA +67691,7,2,1,18,NA,3,3,1,19,228,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,34443.919252,35848.685683,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +67692,7,2,2,12,NA,2,2,2,12,153,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23072.919059,23761.374659,1,97,15,15,4.52,6,6,0,4,0,2,41,1,5,1,5 +67693,7,1,2,2,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12871.484115,0,2,102,15,15,4.47,4,4,1,1,0,1,32,1,5,1,4 +67694,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,8890.956373,9238.69917,2,99,12,12,NA,2,1,0,0,1,2,46,1,3,2,NA +67695,7,1,2,55,NA,2,2,NA,NA,NA,2,NA,2,1,5,NA,4,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,23200.373382,0,2,93,3,3,0.63,3,3,0,1,0,1,53,2,2,1,4 +67696,7,2,2,67,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18695.172864,19350.637044,2,102,7,7,1.68,5,5,0,0,3,1,70,2,4,1,4 +67697,7,2,2,3,NA,5,7,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8818.200077,9596.189182,2,102,15,15,5,3,3,1,0,0,2,34,1,5,1,5 +67698,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,129559.2554,1,98,9,9,3.97,2,2,0,0,2,1,63,1,5,1,4 +67699,7,2,1,32,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,20254.971305,2,100,9,9,3.24,3,3,1,0,0,1,32,1,3,1,4 +67700,7,2,1,69,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9883.238978,10581.776717,1,90,4,4,0.78,4,4,0,0,1,1,69,2,4,1,3 +67701,7,2,1,54,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17869.988703,18923.921245,3,90,14,14,3.69,4,4,0,2,0,2,49,1,4,1,4 +67702,7,1,1,8,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8613.834494,0,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +67703,7,2,1,72,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,21815.897449,22272.021332,3,92,6,6,1.98,2,2,0,0,2,1,72,1,4,1,1 +67704,7,2,2,10,NA,4,4,2,10,128,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10221.991799,10790.677347,1,98,15,15,3.7,5,5,0,3,0,1,37,1,2,1,2 +67705,7,1,1,78,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,12173.814732,0,2,92,3,3,0.98,1,1,0,0,1,1,78,1,1,2,NA +67706,7,2,1,7,NA,5,6,1,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9307.245755,9856.522898,1,92,14,14,3.47,4,4,0,2,0,1,37,1,5,1,5 +67707,7,2,1,46,NA,3,3,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27340.471576,32700.198254,2,91,2,2,0.44,3,3,0,1,0,1,46,2,3,1,4 +67708,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,22685.373982,23047.569967,1,98,6,6,0.97,7,7,1,2,0,1,49,1,2,1,2 +67709,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,9235.951997,10444.280286,2,103,12,12,NA,3,3,0,0,1,1,60,2,2,1,2 +67710,7,2,1,50,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,22238.49412,21912.1785,2,90,7,7,1.34,5,5,0,1,2,1,61,2,1,4,NA +67711,7,2,1,17,NA,4,4,2,17,214,2,NA,2,1,5,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,77,77,NA,7,7,0,3,1,2,43,77,5,5,NA +67712,7,2,1,15,NA,4,4,1,15,181,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13653.432599,13680.426553,2,96,5,5,1.07,4,4,0,3,0,2,46,1,4,3,NA +67713,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,167711.394252,169284.299948,1,101,10,10,4.63,2,2,0,0,2,1,62,1,5,1,5 +67714,7,2,1,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,43188.300631,46554.36669,2,91,15,2,0.86,7,1,0,0,1,1,49,NA,NA,5,NA +67715,7,2,2,3,NA,5,7,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12382.393854,12702.004448,1,97,10,10,2.82,4,4,1,1,0,2,24,1,3,5,NA +67716,7,2,1,60,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12585.09113,12786.688219,1,92,5,5,1.41,2,2,0,0,2,1,60,1,2,1,4 +67717,7,2,1,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,10717.375231,11218.730451,2,101,3,3,1.1,1,1,0,0,1,1,66,1,1,2,NA +67718,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,138322.767578,145546.941919,1,101,5,5,1.45,2,2,0,0,0,2,49,1,4,3,NA +67719,7,2,1,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16214.132654,20271.082789,3,90,14,14,5,2,2,0,0,0,1,47,1,2,5,NA +67720,7,2,1,64,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12279.19827,12375.250021,2,102,14,14,5,2,2,0,0,2,1,64,1,4,1,3 +67721,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,49191.372812,55403.452354,3,91,3,3,1.1,1,1,0,0,1,2,80,1,1,2,NA +67722,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,4,1,0.4,4,1,0,0,0,1,22,1,5,5,NA +67723,7,1,2,19,NA,2,2,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,21850.358234,0,2,93,99,99,NA,3,3,0,0,0,2,54,2,3,4,NA +67724,7,2,1,1,14,4,4,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9438.902193,9727.203655,2,102,4,4,0.81,3,3,2,0,0,2,23,1,4,5,NA +67725,7,1,2,68,NA,2,2,NA,NA,NA,2,NA,2,1,5,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,10561.745159,0,2,90,77,77,NA,2,2,0,0,2,2,68,2,1,1,NA +67726,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,2,2,2,2,22466.936477,23282.464675,1,90,6,6,1.57,3,3,0,0,0,1,50,2,2,1,2 +67727,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,29733.812317,31414.972893,1,101,5,5,1.45,2,2,0,0,0,1,41,NA,NA,1,4 +67728,7,2,1,66,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,74792.980299,75494.43714,2,101,99,2,0.67,7,1,0,0,1,1,55,NA,NA,77,NA +67729,7,2,2,2,NA,2,2,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11412.410776,11898.666241,1,97,3,3,0.44,5,5,2,2,0,2,26,1,4,4,NA +67730,7,2,1,14,NA,3,3,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,102027.743122,101259.182802,1,101,8,8,1.85,5,5,0,3,0,1,41,1,3,1,4 +67731,7,2,1,0,11,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13392.309303,13030.480476,1,99,15,15,3.45,7,7,1,4,0,1,42,1,5,1,5 +67732,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,7233.371983,2,95,1,1,0,1,1,0,0,1,1,62,1,2,2,NA +67733,7,2,2,18,NA,2,2,1,18,217,2,NA,1,1,NA,11,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,15809.066118,16348.490248,2,93,6,6,1.39,4,4,0,0,0,1,53,2,3,1,3 +67734,7,2,2,19,NA,4,4,2,19,237,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18905.695776,2,101,2,2,0.48,2,2,1,0,0,2,19,1,3,NA,NA +67735,7,2,1,16,NA,5,6,2,16,195,NA,NA,2,2,3,9,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,7350.524832,8448.96413,2,90,3,3,0.54,4,4,0,1,0,2,52,NA,1,1,2 +67736,7,2,2,5,NA,1,1,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13366.393396,13935.903375,2,94,5,5,0.67,6,6,1,3,0,1,37,2,3,1,4 +67737,7,2,2,25,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,10800.351372,11406.289115,2,92,15,15,5,3,1,0,0,0,2,25,1,5,5,NA +67738,7,2,1,6,NA,2,2,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10738.959181,10632.988891,2,93,9,9,3.14,3,3,0,2,0,2,34,2,5,3,NA +67739,7,2,2,17,NA,5,6,2,17,214,2,NA,2,1,5,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11975.458482,12226.374363,1,97,15,15,5,3,3,0,1,2,2,63,1,5,1,NA +67740,7,2,1,52,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,4,NA,2,2,2,1,2,2,NA,NA,NA,NA,21084.369131,21009.599098,2,95,4,4,1.12,2,2,0,1,0,1,52,2,3,4,NA +67741,7,2,2,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,NA,NA,NA,NA,105039.256649,105978.379214,1,90,8,8,1.67,5,5,2,1,0,2,28,1,4,1,5 +67742,7,2,1,5,NA,1,1,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17865.135763,18430.646082,3,92,3,3,0.52,5,5,2,1,0,2,29,2,1,1,3 +67743,7,2,1,51,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16117.991297,16911.733026,1,96,3,3,0.43,4,4,1,1,0,2,39,2,4,1,3 +67744,7,2,1,11,NA,1,1,1,11,143,NA,NA,2,2,3,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,13822.148996,14860.201344,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +67745,7,2,2,72,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,29534.722322,30544.805853,3,91,2,2,0.83,1,1,0,0,1,2,72,1,4,3,NA +67746,7,2,1,10,NA,3,3,2,10,128,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39772.343364,41554.529575,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +67747,7,2,2,2,NA,1,1,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8141.317022,8654.572344,1,103,14,14,2.96,5,5,1,2,0,1,34,1,4,1,5 +67748,7,2,2,4,NA,3,3,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26966.264969,27815.81123,1,98,6,6,1.31,3,3,2,0,0,2,22,1,3,5,NA +67749,7,2,1,1,19,5,6,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6389.003009,6767.308805,3,91,14,14,3.06,5,5,3,0,0,1,34,2,5,1,5 +67750,7,2,2,2,NA,4,4,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7016.981922,7550.350821,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +67751,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,43813.24867,47373.102231,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +67752,7,2,1,14,NA,5,7,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11506.937395,12095.740214,1,97,15,15,5,6,6,0,3,0,1,47,1,5,1,5 +67753,7,1,2,6,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,12789.411811,0,1,102,99,99,NA,5,5,0,2,1,1,52,2,1,1,1 +67754,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,14010.52688,14536.170828,2,103,15,15,5,3,3,1,0,0,1,35,1,9,1,5 +67755,7,2,1,11,NA,3,3,1,11,138,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74331.764009,78594.005469,2,91,9,9,2.6,4,4,0,2,0,1,53,1,2,1,5 +67756,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,17583.693727,17958.024135,2,95,15,7,3.13,5,1,0,0,0,1,47,1,5,1,3 +67757,7,2,1,0,4,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6910.953528,6911.08091,2,96,4,4,0.97,3,3,1,0,0,2,37,2,2,1,1 +67758,7,2,2,7,NA,4,4,2,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5758.0032,6529.524105,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +67759,7,2,1,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17341.8035,17546.820808,2,102,7,7,1.53,5,5,1,2,0,1,36,1,2,1,3 +67760,7,2,1,17,NA,5,6,2,18,216,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7057.977053,7861.480262,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +67761,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,27271.751091,29115.882263,2,101,6,6,1.67,3,3,0,0,0,2,22,1,4,5,NA +67762,7,2,1,53,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,21016.438271,22051.40744,1,93,12,12,NA,3,3,0,1,0,2,49,2,3,1,3 +67763,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,97803.500399,99700.910854,1,95,14,14,3.8,4,4,0,2,0,2,37,1,5,1,5 +67764,7,2,1,76,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,2,2,2,1,2,2,NA,12962.876803,16930.790311,2,90,6,5,1.84,2,1,0,0,2,1,76,2,1,2,NA +67765,7,2,1,2,NA,2,2,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10803.555682,10931.27688,2,94,6,6,1.43,5,4,2,1,0,2,23,2,3,6,NA +67766,7,2,2,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,37934.469637,38685.959862,1,94,4,4,1.26,2,2,0,0,1,2,41,1,4,5,NA +67767,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,29167.119125,34820.124106,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +67768,7,2,2,14,NA,3,3,2,14,174,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,103298.858809,112630.333619,1,101,8,8,2.24,4,4,0,1,0,1,45,1,4,1,NA +67769,7,2,2,54,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,1,2,1,1,2,2,2,2,2,2,18295.488967,18390.898385,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +67770,7,2,2,0,10,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4418.651245,4685.491283,2,95,6,6,0.97,6,6,2,1,0,1,54,1,3,6,NA +67771,7,2,1,13,NA,4,4,2,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,6,6,1.51,3,3,0,1,1,1,65,1,2,1,4 +67772,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53541.401974,54113.194007,1,99,9,9,3.74,2,2,0,0,2,2,73,1,3,1,4 +67773,7,2,2,60,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17243.546687,17909.086027,1,92,8,8,3.44,2,2,0,0,2,1,71,1,3,1,5 +67774,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16905.961576,17390.157008,2,94,8,8,1.6,6,6,3,1,0,2,32,1,4,1,4 +67775,7,2,2,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,93589.96496,99393.853006,1,93,15,15,5,3,3,1,0,0,1,33,1,5,1,3 +67776,7,2,1,54,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,1,2,1,1,2,2,2,2,2,2,21139.303536,20829.116843,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +67777,7,1,1,2,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5547.430651,0,1,96,9,9,2.18,5,5,1,1,0,1,26,1,4,1,4 +67778,7,2,1,31,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17802.31438,18749.539496,1,102,3,3,0.82,2,2,0,0,0,1,31,1,4,1,4 +67779,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,207644.101324,209788.639452,1,97,10,10,4.3,2,2,0,0,1,2,56,1,5,1,5 +67780,7,2,2,7,NA,1,1,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16061.826248,2,98,4,4,0.75,4,4,0,2,0,2,33,1,2,5,NA +67781,7,2,2,41,NA,2,2,1,NA,NA,2,NA,2,2,1,NA,5,1,2,2,2,2,2,2,2,2,2,1,2,32606.880052,32776.922157,2,93,9,9,1.49,7,7,0,3,0,2,41,2,5,1,5 +67782,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19440.793325,19514.660132,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +67783,7,2,2,13,NA,5,6,2,13,162,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11975.458482,12226.374363,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +67784,7,2,2,18,NA,1,1,1,18,216,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15690.47168,16249.379042,1,102,5,5,0.86,5,5,2,0,0,2,21,2,2,5,NA +67785,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,27156.758177,27240.256208,1,95,4,4,1.21,2,2,0,0,0,1,46,1,2,1,2 +67786,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,153199.936938,1,95,3,3,1.33,1,1,0,0,0,1,45,1,2,5,NA +67787,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,24881.621161,24802.260383,2,94,15,15,5,1,1,0,0,0,1,44,1,5,3,NA +67788,7,2,1,62,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,2,2,2,2,2,2,1,2,2,2,9871.376767,9834.888389,2,97,4,4,1.29,2,2,0,0,2,2,70,1,3,1,4 +67789,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,1,1,2,2,1,2,2,1,2,2,1,18723.98095,18882.01405,2,101,2,2,0.22,4,4,1,1,0,2,41,1,2,4,NA +67790,7,2,1,14,NA,4,4,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10065.83895,10440.165744,2,99,14,14,4.09,3,3,0,2,0,2,37,1,5,5,NA +67791,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,32489.451884,36954.118364,2,91,3,3,1.16,1,1,0,0,1,2,80,1,4,2,NA +67792,7,1,1,10,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8943.919305,0,1,92,5,5,0.63,7,7,0,4,1,1,60,NA,NA,1,NA +67793,7,2,1,39,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,37658.482129,41412.915504,1,100,7,7,1.74,4,4,0,2,0,2,39,2,1,1,3 +67794,7,2,1,51,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,25139.75955,26335.178282,2,99,77,77,NA,3,3,0,0,0,2,57,2,2,1,1 +67795,7,2,1,41,NA,5,6,2,NA,NA,2,NA,2,2,99,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,11113.602843,11073.454175,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +67796,7,2,2,1,20,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7108.64371,7648.979929,1,90,14,14,2.96,5,5,1,2,0,1,31,1,5,1,4 +67797,7,2,1,45,NA,2,2,2,NA,NA,2,NA,2,1,77,NA,3,3,NA,2,2,2,2,2,2,2,2,2,2,28428.303115,29087.004066,3,90,77,77,NA,4,3,0,0,0,1,45,2,3,3,NA +67798,7,2,1,51,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,24923.937021,24558.216666,2,93,7,7,2.58,2,2,0,0,0,1,51,1,4,1,4 +67799,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,27945.726298,28031.650144,1,94,6,6,1.26,5,5,0,2,0,2,38,1,4,1,NA +67800,7,2,1,0,8,2,2,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5863.789973,5970.184293,2,93,8,8,2.17,4,4,2,0,0,2,30,1,4,1,4 +67801,7,2,2,11,NA,3,3,1,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17482.620882,17502.587262,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +67802,7,2,1,4,NA,5,7,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8890.779467,9258.147648,3,91,10,10,2.48,5,5,2,1,0,2,27,1,2,1,4 +67803,7,2,1,6,NA,5,7,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18834.739821,19876.018883,1,94,2,2,0.3,5,5,1,2,0,1,23,1,1,6,NA +67804,7,2,2,4,NA,5,6,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4437.828549,4650.082829,1,102,5,5,0.92,5,5,1,2,0,2,44,2,1,1,2 +67805,7,2,1,6,NA,4,4,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7687.032802,8119.723568,2,99,4,4,0.78,4,4,0,2,0,2,45,1,3,5,NA +67806,7,2,2,16,NA,2,2,2,16,198,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,20937.26435,23702.551829,1,90,5,5,1,4,4,0,2,0,1,40,2,2,1,1 +67807,7,2,2,3,NA,3,3,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,76623.952798,84569.150751,2,91,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +67808,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,1,2,NA,40827.983435,45600.111014,1,98,8,8,2.62,3,3,0,0,3,1,68,1,4,1,4 +67809,7,2,1,13,NA,1,1,1,13,164,NA,NA,2,2,3,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,32326.52031,34735.818434,2,94,5,5,0.65,6,6,0,3,0,1,44,2,1,1,1 +67810,7,2,1,0,6,2,2,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5420.429995,5420.529903,3,90,6,6,1.3,4,4,2,0,0,1,20,2,5,6,NA +67811,7,2,1,2,NA,4,4,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6454.74783,2,100,15,15,5,3,3,1,0,0,2,35,1,5,1,2 +67812,7,2,1,66,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,1,5,NA,2,2,2,1,2,2,2,2,2,2,12118.033999,12538.522644,2,91,99,99,NA,3,3,0,0,1,2,31,2,5,5,NA +67813,7,2,1,67,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,8561.661692,8628.633702,2,99,15,14,5,2,1,0,0,2,2,65,NA,NA,6,NA +67814,7,2,2,19,NA,4,4,1,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,1,1,0.06,1,1,0,0,0,2,19,1,4,NA,NA +67815,7,2,2,0,4,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20786.668002,20803.881706,1,101,8,8,1.85,5,5,3,0,0,2,31,1,2,1,2 +67816,7,2,1,14,NA,4,4,2,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13969.457688,14306.402061,1,90,3,3,0.63,3,3,1,1,0,2,32,1,4,5,NA +67817,7,2,1,55,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,35958.875702,36129.285962,1,98,8,1,0,4,1,0,0,0,1,53,1,2,1,3 +67818,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16007.367503,15264.693262,2,90,15,15,5,4,4,0,0,0,1,57,2,5,1,5 +67819,7,2,2,79,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,44856.466004,46390.551109,2,94,3,3,1.16,1,1,0,0,1,2,79,1,4,2,NA +67820,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,19130.246369,19040.031855,2,95,7,7,1.74,4,4,0,2,0,2,47,1,5,4,NA +67821,7,2,1,7,NA,4,4,1,8,96,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12399.014378,12375.702699,2,96,2,2,0.31,4,4,0,2,0,2,30,NA,NA,6,NA +67822,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,38369.898602,44511.264162,2,95,3,3,0.95,2,2,0,0,2,2,80,1,1,1,2 +67823,7,2,2,15,NA,3,3,1,15,189,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,92934.523767,97199.343719,1,92,8,8,2.17,4,4,0,1,2,2,80,1,3,2,NA +67824,7,2,1,40,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15851.563418,15794.298537,2,95,15,15,5,1,1,0,0,0,1,40,2,5,5,NA +67825,7,2,2,11,NA,4,4,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11116.391625,11531.852198,1,92,77,77,NA,5,5,1,2,0,2,41,1,3,5,NA +67826,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,122833.610417,128308.021903,1,98,15,15,4.34,4,4,0,2,0,1,51,1,5,1,5 +67827,7,2,1,53,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27609.8026,27737.039026,2,101,8,8,2.7,3,3,0,1,0,1,53,1,4,1,2 +67828,7,2,1,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11136.552864,2,101,4,4,1.22,2,2,0,0,2,1,67,1,1,1,2 +67829,7,2,1,19,NA,3,3,1,19,229,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,73465.215193,72911.812289,1,100,15,15,4.63,5,5,0,0,0,1,51,1,5,1,3 +67830,7,2,1,0,5,2,2,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,5733.655482,6014.350383,1,90,10,10,2.44,5,5,1,0,0,2,56,2,1,1,1 +67831,7,2,2,0,1,3,3,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16608.743852,16157.613485,1,94,15,15,5,4,4,2,0,0,1,37,1,5,1,4 +67832,7,2,2,71,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,17836.372654,18457.016952,2,96,5,5,0.67,6,6,1,2,1,1,34,1,4,1,4 +67833,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,12526.25131,13442.161918,2,95,5,5,1.32,2,2,0,0,2,2,78,1,2,1,2 +67834,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,92613.517882,94092.287712,3,91,8,6,2.75,3,1,0,0,0,1,23,1,4,1,4 +67835,7,2,2,9,NA,4,4,2,9,114,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7405.320425,7603.433563,2,99,6,6,1.13,4,4,1,1,0,1,33,1,3,6,NA +67836,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,112153.23206,1,91,8,8,2.17,4,4,0,0,0,1,59,1,4,1,5 +67837,7,2,1,8,NA,3,3,2,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49922.147265,52289.098209,1,98,9,9,2.6,4,4,1,1,0,2,35,1,2,1,NA +67838,7,2,1,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,11650.457723,11613.298191,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +67839,7,2,1,61,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9313.036488,9824.696739,1,103,15,15,5,2,2,0,0,1,2,56,2,5,1,5 +67840,7,2,1,28,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,115954.75973,120569.27907,1,92,5,5,1.97,1,1,0,0,0,1,28,1,4,3,NA +67841,7,2,1,58,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11498.794569,11546.882913,1,96,15,15,5,5,5,0,0,0,1,58,2,5,1,5 +67842,7,2,2,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,16420.864787,17686.616768,2,102,1,1,0.16,3,3,1,0,1,2,63,1,2,4,NA +67843,7,2,1,3,NA,3,3,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24655.003412,27816.70307,1,98,2,2,0.36,5,5,3,0,0,1,25,1,3,1,3 +67844,7,2,1,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,111284.977736,114467.051739,3,91,8,5,1.5,3,2,0,0,0,1,23,1,4,1,4 +67845,7,2,1,49,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18116.816149,22904.074887,2,90,8,7,3.21,2,1,0,0,0,1,51,1,2,5,NA +67846,7,2,1,15,NA,5,7,2,15,183,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60818.973858,62775.825513,1,99,15,15,5,4,4,0,2,0,2,44,1,5,1,5 +67847,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,16186.470589,15743.485359,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +67848,7,2,1,66,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,12585.09113,13280.957381,2,98,4,4,1.34,2,2,0,0,2,1,66,1,1,1,1 +67849,7,2,2,0,11,5,7,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5882.73073,5843.204067,3,90,15,15,5,3,3,1,0,0,2,32,2,5,1,5 +67850,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10440.656902,1,99,10,10,5,1,1,0,0,1,2,64,1,5,3,NA +67851,7,2,2,5,NA,3,3,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51483.624552,53105.566664,1,94,15,15,5,4,4,2,0,0,1,51,2,5,1,5 +67852,7,2,1,15,NA,5,6,1,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12412.721558,13262.259083,1,92,10,10,2.82,4,4,0,2,0,2,48,2,5,1,5 +67853,7,2,1,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19923.530941,23644.216851,2,95,6,6,0.97,6,6,2,2,0,1,37,1,3,1,4 +67854,7,2,1,80,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12101.489198,13370.144062,1,93,3,3,0.65,3,3,0,0,3,2,74,2,1,2,NA +67855,7,2,1,58,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11498.794569,11546.882913,2,100,15,15,5,3,3,0,1,0,1,58,2,5,1,5 +67856,7,2,2,0,8,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4523.857227,4573.252417,2,95,6,6,1.57,3,3,1,0,0,1,29,1,3,1,4 +67857,7,2,2,25,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16021.911789,17471.931528,1,94,7,7,1.79,4,4,0,1,0,1,59,2,4,1,4 +67858,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,NA,10049.7347,10691.470743,2,90,5,5,1.98,1,1,0,0,1,2,68,1,4,5,NA +67859,7,2,1,18,NA,4,4,1,18,219,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12792.875152,12871.476461,2,93,99,99,NA,7,6,1,0,0,1,19,1,3,NA,NA +67860,7,2,2,14,NA,3,3,2,14,174,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23708.623398,24267.27809,2,97,5,5,1.08,3,3,0,1,0,2,45,1,4,6,NA +67861,7,2,1,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,85786.890667,86591.455494,2,96,9,9,5,1,1,0,0,1,1,60,1,5,5,NA +67862,7,2,1,1,20,3,3,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23524.870375,27564.905667,1,90,7,7,2.1,3,3,1,0,0,2,40,2,5,1,4 +67863,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,202246.928022,1,91,15,15,5,3,3,0,0,0,2,50,1,4,1,4 +67864,7,2,2,22,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,15735.580263,16455.708445,1,97,15,15,5,4,4,0,0,0,1,51,2,5,1,5 +67865,7,2,1,59,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17121.370948,17378.349074,1,92,14,14,3.9,4,4,0,0,0,2,55,2,5,1,5 +67866,7,2,2,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,13101.965339,13686.954077,1,100,6,6,2.24,1,1,0,0,1,2,60,1,5,3,NA +67867,7,2,2,11,NA,2,2,1,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,13720.541363,14610.824098,2,100,4,4,0.81,4,4,0,2,0,2,37,1,2,1,2 +67868,7,2,2,13,NA,1,1,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23979.296993,25562.604106,1,101,3,3,0.41,5,5,0,2,1,2,36,2,4,4,NA +67869,7,2,2,4,NA,2,2,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,2,2,1,NA,NA,NA,NA,12675.140707,13078.439708,1,96,5,5,0.94,4,4,2,0,0,1,32,2,3,1,4 +67870,7,2,2,20,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,1,1,2,2,1,10345.80475,11593.940235,3,90,15,15,3.23,6,6,0,2,0,1,50,2,2,1,2 +67871,7,2,2,6,NA,2,2,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15148.721588,15796.67129,2,91,10,10,3.04,4,4,1,1,0,2,31,2,5,1,5 +67872,7,2,2,78,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,1,1,NA,2,2,2,1,2,2,2,2,2,NA,20441.922878,23572.887355,1,90,4,4,0.94,3,3,0,0,2,2,78,2,1,1,2 +67873,7,2,2,50,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,20388.95294,20876.134898,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +67874,7,2,1,69,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,138075.879417,141933.339512,2,94,10,10,4.3,2,2,0,0,2,1,69,1,4,1,5 +67875,7,2,2,9,NA,4,4,1,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11195.065587,11548.620784,2,96,15,9,3.74,3,2,0,1,0,2,38,1,5,6,NA +67876,7,2,2,5,NA,4,4,2,5,63,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11353.600279,12216.600549,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +67877,7,2,2,79,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,33602.625,34751.830256,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +67878,7,2,1,9,NA,4,4,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8714.559478,8887.823591,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +67879,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,139800.409559,142430.529735,1,100,15,15,5,4,4,0,1,0,1,50,1,4,1,4 +67880,7,2,1,13,NA,5,6,1,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9737.713978,10134.40846,2,100,14,14,4.03,4,4,0,2,0,1,48,2,5,1,5 +67881,7,2,2,17,NA,3,3,1,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,31282.308091,32019.424199,2,98,3,3,0.38,5,5,0,4,0,2,39,1,4,5,NA +67882,7,2,1,4,NA,3,3,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,86817.367332,101726.917198,2,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +67883,7,2,1,5,NA,5,7,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12996.965152,13393.943951,1,101,2,2,0.33,4,4,2,1,0,2,26,1,4,5,NA +67884,7,2,2,10,NA,2,2,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16986.005478,17464.743129,2,102,5,5,0.89,4,4,0,3,0,2,44,2,2,4,NA +67885,7,2,2,80,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,3,2,NA,1,2,1,1,2,1,1,2,1,NA,12344.929687,13171.097693,1,93,1,1,0.28,1,1,0,0,1,2,80,2,3,2,NA +67886,7,2,2,3,NA,1,1,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12714.663639,13516.237728,1,102,5,5,0.86,5,5,2,0,0,2,21,2,2,5,NA +67887,7,2,2,67,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17243.546687,17909.086027,1,92,14,14,5,2,2,0,0,2,1,62,1,4,1,4 +67888,7,2,1,8,NA,3,3,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,27154.222487,28089.451048,2,101,4,4,0.73,5,5,1,2,0,1,40,1,5,1,5 +67889,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,30863.871606,31440.435679,1,101,4,4,1.43,1,1,0,0,0,2,42,1,5,5,NA +67890,7,2,2,7,NA,1,1,2,7,88,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14300.71869,14814.284705,2,94,13,13,NA,5,5,0,3,0,1,32,2,2,1,1 +67891,7,2,2,29,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,17204.739153,20747.6165,1,93,9,9,5,1,1,0,0,0,2,29,1,5,5,NA +67892,7,2,2,10,NA,3,3,1,10,123,NA,NA,2,2,3,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,13450.606713,14078.286101,3,91,4,4,0.65,5,5,2,2,0,2,27,2,2,3,NA +67893,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,83819.702285,99717.125794,1,99,14,14,5,1,1,0,0,0,1,34,1,5,5,NA +67894,7,2,1,80,NA,5,7,1,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,38080.409655,40864.822189,2,95,6,6,1.95,2,2,0,0,2,1,80,1,1,1,3 +67895,7,2,1,8,NA,4,4,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9261.557132,9782.87535,2,100,7,7,1.79,4,4,0,1,0,2,51,1,3,3,NA +67896,7,2,1,17,NA,4,4,2,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15381.581315,15476.088016,1,93,12,12,NA,5,4,0,2,0,1,32,1,2,5,NA +67897,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,60257.408263,62318.203523,1,103,15,15,5,2,2,0,0,2,1,74,1,5,1,5 +67898,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,12170.020379,2,97,6,6,1,6,6,1,2,2,2,60,1,2,2,NA +67899,7,2,1,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,NA,7663.797586,8115.960731,1,96,3,3,1.25,1,1,0,0,1,1,80,1,2,4,NA +67900,7,1,1,24,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,13859.220514,0,1,98,12,2,0.54,3,1,0,0,0,1,24,1,4,5,NA +67901,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12222.312509,13136.499838,2,95,12,12,NA,3,3,0,0,3,2,73,1,2,1,1 +67902,7,2,1,21,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,4,NA,2,2,2,2,2,2,2,2,2,2,39915.513053,44831.646235,2,98,5,5,1.07,4,4,0,1,0,1,53,2,1,1,1 +67903,7,2,2,3,NA,4,4,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10771.85499,11049.894844,2,97,1,1,0.2,2,2,1,0,0,2,26,1,4,5,NA +67904,7,2,1,1,21,2,2,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12373.634774,12852.001067,1,92,10,10,2.63,5,5,2,1,0,2,26,1,4,1,4 +67905,7,2,2,10,NA,5,7,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5836.229473,6119.1334,2,103,14,14,3.48,5,5,0,2,1,1,43,1,4,1,5 +67906,7,2,2,8,NA,3,3,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,25563.654853,1,95,15,15,3.62,7,7,2,4,0,1,59,1,5,1,2 +67907,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,74517.751389,89988.433696,2,94,12,12,NA,5,5,1,1,0,1,37,1,4,1,3 +67908,7,2,1,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,23235.97926,24675.846787,2,95,6,6,1.36,3,3,0,0,2,2,60,1,5,1,4 +67909,7,2,1,0,6,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,6218.697738,6608.80804,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +67910,7,2,1,80,NA,2,2,1,NA,NA,1,1,99,NA,NA,NA,9,1,NA,1,1,2,1,1,2,1,1,2,NA,13906.496347,14197.251523,2,103,99,99,NA,6,1,0,0,3,1,80,NA,NA,2,NA +67911,7,2,1,15,NA,3,3,1,15,186,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,81936.967747,80860.127913,1,94,14,14,2.96,5,5,0,3,0,2,39,1,4,1,3 +67912,7,2,1,65,NA,2,2,1,NA,NA,1,2,2,1,7,NA,5,1,NA,2,2,2,1,2,2,1,2,2,1,14067.170863,14292.508976,2,102,15,15,5,3,3,0,0,2,1,36,2,5,5,NA +67913,7,2,1,11,NA,1,1,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13665.416457,13541.311863,1,94,2,2,0.27,5,5,0,4,0,2,47,2,1,4,NA +67914,7,2,1,8,NA,3,3,1,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23188.935049,25672.571973,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +67915,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15976.466658,17286.192057,2,96,8,5,2.2,2,1,0,0,0,2,25,2,5,5,NA +67916,7,2,2,39,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,4,1,2,2,2,2,2,2,2,NA,NA,NA,NA,38184.257672,39931.153329,2,91,8,8,1.85,5,5,0,2,1,1,39,2,3,1,4 +67917,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,22634.531479,23281.741513,1,103,9,6,2.6,3,1,0,0,0,1,27,1,5,5,NA +67918,7,2,2,19,NA,4,4,2,19,232,2,NA,2,2,3,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10694.834447,10900.381844,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +67919,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,186864.831109,211461.930376,1,97,3,3,1.3,1,1,0,0,0,2,59,1,4,3,NA +67920,7,2,2,1,19,2,2,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13464.808163,13893.232889,1,101,15,15,4.99,4,4,2,0,0,1,31,1,4,1,4 +67921,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,51644.110977,57877.507418,1,102,14,14,5,2,2,0,0,1,2,59,1,5,3,NA +67922,7,2,2,3,NA,5,6,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7483.230909,7475.326886,2,96,15,15,5,3,3,1,0,0,1,34,2,5,1,5 +67923,7,2,2,11,NA,4,4,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8115.309776,8917.717263,2,95,6,6,0.97,6,6,2,2,0,1,37,1,3,1,4 +67924,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19150.604366,19611.675453,3,91,15,15,4.47,4,4,0,1,0,2,45,2,5,1,5 +67925,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,12449.932013,12144.773422,3,90,7,7,2.23,3,3,0,0,0,2,51,1,4,3,NA +67926,7,2,2,40,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,15819.48188,17091.862943,1,90,15,15,5,3,3,1,0,0,1,42,1,5,1,5 +67927,7,2,1,32,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15137.053737,17738.779486,2,99,15,15,5,1,1,0,0,0,1,32,1,5,5,NA +67928,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,64581.191728,64779.757488,2,94,15,15,5,2,2,0,0,0,1,36,1,2,1,4 +67929,7,1,2,20,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,NA,NA,NA,NA,18723.98095,0,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +67930,7,2,1,59,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,27595.50738,28151.492876,1,98,10,10,3.51,3,3,0,0,0,1,59,2,5,1,4 +67931,7,2,1,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5991.543696,6284.863687,1,102,5,5,0.86,5,5,2,0,0,2,21,2,2,5,NA +67932,7,2,1,9,NA,3,3,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,48147.167375,49984.220445,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +67933,7,2,1,12,NA,3,3,1,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,124064.997098,122531.713298,1,95,7,7,2.54,2,2,0,1,0,2,37,1,1,5,NA +67934,7,2,2,16,NA,3,3,1,16,194,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,113907.203714,124196.980527,1,94,7,7,1.52,4,4,0,2,2,1,61,2,1,1,5 +67935,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,74265.831326,76685.765974,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +67936,7,2,1,13,NA,5,6,2,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,10346.302718,11357.395963,2,91,12,12,NA,7,6,0,4,2,2,72,2,1,2,NA +67937,7,1,2,74,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15730.58404,0,2,98,77,77,NA,4,4,0,0,2,1,71,NA,NA,1,1 +67938,7,2,2,27,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16026.268721,19326.470131,1,93,14,14,5,1,1,0,0,0,2,27,1,5,5,NA +67939,7,2,1,72,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,49653.587757,54188.961403,2,98,15,15,5,2,2,0,0,2,2,66,1,3,1,1 +67940,7,2,1,66,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22184.040999,22468.589781,2,94,8,8,3.06,2,2,0,0,2,1,66,1,4,1,4 +67941,7,2,2,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,2,1,2,2,1,2,2,1,2,2,1,35313.648114,35629.376203,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +67942,7,2,1,1,12,2,2,2,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8331.647763,8595.381151,2,90,99,99,NA,5,5,1,1,0,2,40,2,3,1,1 +67943,7,2,1,5,NA,5,7,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6176.631821,6670.596558,1,93,15,15,5,5,5,1,2,0,2,40,1,5,1,5 +67944,7,2,2,10,NA,4,4,2,10,131,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11467.793741,13004.375485,2,91,6,6,0.78,7,7,1,4,0,2,38,2,2,77,NA +67945,7,2,1,6,NA,3,3,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,38712.032122,41122.784973,3,91,15,15,5,6,6,1,3,0,2,40,1,5,1,5 +67946,7,2,1,3,NA,1,1,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,18754.85406,18780.196288,2,102,5,5,0.89,4,4,2,0,0,1,33,2,9,1,2 +67947,7,2,1,79,NA,4,4,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,2,1,2,1,1,2,2,NA,8074.739647,8488.510868,2,93,13,13,NA,3,3,0,0,2,2,63,2,2,1,3 +67948,7,2,1,27,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,4,5,NA,2,2,2,NA,NA,NA,1,2,2,1,44549.73661,46547.524849,2,93,4,4,0.69,4,4,0,1,1,2,66,2,3,2,NA +67949,7,2,2,10,NA,2,2,2,10,129,NA,NA,2,2,1,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,10762.400563,12070.126078,2,90,3,3,0.46,5,5,1,3,0,2,35,2,1,4,NA +67950,7,2,2,4,NA,4,4,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11914.048896,13313.886049,1,100,14,14,3.6,4,4,1,1,0,1,41,1,4,1,5 +67951,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,18174.62037,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +67952,7,2,2,65,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,12994.252166,2,90,2,2,0.55,1,1,0,0,1,2,65,2,1,5,NA +67953,7,2,1,0,9,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5081.270665,5448.486113,2,99,77,77,NA,6,6,1,1,0,2,42,1,3,1,3 +67954,7,2,1,15,NA,2,2,2,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21399.234084,21768.65302,1,91,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +67955,7,2,2,12,NA,3,3,2,12,147,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71303.309206,77744.474592,2,94,15,15,5,5,5,0,3,0,1,44,1,5,1,4 +67956,7,2,2,3,NA,5,6,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4369.011217,4638.097632,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +67957,7,2,1,50,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,2,3,NA,1,2,2,NA,NA,NA,1,2,2,1,27609.8026,27521.740194,2,101,99,99,NA,3,3,0,1,1,2,78,1,1,2,NA +67958,7,2,2,43,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,3,1,2,2,1,2,2,NA,NA,NA,NA,9131.449129,11051.567129,1,103,77,77,NA,6,6,0,2,2,1,70,NA,NA,1,1 +67959,7,2,1,13,NA,4,4,1,13,162,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16147.713323,16532.569027,1,92,5,5,0.95,4,4,0,2,0,2,33,1,4,5,NA +67960,7,2,2,40,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,5,1,2,2,2,2,2,2,2,2,2,2,2,31334.47528,32058.983464,2,96,7,7,1.57,4,4,0,2,0,1,40,2,2,1,5 +67961,7,2,1,6,NA,2,2,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15882.795076,15889.831109,1,97,3,3,0.44,5,5,2,2,0,2,26,1,4,4,NA +67962,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,2,1,2,2,1,2,2,1,2,2,1,16339.124275,15891.961277,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +67963,7,2,2,11,NA,4,4,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8146.767632,8771.942314,2,100,6,6,0.99,5,5,0,3,0,2,40,1,3,1,3 +67964,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,NA,NA,NA,NA,31335.13799,33684.15133,1,95,6,3,0.45,6,4,1,2,0,1,28,1,2,1,2 +67965,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,52448.388619,54438.22579,1,99,8,8,3.4,2,2,0,0,2,1,74,1,5,1,4 +67966,7,2,1,20,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,101419.325386,103801.228657,1,100,15,15,4.63,5,5,0,0,0,1,51,1,5,1,3 +67967,7,2,1,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,158509.005274,159425.752864,1,100,15,15,4.07,5,5,0,2,0,2,41,1,5,1,4 +67968,7,2,2,7,NA,5,6,2,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6878.565723,7345.278289,3,90,14,14,4.71,3,3,0,1,0,1,43,1,5,1,5 +67969,7,2,2,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,118269.59683,119479.91378,2,98,10,10,4.55,2,2,0,0,1,2,66,1,5,2,NA +67970,7,2,1,72,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,48254.793439,51076.634961,2,100,99,99,NA,2,2,0,0,2,1,72,1,4,1,4 +67971,7,2,2,11,NA,1,1,1,11,140,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12215.503444,12532.555214,1,102,5,5,0.92,5,5,0,3,0,2,39,2,3,1,3 +67972,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,84910.063417,90031.493834,2,96,14,4,1.38,3,1,0,0,0,1,30,2,5,5,NA +67973,7,2,1,6,NA,5,6,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11522.32071,1,97,15,15,4.07,5,5,0,3,0,1,42,2,5,1,5 +67974,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37814.382501,44413.458724,1,98,3,3,1.03,1,1,0,0,0,1,27,1,4,5,NA +67975,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,33731.056243,36109.766611,2,98,4,4,1.22,2,2,0,0,2,1,80,1,1,1,1 +67976,7,1,1,34,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,99134.771466,0,2,99,15,15,5,2,2,0,0,0,2,34,NA,NA,1,5 +67977,7,2,2,56,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,17152.714252,16747.256128,1,102,7,1,0.33,5,1,1,0,2,1,47,1,3,5,NA +67978,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,49428.481088,50236.061312,1,101,1,1,0.13,1,1,0,0,1,2,60,1,4,3,NA +67979,7,2,1,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,8232.241159,8296.636338,2,98,7,7,2.72,2,2,0,0,1,1,65,1,4,3,NA +67980,7,2,2,8,NA,4,4,1,8,105,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8362.256577,8929.488766,2,100,7,7,1.34,5,5,0,2,0,2,53,1,4,4,NA +67981,7,2,1,19,NA,1,1,2,19,238,2,NA,2,1,4,15,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,20174.283097,21488.447069,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +67982,7,1,1,42,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,148374.146816,0,2,96,10,6,2.66,2,1,0,0,0,1,35,1,5,5,NA +67983,7,2,2,47,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,13568.706187,17300.043727,3,90,6,6,1.98,2,2,0,0,0,2,47,2,5,2,NA +67984,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,85040.351078,89341.219459,1,93,7,7,2.16,3,3,0,1,0,2,50,1,5,3,NA +67985,7,2,1,13,NA,3,3,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58479.782556,60361.370686,1,99,15,15,5,5,5,0,3,0,2,43,1,5,1,5 +67986,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,8411.959333,8787.544319,1,96,9,9,3.97,2,2,0,0,1,1,28,1,5,5,NA +67987,7,2,2,6,NA,4,4,2,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7446.876055,7952.015759,2,99,6,6,1.15,5,5,1,2,0,2,34,1,4,77,NA +67988,7,2,1,14,NA,3,3,2,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,58479.782556,60361.370686,1,99,15,15,5,5,5,0,3,0,2,43,1,5,1,5 +67989,7,2,2,22,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,NA,NA,NA,NA,55392.206282,57222.234271,3,91,3,3,1.29,1,1,0,0,0,2,22,1,3,5,NA +67990,7,2,2,12,NA,5,6,2,12,148,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6937.463063,7205.726089,3,90,10,10,2.41,5,5,1,2,0,1,44,2,4,1,5 +67991,7,2,1,57,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11690.444016,12095.591726,3,90,4,4,0.92,3,3,0,0,1,2,56,2,2,1,2 +67992,7,2,1,41,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,52941.648658,52646.945429,2,102,15,15,5,2,2,0,0,0,1,41,2,4,6,NA +67993,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,5,NA,2,2,2,2,2,2,1,2,2,NA,8609.250304,11228.904188,2,90,4,4,0.57,5,5,1,0,2,2,80,2,1,2,NA +67994,7,2,1,12,NA,3,3,2,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71458.892941,71654.216305,2,94,3,3,0.54,4,4,0,1,0,2,48,1,3,1,3 +67995,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,58072.588922,61468.555023,1,101,14,14,5,2,2,0,0,2,2,70,1,5,1,2 +67996,7,2,1,9,NA,1,1,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,2,2,2,2,11367.678664,11547.566042,2,96,5,5,0.78,5,5,0,2,0,1,37,2,1,5,NA +67997,7,1,2,25,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,11934.941038,0,3,90,8,8,1.85,5,5,0,0,1,2,25,1,5,5,NA +67998,7,2,2,52,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,17991.883465,18228.515837,2,102,10,10,3.62,3,3,0,0,0,1,51,2,5,1,5 +67999,7,2,2,52,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,24004.6026,25447.359355,2,91,14,14,4.19,3,3,0,1,0,1,55,2,3,1,5 +68000,7,2,1,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21941.544332,21717.573526,1,99,10,10,2.58,5,5,0,1,2,1,65,1,5,1,3 +68001,7,2,1,79,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,NA,8992.410435,11769.853451,2,90,4,4,1.43,1,1,0,0,1,1,79,1,2,4,NA +68002,7,2,2,11,NA,3,3,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55469.656717,57246.428971,1,98,9,9,2.15,5,5,0,3,0,2,32,1,3,1,4 +68003,7,2,1,72,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,15262.668516,16210.38509,1,102,7,7,1.41,5,5,0,2,2,1,72,1,4,1,3 +68004,7,2,2,33,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,36002.138941,36147.943555,1,103,15,15,5,2,2,0,0,0,1,36,2,5,1,5 +68005,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,99,2,0.55,2,1,0,0,0,1,21,NA,NA,5,NA +68006,7,2,1,13,NA,4,4,2,13,167,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15970.206483,16374.875978,2,97,3,3,0.46,5,5,0,3,0,1,40,1,2,1,3 +68007,7,2,2,33,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23038.68441,23821.989403,1,92,6,6,1.92,2,2,0,0,0,2,33,2,4,5,NA +68008,7,2,1,80,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,3,2,NA,2,2,2,2,2,2,NA,NA,NA,NA,9710.399795,10186.406299,2,93,99,99,NA,1,1,0,0,1,1,80,2,3,2,NA +68009,7,2,2,14,NA,4,4,1,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13697.127402,13594.601175,2,100,10,7,2.05,4,3,0,2,0,1,20,1,4,6,NA +68010,7,2,1,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11218.730451,2,97,3,3,1.29,1,1,0,0,1,1,63,1,2,2,NA +68011,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,47973.37979,48741.666001,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +68012,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,12537.004291,13376.026635,2,98,77,77,NA,2,2,0,0,2,2,70,1,3,1,2 +68013,7,2,2,60,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14067.755128,14924.32642,2,91,8,8,4.3,1,1,0,0,1,2,60,2,5,5,NA +68014,7,2,1,16,NA,3,3,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30100.326038,29873.584609,1,101,6,6,1.17,4,4,0,1,0,1,41,1,3,6,NA +68015,7,2,2,9,NA,3,3,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19824.800404,20630.46787,1,101,4,4,0.78,4,4,1,2,0,2,32,1,3,3,NA +68016,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,159097.269198,158226.612798,1,97,15,15,4.77,4,4,0,0,0,1,56,1,4,1,4 +68017,7,2,2,68,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16352.915834,18960.412859,3,92,10,10,4.3,5,2,2,1,1,2,68,1,3,1,1 +68018,7,2,1,1,22,5,6,2,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5891.941477,6363.138629,1,90,6,6,0.92,6,6,2,0,2,2,30,2,5,1,5 +68019,7,2,1,12,NA,3,3,1,12,149,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71934.689876,71392.8162,1,100,15,15,5,5,5,0,3,0,1,47,1,5,1,5 +68020,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,35334.703093,40990.264786,1,101,3,3,1.25,1,1,0,0,1,2,80,1,2,2,NA +68021,7,2,1,34,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,20803.970543,21211.256549,1,93,5,5,1.84,1,1,0,0,0,1,34,2,2,5,NA +68022,7,2,1,58,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,37426.314738,36877.141263,3,92,15,15,5,2,2,0,0,0,1,58,1,4,1,4 +68023,7,2,1,25,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,5,NA,1,2,2,NA,NA,NA,1,2,2,1,9177.295801,9548.31812,2,92,77,77,NA,4,4,0,0,0,1,27,2,2,5,NA +68024,7,2,2,26,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,2,2,2,1,2,2,NA,NA,NA,NA,30253.427014,34374.819903,2,90,6,6,2.01,2,2,0,1,0,2,26,1,3,5,NA +68025,7,2,2,19,NA,2,2,1,19,238,2,NA,2,2,3,15,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,18556.092615,19088.608674,1,103,6,6,0.93,5,5,0,1,0,1,39,2,3,1,3 +68026,7,2,2,1,19,5,7,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6683.092466,7272.710878,3,91,8,8,2.7,3,3,1,0,0,1,31,1,5,1,5 +68027,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,18490.479848,18604.849683,2,100,8,8,2.7,3,3,1,0,0,2,41,1,4,1,3 +68028,7,2,2,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,14994.337564,16150.13007,1,100,9,9,3.97,2,2,0,0,2,1,70,NA,NA,1,3 +68029,7,2,1,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,7973.883342,8285.757609,1,100,3,3,0.9,1,1,0,0,1,1,60,1,3,5,NA +68030,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,89234.06428,94763.645369,1,93,15,15,5,4,3,0,0,3,1,80,1,5,2,NA +68031,7,2,1,2,NA,1,1,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10276.786905,10398.280565,1,102,4,4,0.5,6,6,2,2,0,1,25,1,2,1,3 +68032,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,36401.782557,40656.559204,2,100,6,6,2.01,2,2,0,0,2,1,80,1,5,1,5 +68033,7,2,1,2,NA,3,3,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49276.9767,53002.397569,2,98,8,8,2.42,4,4,2,0,0,2,31,1,4,1,2 +68034,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,11190.39853,11690.037855,2,99,99,99,NA,2,2,0,0,2,2,62,1,5,3,NA +68035,7,2,2,78,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,55793.89654,57702.040299,2,103,12,12,NA,1,1,0,0,1,2,78,1,4,2,NA +68036,7,2,1,3,NA,1,1,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14505.510202,14266.522334,2,94,5,5,1.3,3,3,1,0,0,2,38,2,1,1,4 +68037,7,2,1,13,NA,5,6,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6666.045669,7124.269577,3,90,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +68038,7,2,1,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7238.674935,7295.298127,1,96,15,15,5,3,3,0,0,2,2,44,1,5,5,NA +68039,7,2,2,0,1,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7849.042868,8059.930457,2,98,14,14,3.25,5,5,2,1,0,1,37,1,5,1,5 +68040,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,29738.952706,30201.133298,2,94,8,8,3.4,2,2,0,0,0,1,22,1,3,5,NA +68041,7,2,1,63,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,6441.264127,6693.19464,1,96,15,15,5,2,2,0,0,2,1,63,1,3,1,3 +68042,7,2,1,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,32375.321924,34954.784356,1,98,2,2,0.31,3,3,1,0,0,1,45,NA,NA,1,NA +68043,7,2,2,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,79351.077678,83837.616505,2,98,9,9,4.01,2,2,0,0,0,1,27,1,5,1,4 +68044,7,2,2,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,187291.098551,189225.431861,2,91,7,7,2.31,2,2,0,0,0,2,58,1,5,3,NA +68045,7,2,2,13,NA,4,4,2,13,162,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10671.280357,10591.403308,1,99,10,10,3.13,4,4,0,2,0,1,35,1,4,1,5 +68046,7,2,2,65,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,149575.283913,151406.873597,1,95,5,5,1.84,1,1,0,0,1,2,65,1,3,3,NA +68047,7,2,1,7,NA,5,6,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11461.625841,1,97,15,15,5,3,3,0,1,0,2,36,2,5,1,5 +68048,7,2,1,10,NA,4,4,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9699.683862,9815.96792,2,100,1,1,0.06,3,3,1,1,0,2,30,1,4,5,NA +68049,7,2,2,6,NA,5,6,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9227.090107,9736.375878,2,100,15,15,5,4,4,1,1,0,1,41,2,5,1,5 +68050,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,21143.97379,22281.995197,1,97,77,77,NA,3,3,0,0,3,2,62,1,5,1,NA +68051,7,1,1,51,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,24595.31055,0,1,97,15,15,5,4,4,0,2,0,1,51,1,5,1,NA +68052,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18404.681357,22792.166915,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +68053,7,2,1,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,18754.85406,20094.472571,2,102,10,10,3.04,4,4,2,0,0,2,31,2,2,1,NA +68054,7,2,2,8,NA,3,3,2,8,98,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,43531.157975,44359.496292,1,91,7,7,1.88,4,4,1,2,0,2,43,1,5,4,NA +68055,7,2,1,0,1,5,6,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5300.922196,5735.896742,3,90,7,7,1.82,4,4,1,0,0,2,54,2,1,3,NA +68056,7,2,2,6,NA,4,4,2,6,83,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7136.421849,7489.546444,1,90,9,9,1.65,7,7,0,4,0,1,36,1,4,1,4 +68057,7,1,1,6,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,66000.998272,0,1,90,15,15,5,4,4,1,1,0,2,39,1,5,1,4 +68058,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,123771.419917,129271.862102,2,98,8,8,2.7,3,3,0,0,1,2,71,NA,NA,2,NA +68059,7,1,1,29,NA,1,1,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,35782.041084,0,2,96,3,3,0.54,4,4,1,1,0,1,29,1,2,1,2 +68060,7,2,1,18,NA,3,3,1,18,217,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,69211.537407,74163.290023,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +68061,7,2,2,35,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21619.283038,21815.3204,2,102,15,15,3.92,5,5,1,2,0,1,34,2,5,1,5 +68062,7,2,1,28,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,59682.963348,63721.06052,2,102,10,7,3.67,2,1,0,0,0,2,27,1,4,6,NA +68063,7,2,1,51,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,27227.937106,28128.07977,1,101,1,1,0.27,1,1,0,0,0,1,51,1,3,3,NA +68064,7,2,2,80,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,17057.278872,18910.504828,2,98,2,2,0.82,1,1,0,0,1,2,80,1,3,2,NA +68065,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114993.808573,116714.079488,1,98,7,3,0.9,4,1,0,0,0,2,20,1,4,5,NA +68066,7,2,2,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,9943.806181,2,100,14,14,5,2,2,0,0,2,2,63,1,5,1,4 +68067,7,2,2,2,NA,5,6,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8818.200077,9596.189182,2,102,9,9,2.68,4,4,1,1,0,2,38,2,5,1,2 +68068,7,2,2,79,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,74947.363106,78666.944453,2,91,15,15,5,2,2,0,0,2,2,79,1,5,1,5 +68069,7,2,2,66,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,3,5,NA,2,2,2,2,2,2,NA,NA,NA,NA,10136.963678,11753.317783,2,94,2,2,0.41,2,2,0,1,1,2,66,2,3,5,NA +68070,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19692.655418,21458.476044,2,99,13,13,NA,3,3,0,0,1,1,80,1,2,2,NA +68071,7,1,1,27,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,11977.649578,0,2,92,15,10,5,3,1,0,0,0,1,29,1,5,5,NA +68072,7,2,1,14,NA,3,3,1,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,75412.415858,75196.316989,2,98,15,15,5,4,4,0,2,0,2,46,1,4,1,NA +68073,7,2,1,58,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,26124.541799,26375.922323,1,94,4,4,1.34,4,1,0,0,0,1,58,1,4,6,NA +68074,7,2,1,1,16,5,7,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8361.302835,9219.703624,1,101,13,13,NA,3,3,1,0,0,2,19,1,2,NA,NA +68075,7,2,1,59,NA,5,6,2,NA,NA,1,1,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15693.68983,16353.841376,1,94,7,7,1.79,4,4,0,1,0,1,59,2,4,1,4 +68076,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,101896.080785,107317.764998,3,91,6,6,2.3,1,1,0,0,0,1,30,1,4,3,NA +68077,7,2,2,72,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,54256.870337,56112.448006,2,91,12,12,NA,2,2,0,0,2,1,76,1,5,1,2 +68078,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,2,99,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,13392.164122,13834.479479,3,90,15,15,5,3,3,0,0,0,1,46,2,3,1,3 +68079,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,37307.740846,37344.375392,1,91,5,5,1.36,2,2,0,1,0,2,49,1,5,3,NA +68080,7,2,2,39,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,19741.154437,19920.161476,1,100,5,5,0.74,6,6,0,3,0,1,40,2,3,1,4 +68081,7,2,2,1,21,4,4,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,7573.246603,2,100,8,8,2.33,4,4,1,0,0,2,50,1,4,3,NA +68082,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22570.662508,23423.888442,1,95,12,12,NA,5,5,1,1,0,2,46,1,4,1,4 +68083,7,2,1,10,NA,2,2,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12577.115885,12649.318947,2,96,7,7,1.57,4,4,0,2,0,1,40,2,2,1,5 +68084,7,2,1,20,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,1,1,0.14,2,1,0,0,0,1,20,1,4,5,NA +68085,7,2,2,16,NA,1,1,2,16,194,NA,NA,2,2,4,9,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,18368.872199,19023.186366,2,94,4,4,0.63,6,6,1,2,0,2,36,2,3,1,1 +68086,7,2,2,27,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,1,2,2,2,2,2,2,2,1,2,2,2,50915.06085,50693.303376,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +68087,7,2,1,12,NA,4,4,2,12,154,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13742.402649,13769.572504,1,96,15,15,5,2,2,0,1,0,2,39,1,4,5,NA +68088,7,2,2,10,NA,5,7,1,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5139.061504,5511.809249,2,103,15,15,5,3,3,0,1,0,2,37,2,5,1,5 +68089,7,2,1,46,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18335.522037,18907.54446,1,96,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +68090,7,2,1,13,NA,3,3,1,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19381.771783,19434.749274,1,102,4,4,0.97,3,3,0,1,0,2,19,1,2,NA,NA +68091,7,2,2,74,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,2,2,2,NA,17057.278872,19050.04708,2,98,13,13,NA,1,1,0,0,1,2,74,1,1,2,NA +68092,7,2,2,11,NA,5,7,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6137.256046,6434.751859,1,103,15,15,3.7,5,5,0,2,1,1,55,1,5,1,5 +68093,7,2,1,47,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18186.25816,18751.952628,2,101,9,9,3.74,2,2,0,0,0,2,40,2,4,1,2 +68094,7,2,1,3,NA,2,2,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14716.463544,15182.304505,2,96,1,1,0.06,5,5,2,1,0,1,27,2,3,1,4 +68095,7,2,2,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,35126.205635,35295.519265,1,92,4,4,0.5,6,6,0,3,0,2,41,1,4,1,NA +68096,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,28280.669788,29879.976389,1,99,77,77,NA,2,2,0,0,2,2,80,1,4,1,4 +68097,7,2,2,8,NA,4,4,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9399.281543,9696.12347,2,96,3,3,0.54,4,4,2,1,0,2,25,1,4,2,NA +68098,7,2,2,9,NA,3,3,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12892.545573,15136.637829,1,99,6,6,1.12,4,4,0,2,0,1,39,1,3,1,3 +68099,7,2,2,35,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,1,1,2,2,2,2,2,2,2,1,2,2,2,34898.504426,33956.869463,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +68100,7,2,2,65,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,1,2,1,1,2,2,1,2,1,NA,11313.630983,11818.772505,1,93,2,2,0.54,2,2,0,0,2,1,76,2,4,1,1 +68101,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,11740.600601,12693.223305,3,91,4,4,1.16,2,2,0,0,2,1,80,1,5,1,5 +68102,7,2,1,75,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,1,2,2,NA,12962.876803,16930.790311,2,90,3,3,0.46,5,5,0,2,2,1,75,2,1,1,2 +68103,7,2,2,0,3,4,4,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4099.350341,4514.494508,2,99,6,6,1.39,4,4,1,0,1,2,63,1,3,3,NA +68104,7,2,1,18,NA,5,7,1,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14831.338089,14976.576871,1,98,3,3,0.43,4,4,0,1,0,2,39,1,2,5,NA +68105,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16675.763807,16960.86402,2,95,12,12,NA,3,3,0,0,2,1,65,1,4,1,4 +68106,7,2,2,72,NA,3,3,1,NA,NA,2,NA,2,1,9,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,69886.968852,72277.093789,1,102,7,7,2.86,2,2,0,0,2,1,73,1,5,1,3 +68107,7,2,2,8,NA,3,3,1,8,105,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,64166.795496,75335.746424,1,101,5,5,0.89,5,5,1,2,0,1,31,1,2,1,1 +68108,7,2,1,2,NA,4,4,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6314.243514,6704.025386,2,97,5,5,0.76,5,5,1,1,0,2,47,1,4,5,NA +68109,7,2,1,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18790.641284,20754.743742,2,100,8,8,2.7,3,3,1,0,0,2,41,1,4,1,3 +68110,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,10,10,4.49,2,2,0,0,2,1,60,1,5,1,4 +68111,7,2,2,12,NA,1,1,1,12,150,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17490.464019,17826.708822,1,102,15,15,4.47,4,4,0,2,0,2,30,1,4,1,4 +68112,7,2,1,52,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17950.706927,18011.264999,2,94,15,15,4.44,5,5,0,1,1,2,74,1,5,2,NA +68113,7,2,2,0,6,1,1,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7565.515117,7406.345541,1,100,1,1,0.09,4,4,2,0,0,2,28,2,2,1,2 +68114,7,2,2,16,NA,3,3,2,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,71303.309206,77744.474592,2,94,15,15,5,3,3,0,1,1,1,63,1,5,1,3 +68115,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,44066.377955,48262.000685,2,97,5,5,2.11,1,1,0,0,1,2,80,1,4,2,NA +68116,7,2,1,8,NA,1,1,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14042.313177,2,98,3,3,0.54,3,3,0,2,0,2,35,1,3,5,NA +68117,7,2,1,28,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,23022.732862,27069.827485,2,102,14,14,3.25,5,5,1,1,0,2,32,1,4,1,3 +68118,7,2,2,18,NA,4,4,2,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,10154.02528,10568.655787,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +68119,7,2,1,30,NA,4,4,1,NA,NA,2,NA,2,2,3,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,30195.362375,34424.306144,2,102,8,8,4.59,1,1,0,0,0,1,30,2,4,5,NA +68120,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,26388.213487,26374.704746,2,96,6,3,1.01,2,1,0,0,0,1,25,NA,NA,6,NA +68121,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,62513.129282,66168.769092,2,95,15,15,5,2,2,0,0,2,1,70,1,5,1,5 +68122,7,2,1,70,NA,3,3,2,NA,NA,1,9,1,1,NA,NA,4,1,NA,1,1,2,1,2,2,NA,NA,NA,NA,68074.313029,72055.159478,1,101,9,9,4.13,2,2,0,0,2,1,70,1,4,1,3 +68123,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,1,2,1,1,2,1,2,2,NA,15437.181938,16772.913227,2,98,3,3,0.97,1,1,0,0,1,1,80,1,1,5,NA +68124,7,2,1,22,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,14385.653726,15564.966804,2,101,14,6,2.3,2,1,0,0,0,1,22,2,4,5,NA +68125,7,2,1,15,NA,4,4,2,15,190,NA,NA,2,1,2,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13969.457688,14694.403205,1,90,14,14,3.25,4,4,0,2,0,2,33,2,3,1,3 +68126,7,2,1,6,NA,3,3,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22394.780012,23678.914206,1,91,4,4,0.81,4,4,1,1,0,1,32,1,4,6,NA +68127,7,2,2,50,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,11446.604914,11862.967437,2,92,8,8,2.01,4,4,0,0,0,1,53,2,3,1,3 +68128,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25786.235831,27127.570278,1,93,3,3,0.75,2,2,0,0,1,2,80,1,1,2,NA +68129,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,16494.288293,17728.004854,2,97,2,2,0.84,1,1,0,0,1,2,78,1,2,2,NA +68130,7,2,1,7,NA,3,3,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57057.523607,61384.115788,1,98,9,9,2.15,5,5,0,3,0,2,32,1,3,1,4 +68131,7,2,2,39,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,34898.504426,34194.957212,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +68132,7,2,1,5,NA,1,1,2,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14505.510202,14964.673559,2,94,4,4,0.63,6,6,1,2,0,2,36,2,3,1,1 +68133,7,2,1,44,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,33029.272844,33302.556931,2,93,7,7,1.52,4,4,1,1,0,1,44,2,4,1,NA +68134,7,2,1,32,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,4,6,NA,2,2,2,2,2,2,1,2,2,2,41155.167164,40844.556107,1,102,13,13,NA,6,6,1,2,0,2,36,2,4,6,NA +68135,7,2,1,50,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16590.074977,17115.36835,1,92,15,15,5,3,3,1,0,0,1,50,1,4,1,4 +68136,7,2,1,15,NA,2,2,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19570.996814,20425.923806,2,100,4,4,0.81,4,4,0,2,0,2,37,1,2,1,2 +68137,7,2,2,68,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,2,4,NA,1,2,1,1,2,1,1,2,1,NA,9991.888445,10532.363744,3,90,8,4,1.72,3,1,0,0,1,2,68,2,2,4,NA +68138,7,2,2,5,NA,3,3,2,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78165.891242,86270.974005,1,101,14,14,4.21,4,4,1,1,0,2,37,1,5,1,5 +68139,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19210.136544,19335.440888,1,96,15,15,5,2,2,0,0,0,1,48,1,2,1,3 +68140,7,2,1,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19008.083201,18737.138245,2,97,1,1,0,2,2,0,0,1,2,63,1,4,5,NA +68141,7,2,2,4,NA,4,4,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10544.002566,11345.464378,1,91,6,6,0.99,5,5,3,0,0,2,33,2,3,1,4 +68142,7,2,1,36,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15732.465299,16321.860662,2,92,14,6,2.75,2,1,0,0,0,1,48,NA,NA,5,NA +68143,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,4,NA,2,2,2,1,2,2,2,2,1,NA,16623.349489,17874.484754,2,93,6,6,1.41,3,3,0,1,1,2,80,2,4,4,NA +68144,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,15083.375446,14341.447668,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +68145,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,9221.19173,9581.850682,2,95,6,6,1.65,2,2,0,0,2,1,62,1,1,1,3 +68146,7,2,2,6,NA,5,7,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22371.648216,22397.198208,1,92,3,3,0.46,5,5,2,1,0,1,30,1,3,1,2 +68147,7,2,1,75,NA,4,4,1,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,9662.124837,9885.036833,2,92,3,3,1.1,1,1,0,0,1,1,75,2,4,3,NA +68148,7,2,1,9,NA,1,1,1,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14258.502552,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +68149,7,2,1,8,NA,1,1,1,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11399.23838,11468.323492,2,103,77,77,NA,5,5,1,2,0,2,30,1,2,1,2 +68150,7,2,1,13,NA,2,2,1,13,167,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,19820.949231,20163.121943,2,91,8,8,1.85,5,5,0,2,1,1,39,2,3,1,4 +68151,7,2,1,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16088.355002,15889.986896,2,100,3,3,0.92,1,1,0,0,0,1,29,1,2,5,NA +68152,7,2,1,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16737.888813,2,100,14,14,4.86,3,3,0,0,0,2,52,1,5,1,3 +68153,7,2,1,14,NA,5,6,1,14,170,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6015.001712,6229.601178,1,102,5,5,0.92,5,5,1,2,0,2,44,2,1,1,2 +68154,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15599.953109,15843.647059,1,99,15,15,5,2,2,0,0,0,1,56,1,4,1,4 +68155,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,25189.042335,24499.678113,1,100,10,10,2.59,5,5,0,1,0,2,40,1,5,1,NA +68156,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,13934.943848,14557.124186,2,96,12,10,5,2,1,0,0,1,1,53,1,4,3,NA +68157,7,2,2,24,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,14756.436992,15386.562828,2,95,14,8,4.59,2,1,0,0,0,2,24,1,4,6,NA +68158,7,2,1,7,NA,1,1,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8828.580268,9491.612368,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +68159,7,2,1,66,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12579.986433,13271.133625,1,92,6,6,2.15,2,2,0,0,2,2,61,2,4,1,5 +68160,7,2,1,11,NA,3,3,2,11,143,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24713.905595,26080.214484,1,98,6,6,0.97,7,7,1,2,0,1,49,1,2,1,2 +68161,7,2,1,10,NA,4,4,1,10,131,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8894.789377,9317.745565,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +68162,7,2,1,0,9,3,3,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17196.879565,17846.963436,2,94,99,99,NA,6,6,2,0,0,2,26,1,4,1,NA +68163,7,2,2,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20729.303307,20166.249394,1,90,14,14,4.98,3,3,1,0,0,2,33,2,5,1,5 +68164,7,2,2,14,NA,1,1,1,14,169,NA,NA,2,2,3,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,26325.414456,26852.811114,3,92,4,4,0.67,4,4,0,3,0,2,36,2,1,5,NA +68165,7,2,2,0,5,2,2,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6850.346072,7305.598313,1,90,3,3,0.43,4,4,2,0,0,1,31,1,3,6,NA +68166,7,2,1,6,NA,5,6,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6631.058951,7488.793181,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +68167,7,1,1,5,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27873.065855,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +68168,7,2,2,2,NA,5,7,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6247.52442,6810.692829,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +68169,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,55695.737629,59946.103917,1,92,5,5,1.15,3,3,1,0,0,1,23,1,4,1,4 +68170,7,2,1,37,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22856.432972,22931.992355,2,98,14,14,3.36,4,4,0,2,0,1,37,1,4,1,4 +68171,7,2,2,58,NA,1,1,1,NA,NA,2,NA,2,2,8,NA,1,4,NA,2,2,2,2,2,2,NA,NA,NA,NA,28349.668436,29490.478086,1,102,1,1,0.33,2,2,0,0,0,1,37,1,2,4,NA +68172,7,2,2,9,NA,3,3,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,50928.148447,51656.230004,3,91,14,14,3.4,4,4,0,2,0,1,40,1,4,1,4 +68173,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,22824.336433,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +68174,7,2,1,5,NA,3,3,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30883.231636,34843.624635,1,95,6,3,0.45,6,4,1,2,0,1,28,1,2,1,2 +68175,7,2,1,4,NA,2,2,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16169.123686,17324.04909,1,100,10,10,2.91,4,4,1,1,0,1,32,1,5,1,5 +68176,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,17164.211773,17267.434455,2,99,6,6,2.24,1,1,0,0,0,2,58,1,2,5,NA +68177,7,2,1,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,32476.100686,32780.682518,1,100,4,4,1.19,2,2,0,0,1,1,62,1,5,1,5 +68178,7,2,1,18,NA,5,6,2,18,223,2,NA,2,1,3,15,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,9923.450213,10376.279545,2,100,5,5,0.89,4,4,0,1,0,2,40,2,3,1,3 +68179,7,2,1,17,NA,4,4,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,NA,9178.515376,10829.980579,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +68180,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19799.565045,19517.338151,1,90,14,14,2.96,5,5,1,2,0,1,31,1,5,1,4 +68181,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,15498.463997,16338.715638,1,98,5,5,1.39,2,2,0,0,2,2,71,1,3,1,3 +68182,7,2,1,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,138834.18124,153441.395439,1,100,15,15,4.56,4,4,0,2,0,2,42,1,4,1,3 +68183,7,2,2,28,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,23293.719218,24697.897932,1,92,7,7,1.83,3,3,1,1,0,2,28,1,3,5,NA +68184,7,2,1,7,NA,4,4,1,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12267.215138,12414.279886,2,102,5,5,0.76,5,5,1,3,0,2,30,1,4,4,NA +68185,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26847.643051,27369.434392,1,98,4,4,0.67,5,5,1,2,0,1,29,1,4,1,3 +68186,7,2,2,17,NA,1,1,1,17,206,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20370.629189,20955.218165,1,95,15,15,5,3,3,0,1,0,1,50,1,3,1,4 +68187,7,2,1,3,NA,4,4,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7431.820906,7890.591472,1,99,10,10,2.71,5,5,1,1,2,1,75,1,1,1,3 +68188,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,64463.340883,66173.435468,1,91,14,14,5,2,2,0,0,2,2,70,1,2,1,NA +68189,7,2,2,10,NA,4,4,2,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9326.540969,10100.402919,1,91,8,8,1.76,5,5,0,3,0,2,42,1,3,6,NA +68190,7,2,2,1,12,1,1,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11438.839305,12628.78556,1,102,14,14,4.32,3,3,1,0,0,1,25,1,4,1,4 +68191,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,29167.119125,34820.124106,1,98,3,3,0.5,5,5,0,3,0,2,56,1,3,3,NA +68192,7,2,2,5,NA,1,1,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14852.990935,14903.708855,2,94,6,6,0.8,7,7,1,3,0,2,36,2,3,1,1 +68193,7,2,1,17,NA,3,3,2,17,208,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,71458.892941,70519.759062,2,94,10,10,3.51,3,3,0,2,0,2,39,2,4,3,NA +68194,7,2,1,15,NA,4,4,2,15,180,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10745.098568,10766.342508,1,96,12,12,NA,5,5,1,2,0,2,35,1,5,1,4 +68195,7,2,1,74,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,17306.956173,18319.031536,1,100,4,4,1.16,2,2,0,0,2,1,74,1,3,1,5 +68196,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,125040.051934,125530.45672,1,97,15,15,5,4,4,0,0,1,1,67,NA,NA,2,NA +68197,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,196252.38045,199712.076327,1,98,14,14,5,2,2,0,0,0,1,59,1,3,1,4 +68198,7,2,1,32,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,17371.064048,17243.514155,1,96,12,12,NA,5,5,2,0,1,2,63,2,5,3,NA +68199,7,2,2,30,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,29148.354549,29365.982413,2,92,14,14,4.03,4,4,1,1,1,2,30,1,5,4,NA +68200,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,31155.769617,31636.819209,1,92,14,9,3.97,3,2,0,0,2,1,51,1,4,5,NA +68201,7,2,2,12,NA,1,1,1,12,153,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,19719.98657,20781.904006,2,102,6,6,1.03,5,5,1,1,0,1,37,1,2,1,2 +68202,7,2,1,9,NA,3,3,2,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,75923.373594,80651.425295,1,94,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +68203,7,2,2,78,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,72551.269339,73326.076054,1,95,4,4,1.12,2,2,0,0,2,2,78,1,4,1,2 +68204,7,2,2,18,NA,3,3,2,18,226,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24820.424867,25966.716212,1,91,3,3,0.62,3,3,0,1,0,2,55,1,4,4,NA +68205,7,2,1,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15601.50288,15850.523572,2,99,2,2,0.2,7,7,1,2,1,1,63,1,1,2,NA +68206,7,2,2,35,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,17978.142628,18308.053591,1,91,10,10,3.22,4,4,1,1,0,1,38,2,5,1,5 +68207,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,22013.270774,22643.742168,1,101,3,3,0.66,2,2,0,0,1,2,65,1,2,3,NA +68208,7,2,1,16,NA,5,7,2,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,5388.361335,5758.757236,3,91,15,15,4.47,4,4,0,3,0,2,44,2,5,1,NA +68209,7,2,1,15,NA,2,2,1,15,189,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20798.348063,20598.526957,2,93,12,12,NA,3,1,1,1,0,2,43,1,5,3,NA +68210,7,2,1,27,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,9177.295801,9548.31812,2,92,15,8,4.59,3,1,0,0,0,2,25,1,5,5,NA +68211,7,2,1,2,NA,3,3,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37959.146468,40828.920669,1,91,6,6,1.62,3,3,1,0,0,1,30,1,4,1,4 +68212,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,1,1,2,NA,16321.652472,17542.456462,2,97,4,4,1.02,2,2,0,0,2,2,80,1,1,2,NA +68213,7,2,2,41,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,4,2,2,2,2,1,2,2,NA,NA,NA,NA,40880.818805,41857.641766,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +68214,7,2,2,3,NA,5,6,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6858.963321,7464.098007,3,91,15,15,5,3,3,1,0,0,1,40,2,5,1,5 +68215,7,2,2,14,NA,4,4,1,14,178,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13895.342981,13964.270792,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +68216,7,1,1,60,NA,5,6,NA,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11992.891463,0,1,100,15,15,5,2,2,0,0,1,1,60,2,5,1,NA +68217,7,2,2,19,NA,4,4,2,19,234,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13841.239638,13875.328502,1,96,15,15,4.9,4,4,0,1,0,1,47,1,3,1,5 +68218,7,2,1,1,14,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13968.423539,13738.28453,2,102,6,6,1.62,3,3,1,0,0,1,20,2,4,1,4 +68219,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,25270.027986,25977.972711,1,100,9,6,2.24,3,1,0,0,0,1,25,NA,NA,5,NA +68220,7,2,1,14,NA,4,4,2,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11834.781205,13035.394237,2,90,2,2,0.31,5,5,0,2,1,2,71,1,2,2,NA +68221,7,2,1,3,NA,4,4,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8385.172131,8641.288503,2,93,6,2,0.46,3,2,1,1,0,2,31,2,3,3,NA +68222,7,2,1,36,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,38746.026117,2,98,14,14,2.87,5,5,0,3,0,2,34,1,2,1,2 +68223,7,2,2,9,NA,3,3,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25527.806244,26565.240294,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +68224,7,2,2,11,NA,2,2,2,11,134,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15166.167659,15710.813593,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +68225,7,2,1,2,NA,5,6,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6389.003009,6946.807658,3,91,6,6,1.15,5,5,1,0,0,1,55,2,5,1,5 +68226,7,2,2,38,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,20039.469886,21581.359058,1,97,15,15,5,4,4,1,1,0,1,44,2,5,1,5 +68227,7,2,2,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,25638.18991,26248.270338,2,101,2,2,0.38,3,3,0,2,0,2,56,1,3,2,NA +68228,7,2,1,11,NA,4,4,2,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6377.235034,7094.374704,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +68229,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,97803.500399,102601.600974,1,101,14,14,5,3,3,0,1,0,2,36,1,5,1,5 +68230,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,59001.303336,68847.35366,2,101,2,2,0.46,1,1,0,0,0,2,22,1,4,5,NA +68231,7,2,1,13,NA,5,6,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10592.643259,11320.781443,2,91,77,77,NA,3,3,0,1,0,2,43,2,5,1,5 +68232,7,2,2,9,NA,1,1,1,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13064.573334,13403.6626,2,103,2,2,0.22,7,7,0,3,0,2,39,2,1,5,NA +68233,7,2,2,5,NA,3,3,2,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51483.624552,53105.566664,1,91,15,15,5,4,4,1,1,0,1,38,1,5,1,5 +68234,7,2,1,68,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,4,5,NA,1,2,2,1,2,2,2,2,2,2,12845.115724,13050.878075,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +68235,7,2,1,79,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19473.412374,20529.16646,1,95,4,4,1.22,2,2,0,0,1,1,79,1,1,1,3 +68236,7,2,2,41,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,26595.398371,26621.513872,1,94,4,4,1.26,2,2,0,0,1,2,41,1,4,5,NA +68237,7,2,1,63,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,120735.071461,122283.708051,1,94,8,8,2.41,3,3,0,0,3,1,63,1,4,1,5 +68238,7,2,2,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10771.85499,11250.180007,2,97,5,5,1.08,3,3,1,1,0,2,27,1,3,5,NA +68239,7,2,2,7,NA,1,1,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20753.369981,21285.255435,1,97,10,10,2.32,6,6,0,4,0,1,42,1,4,1,4 +68240,7,2,1,19,NA,1,1,2,19,239,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,25099.482648,25097.275151,1,97,4,4,0.65,4,4,0,1,0,2,45,2,2,3,NA +68241,7,2,1,9,NA,1,1,1,9,114,NA,NA,2,2,3,3,NA,NA,NA,2,1,1,1,2,2,1,2,2,1,19774.151841,21259.203461,3,92,7,7,1.41,5,5,1,2,0,1,20,2,1,1,1 +68242,7,2,1,7,NA,1,1,2,7,85,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9390.522479,9862.720437,2,90,3,3,0.58,4,4,0,2,0,2,36,2,3,1,3 +68243,7,2,1,13,NA,1,1,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22621.505951,23112.921348,1,92,14,14,5,2,2,0,1,0,2,41,1,5,3,NA +68244,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,29108.403608,1,94,2,2,0.42,3,3,0,0,0,2,52,1,4,1,1 +68245,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,18246.235208,18400.236064,2,99,1,1,0.07,4,4,1,1,0,2,24,1,2,5,NA +68246,7,2,1,9,NA,5,6,2,9,116,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5377.477719,5731.340117,2,100,4,4,0.5,6,6,2,1,0,1,30,2,4,1,3 +68247,7,2,2,80,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,12833.793728,13278.897744,2,92,77,77,NA,2,2,0,0,2,2,80,1,3,1,4 +68248,7,2,1,15,NA,4,4,1,15,190,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12147.046136,12703.852077,2,100,8,8,1.8,5,5,0,3,0,2,43,1,3,1,3 +68249,7,2,1,60,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,117075.881463,118577.582598,1,94,9,9,3.97,2,2,0,0,1,1,60,1,4,1,4 +68250,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,207644.101324,214736.820497,1,97,15,15,5,2,2,0,0,0,1,50,1,3,6,NA +68251,7,2,2,34,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,39561.667842,39233.767064,2,98,14,14,2.87,5,5,0,3,0,2,34,1,2,1,2 +68252,7,2,2,45,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,15206.604563,15895.992431,2,90,14,14,4.25,4,4,0,2,1,2,45,2,5,5,NA +68253,7,2,2,8,NA,3,3,2,8,102,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,63165.080986,62975.31549,1,98,15,15,5,3,3,0,1,0,2,43,1,5,1,5 +68254,7,2,2,55,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15499.383981,15426.291906,2,99,5,5,1.26,3,3,1,0,0,2,50,2,3,5,NA +68255,7,2,1,60,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,6800.602543,7011.068263,1,99,6,6,1.62,3,3,0,0,1,1,60,2,5,1,3 +68256,7,2,2,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22790.461787,22849.332243,2,98,10,10,3.78,3,3,0,0,0,2,46,1,4,1,4 +68257,7,2,1,12,NA,5,6,1,12,155,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10346.302718,11892.421636,2,91,6,6,1.26,5,5,0,2,0,2,47,2,1,1,1 +68258,7,2,1,3,NA,2,2,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12403.412256,13289.361067,2,90,10,10,3.13,4,4,1,2,0,2,39,1,5,4,NA +68259,7,2,2,4,NA,5,7,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,95,10,6,1.34,5,4,1,2,0,1,32,1,3,6,NA +68260,7,2,1,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11218.730451,2,95,3,3,1.29,1,1,0,0,1,1,61,1,2,3,NA +68261,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,14971.827573,15192.169136,2,97,15,15,5,3,3,0,0,3,2,80,1,3,2,NA +68262,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,10576.529742,11391.789088,2,99,2,2,0.72,1,1,0,0,1,2,64,1,3,5,NA +68263,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,10,10,3.78,3,3,0,0,2,1,62,1,5,1,5 +68264,7,2,1,9,NA,1,1,2,9,111,NA,NA,2,2,3,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11917.887108,12700.965428,2,94,7,7,1.34,5,5,2,1,0,1,32,2,1,1,NA +68265,7,2,1,11,NA,1,1,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11881.117946,11953.12349,1,102,6,6,1.18,5,5,0,2,1,2,42,2,2,2,NA +68266,7,2,2,11,NA,4,4,2,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8757.841043,9104.895674,2,97,7,7,2.16,3,3,0,1,0,2,31,1,3,6,NA +68267,7,2,1,3,NA,5,6,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6389.003009,6899.95174,3,91,6,6,1.22,5,5,1,2,0,2,37,1,4,1,2 +68268,7,1,2,6,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10332.067017,0,1,100,3,3,0.73,3,3,1,1,0,2,32,1,3,5,NA +68269,7,2,2,2,NA,1,1,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13065.99844,14425.21291,1,95,8,8,2.24,4,4,2,0,0,2,29,1,3,1,4 +68270,7,2,2,48,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,6,NA,2,2,2,2,2,2,2,2,2,2,31235.666551,31802.121006,2,94,9,9,4.21,3,2,0,0,0,2,48,2,2,6,NA +68271,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,127198.447143,126871.700524,1,101,8,8,4.25,1,1,0,0,0,1,43,1,4,5,NA +68272,7,2,1,1,18,5,7,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26337.322319,30860.353051,1,94,6,6,1.33,4,4,2,0,0,2,29,1,2,1,4 +68273,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,59510.728426,64021.429591,1,99,5,5,0.89,4,4,2,0,0,2,31,1,4,1,5 +68274,7,2,1,12,NA,5,6,1,12,147,NA,NA,2,2,3,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8530.740143,8910.137481,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +68275,7,2,1,71,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,7608.031426,7606.53553,1,99,14,14,5,2,2,0,0,2,1,71,1,4,1,3 +68276,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,31909.283101,36294.223393,2,91,6,6,1.26,5,5,0,1,2,2,80,1,4,2,NA +68277,7,2,1,61,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,4,1,NA,2,2,2,1,2,2,1,2,2,2,11568.876339,11794.347884,1,102,6,6,1.48,3,3,0,0,1,2,57,2,1,1,4 +68278,7,2,2,0,0,1,1,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7896.364456,7653.697165,2,102,15,15,2.43,7,7,3,2,0,1,28,2,5,1,4 +68279,7,2,1,20,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14424.961621,15273.975784,2,102,8,8,2.01,4,4,0,0,0,1,59,2,4,1,4 +68280,7,2,2,15,NA,3,3,2,15,184,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,91539.042546,96988.607103,1,101,9,9,2.6,4,4,0,2,0,2,38,1,4,1,4 +68281,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17115.540769,2,97,12,6,2.75,3,1,0,0,0,1,21,NA,NA,77,NA +68282,7,2,2,54,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,13728.308948,13865.439464,2,90,6,6,1.12,4,4,0,1,1,1,63,2,1,1,1 +68283,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,2,1,2,2,1,2,2,3,13155.047649,13224.610785,3,90,15,15,3.7,5,5,0,0,0,1,56,2,3,1,3 +68284,7,2,1,8,NA,1,1,1,8,106,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14007.413517,2,98,15,15,4.97,5,5,0,3,0,1,39,1,5,1,5 +68285,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,110369.721342,114327.60352,1,94,9,9,3.97,2,2,0,0,0,1,49,1,3,1,3 +68286,7,2,2,16,NA,3,3,2,17,205,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,111142.989658,114400.666347,1,95,NA,NA,NA,5,5,0,2,0,2,37,1,3,1,NA +68287,7,2,1,12,NA,1,1,1,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22768.423624,22944.003607,1,92,5,5,1.24,3,3,0,1,0,2,29,2,3,6,NA +68288,7,2,1,28,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,34708.958385,37032.750996,2,97,13,13,NA,3,3,0,1,0,1,28,2,2,1,1 +68289,7,2,1,9,NA,4,4,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10199.928366,10774.065998,1,100,5,5,0.85,5,5,0,2,0,2,54,1,2,2,NA +68290,7,2,2,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,81416.374938,89993.518978,1,97,9,9,3.97,2,2,0,0,2,1,79,1,3,1,3 +68291,7,2,1,69,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,2,2,2,2,2,2,2,2,1,2,6687.985443,7006.085081,2,93,4,4,0.99,2,2,0,0,2,1,69,2,3,1,1 +68292,7,2,1,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12005.116852,11690.420322,3,92,14,14,2.29,7,7,2,0,0,2,50,2,1,1,9 +68293,7,2,1,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,191792.099076,199776.618579,1,98,6,6,1.98,2,2,0,0,0,1,54,1,4,1,3 +68294,7,2,2,11,NA,3,3,2,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55469.656717,57246.428971,1,101,14,14,3.3,4,4,0,2,0,2,42,1,4,1,3 +68295,7,1,2,20,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,6,3,1,2,2,1,2,2,NA,NA,NA,NA,60324.348827,0,1,101,13,13,NA,3,3,1,0,0,2,20,1,2,6,NA +68296,7,2,2,69,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,46357.185832,48577.343045,2,98,3,3,0.68,2,2,0,0,2,1,80,1,1,1,3 +68297,7,2,1,5,NA,5,6,1,5,63,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10273.602479,11522.969217,1,92,14,14,3.3,4,4,2,0,0,1,28,1,4,1,4 +68298,7,2,1,1,23,2,2,2,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12567.081957,12360.030976,1,97,15,15,5,4,4,1,1,0,1,42,1,5,1,5 +68299,7,2,2,12,NA,4,4,2,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19113.842115,19208.656277,1,97,1,1,0.09,4,4,0,1,0,2,44,2,2,1,3 +68300,7,2,1,16,NA,4,4,2,16,193,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11023.237662,11433.168046,1,99,14,14,4.05,3,3,0,1,0,2,52,1,4,4,NA +68301,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,169896.236244,2,91,15,2,0.63,7,1,0,0,1,1,49,NA,NA,5,NA +68302,7,2,1,17,NA,4,4,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11023.237662,11433.168046,1,99,15,15,5,4,4,0,2,0,2,46,1,5,1,5 +68303,7,2,2,16,NA,1,1,2,16,198,NA,NA,2,2,1,10,NA,NA,NA,1,2,2,1,2,2,2,2,2,2,16896.101801,17220.920308,1,93,15,1,0,3,1,0,1,0,2,46,2,5,5,NA +68304,7,2,1,19,NA,1,1,1,19,232,2,NA,2,2,3,11,NA,NA,NA,2,2,2,2,2,2,1,2,2,2,25268.119938,26371.916437,1,100,99,99,NA,6,6,0,1,0,2,22,2,3,1,3 +68305,7,2,2,17,NA,5,6,1,17,205,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,10081.858636,10347.605805,2,102,15,15,3.82,5,5,0,1,2,1,60,2,2,1,1 +68306,7,2,1,17,NA,3,3,2,17,212,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,88448.252445,87285.839384,1,95,8,1,0.09,4,1,0,1,0,2,57,1,5,5,NA +68307,7,2,1,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6347.215153,6424.634366,2,95,7,7,1.83,3,3,1,0,0,1,33,1,3,6,NA +68308,7,2,1,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8361.170561,8618.715512,1,94,4,4,0.56,5,5,1,2,0,1,34,1,2,3,NA +68309,7,2,1,57,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16499.662173,16747.308945,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +68310,7,2,2,47,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20303.639991,21936.687597,1,97,10,10,3.67,3,3,0,1,0,1,47,1,5,1,5 +68311,7,2,2,33,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,3,1,1,1,2,2,1,2,2,1,2,2,1,18018.210636,18055.00232,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +68312,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,62471.259637,62663.338056,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +68313,7,2,1,5,NA,3,3,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,67064.292398,74209.90502,2,91,15,15,5,5,5,2,1,0,2,40,1,5,1,5 +68314,7,2,1,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16995.30979,18681.886374,2,103,6,6,1.3,4,4,1,1,0,2,26,1,4,1,3 +68315,7,2,2,10,NA,1,1,1,10,121,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15510.382876,18634.445505,1,100,6,6,1.11,5,5,0,2,1,1,38,2,2,1,1 +68316,7,2,2,70,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,13204.205822,14198.003586,1,98,9,9,2.49,4,4,0,1,2,2,70,1,4,2,NA +68317,7,2,2,19,NA,3,3,1,19,237,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,36241.268921,38398.808798,2,101,2,1,0.28,2,1,0,0,0,2,21,1,4,5,NA +68318,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,18693.365067,19341.691824,1,92,12,12,NA,7,7,1,2,1,2,45,2,3,1,3 +68319,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,90708.718111,91145.947869,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +68320,7,2,1,0,1,5,7,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6420.539566,6377.399312,2,99,15,15,5,3,3,1,0,0,1,35,2,5,1,5 +68321,7,2,1,80,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,28658.58153,30983.915333,2,94,8,8,3.4,2,2,0,0,2,1,80,1,3,1,5 +68322,7,2,1,32,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,30626.581617,32055.135325,2,90,6,6,1.62,3,3,1,0,0,2,28,1,5,1,4 +68323,7,2,2,16,NA,5,7,1,16,202,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,23414.779924,23738.339087,1,102,5,5,1.27,3,3,0,2,0,2,38,1,2,3,NA +68324,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,90179.087212,91826.282843,2,95,14,14,5,2,2,0,0,0,1,39,1,4,1,5 +68325,7,2,1,2,NA,4,4,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5662.231921,6243.536586,1,99,2,2,0.31,4,4,1,0,1,2,67,1,3,3,NA +68326,7,2,1,12,NA,4,4,2,12,152,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,NA,NA,NA,1,2,2,1,10366.393886,10567.129261,1,90,9,9,1.65,7,7,0,4,0,1,36,1,4,1,4 +68327,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,26019.443397,28034.871168,2,100,6,6,2.01,2,2,0,0,2,1,80,1,5,1,5 +68328,7,2,1,5,NA,3,3,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,56162.95725,63365.162813,2,95,15,15,4.63,5,5,1,2,0,2,36,1,5,1,3 +68329,7,2,2,15,NA,1,1,1,15,188,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18515.058419,19512.090709,2,96,7,7,1.79,4,4,0,2,0,1,43,2,3,1,2 +68330,7,2,2,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,133492.667054,133041.068157,1,95,6,6,1.94,2,2,0,0,2,2,69,1,2,1,4 +68331,7,2,1,66,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14488.953694,14771.336069,3,92,14,14,5,2,2,0,0,2,1,66,1,4,1,4 +68332,7,2,2,17,NA,3,3,2,17,205,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,123622.182994,127245.633335,2,94,7,7,2.72,2,2,0,1,0,2,43,1,3,3,NA +68333,7,2,1,2,NA,3,3,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,43818.485,49773.383799,2,91,10,10,2.5,5,5,1,0,0,1,57,1,9,1,3 +68334,7,2,2,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,26682.998353,27885.908424,2,99,3,3,0.56,4,4,1,0,0,2,38,1,3,5,NA +68335,7,1,2,14,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7969.467397,0,2,103,15,15,4.34,4,4,0,2,0,1,48,2,5,1,5 +68336,7,2,2,1,22,1,1,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8832.868731,8863.029978,1,102,6,6,0.8,7,7,3,3,0,2,34,2,3,1,1 +68337,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,4,1,NA,2,2,2,2,2,2,1,2,2,2,41241.224595,42341.927552,2,102,10,10,3.04,4,4,2,0,0,2,31,2,2,1,NA +68338,7,2,1,51,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,2,2,2,2,2,2,2,2,1,2,25108.558777,27044.812277,2,93,4,4,0.82,4,4,0,0,0,1,51,2,3,1,3 +68339,7,2,1,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,18790.641284,20754.743742,2,100,4,4,0.85,4,4,0,2,0,2,39,1,3,6,NA +68340,7,2,1,10,NA,3,3,2,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21087.869274,22876.159598,1,101,4,4,0.78,4,4,1,2,0,2,32,1,3,3,NA +68341,7,2,2,64,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,2,2,2,1,10235.0654,10993.258671,2,93,10,10,3.04,4,4,0,0,2,1,72,2,3,1,2 +68342,7,2,1,59,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,1,6,NA,1,2,1,1,2,1,NA,NA,NA,NA,16499.662173,16440.055989,3,91,6,4,1.38,3,1,0,0,0,1,59,2,1,6,NA +68343,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,17206.320427,17285.613667,1,96,2,2,0.4,3,3,0,0,0,2,56,1,3,3,NA +68344,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,152858.509804,152465.847768,1,95,14,7,3.67,2,1,0,0,0,1,47,1,4,3,NA +68345,7,2,2,18,NA,4,4,1,18,223,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,2,1,0.09,4,1,0,0,0,2,19,1,4,NA,NA +68346,7,2,1,0,4,4,4,2,NA,4,NA,NA,2,2,99,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6327.979262,6425.104835,1,90,13,13,NA,3,3,2,0,0,2,21,2,4,5,NA +68347,7,2,2,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20899.681083,21326.972731,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +68348,7,2,1,32,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,51543.062078,54569.929737,3,92,14,14,3.25,4,4,2,0,0,2,33,1,5,1,5 +68349,7,1,2,12,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24869.937631,0,2,93,6,6,1.48,4,4,0,1,0,1,53,2,2,1,3 +68350,7,2,2,12,NA,3,3,1,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,93740.540203,99321.165816,1,100,15,15,4.56,4,4,0,2,0,2,42,1,4,1,3 +68351,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,90303.174138,92885.29608,2,92,15,15,5,4,1,0,0,0,1,27,NA,NA,5,NA +68352,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,30548.472436,32702.747345,1,95,1,1,0.21,4,4,1,0,1,2,75,1,1,2,NA +68353,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,94698.084211,100770.654731,1,101,14,14,4.21,4,4,1,1,0,2,37,1,5,1,5 +68354,7,2,1,45,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,1,1,2,2,1,2,1,NA,14879.667962,14825.914121,3,91,4,4,0.69,5,5,0,2,0,1,45,2,4,1,1 +68355,7,2,2,19,NA,4,4,2,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,1,1,0.05,1,1,0,0,0,2,19,1,4,NA,NA +68356,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,15616.794261,15846.627851,2,97,7,7,3.49,1,1,0,0,1,2,73,1,4,3,NA +68357,7,2,1,1,12,3,3,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26337.322319,28328.46741,1,94,3,3,0.93,2,2,1,0,0,2,25,1,5,3,NA +68358,7,2,2,0,5,1,1,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6787.112205,6644.319314,2,94,3,3,0.54,3,3,1,0,0,2,21,1,4,1,3 +68359,7,1,2,11,NA,2,2,NA,NA,NA,NA,NA,2,1,4,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15821.530831,0,2,91,6,6,0.93,5,5,1,2,0,2,50,2,1,5,NA +68360,7,2,1,13,NA,5,6,1,13,166,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12013.02156,13498.577364,3,92,12,12,NA,5,5,0,2,0,1,47,1,3,1,3 +68361,7,2,1,8,NA,1,1,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,13898.598114,14118.535925,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +68362,7,2,1,2,NA,4,4,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8009.966208,8254.622305,2,96,13,13,NA,4,4,1,1,0,2,40,1,3,77,NA +68363,7,2,1,1,21,5,7,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6929.441295,7483.610581,2,102,15,15,5,5,5,1,0,2,1,30,1,4,1,5 +68364,7,2,1,63,NA,4,4,2,NA,NA,2,NA,2,2,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,7514.993062,7713.03043,2,90,6,6,1.12,4,4,0,1,1,1,63,2,1,1,1 +68365,7,2,1,64,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,22184.040999,22468.589781,2,94,6,6,2.66,1,1,0,0,1,1,64,1,4,3,NA +68366,7,2,1,3,NA,4,4,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11920.911192,13144.753907,2,96,3,3,0.59,3,3,1,0,0,2,25,1,4,1,NA +68367,7,2,1,78,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,10160.645851,10681.304475,1,96,8,8,3.14,2,2,0,0,2,2,64,1,3,1,2 +68368,7,2,1,17,NA,5,6,2,17,207,2,NA,2,1,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9136.388281,9764.423514,3,91,9,9,4.08,2,2,0,1,0,2,54,2,5,1,NA +68369,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,39565.288792,43332.356399,1,99,77,77,NA,2,2,0,0,2,2,80,1,4,1,4 +68370,7,2,2,10,NA,3,3,2,10,129,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24070.467912,23750.822126,1,95,7,7,1.17,6,6,1,3,0,2,44,1,4,1,NA +68371,7,2,1,10,NA,3,3,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18216.94614,18737.854061,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +68372,7,2,2,2,NA,5,6,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4962.240532,5199.576603,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +68373,7,2,2,8,NA,4,4,2,8,97,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11467.793741,13004.375485,2,91,6,6,0.78,7,7,1,4,0,2,38,2,2,77,NA +68374,7,2,1,45,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20696.713928,21333.342141,2,102,15,15,5,3,3,1,0,0,2,34,1,5,1,5 +68375,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,29167.119125,29596.13582,1,101,1,1,0.1,4,4,1,1,0,2,52,1,4,3,NA +68376,7,2,2,61,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,13057.178942,13648.591881,1,102,77,77,NA,2,2,0,0,2,1,68,2,4,1,1 +68377,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,NA,8386.962371,8877.414759,1,93,3,3,0.93,1,1,0,0,1,1,74,1,4,4,NA +68378,7,2,1,0,3,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9419.940635,10084.452218,2,98,3,3,0.54,3,3,1,0,0,1,23,1,3,1,2 +68379,7,2,1,1,16,4,4,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6580.937346,6661.20735,2,97,4,4,0.97,3,3,1,0,0,1,38,1,3,6,NA +68380,7,2,2,43,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,17623.300255,17855.084956,1,100,15,15,5,4,4,0,1,0,1,44,2,5,1,5 +68381,7,2,1,9,NA,3,3,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21087.869274,22876.159598,1,101,4,4,0.99,2,2,0,1,0,2,35,1,3,5,NA +68382,7,2,1,0,11,3,3,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9081.731172,9425.042696,1,95,8,8,1.45,6,6,1,1,2,1,69,1,1,1,3 +68383,7,2,2,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21905.560663,22505.214105,1,95,5,5,0.76,5,5,2,1,0,2,27,1,4,6,NA +68384,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,61710.107686,62261.838119,1,98,2,2,0.63,1,1,0,0,0,2,23,1,4,5,NA +68385,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,22912.222762,29561.458771,2,96,5,5,1.5,2,2,1,0,0,2,22,1,3,5,NA +68386,7,1,1,30,NA,1,1,NA,NA,NA,2,NA,2,2,77,NA,3,5,NA,2,2,2,2,2,2,NA,NA,NA,NA,53303.690379,0,1,100,4,4,0.78,4,4,0,0,1,1,33,2,1,1,1 +68387,7,2,2,70,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,1,1,2,1,1,2,2,NA,12296.397953,12433.512478,1,99,9,9,4.08,2,2,0,0,2,1,73,2,5,1,5 +68388,7,2,2,2,NA,3,3,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47602.397711,49102.065502,1,102,6,6,1.23,4,4,2,0,0,2,25,1,5,1,5 +68389,7,2,2,15,NA,4,4,1,15,191,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15483.914568,16116.18632,1,100,6,6,2.12,2,2,0,1,0,2,44,1,3,3,NA +68390,7,1,2,25,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,2,1,3,1,2,2,1,2,2,NA,NA,NA,NA,39550.779175,0,2,96,3,3,0.54,4,4,1,1,0,1,29,1,2,1,2 +68391,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,1,2,1,2,2,NA,NA,NA,NA,60163.952904,0,1,97,12,99,NA,2,1,0,0,2,2,65,1,2,2,NA +68392,7,1,2,61,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,14994.337564,0,1,100,10,10,4.63,2,2,0,0,1,1,58,1,5,1,4 +68393,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,2,1,0.11,4,1,0,0,0,2,19,1,4,NA,NA +68394,7,2,2,58,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,139343.551779,138175.157138,2,98,14,14,5,1,1,0,0,0,2,58,1,5,5,NA +68395,7,2,2,0,10,1,1,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9179.885292,9149.640857,1,101,5,5,1.23,3,3,2,0,0,2,24,1,2,5,NA +68396,7,2,2,0,6,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6700.950086,6495.019697,2,96,3,3,0.34,7,7,3,1,0,2,49,2,1,4,NA +68397,7,1,2,55,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,141316.739364,0,2,94,8,8,1.33,7,7,1,2,1,1,34,NA,NA,6,NA +68398,7,2,2,6,NA,4,4,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11116.391625,11531.852198,1,92,7,7,1.83,3,3,1,1,0,2,28,1,3,5,NA +68399,7,2,2,5,NA,5,6,1,5,64,NA,NA,2,2,1,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,6858.963321,7464.098007,3,91,14,14,3.58,4,4,1,1,0,1,39,2,5,1,5 +68400,7,2,1,8,NA,4,4,2,9,108,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7687.032802,8052.55895,2,99,9,9,2.43,4,4,0,2,0,2,49,1,3,3,NA +68401,7,2,1,43,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,5,NA,2,2,2,2,2,2,1,2,2,2,31347.36219,35248.66815,2,90,2,2,0.46,1,1,0,0,0,1,43,2,1,5,NA +68402,7,2,2,1,19,5,7,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3842.794137,4026.588867,1,93,15,15,5,5,5,1,0,1,1,61,2,4,1,4 +68403,7,2,2,36,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,2,2,2,2,2,2,2,NA,NA,NA,NA,35425.867861,35132.246023,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +68404,7,2,2,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,11879.290971,12409.688606,2,96,3,3,1.1,1,1,0,0,1,2,65,1,4,5,NA +68405,7,2,1,1,20,3,3,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22170.765881,25013.89276,1,94,3,3,0.39,6,6,1,0,2,1,80,1,4,1,3 +68406,7,2,2,17,NA,5,6,2,17,215,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12054.065975,12306.62888,1,98,6,6,1.65,2,2,0,1,0,2,52,2,5,1,NA +68407,7,2,2,80,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,2,1,2,2,1,2,NA,NA,NA,NA,16878.750567,18850.661665,2,98,3,3,0.98,2,2,0,0,1,2,80,1,1,2,NA +68408,7,2,2,16,NA,3,3,1,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,91539.042546,96988.607103,1,101,7,7,2.31,2,2,0,1,0,2,43,1,4,3,NA +68409,7,2,1,3,NA,1,1,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,20874.345556,20902.551716,3,92,5,5,1.05,3,3,1,1,0,2,38,2,3,5,NA +68410,7,2,1,16,NA,4,4,2,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13863.378072,13964.345562,1,96,15,15,5,4,4,0,1,0,1,56,1,4,1,5 +68411,7,2,2,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,89807.047643,92234.66957,3,91,9,7,3.67,2,1,0,0,0,1,41,NA,NA,3,NA +68412,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,22013.270774,24073.71767,1,101,5,5,1.05,3,3,0,0,1,2,55,1,4,1,NA +68413,7,2,2,3,NA,1,1,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15326.318384,16920.666785,1,94,6,6,1.3,4,4,2,0,0,1,24,2,1,1,4 +68414,7,1,1,77,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19418.523783,0,1,101,4,4,0.99,2,2,0,0,2,1,77,1,3,1,3 +68415,7,2,2,43,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,2,1,2,2,1,2,2,1,2,2,1,49900.868115,50161.096898,3,92,7,7,2.78,2,2,0,0,0,1,24,1,3,5,NA +68416,7,2,1,63,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,3,8623.181934,10090.425838,2,103,3,3,0.63,3,3,0,0,1,1,63,2,3,1,NA +68417,7,2,1,19,NA,1,1,2,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,14081.782012,14391.713696,2,90,6,6,1.15,5,5,0,2,0,2,47,2,1,1,5 +68418,7,2,2,70,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,2,2,2,2,2,2,NA,20621.25319,22173.285594,2,93,9,9,3.14,3,3,0,0,2,1,43,NA,NA,5,NA +68419,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,81416.374938,85457.008484,1,97,5,5,1.79,1,1,0,0,1,2,70,1,4,2,NA +68420,7,2,1,22,NA,4,4,1,NA,NA,2,NA,2,1,4,NA,4,5,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,18831.340773,18391.458344,2,93,9,9,2.07,5,5,0,1,0,1,55,NA,NA,5,NA +68421,7,1,2,15,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12327.773112,0,2,95,12,12,NA,2,2,0,1,0,1,47,1,4,2,NA +68422,7,2,2,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,53370.063988,54427.336747,3,92,13,13,NA,2,2,0,0,2,2,60,1,4,1,NA +68423,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,154825.466557,157902.106304,1,91,15,15,5,2,2,0,0,0,1,44,NA,NA,1,5 +68424,7,2,1,72,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,1,1,1,2,2,1,2,1,NA,16828.011748,23148.456034,1,97,14,14,2.29,7,7,1,2,2,1,40,2,1,1,1 +68425,7,2,1,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16385.890285,2,100,12,12,NA,2,2,0,0,1,1,56,1,5,1,4 +68426,7,2,2,19,NA,3,3,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,35205.804094,37301.699975,2,101,99,2,0.55,3,1,0,0,0,2,19,1,4,NA,NA +68427,7,2,2,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,30275.274308,30259.77569,2,101,3,1,0.18,2,1,0,0,0,2,25,1,4,5,NA +68428,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,2,1,2,2,1,2,2,1,2,2,1,24842.055317,24866.449113,2,95,3,3,0.63,3,3,0,0,0,2,44,1,2,4,NA +68429,7,2,1,27,NA,3,3,2,NA,NA,2,NA,2,1,4,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,118671.226879,152848.538678,2,91,15,9,5,2,1,0,0,0,2,26,1,5,5,NA +68430,7,2,2,2,NA,5,6,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6365.363193,6669.808387,1,92,14,14,2.42,6,6,1,3,0,1,30,1,4,6,NA +68431,7,2,1,3,NA,4,4,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7076.684446,7163.001252,2,99,2,2,0.22,4,4,1,1,0,1,18,1,2,NA,NA +68432,7,2,1,80,NA,2,2,2,NA,NA,1,2,2,1,9,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11755.776731,12827.229805,3,90,3,3,0.78,3,3,0,1,2,1,80,2,3,1,2 +68433,7,2,2,6,NA,1,1,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13085.05107,13640.91346,2,92,14,14,4.03,4,4,1,1,1,2,30,1,5,4,NA +68434,7,2,2,67,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,11576.638399,12468.988052,1,101,3,3,1.12,1,1,0,0,1,2,67,1,2,5,NA +68435,7,2,2,8,NA,3,3,1,8,101,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,25826.784831,26196.011011,2,91,2,2,0.44,3,3,0,1,0,1,46,2,3,1,4 +68436,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,203724.329642,1,91,15,12,NA,2,1,0,0,0,1,51,1,3,1,NA +68437,7,2,1,4,NA,4,4,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7354.77583,7808.790358,2,90,8,8,1.67,6,6,1,1,0,1,52,1,3,1,5 +68438,7,2,1,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,25964.952645,26783.974907,2,96,5,5,1.36,2,2,0,0,0,2,51,1,4,1,3 +68439,7,2,1,14,NA,5,7,2,14,174,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8676.361974,9272.775003,1,90,77,77,NA,4,4,0,2,0,2,51,1,5,1,5 +68440,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,116165.700541,2,94,99,99,NA,2,2,0,0,0,2,37,1,2,1,4 +68441,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22631.175755,22215.258702,2,96,5,5,1.36,2,2,0,0,0,2,51,1,4,1,3 +68442,7,2,2,42,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,5,2,2,2,2,2,2,2,1,2,2,2,30678.628571,30838.615009,3,91,5,5,1.03,4,4,0,2,0,2,42,2,1,5,NA +68443,7,2,1,73,NA,4,4,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,6725.306794,6857.040344,2,99,77,77,NA,1,1,0,0,1,1,73,2,5,1,NA +68444,7,2,1,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19537.368697,21142.881814,2,96,3,3,0.47,4,4,1,0,1,2,61,1,4,3,NA +68445,7,2,1,70,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,4,1,NA,2,2,2,2,2,2,1,2,1,NA,9710.399795,9879.67408,2,93,12,12,NA,5,5,1,0,2,1,70,2,4,1,5 +68446,7,2,2,68,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11838.431472,12295.352662,2,92,7,7,2.72,2,2,0,0,2,2,68,1,5,1,NA +68447,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,49568.196121,49400.509437,1,95,2,2,0.78,1,1,0,0,1,2,68,1,4,3,NA +68448,7,2,2,28,NA,5,7,1,NA,NA,2,NA,2,1,3,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18100.072824,19323.729203,1,92,7,7,3.22,1,1,0,0,0,2,28,2,5,5,NA +68449,7,2,1,12,NA,2,2,2,12,145,NA,NA,2,1,4,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15594.049321,16140.624477,2,99,77,77,NA,4,4,1,1,1,2,38,2,4,1,4 +68450,7,2,2,47,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,21481.050033,21698.613985,2,91,8,7,3.31,2,1,0,0,0,1,55,1,2,6,NA +68451,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16715.026676,2,100,7,7,1.38,5,5,1,0,0,2,45,1,2,3,NA +68452,7,2,2,69,NA,2,2,2,NA,NA,2,NA,2,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,9716.805546,12994.252166,2,90,4,4,1.47,1,1,0,0,1,2,69,2,2,3,NA +68453,7,2,2,79,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,56393.181686,58123.268911,2,93,7,7,2.31,2,2,0,0,2,2,79,1,3,1,5 +68454,7,1,1,28,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,103001.073873,0,2,97,7,7,3.21,1,1,0,0,0,1,28,1,4,5,NA +68455,7,2,1,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39031.957066,39638.562591,1,95,3,2,0.74,2,1,0,0,0,1,27,1,3,5,NA +68456,7,2,1,3,NA,2,2,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11179.43727,11311.602194,2,93,3,3,0.37,5,5,3,0,0,1,28,2,1,6,NA +68457,7,2,1,0,8,3,3,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,28319.415322,27829.834184,1,92,9,9,2.6,4,4,2,0,0,2,32,1,3,1,5 +68458,7,2,1,44,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,29797.944087,29360.705192,1,103,5,5,0.74,5,5,1,1,0,2,40,99,3,1,1 +68459,7,2,2,16,NA,4,4,2,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10460.187371,12283.198438,1,99,7,7,1.53,5,5,0,3,0,1,39,1,3,1,3 +68460,7,2,1,4,NA,2,2,1,4,55,NA,NA,2,1,2,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11179.43727,11533.315753,2,93,14,14,2.91,6,6,2,0,1,2,74,NA,NA,2,NA +68461,7,2,1,6,NA,3,3,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,63513.013195,68899.034203,2,101,7,7,1.57,4,4,0,2,0,2,28,1,3,6,NA +68462,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,29483.108693,29407.372658,1,94,4,4,0.79,3,3,0,1,0,1,49,1,2,3,NA +68463,7,2,2,0,7,3,3,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19676.563141,20852.949038,2,99,15,15,5,3,3,1,0,0,1,43,1,5,1,5 +68464,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,42101.975168,41959.54633,1,101,5,5,1.24,3,3,0,0,1,2,61,1,4,1,3 +68465,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,2,NA,1,2,1,1,2,1,1,2,1,NA,13689.379977,14234.742701,2,92,2,2,0.89,1,1,0,0,1,2,80,2,1,2,NA +68466,7,2,1,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,25624.148584,27611.905955,2,96,12,12,NA,2,1,0,0,0,1,33,1,3,3,NA +68467,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,139800.409559,144765.126463,1,100,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +68468,7,2,1,61,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,9115.676792,11889.427964,2,90,6,6,1.7,2,2,0,0,2,1,61,2,1,1,2 +68469,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,29738.952706,30201.133298,2,94,3,3,1.01,1,1,0,0,0,1,25,1,4,5,NA +68470,7,2,1,56,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,2,1,2,2,1,2,2,3,12158.061776,12114.139928,3,90,15,15,3.7,5,5,0,0,0,1,56,2,3,1,3 +68471,7,2,2,15,NA,4,4,2,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11600.051433,12143.645666,3,90,14,14,2.97,5,5,0,2,1,1,73,2,3,2,NA +68472,7,2,1,9,NA,3,3,2,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18324.386573,20287.008963,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +68473,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17811.496463,19015.919888,2,99,NA,77,NA,3,2,0,0,1,1,63,1,3,5,NA +68474,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108014.727405,114941.235527,2,94,14,14,4.71,3,3,1,0,0,1,35,1,5,1,5 +68475,7,2,2,12,NA,3,3,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,36586.371708,39087.782259,1,98,3,3,0.5,5,5,0,3,0,2,56,1,3,3,NA +68476,7,2,2,9,NA,4,4,1,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9139.784234,11102.911341,2,100,3,3,0.63,4,4,0,1,0,1,51,1,2,77,NA +68477,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16386.190684,20296.970403,2,90,7,5,1.84,2,1,0,0,0,1,21,1,3,5,NA +68478,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,120278.381994,2,94,10,10,2.91,4,4,0,2,0,2,38,1,4,1,4 +68479,7,2,2,3,NA,3,3,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +68480,7,2,1,6,NA,1,1,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12477.812875,12553.43469,2,94,7,7,1.17,6,6,1,2,0,2,30,2,3,6,NA +68481,7,2,2,19,NA,3,3,2,19,239,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,100004.689924,104137.373956,1,90,15,15,5,3,3,0,0,1,1,66,NA,NA,1,4 +68482,7,2,2,77,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,15211.382198,16229.383727,2,101,3,3,0.65,3,3,0,0,1,2,77,1,3,2,NA +68483,7,2,2,14,NA,1,1,1,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16427.640886,18021.433684,1,102,7,7,1.41,5,5,0,2,2,1,72,1,4,1,3 +68484,7,2,1,47,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,10846.102759,10858.953375,1,99,7,5,1.84,2,1,0,1,0,1,47,2,4,5,NA +68485,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,122483.259869,124909.680309,3,91,6,6,2.3,1,1,0,0,1,2,64,1,5,3,NA +68486,7,2,1,3,NA,4,4,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10690.995725,11500.031681,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +68487,7,2,1,19,NA,4,4,2,19,229,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,10817.360862,11219.635132,2,99,6,6,1.15,5,5,1,2,0,2,34,1,4,77,NA +68488,7,2,2,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,16741.034883,16282.872546,2,95,4,4,1.61,1,1,0,0,0,2,58,1,5,5,NA +68489,7,2,2,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7746.357421,8271.811673,1,99,7,7,2.52,2,2,0,1,0,2,40,1,4,3,NA +68490,7,2,2,4,NA,5,6,1,4,59,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5601.441711,5595.525293,1,103,5,5,1.26,3,3,1,0,0,1,40,2,5,1,5 +68491,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,35161.248998,42165.766203,3,91,7,7,2.45,2,2,0,0,2,1,80,1,2,1,2 +68492,7,2,1,0,1,1,1,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8519.229538,8673.80493,1,101,15,15,4.99,4,4,2,0,0,1,31,1,4,1,4 +68493,7,2,1,29,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11770.082057,12287.307332,3,91,5,5,1.08,3,3,1,0,0,1,29,2,5,1,5 +68494,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,2,1,2,2,1,2,2,1,2,2,1,20626.479002,22617.279591,2,100,4,1,0,2,1,0,0,0,2,38,1,3,2,NA +68495,7,2,2,78,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,27275.632708,28985.222851,2,96,2,2,0.87,1,1,0,0,1,2,78,1,3,2,NA +68496,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,17188.361186,17721.573899,2,95,2,2,0.75,1,1,0,0,0,1,56,1,2,3,NA +68497,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,59613.972918,59797.266126,2,100,5,5,2.2,1,1,0,0,0,2,34,1,5,3,NA +68498,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9547.901254,10157.592212,3,90,15,15,5,5,5,1,0,1,1,38,2,3,1,4 +68499,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,175544.769665,182852.89468,1,91,15,15,5,2,2,0,0,0,2,56,1,4,1,4 +68500,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,12863.404053,13555.744544,2,90,6,6,2.75,1,1,0,0,1,2,80,1,5,2,NA +68501,7,2,1,52,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,152865.087613,1,94,8,8,1.67,5,5,1,2,0,1,52,1,4,1,4 +68502,7,2,1,27,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,21873.767586,21362.816924,2,99,77,4,1.43,2,1,0,0,0,1,27,2,5,5,NA +68503,7,2,2,3,NA,5,7,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,92,3,3,0.46,5,5,2,1,0,1,30,1,3,1,2 +68504,7,2,2,6,NA,3,3,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,98,14,14,4.12,4,4,0,2,0,2,36,1,5,1,3 +68505,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,151766.599459,156268.87702,3,91,7,7,1.97,4,4,0,0,1,2,77,1,5,2,NA +68506,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,32189.450686,32533.215899,1,101,4,4,1.22,2,2,0,0,2,2,77,1,4,1,3 +68507,7,2,2,49,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,25189.111847,25556.352159,2,102,10,10,4.76,2,2,0,0,1,2,49,2,5,5,NA +68508,7,2,2,31,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,1,2,2,1,15542.93857,15828.161907,3,91,8,8,2.7,3,3,1,0,0,1,31,1,5,1,5 +68509,7,2,2,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,14140.449064,14449.882828,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +68510,7,2,1,65,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,8886.717016,8956.231711,2,101,6,6,1.51,3,3,0,1,1,1,65,1,2,1,4 +68511,7,2,2,9,NA,5,7,1,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8128.755281,8415.30848,1,98,4,4,0.94,3,3,1,1,0,2,28,1,2,77,NA +68512,7,2,2,57,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,20734.495277,22158.856945,2,99,77,77,NA,3,3,0,0,0,2,57,2,2,1,1 +68513,7,2,2,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,54370.517487,54186.584794,1,95,6,6,2.04,2,2,0,0,2,1,71,1,3,1,4 +68514,7,2,1,3,NA,5,7,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7629.74403,8207.121237,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +68515,7,2,1,13,NA,5,7,1,13,163,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,63907.082519,63067.196763,1,102,8,8,1.91,5,5,1,2,0,2,38,1,5,1,4 +68516,7,2,1,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,28213.419452,32164.786649,1,100,7,7,3.13,1,1,0,0,0,1,30,1,5,5,NA +68517,7,2,1,28,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,1,1,2,2,NA,NA,NA,NA,49741.714519,52356.235161,2,91,14,14,4.71,3,3,0,0,0,1,28,2,1,1,2 +68518,7,2,2,25,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,19495.209875,21153.580858,2,90,7,7,3.31,1,1,0,0,0,2,25,1,5,5,NA +68519,7,2,1,5,NA,3,3,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58332.578536,63879.860857,1,91,7,7,1.88,4,4,1,2,0,2,43,1,5,4,NA +68520,7,2,2,17,NA,3,3,2,17,207,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,29885.567338,31265.78413,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +68521,7,2,2,28,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,47348.206546,48810.979214,1,92,10,10,2.93,4,4,1,0,0,2,55,1,4,1,4 +68522,7,2,1,12,NA,4,4,2,12,154,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10817.360862,11219.635132,2,99,6,6,1.15,5,5,1,2,0,2,34,1,4,77,NA +68523,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,11879.290971,12889.384857,2,96,2,2,0.83,1,1,0,0,1,2,62,1,2,5,NA +68524,7,2,1,11,NA,4,4,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9184.716222,9199.031651,1,102,7,7,1.57,4,4,0,2,0,2,33,1,4,1,4 +68525,7,2,2,39,NA,1,1,1,NA,NA,2,NA,2,1,5,NA,3,1,2,2,2,2,1,2,2,2,2,2,2,36453.846815,35470.245447,1,102,5,5,0.92,5,5,0,3,0,2,39,2,3,1,3 +68526,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,15799.067708,16817.831279,2,95,5,5,1.52,2,2,0,0,0,2,58,1,2,2,NA +68527,7,2,2,8,NA,3,3,1,8,107,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,48532.852397,48387.04619,1,98,15,15,5,5,5,0,3,0,2,41,1,5,6,NA +68528,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,90234.245265,93002.542962,2,101,6,6,2.75,1,1,0,0,1,2,70,1,4,3,NA +68529,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,42992.537371,48017.666119,2,95,5,5,1.79,1,1,0,0,1,2,80,1,4,2,NA +68530,7,2,1,13,NA,2,2,2,13,166,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13921.972975,14228.387356,3,90,14,14,3.93,3,3,0,1,0,2,36,2,3,1,4 +68531,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,6038.685119,6085.921613,1,96,15,15,5,3,3,0,0,1,1,60,1,4,1,4 +68532,7,2,1,3,NA,1,1,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,17341.8035,17890.748046,2,102,6,6,1,6,6,1,3,0,1,35,2,3,1,3 +68533,7,2,2,9,NA,5,6,2,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6198.268014,6830.048804,3,90,77,77,NA,5,5,0,2,0,1,46,2,3,1,3 +68534,7,2,2,8,NA,2,2,1,8,99,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,15897.166957,16345.216522,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +68535,7,2,2,0,7,1,1,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6787.112205,7016.795893,2,94,13,2,0.36,5,4,1,1,0,1,25,2,4,1,4 +68536,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8949.073879,2,95,7,7,3.22,1,1,0,0,1,2,60,1,3,3,NA +68537,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,95087.883412,95380.247139,1,100,15,15,5,2,2,0,0,0,1,46,1,4,1,5 +68538,7,2,1,72,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,9472.03363,9657.569347,2,93,12,12,NA,4,4,0,0,2,1,72,1,2,1,4 +68539,7,1,1,72,NA,2,2,NA,NA,NA,2,NA,2,1,9,NA,2,5,NA,2,2,2,1,2,2,NA,NA,NA,NA,12962.876803,0,2,90,3,3,0.92,1,1,0,0,1,1,72,2,2,5,NA +68540,7,2,1,9,NA,3,3,2,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14307.565788,15198.555052,3,91,5,5,1.07,4,4,0,2,0,2,36,1,5,1,4 +68541,7,2,1,12,NA,4,4,2,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,77,77,NA,7,7,0,3,1,2,43,77,5,5,NA +68542,7,2,2,4,NA,3,3,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21341.740728,22680.288414,1,98,4,4,0.67,5,5,1,2,0,1,29,1,4,1,3 +68543,7,2,2,13,NA,1,1,1,13,160,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,21819.210646,22256.331163,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +68544,7,2,1,66,NA,5,6,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,8623.181934,9096.941425,2,103,6,6,2.28,1,1,0,0,1,1,66,1,4,5,NA +68545,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,8219.195224,8540.664122,2,99,2,2,0.2,7,7,1,2,1,1,63,1,1,2,NA +68546,7,2,2,6,NA,4,4,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10888.493631,13227.224662,1,101,13,13,NA,5,5,0,1,0,1,53,1,3,1,3 +68547,7,2,2,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,60914.616471,70137.240791,2,91,2,2,0.58,1,1,0,0,0,2,21,1,5,5,NA +68548,7,2,2,66,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,124544.616504,126579.471046,1,100,6,6,2.82,1,1,0,0,1,2,66,1,5,2,NA +68549,7,2,1,67,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,2,2,2,1,2,2,2,2,2,1,9430.93681,9952.400706,1,92,3,3,0.88,2,2,0,0,2,1,67,1,1,1,1 +68550,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,1,2,1,2,2,NA,NA,NA,NA,37019.065541,0,1,96,15,15,5,3,2,0,0,2,2,57,1,5,6,NA +68551,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,11532.104822,12394.666968,2,99,4,4,1.61,1,1,0,0,1,2,80,1,1,2,NA +68552,7,2,2,0,2,4,4,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4439.36229,4769.277094,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +68553,7,2,2,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,131590.908764,1,98,6,6,1.11,5,5,0,2,1,2,37,1,1,1,1 +68554,7,2,2,11,NA,1,1,1,11,132,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17053.854294,17496.484818,2,94,6,6,0.8,7,7,1,3,0,2,36,2,3,1,1 +68555,7,2,2,6,NA,3,3,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22308.590534,22137.463018,1,101,5,5,0.71,6,6,1,1,1,1,63,1,2,1,5 +68556,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,24902.414229,28566.820481,1,90,15,15,5,2,2,0,0,0,2,50,2,4,3,NA +68557,7,2,1,71,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,15176.622228,16562.859469,1,101,3,3,0.98,1,1,0,0,1,1,71,1,3,3,NA +68558,7,2,2,62,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,17243.546687,17998.333464,1,92,1,1,0.26,2,2,0,0,2,1,63,2,1,1,1 +68559,7,2,1,80,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,34540.440658,39912.090511,1,90,6,6,2.69,1,1,0,0,1,1,80,2,3,2,NA +68560,7,2,2,28,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,51746.15111,53882.638481,1,95,6,6,1.37,3,3,1,1,0,2,28,1,4,5,NA +68561,7,2,2,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,145813.864843,148196.223981,1,100,6,6,1.31,3,3,0,0,2,1,65,1,5,1,5 +68562,7,2,1,3,NA,4,4,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9126.025,2,100,6,6,1.52,4,4,1,2,0,2,39,1,4,3,NA +68563,7,2,2,17,NA,4,4,1,17,208,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13452.957635,13490.376767,2,93,4,4,1.29,2,2,0,1,0,2,56,2,3,4,NA +68564,7,2,2,35,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,4,1,2,1,2,1,1,2,1,NA,NA,NA,NA,20039.469886,21581.359058,1,97,15,15,5,4,4,2,0,0,2,35,2,4,1,4 +68565,7,2,2,65,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14102.354333,14646.654863,3,91,15,15,5,2,2,0,0,2,2,65,2,5,1,5 +68566,7,2,1,13,NA,4,4,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13468.614146,13600.508187,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +68567,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,24217.957803,24014.890408,2,94,4,1,0.09,2,1,0,0,0,2,51,1,2,6,NA +68568,7,2,1,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,114410.004231,116188.079068,1,97,15,15,3.89,5,5,0,2,0,1,50,1,4,6,NA +68569,7,2,2,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,19977.261965,20728.031273,1,92,NA,1,0.18,4,3,0,2,0,2,56,1,4,4,NA +68570,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,23465.604153,23669.640656,2,98,3,3,1.19,1,1,0,0,0,1,49,1,3,3,NA +68571,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10562.541357,10524.383438,1,103,5,5,0.65,6,6,0,0,1,2,26,2,4,5,NA +68572,7,2,1,42,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,117613.757473,123317.366869,2,93,9,9,3.77,2,2,0,0,0,2,42,2,4,1,5 +68573,7,2,1,64,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,10288.337394,10853.580889,3,91,9,9,3.24,3,3,0,1,1,1,64,2,2,1,5 +68574,7,2,1,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,40776.102186,2,98,7,7,1.53,5,5,0,0,0,2,48,1,3,5,NA +68575,7,2,2,42,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,33565.905936,33977.52311,2,93,14,14,3.52,5,5,1,2,0,1,44,1,5,1,5 +68576,7,2,2,1,20,1,1,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9439.743884,10034.856293,1,90,6,6,1.11,5,5,1,2,0,1,30,2,1,6,NA +68577,7,2,1,19,NA,2,2,2,19,239,2,NA,1,1,NA,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22228.448129,22318.929635,1,93,6,6,1.78,3,3,0,0,0,1,19,1,3,NA,NA +68578,7,2,1,8,NA,2,2,1,8,100,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13665.416457,13530.568366,1,94,5,5,0.74,5,5,1,1,0,2,24,1,3,1,4 +68579,7,2,1,6,NA,1,1,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11159.151566,11335.739115,1,102,6,6,1.03,6,6,0,4,0,1,34,2,2,1,1 +68580,7,2,2,47,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,46405.063078,46647.061535,2,98,10,10,4.43,2,2,0,0,1,2,47,1,4,3,NA +68581,7,2,1,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18790.641284,18862.037788,2,100,15,15,4.97,5,5,0,2,1,2,42,1,5,1,5 +68582,7,2,2,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,19807.824556,20146.472612,1,96,9,9,3.35,3,3,0,0,0,2,42,1,4,5,NA +68583,7,2,1,11,NA,3,3,2,11,135,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,42986.51011,44926.997612,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +68584,7,2,1,18,NA,3,3,2,18,221,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,88198.948426,91036.751291,1,101,9,9,2.6,4,4,0,1,2,2,63,1,4,1,4 +68585,7,2,2,1,17,1,1,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11901.705423,12652.027961,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +68586,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,1,1,0.05,4,1,0,0,0,2,21,1,4,5,NA +68587,7,2,2,2,NA,4,4,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6854.479526,6961.787344,2,91,6,6,0.78,7,7,1,4,0,2,38,2,2,77,NA +68588,7,2,2,14,NA,1,1,1,14,174,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,16360.434077,17687.989006,3,91,5,5,1.03,4,4,0,2,0,2,42,2,1,5,NA +68589,7,2,1,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16117.991297,16472.240486,1,96,10,10,3.04,4,4,0,1,0,2,43,1,5,1,4 +68590,7,2,1,1,16,4,4,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5942.817425,6188.375425,2,97,13,13,NA,6,6,2,2,0,2,24,1,2,6,NA +68591,7,2,1,67,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,8088.223021,7993.317874,1,99,14,14,4.86,3,3,0,1,1,2,56,1,5,1,5 +68592,7,2,1,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,24793.720953,26072.340199,1,92,14,14,3.25,4,4,0,2,0,1,34,1,4,6,NA +68593,7,2,2,63,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14745.12656,14965.949752,1,98,10,10,5,1,1,0,0,1,2,63,2,5,5,NA +68594,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,12291.154515,13189.875012,1,95,3,3,0.92,1,1,0,0,1,1,80,1,3,2,NA +68595,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,36676.329165,37617.002202,1,95,4,4,1.56,1,1,0,0,0,2,50,1,2,4,NA +68596,7,2,2,6,NA,3,3,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17958.854782,18534.102526,2,100,2,2,0.38,3,3,0,2,0,2,35,1,4,5,NA +68597,7,2,2,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,NA,49260.413155,50771.674072,2,100,14,5,2.2,2,1,0,0,2,1,71,1,2,6,NA +68598,7,2,1,14,NA,4,4,1,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11429.628358,11512.87076,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +68599,7,2,2,2,NA,1,1,1,2,32,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13322.479814,13501.65138,1,92,5,5,1.15,3,3,1,0,0,2,27,1,3,1,3 +68600,7,2,2,7,NA,3,3,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24070.467912,24097.958076,1,95,6,3,0.45,6,4,1,2,0,1,28,1,2,1,2 +68601,7,2,1,26,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9956.598907,10266.888978,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +68602,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,34997.800447,35379.102239,2,96,6,6,1.11,5,5,0,3,0,2,32,2,3,1,2 +68603,7,2,1,19,NA,4,4,2,19,234,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12721.673656,12814.326071,2,97,2,2,0.49,2,2,0,0,0,1,24,1,4,6,NA +68604,7,2,2,2,NA,4,4,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5403.773938,5854.006054,3,90,10,10,2.59,5,5,1,2,0,2,32,1,4,1,4 +68605,7,2,2,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,23003.908463,24458.642976,2,99,12,1,0.12,2,1,0,0,1,2,46,1,3,2,NA +68606,7,2,2,62,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,2,2,2,1,2,2,2,9330.330573,12477.420452,3,90,6,6,1.04,5,5,0,1,1,2,50,2,1,1,2 +68607,7,2,2,0,4,5,6,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5507.575232,5813.640954,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +68608,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,2,1,9,NA,5,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,41252.836432,0,1,100,15,15,5,3,1,0,0,3,2,69,NA,NA,5,NA +68609,7,2,1,4,NA,1,1,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14505.510202,14676.996441,2,94,7,7,1.17,6,6,1,2,0,2,30,2,3,6,NA +68610,7,2,1,6,NA,4,4,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8439.403196,8726.876152,2,103,6,6,1.11,5,5,1,2,0,2,36,1,4,5,NA +68611,7,2,1,8,NA,5,6,2,8,96,NA,NA,2,2,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9928.619925,10708.884665,1,91,12,12,NA,4,4,0,2,0,1,43,2,5,1,5 +68612,7,2,2,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,24713.281483,24036.937705,1,92,10,10,4.3,2,2,0,0,0,2,55,1,4,1,5 +68613,7,2,2,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,166028.936087,168741.576297,2,101,8,8,4.41,1,1,0,0,1,2,61,1,4,2,NA +68614,7,2,1,73,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,2,1,NA,2,2,2,1,2,2,2,2,2,NA,15301.031416,16695.608527,1,90,4,4,0.94,3,3,0,0,2,2,78,2,1,1,2 +68615,7,2,1,0,0,2,2,1,NA,0,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7530.249163,7898.897498,2,102,14,14,3.25,5,5,2,0,0,1,27,1,5,1,5 +68616,7,2,2,17,NA,4,4,2,17,206,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11956.705842,11923.015236,1,96,15,15,5,5,5,0,3,0,2,47,1,5,1,5 +68617,7,2,2,2,NA,5,6,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5022.237557,1,91,14,14,3.69,4,4,1,1,0,2,29,2,5,1,5 +68618,7,2,2,13,NA,5,6,2,13,158,NA,NA,2,2,2,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7649.811754,7945.620413,2,90,3,1,0,5,1,1,2,0,1,44,2,5,1,5 +68619,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16942.073558,18043.178849,1,99,6,6,1.12,4,4,2,0,0,2,29,1,2,1,4 +68620,7,2,1,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16555.478822,16319.493771,2,96,3,3,0.47,6,6,0,4,0,1,36,1,4,1,4 +68621,7,2,2,14,NA,4,4,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,6,6,1.16,4,4,0,3,0,2,36,1,4,4,NA +68622,7,2,2,70,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,64463.340883,65151.773075,1,91,7,7,2.72,2,2,0,0,2,1,70,NA,NA,1,4 +68623,7,2,1,28,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11279.598253,11667.930056,1,93,15,15,5,5,5,1,0,1,1,61,2,4,1,4 +68624,7,2,1,45,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,34205.013302,34329.398365,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +68625,7,2,1,24,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,2,2,2,1,2,2,1,2,2,1,47487.549895,49034.44781,1,102,77,77,NA,3,3,0,0,1,1,61,2,4,1,1 +68626,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,54781.947924,56462.604085,2,93,10,10,3.61,3,3,0,0,2,1,75,1,4,1,4 +68627,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,74668.489197,78374.230241,2,91,77,77,NA,2,2,0,0,2,2,70,1,3,1,4 +68628,7,2,2,17,NA,4,4,2,17,206,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +68629,7,2,2,4,NA,4,4,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11378.89676,1,96,12,12,NA,7,7,1,0,1,2,59,1,3,1,1 +68630,7,2,1,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,69063.138927,75761.928286,1,92,10,10,2.1,6,6,1,1,0,2,29,1,4,1,2 +68631,7,2,1,12,NA,5,6,2,12,149,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10618.845283,10988.972369,1,93,14,14,5,2,2,0,1,0,2,46,2,5,3,NA +68632,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,134694.414609,139412.076132,2,94,15,15,5,2,2,0,0,2,1,64,1,5,1,5 +68633,7,2,2,38,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,3,1,2,1,2,2,1,2,2,1,2,2,2,46400.322077,46544.459997,1,95,9,9,2.46,4,4,0,0,0,1,42,2,2,1,3 +68634,7,2,2,15,NA,4,4,1,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17373.928778,17416.718116,2,96,15,15,5,3,3,0,1,0,1,55,1,5,1,4 +68635,7,2,2,58,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19183.115011,19284.554221,1,92,14,14,5,2,2,0,0,0,1,40,1,5,1,4 +68636,7,2,1,1,17,5,6,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6319.053383,6506.026949,1,91,15,15,5,3,3,1,0,0,1,39,2,5,1,5 +68637,7,2,2,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,28059.790487,28146.065043,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +68638,7,2,1,18,NA,4,4,2,18,222,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11538.004005,11560.815583,1,96,9,9,3.35,3,3,0,0,0,2,42,1,4,5,NA +68639,7,2,2,19,NA,3,3,2,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,123622.182994,134789.559864,2,94,15,15,3.82,5,5,0,0,0,1,50,1,5,1,5 +68640,7,2,2,28,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,12412.338679,12980.380959,3,90,15,15,3.7,5,5,0,0,0,1,56,2,3,1,3 +68641,7,2,2,14,NA,1,1,1,14,176,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,20460.442471,21235.303768,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +68642,7,2,1,16,NA,4,4,1,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16147.713323,16532.569027,1,92,NA,1,0.18,4,3,0,2,0,2,56,1,4,4,NA +68643,7,2,1,17,NA,1,1,1,17,207,2,NA,1,1,NA,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,32326.52031,34735.818434,2,94,5,5,0.65,6,6,0,3,0,1,44,2,1,1,1 +68644,7,2,2,1,13,2,2,2,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9889.733317,10584.607254,1,91,5,5,0.8,5,5,2,1,0,2,31,2,3,1,1 +68645,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,48731.095364,50226.117333,2,93,6,6,2.51,1,1,0,0,1,2,75,1,5,3,NA +68646,7,2,2,45,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,34226.159502,34404.646012,1,97,4,4,0.65,4,4,0,1,0,2,45,2,2,3,NA +68647,7,2,1,54,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,16851.334496,17374.092058,2,95,3,3,1.07,1,1,0,0,0,1,54,1,2,5,NA +68648,7,2,2,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85420.170155,86011.35365,1,91,14,14,3.06,5,5,2,0,0,2,30,1,5,1,5 +68649,7,2,2,0,8,1,1,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6787.112205,7238.162123,2,94,8,8,2.33,4,4,2,0,0,1,24,1,2,6,NA +68650,7,2,1,3,NA,5,7,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6538.646646,7333.807608,2,100,6,6,1.62,3,3,1,0,0,1,32,1,3,1,3 +68651,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,87808.984693,88078.968218,1,93,15,15,5,1,1,0,0,0,2,32,1,5,5,NA +68652,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,78529.577822,86568.047729,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +68653,7,2,1,9,NA,1,1,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11159.151566,11210.524757,1,102,4,4,0.5,6,6,2,2,0,1,25,1,2,1,3 +68654,7,2,2,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5687.793894,6161.690011,2,90,7,7,1.53,5,5,2,1,0,1,35,2,4,1,4 +68655,7,2,1,19,NA,5,6,1,19,231,2,NA,2,2,1,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9948.022697,10353.284725,2,101,5,5,1.84,2,1,0,0,0,1,19,2,4,NA,NA +68656,7,2,1,10,NA,4,4,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8183.206265,8693.880504,3,90,3,3,0.78,3,3,0,1,2,1,80,2,3,1,2 +68657,7,2,1,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,22705.790734,22474.018796,1,95,3,3,0.76,3,3,0,0,1,1,41,1,2,1,4 +68658,7,2,2,17,NA,5,6,2,17,212,2,NA,2,1,99,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10998.124667,11476.706351,1,91,15,15,5,4,4,0,2,0,2,55,1,5,1,5 +68659,7,2,2,15,NA,3,3,1,15,186,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,85039.920663,86146.650284,1,94,14,14,2.96,5,5,0,3,0,2,39,1,4,1,3 +68660,7,2,1,24,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,1,5,NA,2,2,2,1,2,2,2,2,1,2,38474.772527,38999.213364,2,93,4,4,0.56,5,5,0,0,0,2,49,2,2,5,NA +68661,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10991.458112,11482.21496,2,99,15,15,5,2,2,0,0,2,1,60,1,5,1,5 +68662,7,2,2,37,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,16369.916397,16518.354031,1,101,8,8,1.81,5,5,2,0,1,2,37,2,4,1,2 +68663,7,2,2,48,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,14101.070104,15807.720539,2,92,6,6,1.3,4,4,0,1,0,2,48,2,3,1,3 +68664,7,2,1,6,NA,2,2,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13953.558291,13815.866863,2,93,15,15,5,3,3,0,1,0,2,36,2,3,1,5 +68665,7,2,2,51,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,3,3,NA,2,2,2,2,2,2,2,2,1,2,23122.188977,23961.502212,2,93,4,4,0.69,4,4,0,1,1,2,66,2,3,2,NA +68666,7,2,1,15,NA,5,6,1,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9587.464696,10013.85895,3,92,15,15,5,3,3,0,1,0,1,55,2,5,1,4 +68667,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,1,1,2,1,1,2,2,3,22345.774392,22681.166648,1,92,7,7,2.1,3,3,0,0,0,1,24,2,4,5,NA +68668,7,2,2,8,NA,1,1,1,8,104,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15841.451259,16252.614023,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +68669,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,27140.404673,27611.034752,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +68670,7,2,2,5,NA,5,7,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8894.95474,1,97,15,15,5,4,4,1,0,0,2,39,2,5,1,5 +68671,7,2,1,6,NA,4,4,2,6,81,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7504.213986,7926.614174,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +68672,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,133495.735893,134864.21511,3,92,12,3,0.98,3,1,0,0,0,1,45,1,3,1,3 +68673,7,2,1,62,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,10004.038848,10164.290775,2,102,5,5,1.3,3,3,0,0,1,1,56,1,2,5,NA +68674,7,2,2,0,5,5,7,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8377.359485,8321.07116,2,96,12,12,NA,4,4,1,0,0,2,20,1,5,1,5 +68675,7,2,2,73,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,18481.000773,19056.863071,1,100,10,10,4.63,2,2,0,0,2,1,78,2,5,1,5 +68676,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,19060.786733,19514.352798,2,97,4,4,0.81,4,4,1,1,0,2,51,1,3,4,NA +68677,7,2,2,2,NA,5,7,1,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8474.492088,9470.199674,1,102,7,7,1.9,4,4,1,1,0,1,29,1,4,1,3 +68678,7,2,1,43,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,27776.016947,27368.446715,2,90,99,99,NA,5,5,1,1,0,2,40,2,3,1,1 +68679,7,2,1,43,NA,5,7,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,168806.614822,176992.791466,2,101,5,5,1.36,2,2,0,0,0,2,47,1,2,1,4 +68680,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,53634.754806,54437.113731,1,98,12,2,0.45,3,1,0,0,0,2,22,NA,NA,5,NA +68681,7,2,1,66,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,1,2,NA,7973.883342,8285.757609,1,100,5,5,2.06,1,1,0,0,1,1,66,1,3,3,NA +68682,7,2,2,79,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,98976.420245,105956.226489,2,101,5,5,1.63,2,2,0,0,2,1,80,1,1,1,1 +68683,7,2,2,20,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,2,2,2,1,2,2,1,2,2,2,32537.532358,33640.063825,2,90,8,8,2.01,4,4,0,0,1,2,67,2,4,2,NA +68684,7,2,2,6,NA,3,3,2,6,72,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23521.178662,23340.749474,1,101,3,3,0.44,5,5,0,3,0,1,35,1,3,1,4 +68685,7,2,2,12,NA,4,4,2,12,154,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11905.948878,13980.928588,2,99,5,5,1.32,2,2,0,1,0,1,46,2,2,5,NA +68686,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,18801.993237,20608.537144,2,96,7,7,2.45,2,2,0,0,0,1,24,2,5,5,NA +68687,7,2,2,45,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,39843.937983,40051.72073,1,102,9,9,3.74,2,2,0,0,0,2,45,1,4,1,2 +68688,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,94644.050918,104631.781207,2,91,15,15,5,4,4,2,0,0,1,35,1,5,1,5 +68689,7,2,2,70,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,1,2,2,NA,18607.968221,20176.873294,2,92,5,5,1.36,2,2,0,0,2,1,75,2,1,1,1 +68690,7,2,2,29,NA,5,7,2,NA,NA,2,NA,2,1,6,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,45549.853584,51248.283427,3,91,7,7,1.57,4,4,2,0,0,2,29,2,3,1,3 +68691,7,2,1,7,NA,3,3,2,7,90,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,66868.503099,69864.859716,1,98,14,14,3.15,5,5,0,3,0,1,34,1,4,1,4 +68692,7,2,2,4,NA,5,6,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5081.860978,5222.553414,3,91,14,14,3.06,5,5,3,0,0,1,34,2,5,1,5 +68693,7,2,1,28,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,124091.929364,126020.47345,1,95,15,15,4.14,7,7,2,2,0,1,28,1,4,5,NA +68694,7,2,1,57,NA,4,4,2,NA,NA,1,1,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16589.308426,16584.966003,2,90,15,15,5,4,4,0,0,0,1,57,2,5,1,5 +68695,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,25815.880139,26556.735732,2,101,1,1,0.23,2,1,0,0,0,1,20,1,4,5,NA +68696,7,2,1,44,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,5,3,NA,2,2,2,2,2,2,2,2,2,2,35393.002863,36467.929589,2,93,3,3,0.58,4,4,0,1,1,1,65,2,1,3,NA +68697,7,2,1,10,NA,1,1,2,10,130,NA,NA,2,2,3,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12477.812875,12675.267527,2,94,4,4,0.73,5,5,2,1,0,1,35,2,1,6,NA +68698,7,2,1,8,NA,1,1,1,8,107,NA,NA,2,2,2,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13870.762641,14200.45921,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +68699,7,2,2,18,NA,4,4,1,19,228,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13801.622751,14246.373765,1,100,10,10,2.59,5,5,0,1,0,2,40,1,5,1,NA +68700,7,2,2,4,NA,1,1,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12261.362755,13536.873522,1,103,13,13,NA,4,4,2,0,0,2,27,2,2,6,NA +68701,7,2,2,27,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,2,6,2,2,2,2,2,2,2,2,2,1,2,32455.694722,36034.785338,1,103,13,13,NA,4,4,2,0,0,2,27,2,2,6,NA +68702,7,2,1,56,NA,4,4,2,NA,NA,2,NA,2,2,7,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,20066.354173,20688.84721,1,96,6,6,2.24,1,1,0,0,0,1,56,2,3,3,NA +68703,7,2,1,63,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,9235.951997,9415.956027,1,103,15,15,5,2,2,0,0,1,1,63,1,5,3,NA +68704,7,2,1,7,NA,3,3,2,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18324.386573,20287.008963,2,95,7,7,1.13,6,6,0,3,1,1,52,1,4,1,4 +68705,7,2,1,6,NA,4,4,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12267.215138,12414.279886,2,102,5,5,0.76,5,5,1,3,0,2,30,1,4,4,NA +68706,7,2,1,26,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,21022.682584,20897.3615,1,100,5,5,1.05,3,3,1,0,0,2,35,1,4,6,NA +68707,7,2,1,54,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,166897.201244,167183.296853,2,91,15,15,5,4,4,0,0,0,1,54,1,5,1,NA +68708,7,2,2,61,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,1,2,NA,2,2,2,2,2,2,1,2,2,2,6278.072933,7279.121105,2,103,5,5,0.65,6,6,1,0,1,2,61,2,1,2,NA +68709,7,2,2,30,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,2,5,3,1,2,2,1,2,2,NA,NA,NA,NA,12801.027411,15381.268364,2,90,77,77,NA,4,3,1,0,0,2,30,2,2,5,NA +68710,7,2,1,40,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,2,2,2,2,2,2,2,2,1,2,33029.272844,32544.619181,2,93,6,6,0.93,5,5,1,2,0,1,40,2,4,1,4 +68711,7,2,1,26,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,12084.002684,12472.760771,1,99,9,9,5,1,1,0,0,0,1,26,1,5,5,NA +68712,7,2,1,0,2,5,7,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7882.953266,8003.945501,2,96,7,7,1.79,4,4,1,0,0,2,30,1,4,6,NA +68713,7,2,2,22,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,45798.520132,47350.399021,2,91,3,3,0.73,3,3,0,0,0,2,22,2,2,5,NA +68714,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,1,96,15,9,5,2,1,0,0,0,2,55,1,4,5,NA +68715,7,2,1,54,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,145342.530024,147904.745834,1,99,15,15,5,2,2,0,0,0,1,54,1,3,1,4 +68716,7,2,2,12,NA,1,1,1,12,151,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,24481.187693,24971.637581,1,95,13,13,NA,5,5,1,2,0,2,34,2,1,1,1 +68717,7,2,1,80,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,9835.055907,10027.702409,2,99,10,10,4.76,2,2,0,0,2,1,80,1,2,2,NA +68718,7,2,2,6,NA,1,1,2,6,79,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13231.432201,13706.598104,2,97,4,4,0.67,4,4,0,2,0,1,39,2,2,6,NA +68719,7,2,1,2,NA,5,6,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6185.185728,6679.834548,1,97,15,15,4.84,6,6,2,0,0,1,53,NA,NA,1,NA +68720,7,2,2,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,215228.012584,222579.783434,1,98,6,6,1.98,2,2,0,0,0,1,54,1,4,1,3 +68721,7,2,2,39,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,36053.766709,37679.125242,1,100,3,3,0.73,3,3,2,0,0,2,39,1,3,5,NA +68722,7,2,1,40,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,31740.385214,33170.19689,2,96,7,7,1.57,4,4,0,2,0,1,40,2,2,1,5 +68723,7,2,2,9,NA,1,1,1,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10118.363218,10311.586628,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +68724,7,2,2,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,35160.335949,35576.957572,1,103,5,5,1.02,4,4,2,0,0,1,25,1,2,1,4 +68725,7,2,2,0,9,3,3,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27484.911887,26738.360643,1,92,14,14,3.9,4,4,2,0,0,2,28,1,3,1,3 +68726,7,2,2,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27769.056387,27890.133764,1,94,2,2,0.42,3,3,0,0,0,2,52,1,4,1,1 +68727,7,2,2,9,NA,5,6,2,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6198.268014,6618.822195,3,90,12,12,NA,5,5,1,2,0,1,37,2,5,1,5 +68728,7,2,2,9,NA,2,2,1,9,117,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12307.832776,12608.996083,2,93,5,5,0.89,4,4,0,2,0,1,42,NA,NA,6,NA +68729,7,2,1,8,NA,1,1,1,8,100,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12577.115885,12776.141954,2,96,6,6,1.11,6,6,0,2,1,1,40,2,2,1,2 +68730,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,9260.072397,9783.740861,1,98,3,3,1.07,1,1,0,0,1,1,80,1,4,3,NA +68731,7,2,2,1,16,1,1,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,15816.39252,3,92,14,14,3.25,4,4,2,0,0,2,33,1,5,1,5 +68732,7,2,2,33,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,42456.72357,41469.55672,1,92,14,14,3.15,5,5,1,2,0,1,34,1,4,1,4 +68733,7,2,1,54,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,37557.946192,44552.872015,2,102,15,15,3.92,5,5,0,0,0,1,19,1,4,NA,NA +68734,7,2,2,1,17,3,3,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27529.278041,30383.810541,1,92,5,5,1.15,3,3,1,0,0,1,23,1,4,1,4 +68735,7,2,1,11,NA,4,4,2,11,136,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8453.214884,8599.856249,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +68736,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,28499.00321,31184.438144,2,98,3,3,0.75,2,2,0,0,0,1,22,1,2,5,NA +68737,7,2,1,42,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,2,1,2,2,1,2,2,2,41527.444056,43502.112286,1,95,9,9,2.46,4,4,0,0,0,1,42,2,2,1,3 +68738,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,120220.968534,126279.549,1,98,6,6,1.78,2,2,0,0,0,2,48,1,4,5,NA +68739,7,2,1,31,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,14204.262514,14001.792163,1,99,6,6,0.6,7,7,2,1,1,2,69,1,3,2,NA +68740,7,2,1,64,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,101090.822284,102038.91726,2,102,14,14,5,1,1,0,0,1,1,64,1,4,3,NA +68741,7,2,2,31,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,3,2,1,2,2,1,2,2,NA,NA,NA,NA,39561.667842,38928.923531,2,98,5,5,1.63,2,2,1,0,0,2,31,1,1,3,NA +68742,7,2,2,3,NA,2,2,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15358.480588,15565.033952,1,102,5,5,1.36,2,2,1,0,0,2,21,1,3,5,NA +68743,7,2,1,9,NA,5,7,2,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5171.245544,5675.166629,1,99,15,15,4.47,4,4,0,2,0,2,52,2,5,1,5 +68744,7,2,1,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,22235.85388,1,94,5,5,1.04,4,4,0,2,0,2,29,1,3,1,3 +68745,7,2,2,61,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,31362.042024,31983.331006,1,94,4,4,1.4,1,1,0,0,1,2,61,1,4,3,NA +68746,7,2,2,60,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,2,1,2,1,NA,17243.546687,17909.086027,1,92,7,7,2.1,3,3,0,0,2,1,37,2,5,5,NA +68747,7,2,2,10,NA,2,2,1,11,132,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16061.826248,2,98,6,6,0.78,7,7,1,3,1,2,63,1,2,4,NA +68748,7,2,1,70,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,18239.933451,19545.291055,2,102,7,7,1.68,5,5,0,0,3,1,70,2,4,1,4 +68749,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,15842.721579,15352.843701,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +68750,7,2,2,16,NA,4,4,2,16,200,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12209.74498,12781.910285,2,90,3,3,0.95,2,2,0,1,0,2,49,1,3,5,NA +68751,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,83226.861139,86401.777435,2,95,14,14,5,2,2,0,0,0,1,39,1,4,1,5 +68752,7,2,1,45,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,46745.699003,51362.782618,2,98,8,8,2.26,4,4,0,1,0,2,43,1,3,1,2 +68753,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,127315.335607,133282.596235,1,94,15,15,5,3,3,0,1,0,2,43,1,5,1,5 +68754,7,2,1,57,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,143642.364525,143888.596634,1,90,14,14,3.25,4,4,0,0,1,2,77,1,3,3,NA +68755,7,2,2,2,NA,1,1,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,11879.078775,2,98,2,2,0.35,3,3,2,0,0,2,20,1,4,5,NA +68756,7,2,2,4,NA,1,1,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10024.946819,10059.178608,2,93,77,77,NA,7,7,3,1,0,2,43,2,1,1,9 +68757,7,2,2,0,2,5,6,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9150.459338,9901.313011,1,97,15,15,5,4,4,2,0,0,1,40,2,5,1,5 +68758,7,2,1,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,1,2,NA,17703.366452,19320.397271,1,101,4,4,1.22,2,2,0,0,2,2,77,1,3,1,2 +68759,7,1,2,15,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15809.066118,0,2,93,3,3,0.63,3,3,0,1,0,1,53,2,2,1,4 +68760,7,2,1,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37326.925742,39362.952436,2,91,6,1,0.31,4,1,0,0,0,1,25,NA,NA,5,NA +68761,7,2,2,4,NA,4,4,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9268.093277,10357.044767,1,99,3,3,0.54,3,3,1,0,0,2,29,1,4,1,4 +68762,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,60664.751082,63005.627956,1,102,14,14,4.05,3,3,0,2,0,2,34,1,4,3,NA +68763,7,2,1,26,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,5,NA,1,2,2,2,2,2,1,2,2,1,35338.972549,37196.45724,2,90,4,4,0.81,3,3,0,0,0,1,39,2,3,5,NA +68764,7,2,1,3,NA,4,4,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9572.619158,2,100,7,7,1.38,5,5,1,0,0,2,45,1,2,3,NA +68765,7,2,1,25,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,4,6,NA,1,2,2,1,2,2,1,2,2,2,41258.226616,42207.135518,2,99,15,1,0.27,2,1,0,0,0,1,31,1,5,6,NA +68766,7,2,1,6,NA,4,4,2,6,77,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10464.577474,10672.635694,1,96,99,99,NA,4,4,1,1,0,2,35,2,3,1,3 +68767,7,2,2,68,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,9680.216878,10112.428208,1,96,99,99,NA,2,2,0,0,1,2,68,2,4,5,NA +68768,7,2,2,77,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,2,2,2,1,2,2,NA,17318.187297,23904.945555,2,90,2,2,0.64,1,1,0,0,1,2,77,2,1,4,NA +68769,7,2,2,56,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,14680.520497,15280.64157,3,91,15,15,5,3,3,0,1,1,2,56,2,5,1,NA +68770,7,2,2,39,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,6,2,2,2,2,1,2,2,1,2,1,2,29102.738194,30199.222574,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +68771,7,2,2,24,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,23845.8146,23474.128607,1,98,15,15,5,4,4,1,0,0,2,24,1,4,1,NA +68772,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,1,2,1,2,2,NA,NA,NA,NA,11289.606124,12205.635507,1,94,8,8,1.39,7,7,2,0,1,2,52,1,5,2,NA +68773,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,163102.567998,164787.083347,1,99,9,9,4.35,2,2,0,0,1,1,66,1,2,1,3 +68774,7,2,1,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,43104.257334,46015.156479,2,101,5,5,1.36,2,2,0,0,0,2,22,1,4,5,NA +68775,7,2,2,18,NA,5,6,2,18,217,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6226.949288,6291.898221,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +68776,7,2,1,8,NA,3,3,1,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,42634.626688,43853.750605,1,102,14,14,4.05,3,3,0,2,0,2,34,1,4,3,NA +68777,7,2,1,17,NA,3,3,2,17,210,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30100.326038,35344.542616,1,101,6,6,1.31,3,3,0,2,0,1,43,1,3,4,NA +68778,7,2,1,0,8,1,1,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7284.164858,7692.652584,2,98,4,4,0.65,5,5,3,0,0,2,23,1,4,5,NA +68779,7,2,1,16,NA,1,1,1,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27378.670648,27376.262696,2,96,9,9,4.21,2,2,0,1,0,2,50,1,4,4,NA +68780,7,2,1,78,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,16632.531676,17822.854094,1,100,10,10,4.63,2,2,0,0,2,1,78,2,5,1,5 +68781,7,2,1,34,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13936.822202,14121.672299,1,93,15,6,2.3,6,1,0,0,0,1,34,2,5,5,NA +68782,7,2,2,0,8,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4543.931297,4593.545672,1,96,14,14,3.34,4,4,1,1,0,2,43,1,5,77,NA +68783,7,2,1,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,32375.321924,36431.315201,1,101,2,2,0.22,4,4,1,0,0,2,25,1,4,6,NA +68784,7,2,2,18,NA,1,1,2,19,228,2,NA,2,2,3,12,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,16594.391299,17940.930507,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +68785,7,2,1,0,10,4,4,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6275.847063,6372.172481,2,100,1,1,0,4,4,2,0,0,2,23,1,4,5,NA +68786,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,33707.673642,36318.620408,2,95,15,15,5,2,2,0,0,2,1,80,1,5,1,5 +68787,7,2,1,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,149474.480274,150876.348421,1,100,6,6,1.31,3,3,0,0,2,1,65,1,5,1,5 +68788,7,2,1,9,NA,1,1,1,9,113,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14258.502552,1,92,6,6,1.12,4,4,0,2,0,1,20,1,2,1,2 +68789,7,2,1,16,NA,3,3,1,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,126777.533816,125822.536881,1,100,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +68790,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,38954.135779,38857.944364,1,91,3,3,0.62,3,3,0,1,0,2,55,1,4,4,NA +68791,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19130.246369,18752.254654,2,95,14,14,3.47,4,4,0,0,0,2,45,1,4,1,4 +68792,7,2,2,5,NA,1,1,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,16648.051651,2,98,5,5,0.59,7,7,2,1,2,2,71,1,2,1,1 +68793,7,2,1,73,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,68460.271241,72711.227332,1,102,7,7,2.86,2,2,0,0,2,1,73,1,5,1,3 +68794,7,2,1,74,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,87101.243392,92194.745773,1,101,14,14,4.96,2,2,0,0,2,1,74,1,4,1,3 +68795,7,1,2,4,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13366.393396,0,2,94,7,7,1.18,7,7,1,4,0,2,31,1,4,6,NA +68796,7,2,1,4,NA,2,2,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14505.510202,15161.207968,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +68797,7,2,1,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,17138.242525,20070.705691,1,90,6,6,1.57,3,3,1,0,0,2,25,1,3,6,NA +68798,7,2,1,0,6,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7757.493251,8192.524698,3,92,13,13,NA,6,6,1,2,0,1,53,1,9,1,3 +68799,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,46023.826844,48519.015788,1,91,99,99,NA,1,1,0,0,1,1,70,1,2,3,NA +68800,7,2,2,1,22,1,1,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11512.764389,11552.07657,2,98,7,7,1.26,7,7,1,2,0,1,43,1,2,1,1 +68801,7,2,2,3,NA,4,4,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10295.166918,11223.20055,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +68802,7,2,2,40,NA,4,4,1,NA,NA,2,NA,2,1,4,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,25189.042335,24671.456999,1,100,9,9,2.22,5,5,1,2,0,2,40,2,4,1,4 +68803,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18070.666316,17788.997869,1,99,14,14,4.05,3,3,0,1,0,2,52,1,4,4,NA +68804,7,1,1,31,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19788.748292,0,1,94,1,1,0.08,7,7,2,4,0,1,31,1,2,1,4 +68805,7,2,1,0,4,3,3,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17113.022485,16817.175522,1,91,15,15,5,3,3,1,0,0,1,36,1,5,1,5 +68806,7,2,2,3,NA,5,6,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8171.700571,8311.029296,1,92,7,7,1.65,4,4,2,0,0,1,24,1,4,1,3 +68807,7,2,2,35,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,15388.376971,15419.798755,2,99,15,15,5,2,2,0,0,0,2,35,1,5,1,5 +68808,7,2,1,58,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,18032.281818,17974.767241,2,99,1,1,0.4,1,1,0,0,0,1,58,1,4,3,NA +68809,7,2,2,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,7906.792868,2,95,6,6,0.97,6,6,2,1,0,1,54,1,3,6,NA +68810,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,12291.154515,13189.875012,1,95,2,2,0.66,1,1,0,0,1,1,80,1,3,5,NA +68811,7,2,1,0,7,1,1,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6999.189812,6930.018579,3,92,12,12,NA,7,7,2,1,0,2,30,1,2,1,9 +68812,7,2,1,42,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,19115.012147,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +68813,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,52701.331723,59294.433957,3,91,3,3,0.73,3,3,1,0,0,2,24,1,2,1,3 +68814,7,2,1,32,NA,4,4,2,NA,NA,2,NA,2,1,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20133.630718,20200.188991,1,93,6,6,1.35,3,3,0,1,0,1,32,2,4,1,4 +68815,7,2,2,10,NA,5,6,2,10,123,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6412.057856,6879.064185,3,91,8,8,2.81,3,3,0,2,0,2,31,1,4,3,NA +68816,7,2,2,58,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,21097.069797,24201.517172,2,90,2,2,0.83,1,1,0,0,0,2,58,1,3,3,NA +68817,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18353.275855,20231.959782,1,91,12,8,2.15,6,4,1,1,0,2,29,1,4,6,NA +68818,7,2,1,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7410.50521,7700.344649,2,96,6,6,2.75,1,1,0,0,1,1,62,1,3,3,NA +68819,7,2,1,47,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,52941.648658,53777.896935,2,102,77,77,NA,4,4,0,1,0,1,47,1,2,1,3 +68820,7,2,2,2,NA,2,2,1,2,31,NA,NA,2,1,2,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10164.721409,11222.125211,2,93,5,5,0.87,4,4,1,1,0,1,41,2,5,1,3 +68821,7,2,1,2,NA,4,4,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9438.902193,9727.203655,2,102,4,4,0.72,4,4,2,0,0,1,48,1,3,1,3 +68822,7,2,1,3,NA,2,2,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15745.774489,16244.197679,2,91,4,4,0.67,5,4,2,0,2,2,66,2,1,1,NA +68823,7,2,1,64,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7897.700656,8206.595267,2,95,7,7,2.31,2,2,0,0,2,2,63,1,3,1,3 +68824,7,2,2,80,NA,2,2,2,NA,NA,1,2,2,1,9,NA,2,1,NA,2,1,2,1,2,2,1,1,2,NA,18824.116627,20613.042179,2,90,6,6,2.24,2,2,0,0,2,1,75,2,4,1,2 +68825,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,1,2,1,1,2,1,1,2,2,3,16590.074977,17628.593761,1,92,2,2,0.33,5,5,0,1,0,1,51,2,1,4,NA +68826,7,2,1,7,NA,4,4,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10409.90361,10390.331705,1,96,3,2,0.16,7,6,1,4,0,2,32,1,2,5,NA +68827,7,2,1,43,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17046.256569,17889.989739,1,96,9,9,4.1,2,2,0,0,0,2,45,2,5,1,5 +68828,7,2,1,24,NA,5,6,2,NA,NA,2,NA,2,1,99,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,10141.381563,10448.082757,3,90,15,15,5,3,3,0,0,0,1,46,2,3,1,3 +68829,7,2,2,0,6,2,2,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7446.889459,7422.354625,2,96,6,6,1.12,4,4,2,0,0,1,27,2,2,6,NA +68830,7,2,2,39,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,13027.332011,13103.987136,2,103,77,77,NA,5,5,0,2,0,2,39,2,5,1,5 +68831,7,2,2,79,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,16612.938931,17191.011953,2,99,14,14,4.96,2,2,0,0,2,2,79,1,5,1,NA +68832,7,2,1,15,NA,5,6,2,15,189,NA,NA,2,2,2,8,NA,NA,NA,1,1,1,1,2,1,1,2,1,NA,6666.045669,7091.184391,3,90,6,6,1.31,3,3,0,1,0,1,49,2,3,1,4 +68833,7,2,1,41,NA,2,2,2,NA,NA,2,NA,77,NA,NA,NA,3,5,NA,2,2,2,2,2,2,2,2,1,2,25035.846455,25142.418345,2,99,99,4,1.61,5,1,0,1,0,1,40,2,1,6,NA +68834,7,2,1,7,NA,4,4,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14832.155253,15089.454697,1,97,15,15,5,4,4,1,1,0,1,35,1,5,1,5 +68835,7,1,1,49,NA,2,2,NA,NA,NA,2,NA,2,1,77,NA,1,6,NA,2,2,2,1,2,2,NA,NA,NA,NA,39096.402803,0,2,91,1,1,0.17,4,4,0,1,0,1,49,2,1,6,NA +68836,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,4299.99963,4413.31452,3,90,15,15,4.2,6,6,1,0,2,1,60,1,5,1,4 +68837,7,2,2,35,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,22326.231285,22166.696692,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +68838,7,2,2,7,NA,1,1,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12789.411811,13121.359297,1,102,2,2,0.52,3,3,0,2,0,2,36,2,3,4,NA +68839,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,44041.763669,47615.276255,1,92,10,10,3.67,3,3,0,0,2,1,52,1,4,77,NA +68840,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19117.284298,19018.955883,2,95,7,7,2.58,2,2,0,0,0,2,57,1,4,3,NA +68841,7,2,1,49,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21158.364877,21090.879552,1,96,7,7,2.75,2,2,0,0,0,1,49,1,4,1,5 +68842,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,29670.405171,29530.485322,2,95,4,4,0.76,4,4,0,1,2,1,80,1,1,2,NA +68843,7,2,1,52,NA,1,1,2,NA,NA,2,NA,2,2,2,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,22446.308035,24663.335125,2,94,4,2,0.54,4,2,0,0,0,1,46,NA,NA,1,NA +68844,7,2,1,8,NA,3,3,1,8,100,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,85148.03778,90558.20429,1,98,7,7,1.48,5,5,1,1,0,1,46,1,3,1,3 +68845,7,2,2,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,36067.495928,37024.300659,1,95,3,3,1.1,1,1,0,0,1,2,75,1,3,2,NA +68846,7,2,2,49,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,23742.825358,24088.979786,1,100,15,15,5,2,2,0,0,0,1,48,2,5,1,5 +68847,7,2,1,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,2,2,2,1,2,2,1,59682.963348,63262.110969,2,102,9,9,3.24,3,3,0,0,0,1,54,2,4,1,4 +68848,7,2,2,4,NA,3,3,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20589.729566,21881.111334,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +68849,7,2,1,5,NA,4,4,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,10346.695479,1,100,3,3,0.52,3,3,1,1,0,2,25,1,3,5,NA +68850,7,2,1,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,52698.05363,59566.360508,3,92,7,7,1.65,4,4,1,1,0,1,27,1,3,1,3 +68851,7,2,2,13,NA,1,1,1,13,157,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18515.058419,19360.671834,2,96,6,6,0.87,6,6,1,3,0,1,46,2,1,1,1 +68852,7,2,1,7,NA,5,6,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9720.482616,10533.307174,2,91,7,7,1.56,4,4,1,1,0,2,37,2,5,1,5 +68853,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,27428.65319,29015.297283,2,91,2,2,0.26,4,4,0,1,0,1,20,1,3,5,NA +68854,7,2,1,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,NA,10037.214229,10115.728475,2,92,6,6,2.31,2,2,0,0,2,2,65,1,4,5,NA +68855,7,2,1,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,71070.181743,73766.510327,1,95,6,6,1.94,2,2,0,0,2,2,69,1,2,1,4 +68856,7,2,2,14,NA,5,7,1,14,175,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15711.746539,15750.442176,1,98,14,14,3.16,6,6,2,2,0,1,39,1,5,1,5 +68857,7,2,2,12,NA,3,3,2,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,91797.787708,92992.465808,1,95,14,14,3.8,4,4,0,2,0,2,37,1,5,1,5 +68858,7,2,2,12,NA,2,2,2,12,148,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,8,8,2.24,4,4,1,1,0,2,29,1,4,6,NA +68859,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,85444.349063,86035.699897,1,94,14,14,2.96,5,5,0,3,0,2,39,1,4,1,3 +68860,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23248.471636,1,95,7,7,1.66,5,5,0,3,0,1,34,1,2,1,4 +68861,7,2,1,8,NA,1,1,1,8,100,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11159.151566,11057.808004,1,102,2,2,0.31,4,4,1,2,0,2,25,1,2,4,NA +68862,7,2,1,3,NA,5,7,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8269.653573,9275.321266,1,101,4,4,0.78,4,4,1,2,0,2,31,1,4,3,NA +68863,7,2,1,4,NA,5,6,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6319.053383,6623.952114,1,91,6,6,1.25,4,4,1,1,0,1,26,2,4,6,NA +68864,7,2,2,57,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,1,2,2,2,2,1,2,29695.385784,37858.742479,2,91,3,3,0.66,2,2,0,0,1,1,69,2,5,1,1 +68865,7,2,1,62,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,2,1,2,1,1,2,2,1,8460.109732,8526.287371,1,93,5,5,0.64,7,7,0,2,1,1,21,2,4,5,NA +68866,7,2,1,22,NA,2,2,2,NA,NA,2,NA,2,1,2,NA,4,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,31312.870743,31739.689334,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +68867,7,2,1,12,NA,3,3,1,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,79897.505873,82468.209663,2,100,6,6,1.7,3,3,0,1,0,2,33,1,4,6,NA +68868,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,47157.788417,52669.767304,2,95,10,10,4.3,2,2,0,0,2,1,80,1,5,1,4 +68869,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,156728.884529,156630.502182,1,100,15,15,5,3,3,0,0,0,1,53,1,5,1,4 +68870,7,2,2,0,10,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4581.358327,4631.381361,2,97,5,5,1.3,3,3,1,0,0,2,46,1,3,1,3 +68871,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,83239.679734,92023.913528,1,90,15,15,5,4,4,0,2,0,1,37,1,5,1,5 +68872,7,2,1,34,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,39040.678458,40784.183756,2,98,2,2,0.35,3,3,0,1,0,2,43,1,3,1,3 +68873,7,2,2,24,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16131.725974,16820.579069,1,99,2,2,0.66,2,1,0,0,0,2,24,1,5,5,NA +68874,7,2,1,55,NA,2,2,2,NA,NA,2,NA,2,2,8,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,32634.009061,33534.701149,2,91,10,10,4.63,2,2,0,0,0,1,55,2,3,3,NA +68875,7,2,1,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,174520.785302,181786.280703,1,95,7,7,2.86,2,2,0,0,0,2,50,1,3,1,3 +68876,7,2,2,78,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,81416.374938,89993.518978,1,97,15,15,5,2,2,0,0,2,1,78,1,3,1,3 +68877,7,2,1,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19387.053587,1,99,14,14,3.67,4,4,1,0,0,2,49,1,3,1,3 +68878,7,2,1,2,NA,2,2,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10803.555682,10625.559962,2,94,1,1,0.16,2,2,1,0,0,2,25,2,3,1,NA +68879,7,2,1,2,NA,3,3,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21718.301271,24669.801903,3,91,6,6,1,6,6,1,1,0,2,39,1,1,3,NA +68880,7,2,1,15,NA,5,7,1,15,184,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,59545.101745,58762.542429,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +68881,7,2,2,35,NA,3,3,2,NA,NA,2,NA,2,1,1,NA,2,1,2,1,2,1,1,2,1,NA,NA,NA,NA,19498.713386,20960.418705,2,97,5,5,0.8,5,5,1,2,0,1,46,2,4,1,2 +68882,7,2,2,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16313.554006,16926.636803,1,103,8,8,1.95,4,4,0,1,0,2,48,1,5,1,5 +68883,7,1,1,53,NA,2,2,NA,NA,NA,2,NA,2,2,7,NA,2,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,23431.677775,0,2,93,3,3,0.63,3,3,0,1,0,1,53,2,2,1,4 +68884,7,2,2,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,24905.670199,26841.707501,2,101,3,3,0.65,3,3,0,1,0,2,54,1,3,5,NA +68885,7,2,2,11,NA,1,1,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12481.057866,12612.274737,1,102,4,4,0.61,5,5,2,2,0,2,27,2,2,5,NA +68886,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,83441.642088,87352.545854,1,99,15,15,5,4,4,0,2,0,2,44,1,5,1,5 +68887,7,2,1,1,19,1,1,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,3,92,3,3,0.54,4,4,3,0,0,2,22,1,3,5,NA +68888,7,2,1,74,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,NA,9257.537917,9255.717695,1,99,9,9,5,2,1,0,0,2,2,61,1,4,6,NA +68889,7,2,2,3,NA,4,4,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8674.686381,9059.886471,2,99,77,77,NA,4,4,1,1,0,2,47,1,2,77,NA +68890,7,2,2,8,NA,1,1,1,8,101,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,22618.378147,23255.85994,2,102,5,5,0.89,4,4,1,1,0,2,28,2,2,1,2 +68891,7,2,2,3,NA,1,1,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15308.9293,16274.054403,2,98,4,4,0.48,6,6,2,0,2,2,65,2,1,2,NA +68892,7,2,1,75,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,8431.365248,9201.488687,1,96,10,10,3.04,4,4,0,0,2,1,56,1,3,3,NA +68893,7,2,1,15,NA,4,4,2,15,188,NA,NA,1,1,NA,11,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11023.237662,11433.168046,1,99,15,15,5,4,4,0,2,0,2,46,1,5,1,5 +68894,7,2,1,36,NA,5,7,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,65033.706797,66896.305599,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +68895,7,2,2,74,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,12813.709202,13258.116643,2,103,14,14,3.47,4,4,1,0,1,1,47,2,5,1,5 +68896,7,2,1,4,NA,4,4,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8402.233801,8749.415211,2,97,3,3,0.4,6,6,2,3,0,2,25,1,2,5,NA +68897,7,2,2,1,15,5,6,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6184.163292,6116.466669,1,91,15,15,3.25,7,7,1,2,0,2,31,1,5,1,5 +68898,7,2,1,3,NA,2,2,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13891.873932,13527.718832,2,97,12,6,0.89,7,7,3,0,0,2,26,2,1,6,NA +68899,7,2,1,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18790.641284,22550.069226,2,100,14,14,5,7,1,1,3,1,2,62,1,3,5,NA +68900,7,2,1,7,NA,3,3,2,7,93,NA,NA,2,2,2,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,49047.972936,54301.226542,1,93,10,10,2.48,5,5,2,1,0,1,40,2,5,1,5 +68901,7,2,2,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,112011.120236,112121.110185,2,92,15,15,5,2,1,0,0,0,1,52,1,5,6,NA +68902,7,2,2,78,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,12493.113557,12927.830854,2,99,77,77,NA,1,1,0,0,1,2,78,1,4,2,NA +68903,7,1,2,75,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,89167.746947,0,1,95,5,5,1.43,2,2,0,0,2,1,80,1,3,1,4 +68904,7,2,1,6,NA,4,4,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7758.863533,8127.805304,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +68905,7,2,2,1,21,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7618.827213,7815.48207,2,97,6,6,1.7,2,2,1,0,0,2,20,1,4,5,NA +68906,7,2,2,16,NA,1,1,2,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,12680.621719,13347.583861,2,90,6,6,1.15,5,5,0,2,0,2,47,2,1,1,5 +68907,7,2,2,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,1,2,2,1,119412.590109,122441.098321,1,92,6,6,1.62,3,3,1,0,0,2,26,1,5,1,5 +68908,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,16727.646581,2,100,9,9,2.46,4,4,1,1,1,2,59,1,3,1,3 +68909,7,2,1,16,NA,4,4,2,16,202,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13513.882801,1,96,15,15,5,4,4,1,1,0,1,50,1,3,1,4 +68910,7,2,1,74,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,2,1,NA,2,2,2,1,2,2,1,2,2,NA,17419.161186,17783.358691,1,102,7,7,1.7,4,4,0,0,2,1,44,1,4,4,NA +68911,7,2,1,13,NA,4,4,1,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,95,4,4,0.76,4,4,0,1,2,1,80,1,1,2,NA +68912,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,2,NA,1,1,2,1,2,2,1,2,1,NA,9509.326077,9839.130289,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +68913,7,2,2,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,17260.508485,17587.688781,2,101,1,1,0.1,6,6,1,2,1,2,27,1,2,1,2 +68914,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,38093.351998,47908.278929,2,91,4,4,1.19,2,2,0,0,0,1,59,1,1,1,3 +68915,7,2,2,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,80418.665565,83274.564983,2,100,8,8,2.91,3,3,0,2,0,2,48,1,5,1,NA +68916,7,2,1,56,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,37426.314738,38162.090079,3,92,5,5,1.39,2,2,0,0,0,1,56,2,1,1,1 +68917,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,65331.560138,67202.689613,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +68918,7,2,1,55,NA,1,1,2,NA,NA,2,NA,2,2,2,NA,1,5,NA,2,2,2,2,2,2,2,2,2,2,22446.308035,22401.210337,2,94,77,77,NA,4,4,0,0,0,1,28,2,1,3,NA +68919,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,71525.773464,1,98,7,7,1.66,5,5,2,1,0,2,37,1,5,1,3 +68920,7,2,2,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17805.920521,18110.342663,2,93,12,12,NA,4,4,0,0,2,1,72,1,2,1,4 +68921,7,2,2,8,NA,3,3,1,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,45129.675368,44994.093254,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +68922,7,2,2,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,88916.414931,91644.282892,1,101,14,14,4.96,2,2,0,0,2,1,74,1,4,1,3 +68923,7,2,1,13,NA,5,6,2,13,157,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11506.937395,12032.024805,1,97,7,7,1.48,5,5,0,1,0,2,46,2,4,1,NA +68924,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,4,1,0.18,4,1,0,0,0,1,22,1,5,5,NA +68925,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,8286.407536,8892.303775,1,91,3,3,0.98,1,1,0,0,1,1,80,1,3,2,NA +68926,7,2,2,3,NA,5,6,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6537.38756,6940.023785,1,92,12,12,NA,7,7,1,2,1,2,45,2,3,1,3 +68927,7,2,1,11,NA,4,4,2,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10669.652248,10854.743056,2,97,5,5,0.76,5,5,1,2,0,1,32,1,4,6,NA +68928,7,2,1,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,19260.892847,19291.900704,2,97,13,13,NA,1,1,0,0,0,1,41,1,2,5,NA +68929,7,2,2,19,NA,2,2,2,19,235,2,NA,2,7,77,13,NA,NA,NA,2,2,2,2,2,2,2,2,1,2,23968.380373,25913.276293,2,91,4,4,0.43,7,7,0,1,1,1,41,2,1,4,NA +68930,7,2,2,6,NA,4,4,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8031.102104,8647.40073,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +68931,7,2,1,22,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14424.961621,15273.975784,2,102,8,8,2.01,4,4,0,0,0,1,59,2,4,1,4 +68932,7,2,1,4,NA,4,4,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,11070.778245,1,100,8,8,2.36,3,3,1,0,0,2,37,1,3,4,NA +68933,7,2,1,72,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,8517.336599,8684.171961,2,100,14,14,5,2,2,0,0,2,2,63,1,5,1,4 +68934,7,2,2,47,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,4,NA,2,2,2,2,2,2,1,2,1,2,35815.777398,36002.553631,1,94,2,2,0.27,5,5,0,4,0,2,47,2,1,4,NA +68935,7,2,1,46,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,31233.526521,31366.480522,1,100,8,4,1.43,6,1,1,0,0,1,33,2,3,6,NA +68936,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,26465.930618,28724.649216,2,100,4,4,0.86,3,3,0,2,0,2,36,1,3,5,NA +68937,7,2,1,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19185.622388,22768.505116,2,95,15,10,3.67,5,3,0,0,0,1,47,1,5,1,3 +68938,7,2,1,9,NA,1,1,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,NA,11316.846999,12445.832216,3,91,4,4,1.02,2,2,0,1,0,2,24,2,1,5,NA +68939,7,2,1,7,NA,1,1,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14820.807433,14905.891142,2,102,8,8,1.91,5,5,1,2,0,1,36,2,1,1,4 +68940,7,2,2,2,NA,2,2,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11981.824297,12363.063282,2,91,2,2,0.22,4,4,1,1,0,2,48,2,9,5,NA +68941,7,2,1,0,10,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6780.545196,6884.61702,1,96,14,14,3.47,4,4,1,1,0,2,27,1,3,6,NA +68942,7,2,2,14,NA,4,4,1,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12531.903464,12935.738352,2,100,5,5,1.08,3,3,0,1,0,2,50,1,4,3,NA +68943,7,2,2,0,2,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4099.350341,4144.110416,2,99,7,7,1.74,4,4,2,0,0,2,56,1,2,5,NA +68944,7,2,2,79,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,20341.088581,21872.034752,1,93,2,2,0.64,1,1,0,0,1,2,79,1,4,3,NA +68945,7,2,2,27,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,17568.277926,19062.73336,1,90,2,2,0.56,2,2,1,0,0,2,27,1,3,5,NA +68946,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,82743.954233,85642.054874,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +68947,7,2,2,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,10033.449917,10806.84762,2,95,13,13,NA,2,2,0,0,2,2,80,1,1,1,NA +68948,7,2,2,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,86578.861495,89037.775585,2,101,7,7,1.88,4,4,0,2,0,2,36,1,4,1,5 +68949,7,2,1,63,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,9145.939054,9651.644596,1,101,5,5,0.87,4,4,0,0,2,1,63,2,1,1,NA +68950,7,2,2,38,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,39561.667842,38494.210933,2,98,7,7,1.33,6,6,0,3,0,1,31,1,3,6,NA +68951,7,2,1,4,NA,1,1,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16775.083123,16973.400581,3,92,4,4,0.6,6,6,2,2,0,2,24,1,3,6,NA +68952,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,56397.521122,64147.609457,2,91,7,7,2.51,2,2,0,0,1,2,80,1,5,2,NA +68953,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,24919.497762,27697.191423,1,101,4,4,0.78,4,4,1,2,0,2,32,1,3,3,NA +68954,7,2,2,1,22,4,4,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10927.526143,11412.763748,2,102,2,2,0.36,4,4,1,2,0,2,36,1,3,5,NA +68955,7,2,1,59,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32680.7991,1,95,15,15,3.62,7,7,2,4,0,1,59,1,5,1,2 +68956,7,2,2,14,NA,3,3,1,14,177,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28004.718304,30534.517049,1,94,7,7,1.21,6,6,2,2,0,1,31,1,2,6,NA +68957,7,2,1,12,NA,4,4,2,13,156,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,6,6,1.85,2,2,0,1,0,2,48,1,4,5,NA +68958,7,2,1,12,NA,1,1,1,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30061.88611,32302.400867,1,92,10,10,3.04,4,4,1,1,0,1,32,1,3,1,2 +68959,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,17777.254625,18901.462969,2,99,NA,77,NA,3,1,0,0,1,1,63,1,3,5,NA +68960,7,2,2,10,NA,2,2,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,15897.166957,16345.216522,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +68961,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,117419.769432,119338.215671,2,95,15,15,5,2,2,0,0,2,1,70,1,5,1,5 +68962,7,2,1,14,NA,5,6,2,14,177,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11506.937395,12032.024805,1,97,15,15,5,3,3,0,1,0,2,45,2,5,1,5 +68963,7,2,2,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6306.491784,7047.470907,2,90,6,6,1.34,4,4,1,0,0,1,38,2,4,6,NA +68964,7,2,1,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19130.866571,19325.235628,2,99,6,6,2.95,1,1,0,0,0,1,20,1,3,5,NA +68965,7,2,2,2,NA,3,3,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20820.221848,22126.060024,1,101,5,5,0.89,5,5,1,0,0,1,25,1,2,77,NA +68966,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,11982.125462,2,97,1,1,0,2,2,0,0,1,2,63,1,4,5,NA +68967,7,2,1,20,NA,4,4,1,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26503.609729,2,101,3,1,0,2,1,0,0,0,1,20,2,4,5,NA +68968,7,2,1,12,NA,1,1,1,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22768.423624,22944.003607,3,92,4,4,0.81,3,3,0,2,0,2,31,1,3,1,NA +68969,7,2,1,0,1,1,1,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7040.676479,6971.095244,1,98,9,1,0.04,7,1,3,2,0,2,32,1,4,1,4 +68970,7,2,1,11,NA,1,1,2,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13285.093011,13153.997889,2,94,7,7,1.88,4,4,0,2,0,2,28,1,4,4,NA +68971,7,2,2,21,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,42583.505439,50840.190326,2,91,4,4,0.69,4,4,2,0,0,2,21,1,3,6,NA +68972,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,11771.283932,12488.02543,1,90,9,9,2.07,5,5,0,0,1,1,46,2,4,1,3 +68973,7,2,1,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6837.992772,6921.398172,1,96,15,15,4.34,4,4,1,1,0,1,39,2,5,1,5 +68974,7,2,1,10,NA,4,4,1,10,123,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10311.165779,10434.780551,2,98,8,8,2.43,3,3,0,2,0,2,31,1,4,1,NA +68975,7,2,2,3,NA,3,3,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,85197.465687,87881.529962,1,92,15,15,5,4,4,2,0,0,2,46,1,5,1,5 +68976,7,2,1,44,NA,5,7,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12254.763576,12210.492386,2,90,3,3,0.65,5,3,1,2,0,1,44,2,5,1,5 +68977,7,2,1,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,1,2,2,NA,13251.84987,13511.423639,2,95,4,4,0.76,4,4,0,1,2,1,80,1,1,2,NA +68978,7,2,1,39,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,113559.363135,120841.424294,2,102,15,15,5,4,4,0,2,0,1,39,1,4,1,5 +68979,7,2,2,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,74518.988514,1,98,14,14,4.12,4,4,0,2,0,2,36,1,5,1,3 +68980,7,2,1,20,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,2,2,2,1,2,2,1,35669.2076,36620.108921,2,94,77,77,NA,4,4,0,0,0,1,28,2,1,3,NA +68981,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,40870.323556,45647.400007,2,99,15,15,5,1,1,0,0,1,2,80,1,5,3,NA +68982,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,3,1,1,1,2,2,1,2,2,1,2,2,1,17858.942687,18621.550977,1,97,15,15,4.84,6,6,2,0,0,1,53,NA,NA,1,NA +68983,7,2,1,67,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11568.876339,11794.347884,1,102,6,6,2.75,1,1,0,0,1,1,67,1,5,3,NA +68984,7,2,2,0,9,3,3,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21671.775435,21083.121886,1,101,9,9,2.39,4,4,1,0,0,2,57,1,2,77,NA +68985,7,2,2,16,NA,4,4,1,16,201,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13895.342981,13964.270792,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +68986,7,2,2,18,NA,4,4,2,19,228,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,21329.621847,2,101,12,12,NA,4,4,0,0,0,1,57,1,3,1,3 +68987,7,2,1,9,NA,2,2,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15882.795076,15889.831109,1,97,3,3,0.44,5,5,2,2,0,2,26,1,4,4,NA +68988,7,2,1,72,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,NA,8497.912951,8999.288803,2,100,2,2,0.73,1,1,0,0,1,1,72,1,1,4,NA +68989,7,2,1,34,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,13601.994691,14463.629992,2,100,9,9,2.46,4,4,0,2,0,2,36,2,4,1,3 +68990,7,2,1,53,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22446.308035,22116.943066,2,91,10,10,2.95,4,4,0,1,0,2,18,1,3,NA,NA +68991,7,2,1,40,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,34152.149953,40351.498105,1,90,5,5,1,4,4,0,2,0,1,40,2,2,1,1 +68992,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,17533.239798,17053.396696,2,99,3,3,0.44,5,5,1,1,0,2,53,1,4,1,3 +68993,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,19005.010125,19043.816772,1,92,2,2,0.24,5,5,0,2,0,1,35,2,4,1,3 +68994,7,2,1,19,NA,3,3,1,19,233,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,74191.50646,74370.660378,1,98,8,8,2.62,3,3,0,0,0,1,50,NA,NA,3,NA +68995,7,2,1,75,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,60942.568495,64726.722108,1,94,14,14,5,2,2,0,0,2,2,72,1,5,1,5 +68996,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,NA,1,2,2,1,2,2,1,2,2,NA,14385.653726,15564.966804,2,101,7,5,1.84,2,1,0,0,0,1,23,2,4,5,NA +68997,7,2,1,7,NA,2,2,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13599.766245,14493.354345,2,93,3,3,0.48,4,4,1,1,0,1,49,2,3,1,4 +68998,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,15206.604563,15895.992431,2,90,15,15,5,4,4,1,1,0,1,53,2,5,1,5 +68999,7,2,1,2,NA,4,4,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8022.100831,8353.575096,2,102,4,4,0.53,6,6,2,2,0,2,27,1,2,1,2 +69000,7,2,1,13,NA,3,3,2,13,163,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,26824.630008,26472.092796,1,95,1,1,0.12,3,3,0,2,0,2,40,1,5,3,NA +69001,7,2,1,68,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,6038.685119,6274.869975,1,96,6,6,1.57,3,3,0,0,1,1,42,1,3,NA,NA +69002,7,2,1,8,NA,1,1,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14007.413517,2,98,15,15,4.97,5,5,0,3,0,1,39,1,5,1,5 +69003,7,2,1,7,NA,2,2,2,7,88,NA,NA,2,2,3,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9390.522479,10327.334743,2,90,2,2,0.32,4,4,1,2,0,2,34,2,1,77,NA +69004,7,2,1,16,NA,1,1,2,16,200,NA,NA,1,1,NA,9,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,18120.499457,19917.650851,1,90,1,1,0.02,5,5,0,1,0,2,39,2,1,1,2 +69005,7,2,2,77,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60723.387753,62586.321432,1,96,14,14,5,2,2,0,0,2,1,74,1,5,1,4 +69006,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,95214.22557,95506.977757,1,97,15,15,3.89,5,5,0,2,0,1,50,1,4,6,NA +69007,7,2,1,55,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,2,4,NA,2,2,2,NA,NA,NA,2,2,1,2,24211.824535,26078.926124,2,93,3,3,0.43,4,4,0,0,0,1,45,2,2,6,NA +69008,7,1,2,65,NA,2,2,NA,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9325.158469,0,1,93,15,15,5,2,2,0,0,2,2,65,2,4,1,5 +69009,7,2,1,56,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18416.819037,18519.889723,2,96,8,8,3.67,2,2,0,0,0,1,56,2,5,1,5 +69010,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,13799.782578,14328.748539,2,103,7,7,1.48,5,5,0,1,1,2,80,1,4,3,NA +69011,7,2,2,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,170311.62251,172039.874492,1,94,15,15,5,4,3,0,0,1,1,33,1,2,5,NA +69012,7,2,1,1,14,2,2,2,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8331.647763,8430.145707,2,90,8,8,1.72,5,5,1,2,0,1,20,2,1,1,2 +69013,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,18876.596264,19790.278241,1,101,3,3,0.44,5,5,0,3,0,1,35,1,3,1,4 +69014,7,2,1,78,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60942.568495,64726.722108,1,91,10,10,4.3,2,2,0,0,2,1,78,1,4,1,4 +69015,7,2,1,0,1,2,2,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,7328.080818,7255.659238,2,102,15,15,2.43,7,7,3,2,0,1,28,2,5,1,4 +69016,7,2,2,13,NA,4,4,1,13,159,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14166.687432,14745.171396,1,100,1,1,0,4,4,1,2,0,2,35,1,2,5,NA +69017,7,2,1,58,NA,4,4,2,NA,NA,2,NA,2,2,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16695.743237,21107.492082,3,90,12,12,NA,2,2,0,0,0,2,56,2,4,1,5 +69018,7,2,1,39,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,16058.989596,16964.610342,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +69019,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,138322.767578,151356.795097,1,101,13,13,NA,2,2,0,0,0,1,40,1,2,1,3 +69020,7,2,1,42,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,35551.992846,35164.643493,3,91,15,14,4.03,5,4,2,0,0,1,42,2,4,1,5 +69021,7,2,1,18,NA,1,1,1,18,220,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27186.265479,27336.512389,1,95,4,4,0.68,5,5,0,1,0,2,38,2,3,4,NA +69022,7,2,2,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,42424.587753,44729.774642,2,102,4,4,1.16,2,2,0,0,0,1,48,1,4,1,4 +69023,7,2,2,7,NA,5,7,1,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14676.903347,14493.499136,1,102,5,5,1.27,3,3,0,2,0,2,38,1,2,3,NA +69024,7,2,1,65,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11764.405491,12074.424659,1,97,4,4,1.34,1,1,0,0,1,1,65,1,5,3,NA +69025,7,2,1,60,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,11937.570805,12597.633777,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +69026,7,2,2,1,19,1,1,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9469.751474,10066.755659,1,102,13,13,NA,6,6,1,2,0,2,36,2,4,6,NA +69027,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,96536.931937,99301.799305,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +69028,7,2,1,0,5,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7757.493251,8192.524698,3,92,8,8,1.45,6,6,2,0,0,2,58,2,5,1,9 +69029,7,2,2,6,NA,4,4,2,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7631.175557,7797.231767,1,93,1,1,0.02,5,5,0,4,0,2,36,NA,NA,5,NA +69030,7,1,1,36,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,22188.836739,0,1,101,13,13,NA,3,3,1,0,0,2,20,1,2,6,NA +69031,7,2,1,22,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,5,NA,1,2,2,1,2,2,1,2,2,3,15196.92397,17064.888752,2,101,9,6,2.3,4,1,0,0,0,1,22,2,3,5,NA +69032,7,2,2,64,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,2,NA,2,2,2,1,2,2,NA,NA,NA,NA,6287.91334,6572.718606,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +69033,7,2,1,2,NA,3,3,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50064.977404,56868.769772,1,95,14,14,2.98,5,5,1,2,0,1,33,1,4,1,5 +69034,7,2,1,33,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,2,6,NA,2,2,2,1,2,2,2,2,1,2,36418.962534,36838.502529,2,93,4,4,0.56,5,5,0,2,0,1,37,NA,NA,1,1 +69035,7,2,1,68,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,14,14,5,2,2,0,0,2,1,68,1,4,1,4 +69036,7,2,1,76,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,8764.234393,9213.337166,2,98,77,77,NA,2,2,0,0,2,2,70,1,3,1,2 +69037,7,2,1,41,NA,1,1,1,NA,NA,2,NA,2,1,4,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,37402.70356,39181.236579,2,102,15,15,5,3,3,1,0,0,1,41,2,2,1,5 +69038,7,2,2,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,99381.891022,103468.309204,2,92,15,15,5,2,1,0,0,0,2,29,1,5,1,NA +69039,7,1,1,39,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,83081.99261,0,2,92,15,15,5,2,1,0,0,0,1,41,1,4,5,NA +69040,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,92399.914697,92845.296279,2,92,15,15,5,5,5,0,3,0,2,46,1,5,1,5 +69041,7,2,1,8,NA,4,4,1,8,101,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10311.165779,10516.173846,2,98,4,4,1.29,2,2,0,1,0,2,27,1,2,5,NA +69042,7,2,1,33,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,3,6,NA,2,2,2,1,2,2,1,2,2,1,43108.74283,43605.347908,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +69043,7,2,1,5,NA,5,6,2,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4526.77644,4888.797036,3,90,12,12,NA,5,5,1,2,0,1,37,2,5,1,5 +69044,7,2,2,0,8,2,2,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,7135.777159,7112.267328,1,90,7,7,1.56,4,4,1,1,0,2,37,1,2,77,NA +69045,7,2,2,65,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,4,1,NA,2,2,2,1,2,2,1,2,2,2,13676.984152,14509.761798,2,91,8,8,3.3,2,2,0,0,2,1,65,NA,NA,1,4 +69046,7,2,1,3,NA,5,6,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8402.098771,9423.873047,3,91,7,7,2.16,3,3,1,0,1,2,36,2,5,1,NA +69047,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,98514.948291,98181.677236,1,99,15,15,5,2,2,0,0,2,1,73,1,4,1,5 +69048,7,2,2,11,NA,3,3,1,11,143,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18800.96526,18551.296274,1,94,6,6,1.26,5,5,0,2,0,2,38,1,4,1,NA +69049,7,2,1,71,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,1,2,1,2,2,1,1,2,NA,10776.442569,10987.528707,1,96,7,7,1,7,7,2,1,1,2,53,1,4,1,3 +69050,7,2,2,1,22,3,3,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39879.891371,42381.146401,1,91,14,14,3.06,5,5,2,0,0,2,30,1,5,1,5 +69051,7,2,2,5,NA,3,3,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51483.624552,53105.566664,1,94,15,15,5,4,4,2,0,0,1,51,2,5,1,5 +69052,7,1,2,40,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,3,1,2,2,1,2,2,NA,NA,NA,NA,115926.402585,0,1,101,15,15,5,4,4,0,2,0,2,40,1,4,1,3 +69053,7,2,2,43,NA,2,2,2,NA,NA,2,NA,2,1,1,NA,3,6,2,2,2,2,2,2,2,2,2,2,2,34503.935186,34683.870273,2,91,12,12,NA,5,5,0,1,1,2,43,2,3,6,NA +69054,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19633.637051,21699.358471,2,95,5,5,1.05,3,3,0,1,0,1,43,1,3,1,2 +69055,7,2,2,28,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,53638.260635,56251.206542,2,96,7,7,2.38,2,2,0,0,0,1,29,1,3,1,4 +69056,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13593.59406,14525.996816,2,90,5,5,1.08,3,3,0,1,0,2,29,2,4,1,5 +69057,7,2,2,39,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,4,1,2,2,2,2,1,2,2,NA,NA,NA,NA,29148.354549,28361.870708,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +69058,7,2,1,43,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,6,NA,2,2,1,1,2,2,NA,NA,NA,NA,37324.655911,39220.856657,1,102,5,5,0.86,5,5,2,0,0,2,21,2,2,5,NA +69059,7,2,1,2,NA,4,4,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5662.231921,6243.536586,1,99,13,13,NA,4,4,1,0,0,2,26,1,4,4,NA +69060,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,137038.746155,146586.432966,2,101,3,3,0.92,2,1,0,0,0,1,21,1,4,5,NA +69061,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,26105.275101,26256.723843,1,98,9,9,4.03,2,2,0,1,0,2,49,1,5,3,NA +69062,7,2,2,70,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,2,NA,1,2,1,1,2,1,1,2,1,NA,10831.995402,11374.881633,3,90,77,77,NA,4,4,0,0,2,1,69,2,5,2,NA +69063,7,2,1,2,NA,1,1,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10803.555682,11221.222518,2,91,6,6,1,6,6,1,3,0,2,35,2,2,1,1 +69064,7,2,2,6,NA,4,4,1,6,81,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11195.065587,11390.355382,2,96,2,2,0.31,4,4,0,2,0,2,30,NA,NA,6,NA +69065,7,2,1,28,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,15171.949804,3,91,15,6,2.75,2,1,0,0,0,2,30,NA,NA,6,NA +69066,7,2,1,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60942.568495,64726.722108,1,94,9,9,3.97,2,2,0,0,2,1,74,1,4,1,4 +69067,7,2,1,53,NA,5,6,1,NA,NA,2,NA,2,2,77,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16590.074977,17115.36835,1,92,12,12,NA,4,4,0,1,0,1,53,2,5,1,4 +69068,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,16614.865368,17238.21833,3,91,15,15,5,3,3,1,0,0,2,39,2,5,1,5 +69069,7,2,1,11,NA,4,4,1,11,136,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10269.191209,10473.364732,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +69070,7,2,2,4,NA,5,6,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6683.092466,6676.033575,3,91,6,6,1.34,4,4,1,1,0,1,36,2,4,1,NA +69071,7,2,1,4,NA,5,6,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7580.437211,8294.186048,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +69072,7,1,2,0,3,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6440.205112,0,2,103,14,14,3.86,4,4,2,0,0,2,37,2,5,1,NA +69073,7,2,2,3,NA,5,6,1,3,44,NA,NA,2,2,1,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8052.137959,8043.633038,1,100,7,7,2.2,3,3,1,0,0,2,28,2,2,1,3 +69074,7,2,1,19,NA,1,1,2,19,237,2,NA,2,2,4,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26704.187335,28443.712885,1,95,9,9,2.46,4,4,0,0,0,1,42,2,2,1,3 +69075,7,2,1,2,NA,4,4,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5163.141902,5376.483607,2,99,13,13,NA,5,5,2,0,0,2,21,1,3,5,NA +69076,7,2,1,18,NA,3,3,1,18,220,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24446.632088,24751.360191,1,94,4,4,0.79,3,3,0,1,0,1,49,1,2,3,NA +69077,7,2,2,58,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,35630.227837,37045.269032,2,102,6,6,2.75,1,1,0,0,0,2,58,1,2,3,NA +69078,7,2,2,59,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,27617.038547,29182.278408,1,93,14,14,5,2,2,0,0,0,2,59,2,5,5,NA +69079,7,2,1,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,18683.628164,19333.389409,1,98,5,4,1.7,3,1,0,0,0,1,32,1,5,5,NA +69080,7,2,1,16,NA,4,4,1,16,202,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18413.211403,2,101,4,4,0.86,3,3,0,1,0,2,18,1,2,NA,NA +69081,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,15992.133387,15205.505219,2,95,15,15,3.85,7,7,0,3,1,2,62,1,4,2,NA +69082,7,2,1,8,NA,1,1,2,8,97,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14134.674028,14215.818763,1,96,8,8,2.62,3,3,0,1,0,1,41,2,3,1,5 +69083,7,2,1,14,NA,3,3,2,14,171,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20051.633575,19994.174398,2,97,5,5,0.84,5,5,0,2,0,2,33,1,4,1,3 +69084,7,2,1,2,NA,4,4,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,10545.226242,2,101,1,1,0.21,4,4,1,2,0,2,26,1,3,5,NA +69085,7,2,2,49,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,2,5,NA,2,2,2,1,2,2,1,2,2,2,28065.587512,28753.959014,2,93,4,4,0.56,5,5,0,0,0,2,49,2,2,5,NA +69086,7,2,2,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,104934.725755,111516.131691,2,98,10,10,4.42,2,2,0,0,0,1,25,1,5,1,5 +69087,7,2,2,15,NA,3,3,2,15,189,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,36586.371708,39087.782259,1,98,3,3,0.5,5,5,0,3,0,2,56,1,3,3,NA +69088,7,2,2,67,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,10614.141896,11057.12801,2,93,4,4,0.99,2,2,0,0,2,1,72,2,3,1,4 +69089,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,12170.074646,12490.78413,1,97,9,7,3.36,2,1,0,0,1,1,61,1,5,3,NA +69090,7,2,1,2,NA,3,3,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20538.767297,24065.985233,2,95,3,3,0.52,3,3,1,0,0,1,37,1,4,1,4 +69091,7,2,1,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,132969.642582,135979.403496,2,94,8,8,4.59,1,1,0,0,0,1,52,1,3,3,NA +69092,7,2,2,0,4,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16423.151355,17405.028297,1,99,15,15,5,3,3,1,0,0,2,31,1,5,1,5 +69093,7,2,1,16,NA,5,6,2,16,201,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9099.599144,9725.105491,1,90,9,9,2.6,4,4,0,1,0,2,49,2,2,1,5 +69094,7,2,1,3,NA,3,3,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21357.821814,24096.698658,2,96,3,3,0.53,5,5,3,0,0,2,26,1,4,1,4 +69095,7,2,1,1,14,1,1,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12387.68972,13272.515505,1,94,6,6,1.3,4,4,2,0,0,1,24,2,1,1,4 +69096,7,1,1,12,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13731.625553,0,1,100,8,8,1.95,4,4,0,2,0,2,42,1,4,1,4 +69097,7,2,1,31,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,2,2,2,1,2,2,2,2,2,2,36946.697686,39295.803447,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +69098,7,2,1,14,NA,1,1,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18242.832494,18343.652859,1,102,6,6,1.34,4,4,0,1,0,2,48,2,3,1,1 +69099,7,2,1,6,NA,4,4,2,6,82,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9399.447563,9986.021526,2,90,7,7,1.61,4,4,1,1,1,2,65,1,3,2,NA +69100,7,1,2,77,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,14125.505993,0,1,99,14,14,5,2,2,0,0,2,1,79,NA,NA,1,5 +69101,7,2,1,58,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,25042.846308,24675.381142,1,93,14,6,2.94,5,1,1,0,0,2,22,2,1,6,NA +69102,7,2,2,61,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,1,NA,1,2,2,1,2,2,2,2,2,2,5852.076897,6537.978856,2,90,7,7,0.89,7,7,1,3,3,1,60,2,3,1,3 +69103,7,2,1,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,16995.648055,16598.645683,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +69104,7,2,1,5,NA,1,1,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14993.478359,14600.446315,1,97,6,3,0.63,7,3,2,1,0,1,29,2,2,1,1 +69105,7,2,1,55,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,1,5,NA,2,2,2,2,2,2,1,2,2,2,37557.946192,37006.841228,2,102,5,5,1.08,3,3,0,0,0,1,55,2,1,5,NA +69106,7,2,2,0,8,5,7,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7434.184594,7384.233557,1,93,15,15,5,3,3,1,0,0,2,34,1,5,1,5 +69107,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,7323.703412,7380.991723,2,100,4,4,0.97,3,3,0,0,3,2,80,1,5,2,NA +69108,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,22154.880695,2,97,5,5,1.08,3,3,0,0,0,1,38,1,4,5,NA +69109,7,2,1,1,19,1,1,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11793.948458,12249.904005,1,100,5,5,0.65,6,6,1,2,0,1,32,2,2,1,2 +69110,7,2,2,56,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,24870.513993,25282.537357,2,98,8,8,3.06,2,2,0,1,0,2,56,1,3,3,NA +69111,7,2,1,9,NA,3,3,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,40950.556053,42121.524492,2,95,15,15,4.77,4,4,0,2,0,2,36,1,4,1,5 +69112,7,2,2,23,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,16929.836231,18556.498474,2,101,4,3,1.1,2,1,0,0,0,2,23,2,4,5,NA +69113,7,2,2,8,NA,3,3,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,51531.402068,50847.086518,1,94,6,6,1.57,3,3,0,1,0,2,28,1,4,1,4 +69114,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,NA,NA,NA,NA,NA,NA,NA,84761.905629,91116.013503,1,95,NA,NA,NA,5,5,0,2,0,2,37,1,3,1,NA +69115,7,2,1,79,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,8517.336599,8684.171961,2,100,4,4,1.02,2,2,0,0,1,1,79,1,1,2,NA +69116,7,2,1,14,NA,3,3,2,14,170,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,88198.948426,91036.751291,1,98,10,10,3.04,4,4,0,2,0,2,47,1,4,1,3 +69117,7,2,1,28,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21399.459455,20960.973241,1,90,15,15,4.34,4,4,0,0,1,1,62,2,5,1,3 +69118,7,2,1,11,NA,5,6,2,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,1,1,2,2,NA,4852.395137,5120.382571,1,99,6,6,1.07,6,6,2,1,2,1,44,2,5,4,NA +69119,7,2,1,16,NA,4,4,1,16,203,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15008.400374,15566.530345,1,100,7,7,2.78,2,2,0,1,0,2,37,2,4,5,NA +69120,7,2,2,39,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,27303.803575,27591.614113,1,96,3,3,0.43,4,4,1,1,0,2,39,2,4,1,3 +69121,7,2,2,5,NA,5,7,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,92,3,3,0.46,5,5,2,1,0,1,30,1,3,1,2 +69122,7,2,1,16,NA,4,4,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10732.729133,10991.603368,3,90,10,10,3.67,3,3,0,1,0,2,52,2,3,5,NA +69123,7,2,2,63,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,128590.415432,131137.819973,1,102,15,15,5,2,2,0,0,2,2,63,1,4,1,4 +69124,7,2,2,19,NA,5,6,2,20,NA,2,NA,2,2,2,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10353.070387,10520.518116,2,101,5,3,1.1,2,1,0,0,0,1,29,2,4,1,NA +69125,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,133853.800452,137185.265763,3,91,5,5,1.93,1,1,0,0,0,2,49,1,3,3,NA +69126,7,2,1,3,NA,3,3,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,77607.205684,90935.051698,1,98,6,6,1.31,3,3,1,0,0,1,30,1,5,1,5 +69127,7,2,1,8,NA,3,3,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,54897.892683,58386.014643,2,98,7,7,1.61,4,4,1,1,0,1,43,NA,NA,6,NA +69128,7,2,1,8,NA,4,4,1,8,97,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9184.716222,9199.031651,1,102,1,1,0,5,5,0,3,0,2,41,1,4,1,4 +69129,7,2,1,18,NA,2,2,1,18,225,2,NA,2,2,2,66,NA,NA,NA,2,2,2,2,2,2,1,2,2,2,22721.243258,22896.459408,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +69130,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,31540.022655,39899.113022,2,91,3,3,0.86,2,2,0,0,0,2,41,1,4,1,3 +69131,7,2,2,25,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,22941.698794,22487.759922,2,96,5,5,1.08,3,3,0,0,0,1,50,1,3,1,4 +69132,7,2,1,6,NA,4,4,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11277.594097,11665.009628,1,90,5,5,0.74,5,5,0,2,0,2,18,1,4,NA,NA +69133,7,2,2,1,20,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7623.406054,7742.751523,1,97,4,4,0.46,7,7,3,3,0,2,31,1,3,1,NA +69134,7,2,2,2,NA,4,4,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5687.793894,6002.477845,2,90,8,5,1.36,5,2,2,0,0,2,25,2,3,5,NA +69135,7,1,1,40,NA,5,6,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17210.953493,0,1,91,15,15,5,5,5,2,1,0,1,40,1,5,1,5 +69136,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,4,6,2,2,2,2,2,2,2,1,2,2,2,36453.846815,35470.245447,1,102,13,13,NA,6,6,1,2,0,2,36,2,4,6,NA +69137,7,2,1,56,NA,4,4,2,NA,NA,2,NA,2,2,8,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15760.921402,15756.795819,3,90,15,15,5,4,4,0,0,0,1,56,2,4,1,5 +69138,7,2,2,16,NA,3,3,1,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71832.578284,73443.760792,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +69139,7,2,2,17,NA,2,2,1,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,2,2,2,NA,NA,NA,NA,27070.679378,27847.54398,1,92,6,6,0.93,5,5,0,2,0,1,47,2,1,1,1 +69140,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,44862.41765,53799.51702,1,92,7,7,2.64,2,2,0,0,2,1,80,1,3,1,3 +69141,7,2,1,80,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,8497.912951,8999.288803,1,96,6,6,1.82,2,2,0,0,2,1,80,1,1,1,9 +69142,7,2,1,72,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,38226.070503,39676.327756,1,99,9,9,5,1,1,0,0,1,1,72,1,5,2,NA +69143,7,2,2,10,NA,4,4,1,10,130,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7489.549692,8064.290136,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +69144,7,2,2,71,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,14936.784897,17875.873101,2,94,5,5,2.2,1,1,0,0,1,2,71,1,3,2,NA +69145,7,2,1,18,NA,1,1,1,18,217,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15469.666055,15805.71937,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +69146,7,2,1,41,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,28361.113525,28406.771707,1,97,8,8,4.7,1,1,0,0,0,1,41,1,3,3,NA +69147,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,1,1,2,2,1,17605.619977,18470.699991,3,91,15,15,5,3,3,0,1,0,2,40,2,5,1,5 +69148,7,2,1,5,NA,3,3,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,73006.119819,83450.013654,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +69149,7,2,1,62,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7791.74373,7821.068134,1,91,7,7,3.54,1,1,0,0,1,1,62,1,3,3,NA +69150,7,2,2,6,NA,4,4,2,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8757.841043,9104.895674,2,101,5,5,1.03,4,4,1,1,0,2,31,1,3,5,NA +69151,7,2,1,57,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,119599.307776,123574.267321,1,93,15,15,4.59,4,4,0,1,0,1,57,1,5,1,5 +69152,7,2,1,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17743.990528,2,97,3,3,0.82,2,2,0,0,0,1,24,1,3,5,NA +69153,7,2,1,10,NA,4,4,2,10,124,NA,NA,2,1,3,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10229.206765,10406.656985,1,96,9,9,2.78,4,4,0,2,0,1,54,2,5,4,NA +69154,7,2,1,66,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,29999.543427,32474.673757,2,91,2,2,0.56,1,1,0,0,1,1,66,1,3,3,NA +69155,7,2,2,9,NA,3,3,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74327.830279,75742.187091,2,91,6,6,1.34,4,4,1,2,0,2,33,1,4,3,NA +69156,7,2,1,12,NA,3,3,1,12,155,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,84860.612577,85065.529717,2,98,15,15,5,4,4,0,2,0,1,48,1,3,1,4 +69157,7,2,2,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,1,2,2,1,112960.559471,113970.503883,1,94,99,99,NA,5,5,1,1,0,2,21,1,3,5,NA +69158,7,2,1,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32719.762791,33772.872733,1,91,1,1,0.2,2,2,0,0,0,1,44,1,2,1,2 +69159,7,2,2,22,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,5,5,2,2,2,2,2,2,2,1,2,2,1,35424.746838,36356.556801,2,93,NA,3,0.98,4,1,0,0,0,1,28,NA,NA,4,NA +69160,7,2,1,17,NA,1,1,1,17,208,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,27186.265479,27776.842846,1,92,15,15,4.99,4,4,0,2,0,2,43,1,4,1,4 +69161,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,22233.683089,25178.838093,1,102,2,2,0.49,3,3,1,0,0,1,20,1,2,6,NA +69162,7,2,1,72,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,4,5,NA,2,2,2,2,2,2,2,2,2,NA,12250.041239,12463.587232,2,100,1,1,0,1,1,0,0,1,1,72,2,4,5,NA +69163,7,2,2,10,NA,5,7,1,10,123,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9007.62445,9504.796896,2,102,15,15,5,4,4,0,2,0,1,39,1,4,1,5 +69164,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,51433.469947,56330.524019,1,98,7,7,3.8,1,1,0,0,1,2,80,1,5,2,NA +69165,7,2,1,72,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,18239.933451,19545.291055,2,102,8,8,3.67,2,2,0,0,2,1,72,2,5,1,NA +69166,7,2,1,60,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,6038.685119,6085.921613,1,96,15,15,5,3,3,0,0,1,1,60,2,5,1,5 +69167,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,27681.279,30792.259764,1,91,3,3,1.29,1,1,0,0,1,2,80,1,2,2,NA +69168,7,2,1,75,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,4,NA,1,2,2,1,2,2,1,2,2,NA,8902.117734,9243.371936,1,97,15,15,5,6,6,0,1,1,2,53,1,4,1,NA +69169,7,2,1,10,NA,4,4,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10122.702296,10604.04698,2,100,3,3,0.42,5,5,0,1,0,2,51,1,4,5,NA +69170,7,2,2,51,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22224.73066,22340.630739,2,91,10,10,2.95,4,4,0,1,0,2,18,1,3,NA,NA +69171,7,2,2,40,NA,2,2,1,NA,NA,2,NA,2,1,2,NA,4,5,2,2,2,2,2,2,2,2,2,1,2,32281.860274,32750.128834,2,93,7,7,2.31,2,2,0,0,1,2,40,2,4,5,NA +69172,7,2,2,65,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9570.416297,9969.842041,2,98,6,6,2.75,1,1,0,0,1,2,65,1,4,3,NA +69173,7,2,1,14,NA,4,4,1,14,171,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14848.504688,14877.861397,1,98,8,8,1.95,4,4,0,2,0,2,31,1,2,1,5 +69174,7,2,2,12,NA,4,4,1,12,152,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11838.873374,11750.256617,2,100,15,15,4.47,4,4,0,2,0,1,39,NA,NA,1,5 +69175,7,2,2,32,NA,2,2,2,NA,NA,1,1,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,27127.983961,26396.013964,2,90,15,15,4.2,5,5,1,0,0,2,50,NA,NA,6,NA +69176,7,2,2,57,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,26668.458882,26828.838508,2,102,5,5,1.84,1,1,0,0,0,2,57,1,3,6,NA +69177,7,2,1,66,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,8,8,3.4,2,2,0,0,2,1,66,1,5,1,4 +69178,7,2,2,28,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,1,1,2,2,1,10800.351372,11472.015663,2,92,3,3,0.45,4,4,0,0,1,1,64,2,1,1,1 +69179,7,1,2,14,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15847.19263,0,1,98,15,15,5,4,4,0,2,0,2,50,1,5,1,5 +69180,7,2,2,1,16,4,4,2,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,7906.792868,2,95,10,10,2.32,6,6,1,2,0,1,44,1,4,1,4 +69181,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,5,2,1,2,2,1,2,2,1,2,2,1,90299.161173,91599.679037,1,95,7,7,2.54,2,2,0,1,0,2,37,1,1,5,NA +69182,7,2,2,8,NA,2,2,2,8,103,NA,NA,2,2,1,3,NA,NA,NA,2,1,2,1,2,2,2,2,2,2,10762.400563,12070.126078,2,90,3,3,0.46,5,5,1,3,0,2,35,2,1,4,NA +69183,7,2,1,6,NA,1,1,1,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10658.399025,10722.994279,1,102,8,8,1.33,7,7,1,4,0,2,32,1,3,1,2 +69184,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,34082.896551,1,92,4,4,1.16,2,2,0,0,1,1,56,1,2,1,3 +69185,7,2,1,60,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,2,1,2,2,2,2,1,2,6449.12882,6552.435629,2,93,7,7,1.83,3,3,0,1,1,1,60,2,2,1,4 +69186,7,1,1,5,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,0,2,100,2,2,0.25,4,4,2,1,0,2,39,1,2,5,NA +69187,7,2,2,22,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,1,5,2,2,2,2,2,2,2,NA,NA,NA,NA,31196.446669,31060.57243,2,99,99,1,0,5,1,0,1,0,1,40,2,1,6,NA +69188,7,2,2,8,NA,5,7,2,8,100,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9620.269705,10273.007637,2,91,12,12,NA,4,4,0,2,0,1,40,1,5,1,5 +69189,7,2,1,3,NA,4,4,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,10162.494907,1,100,15,15,5,3,3,1,0,0,2,34,1,5,1,5 +69190,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,9,2,NA,1,1,2,1,2,2,1,1,2,NA,14971.827573,15430.401607,2,97,13,13,NA,4,4,1,0,1,2,45,1,2,5,NA +69191,7,2,1,0,11,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7757.493251,8192.524698,3,92,1,1,0.18,5,5,2,2,0,2,31,2,1,5,NA +69192,7,2,2,0,2,5,7,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9288.555962,9478.459453,1,95,6,6,0.96,5,5,1,0,1,2,69,1,1,2,NA +69193,7,2,2,12,NA,2,2,2,12,147,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,19480.517135,20370.224649,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +69194,7,2,2,6,NA,4,4,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10332.067017,11124.939356,1,100,3,3,0.52,3,3,1,1,0,2,25,1,3,5,NA +69195,7,2,2,10,NA,3,3,2,10,130,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14935.786363,14737.445343,2,94,7,7,1.18,7,7,1,4,0,2,31,1,4,6,NA +69196,7,2,1,27,NA,5,7,1,NA,NA,2,NA,2,2,3,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,32866.0119,33575.905633,1,98,99,99,NA,3,1,0,0,0,2,22,1,4,5,NA +69197,7,2,2,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8832.868731,8863.029978,1,102,2,2,0.19,7,7,2,2,0,1,48,2,9,1,9 +69198,7,2,2,13,NA,1,1,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,18368.872199,20151.001259,2,94,5,5,0.67,6,6,1,3,0,1,37,2,3,1,4 +69199,7,2,1,60,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,2,4,NA,1,2,1,1,2,1,1,2,1,3,6814.038157,7682.939373,2,91,12,13,NA,7,1,0,4,2,2,72,2,1,2,NA +69200,7,2,1,34,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,22957.82581,23425.428596,2,102,15,15,3.92,5,5,1,2,0,1,34,2,5,1,5 +69201,7,2,2,44,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20834.783335,21091.811515,2,94,15,15,5,5,5,0,2,1,1,47,2,5,1,5 +69202,7,2,1,9,NA,1,1,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,17882.621856,17720.218058,3,92,7,7,1.3,5,5,1,2,0,2,33,2,2,1,1 +69203,7,2,2,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8679.600111,2,95,9,9,4.92,1,1,0,0,1,2,66,1,5,3,NA +69204,7,2,2,16,NA,3,3,1,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30430.369428,31312.351655,3,92,5,5,1.03,4,4,0,3,0,1,55,1,4,4,NA +69205,7,2,2,47,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,14872.222375,15689.845848,2,92,7,7,1.61,4,4,0,2,0,1,51,2,3,1,3 +69206,7,1,1,80,NA,2,2,NA,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,13654.270555,0,2,93,7,7,2.31,2,2,0,0,2,1,80,2,1,1,1 +69207,7,2,2,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,27381.645976,29718.515739,2,95,5,4,1.52,3,1,0,0,0,1,31,1,4,5,NA +69208,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,1,2,NA,25840.959268,29976.982116,1,101,3,3,0.86,2,2,0,0,2,2,80,1,2,1,1 +69209,7,1,2,47,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,35469.911999,0,2,91,6,6,2.78,1,1,0,0,0,2,47,1,4,3,NA +69210,7,2,1,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26556.735732,2,101,1,1,0.09,2,1,0,0,0,1,23,1,5,5,NA +69211,7,2,1,0,2,5,6,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8377.359485,8321.07116,2,96,4,4,0.97,3,3,1,0,0,1,31,2,5,1,5 +69212,7,2,1,38,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,2,4,NA,2,2,2,1,2,2,1,2,2,2,41241.224595,41716.316195,2,102,6,6,1.03,5,5,1,1,0,1,37,1,2,1,2 +69213,7,2,2,47,NA,3,3,1,NA,NA,2,NA,2,2,7,NA,5,1,NA,2,2,2,1,2,2,2,2,2,2,27349.117265,27628.99562,2,93,6,6,1.65,2,2,0,0,0,1,52,2,3,1,5 +69214,7,2,2,0,1,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4137.127382,4416.757179,2,97,1,1,0.12,5,5,1,2,0,2,24,1,3,5,NA +69215,7,2,2,9,NA,1,1,1,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19194.228411,19883.529671,2,96,7,7,1.34,5,5,0,2,0,1,24,2,2,5,NA +69216,7,2,1,35,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22937.913723,23137.542903,1,100,3,3,0.43,4,4,0,2,0,1,35,1,4,1,3 +69217,7,2,2,16,NA,5,7,2,16,193,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,31716.869763,32129.640601,1,101,3,3,0.92,2,2,0,1,0,2,53,1,5,3,NA +69218,7,2,2,2,NA,1,1,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9132.13761,10082.124987,1,103,13,13,NA,4,4,2,0,0,2,27,2,2,6,NA +69219,7,2,1,4,NA,2,2,1,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15915.595287,17052.411707,2,96,6,6,1.25,4,4,1,1,0,1,31,2,3,1,3 +69220,7,2,2,21,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,6,1,1,2,2,1,2,2,1,2,2,1,52280.406546,52747.829022,1,92,1,1,0,2,1,0,0,0,1,30,1,3,6,NA +69221,7,2,2,51,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17950.494975,18684.288461,1,92,15,15,5,4,4,0,2,0,1,55,1,5,1,5 +69222,7,2,1,6,NA,3,3,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47178.298856,52231.302145,2,95,8,8,2.17,4,4,1,1,0,1,43,1,4,1,5 +69223,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,100722.771154,105550.354971,2,92,14,8,4.13,2,1,0,0,0,2,25,1,5,5,NA +69224,7,2,2,59,NA,2,2,2,NA,NA,2,NA,2,1,4,NA,1,6,NA,2,2,2,1,2,2,2,2,2,2,18341.621382,19145.40337,2,90,6,6,1.21,4,4,0,0,0,2,59,2,1,6,NA +69225,7,2,2,17,NA,1,1,2,17,209,2,NA,2,2,4,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17544.592739,19246.751055,3,92,6,6,1,6,6,1,1,0,1,42,2,1,1,4 +69226,7,2,2,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7588.605543,8103.359102,1,99,14,14,4.21,4,4,0,2,0,2,44,1,5,1,5 +69227,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14994.337564,15663.818698,1,100,15,15,5,2,2,0,0,1,2,48,1,5,5,NA +69228,7,2,1,17,NA,3,3,2,17,215,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,61479.689958,61628.148021,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +69229,7,2,1,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,93164.281583,96130.599912,2,95,8,8,2.17,4,4,1,1,0,1,43,1,4,1,5 +69230,7,2,2,8,NA,1,1,1,8,102,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16412.026403,3,92,4,4,0.81,3,3,0,2,0,2,31,1,3,1,NA +69231,7,2,1,10,NA,4,4,2,10,131,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12701.072484,14129.347101,2,91,6,6,0.78,7,7,1,4,0,2,38,2,2,77,NA +69232,7,2,1,0,6,2,2,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,6837.213048,7220.636221,2,91,1,1,0.02,5,5,1,2,0,2,27,2,3,1,2 +69233,7,2,2,2,NA,3,3,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26167.521666,28880.852575,1,93,6,6,1.16,4,4,2,0,0,2,33,1,5,1,4 +69234,7,2,1,8,NA,4,4,2,8,107,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12176.538896,12609.8265,2,97,2,2,0.27,4,4,0,2,0,1,51,1,2,4,NA +69235,7,2,2,3,NA,5,7,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27969.562936,30869.748923,3,91,7,7,1.57,4,4,2,0,0,2,29,2,3,1,3 +69236,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18417.587863,18945.077049,2,97,4,4,1.35,2,2,0,0,0,2,27,1,4,1,4 +69237,7,2,2,49,NA,2,2,2,NA,NA,1,2,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,46417.079566,46883.794079,1,97,15,15,5,2,2,0,0,0,2,49,2,5,1,4 +69238,7,2,2,5,NA,3,3,2,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,54058.97777,57449.540919,1,90,8,8,1.67,5,5,2,1,0,2,28,1,4,1,5 +69239,7,2,2,19,NA,5,6,1,19,239,2,NA,2,2,1,15,NA,NA,NA,1,2,1,1,2,1,1,2,1,NA,9200.381964,9723.240452,2,101,2,1,0.32,2,1,0,0,0,2,20,NA,NA,5,NA +69240,7,2,2,7,NA,5,7,1,7,89,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8504.389189,9345.267202,2,93,6,6,1.95,2,2,0,1,0,1,30,1,4,5,NA +69241,7,2,1,36,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,19332.808712,19683.545891,1,90,15,15,5,1,1,0,0,0,1,36,1,5,5,NA +69242,7,1,1,25,NA,2,2,NA,NA,NA,2,NA,2,7,77,NA,2,5,NA,2,2,2,1,2,2,NA,NA,NA,NA,44074.735764,0,2,91,1,1,0.17,4,4,0,1,0,1,49,2,1,6,NA +69243,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105483.169118,109229.181554,1,93,15,15,4.59,4,4,0,2,0,2,45,1,5,1,5 +69244,7,1,2,10,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7899.813226,0,2,100,15,15,5,4,3,0,2,0,1,42,1,3,5,NA +69245,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,21398.47235,20994.797177,1,103,14,8,4.21,2,1,0,0,0,2,29,1,5,5,NA +69246,7,2,1,19,NA,5,7,2,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7672.605662,7940.039559,1,93,14,14,5,2,2,0,0,0,2,53,2,5,3,NA +69247,7,2,2,80,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,12344.929687,12774.490696,1,93,2,2,0.83,1,1,0,0,1,2,80,1,4,3,NA +69248,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,3,1,2,1,2,1,NA,NA,NA,1,2,1,NA,18255.735511,22006.513457,2,91,6,6,1.57,3,3,0,1,0,1,41,2,3,1,3 +69249,7,2,1,34,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,1,2,1,2,2,1,1,2,NA,19923.530941,20672.635795,2,95,6,6,1.08,4,4,1,0,0,2,42,1,4,4,NA +69250,7,2,2,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,17622.141982,18017.336291,2,95,8,8,2.97,2,2,0,0,0,2,56,1,5,2,NA +69251,7,2,2,5,NA,1,1,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14665.744588,16191.375588,2,96,5,5,0.89,4,4,1,1,0,2,36,2,4,6,NA +69252,7,2,1,11,NA,1,1,1,11,140,NA,NA,2,2,3,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14820.807433,15173.085782,2,102,7,7,1.79,4,4,0,2,0,1,40,2,2,6,NA +69253,7,2,2,45,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,3,NA,2,2,2,2,2,2,1,2,2,2,36457.299109,41822.014095,1,90,5,5,1.79,1,1,0,0,0,2,45,2,2,3,NA +69254,7,2,1,4,NA,1,1,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15835.271712,16336.527884,1,100,8,3,0.68,6,3,1,0,0,1,33,2,3,6,NA +69255,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,42993.150248,46481.579201,1,92,6,6,1.98,2,2,0,0,2,1,80,1,5,1,4 +69256,7,2,1,56,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,34082.896551,1,101,3,3,0.88,2,2,0,0,0,1,56,1,2,1,4 +69257,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,24344.236685,23945.277508,2,96,6,6,1.48,4,4,1,1,0,2,25,1,4,5,NA +69258,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21621.615608,21991.273471,1,100,15,15,5,4,4,0,0,0,1,54,1,5,1,5 +69259,7,2,1,30,NA,5,7,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,84910.063417,90031.493834,2,96,14,6,2.75,3,1,0,0,0,1,30,2,5,5,NA +69260,7,2,2,3,NA,5,6,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4882.863582,4877.706148,1,99,7,7,2.89,2,2,1,0,0,2,35,2,5,1,NA +69261,7,2,2,51,NA,3,3,1,NA,NA,2,NA,2,1,8,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,27769.056387,28050.845299,1,94,99,99,NA,3,3,0,0,2,1,74,NA,NA,1,NA +69262,7,2,2,2,NA,1,1,1,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12871.484115,13281.030392,2,102,14,14,3.58,4,4,2,0,0,1,25,2,3,1,1 +69263,7,2,1,73,NA,1,1,1,NA,NA,2,NA,2,1,9,NA,1,1,NA,1,2,2,1,2,2,2,2,2,NA,14673.422679,15506.302145,2,98,5,5,0.59,7,7,2,1,2,2,71,1,2,1,1 +69264,7,2,1,69,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11212.469396,11300.176858,1,100,15,15,5,3,3,0,0,1,1,69,1,5,1,4 +69265,7,2,2,11,NA,1,1,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17053.854294,17233.146259,3,92,1,1,0.26,2,2,0,1,0,2,45,1,2,3,NA +69266,7,2,1,27,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,17265.374984,17186.028516,2,93,4,4,0.56,5,5,2,1,0,1,27,1,2,6,NA +69267,7,2,1,29,NA,3,3,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,94165.180484,100725.804227,2,99,14,14,5,2,2,0,0,0,2,28,1,5,1,5 +69268,7,2,2,11,NA,4,4,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11076.064101,11269.278002,2,102,4,4,0.53,6,6,2,2,0,2,27,1,2,1,2 +69269,7,2,1,16,NA,3,3,2,16,195,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,91343.020442,91081.271456,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +69270,7,2,1,66,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,9048.959172,9513.611982,1,93,12,12,NA,4,4,0,0,2,1,66,2,4,1,2 +69271,7,2,1,1,21,1,1,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12569.23571,12239.751631,2,102,15,15,2.43,7,7,3,2,0,1,28,2,5,1,4 +69272,7,2,2,43,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,1,6,2,2,2,2,1,2,2,NA,NA,NA,NA,32606.880052,32776.922157,2,93,4,4,0.56,5,5,0,2,0,1,37,NA,NA,1,1 +69273,7,2,1,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8890.779467,9258.147648,3,91,1,1,0.07,6,6,2,3,0,2,30,1,2,3,NA +69274,7,2,2,21,NA,4,4,2,NA,NA,2,NA,2,1,3,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18446.691823,17539.327743,1,90,4,4,0.58,6,6,0,3,0,2,21,2,5,5,NA +69275,7,2,1,13,NA,4,4,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,11265.8817,2,95,99,99,NA,2,2,0,1,1,2,80,1,2,2,NA +69276,7,2,1,16,NA,1,1,1,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22768.423624,22886.980387,2,98,15,15,5,3,3,0,1,0,1,38,1,4,1,3 +69277,7,2,1,24,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,15171.949804,3,91,6,6,2.94,2,1,0,0,0,1,24,1,5,5,NA +69278,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,13549.492282,14020.967918,2,93,6,6,2.28,2,2,0,0,1,2,78,1,5,3,NA +69279,7,2,2,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,126314.769628,126413.297707,2,95,15,15,5,2,2,0,0,1,1,61,1,5,1,5 +69280,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,22419.63376,27869.657009,1,94,3,3,1.29,1,1,0,0,1,2,80,1,3,2,NA +69281,7,2,1,3,NA,3,3,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,76114.759421,89186.300704,1,98,15,15,5,4,4,1,1,0,1,40,1,4,1,5 +69282,7,2,2,19,NA,3,3,2,19,236,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,31627.471241,33789.841724,1,101,1,1,0.08,3,3,1,0,0,2,19,1,2,NA,NA +69283,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,10298.451562,11068.740647,1,93,99,1,0.32,2,1,0,0,1,1,50,NA,NA,5,NA +69284,7,2,1,53,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,26651.800212,26887.922292,2,92,3,3,0.92,1,1,0,0,0,1,53,2,4,3,NA +69285,7,2,2,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,37537.641876,38018.476349,2,97,5,5,0.84,5,5,0,2,0,2,33,1,4,1,3 +69286,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,19096.438335,22378.694988,1,93,15,15,5,1,1,0,0,0,1,39,2,5,5,NA +69287,7,2,1,54,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,173139.914798,174527.091604,1,95,14,14,5,2,2,0,0,0,1,54,1,4,1,3 +69288,7,2,2,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,10252.529496,2,100,3,3,0.75,2,2,0,0,2,1,67,1,3,1,2 +69289,7,2,2,5,NA,2,2,1,5,69,NA,NA,2,1,3,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15979.952759,16987.381382,2,102,7,7,1.53,5,5,1,2,0,2,37,2,4,1,4 +69290,7,2,2,1,21,1,1,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9955.153132,10990.75621,2,94,4,4,0.81,4,4,2,0,0,1,26,2,2,1,2 +69291,7,2,1,0,9,5,6,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,4326.150649,4507.366261,1,99,6,6,1.07,6,6,2,1,2,1,44,2,5,4,NA +69292,7,2,1,12,NA,3,3,1,12,147,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,109750.935844,116575.440818,1,94,7,7,1.52,4,4,0,2,2,1,61,2,1,1,5 +69293,7,2,1,9,NA,3,3,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23188.935049,25672.571973,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +69294,7,2,1,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6946.177172,7374.968672,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +69295,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,30658.109612,1,94,5,5,1.2,3,3,0,1,0,1,49,1,4,5,NA +69296,7,2,2,6,NA,5,6,2,6,78,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9849.323746,10517.603056,2,91,10,10,3.04,4,4,1,1,0,1,37,2,5,1,5 +69297,7,2,2,7,NA,2,2,1,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13498.913367,14670.348602,2,93,7,7,1.56,4,4,1,1,0,1,35,2,4,1,4 +69298,7,2,1,1,20,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6429.93791,7090.057975,1,90,3,3,0.63,3,3,1,1,0,2,32,1,4,5,NA +69299,7,2,1,72,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,14781.102246,16162.46005,1,97,12,12,NA,4,4,0,0,2,1,72,1,2,1,3 +69300,7,2,1,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,29159.620934,2,101,1,1,0.33,1,1,0,0,0,1,23,1,4,5,NA +69301,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,99831.393624,101809.075589,2,94,8,8,3.4,2,2,0,0,2,2,64,1,4,1,2 +69302,7,2,2,14,NA,4,4,1,14,176,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17373.928778,17416.718116,2,96,8,8,1.72,5,5,0,3,0,1,39,1,5,1,4 +69303,7,2,2,12,NA,1,1,1,12,154,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,29109.978779,29945.36646,3,92,10,10,2.82,4,4,0,1,1,1,36,1,3,1,5 +69304,7,2,1,11,NA,3,3,2,11,138,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,44777.275016,47565.734765,1,91,14,14,3.06,5,5,0,3,0,2,46,1,5,1,5 +69305,7,2,1,14,NA,4,4,2,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12462.601191,12584.643654,2,97,4,4,0.57,5,5,1,3,0,2,33,1,3,5,NA +69306,7,2,2,0,5,4,4,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7123.540273,7201.320939,2,101,1,1,0.16,3,3,2,0,0,2,21,1,2,5,NA +69307,7,2,1,58,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,21168.33083,21825.00909,2,99,5,5,1.79,1,1,0,0,0,1,58,1,2,3,NA +69308,7,2,1,12,NA,4,4,2,13,156,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11351.725436,11256.943498,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +69309,7,2,2,45,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,27149.46917,27176.128744,1,94,2,1,0,2,1,0,0,0,1,53,1,3,6,NA +69310,7,2,2,18,NA,2,2,2,18,224,2,NA,2,2,2,66,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,16896.101801,17234.594007,1,93,14,8,2.01,5,4,1,0,0,2,22,2,1,6,NA +69311,7,2,2,16,NA,1,1,1,16,198,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,20502.928313,21226.512457,3,92,9,9,2.46,4,4,0,2,0,1,43,2,3,1,4 +69312,7,1,2,6,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13257.060167,0,2,90,14,14,3.06,5,5,1,2,0,1,42,1,4,1,5 +69313,7,2,1,1,14,4,4,2,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6580.937346,6661.20735,2,97,5,5,1.08,3,3,1,0,0,1,28,1,3,5,NA +69314,7,2,1,50,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,16117.991297,17081.203544,1,96,7,7,1.69,4,4,0,1,0,2,19,2,4,NA,NA +69315,7,1,1,11,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15653.970322,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +69316,7,2,2,17,NA,5,6,2,17,214,2,NA,2,2,2,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7588.544207,7881.983727,3,91,4,4,0.69,5,5,0,2,0,1,45,2,4,1,1 +69317,7,2,2,3,NA,4,4,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10447.689164,11241.830083,1,102,7,7,1.8,5,4,1,0,2,1,47,1,3,5,NA +69318,7,2,1,4,NA,4,4,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11324.865632,11670.771889,2,96,2,2,0.44,3,3,2,0,0,2,22,1,2,5,NA +69319,7,2,1,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18790.641284,19715.999527,2,100,15,1,0.05,4,1,0,2,0,1,42,1,3,5,NA +69320,7,2,2,58,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,4,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,29087.427528,29444.125326,1,101,3,3,0.41,5,5,0,2,1,2,36,2,4,4,NA +69321,7,2,1,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21390.017054,21518.859775,2,99,15,15,5,2,2,0,0,0,2,51,1,5,1,5 +69322,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,24460.137584,1,92,4,4,0.61,5,5,1,2,0,1,34,1,3,6,NA +69323,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,7903.072331,8212.17704,2,99,NA,77,NA,3,2,0,0,1,1,63,1,3,5,NA +69324,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,153755.392794,158780.137655,1,91,15,15,5,3,3,0,0,0,2,50,1,4,1,4 +69325,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,20039.469886,21176.851739,1,97,15,15,5,3,3,1,0,0,1,40,1,3,1,5 +69326,7,2,2,2,NA,5,6,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6213.806926,6511.003426,1,95,4,4,0.62,5,5,2,0,2,2,29,2,3,5,NA +69327,7,2,2,10,NA,3,3,2,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55626.447796,54887.751745,1,95,15,15,5,4,4,0,2,0,2,42,1,5,1,5 +69328,7,2,2,71,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,13495.958207,13916.488113,1,96,9,9,4.23,2,2,0,0,2,2,71,2,5,1,5 +69329,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,42559.487719,42202.626733,1,98,3,2,0.62,2,1,0,0,0,2,50,1,2,3,NA +69330,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,NA,NA,NA,NA,23614.167119,30467.110717,2,97,1,1,0.33,2,2,1,0,0,2,24,1,2,5,NA +69331,7,2,2,13,NA,4,4,2,13,166,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10848.628906,11198.221038,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +69332,7,2,1,15,NA,4,4,1,15,186,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17606.165994,20773.995354,2,101,9,9,2.46,4,4,0,2,0,1,42,1,3,1,3 +69333,7,2,2,76,NA,5,7,1,NA,NA,2,NA,2,1,5,NA,1,1,NA,1,2,2,1,2,2,1,2,1,NA,33487.945981,34633.22923,1,102,10,10,3.22,4,4,0,0,2,2,29,2,5,5,NA +69334,7,2,2,58,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,24938.6524,26291.237881,2,98,5,5,1.24,3,3,0,0,1,2,58,1,2,5,NA +69335,7,2,1,54,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32838.149884,1,95,5,5,1.84,1,1,0,0,0,1,54,1,4,3,NA +69336,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,19401.570044,22254.979865,1,92,6,6,1.24,4,4,1,1,0,1,30,1,3,3,NA +69337,7,2,2,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,NA,NA,NA,NA,22912.222762,23105.605227,2,96,6,6,1.35,3,3,1,1,0,2,23,1,2,5,NA +69338,7,2,2,13,NA,1,1,1,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15690.47168,16249.379042,1,102,8,8,1.33,7,7,1,4,0,2,32,1,3,1,2 +69339,7,2,1,22,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,1,6,NA,2,2,2,2,2,2,1,2,2,2,38560.502118,39812.43256,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +69340,7,2,1,14,NA,5,6,2,14,179,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6666.045669,7091.184391,3,90,10,10,2.41,5,5,1,2,0,1,44,2,4,1,5 +69341,7,2,1,6,NA,1,1,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11159.151566,11057.808004,1,102,2,2,0.31,4,4,1,2,0,2,25,1,2,4,NA +69342,7,2,1,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,16645.008535,17770.553389,2,95,2,2,0.4,2,2,0,0,0,2,43,1,1,1,NA +69343,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,118671.226879,120869.497653,2,91,15,15,5,3,3,0,0,0,2,54,1,4,1,4 +69344,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26091.362984,2,101,5,5,1.5,2,2,0,0,0,1,47,1,4,3,NA +69345,7,2,1,11,NA,3,3,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18216.94614,18737.854061,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +69346,7,2,1,18,NA,2,2,1,18,226,2,NA,2,2,4,13,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,15506.325263,16662.012915,1,103,5,5,0.74,5,5,0,1,0,1,47,2,1,1,1 +69347,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,20137.063643,20085.335673,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +69348,7,2,2,13,NA,3,3,1,13,166,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,31627.471241,33789.841724,1,98,6,6,1.11,5,5,1,2,0,2,32,1,2,1,2 +69349,7,2,1,74,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,59483.758768,62962.247193,1,96,14,14,5,2,2,0,0,2,1,74,1,5,1,4 +69350,7,1,2,77,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,12888.823036,0,2,99,7,7,3.13,1,1,0,0,1,2,77,1,5,2,NA +69351,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,66503.043118,69008.73133,2,98,7,7,1.94,3,3,1,0,0,2,31,1,4,1,NA +69352,7,2,1,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9064.168162,9228.63108,3,92,12,12,NA,4,4,2,0,0,1,30,1,3,1,4 +69353,7,2,2,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7871.443574,8074.618887,1,96,9,9,2.88,3,3,1,0,0,1,27,1,3,1,5 +69354,7,2,1,42,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,34205.013302,34329.398365,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +69355,7,2,2,27,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,NA,NA,NA,NA,44119.608456,46238.164206,2,98,1,1,0.14,3,2,2,0,0,2,27,1,3,6,NA +69356,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,11982.125462,2,101,5,5,1.08,3,3,0,1,1,2,62,1,4,2,NA +69357,7,2,1,8,NA,4,4,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,8894.789377,9317.745565,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +69358,7,2,1,11,NA,3,3,1,11,134,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41342.668304,42524.849071,1,102,8,8,2.42,4,4,0,2,0,2,34,1,4,1,3 +69359,7,2,1,8,NA,4,4,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9022.8939,9530.778148,2,100,3,3,0.31,7,7,3,2,0,2,28,1,3,1,3 +69360,7,2,2,0,0,5,7,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6280.554922,6238.355238,2,92,10,10,3.78,3,3,1,0,0,1,35,1,4,6,NA +69361,7,2,1,66,NA,4,4,1,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,10209.064769,10089.274206,1,98,6,6,1.57,3,3,0,0,2,1,66,2,2,1,4 +69362,7,2,1,5,NA,4,4,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8892.687359,9565.637195,2,96,12,10,2.17,7,6,2,3,0,1,29,1,4,3,NA +69363,7,2,2,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,44119.608456,46238.164206,3,92,3,3,0.54,4,4,3,0,0,2,22,1,3,5,NA +69364,7,2,2,11,NA,1,1,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,10118.363218,11093.371216,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +69365,7,2,2,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,185476.232403,190233.31946,1,95,4,4,1.47,1,1,0,0,0,2,59,1,1,5,NA +69366,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,89167.746947,90120.008289,1,95,15,15,5,2,2,0,0,2,1,72,1,3,1,4 +69367,7,2,1,2,NA,3,3,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46257.816906,54201.886729,2,94,15,15,4.59,4,4,1,1,0,2,37,1,5,1,5 +69368,7,2,1,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16851.334496,16952.838472,2,95,14,14,5,2,2,0,0,0,1,52,1,4,1,NA +69369,7,2,1,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,7233.371983,2,95,2,2,0.63,1,1,0,0,1,1,66,1,1,3,NA +69370,7,2,1,17,NA,1,1,1,18,216,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20560.901695,21038.44606,2,96,10,10,3.78,3,3,0,1,0,1,42,1,3,1,3 +69371,7,2,1,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,22650.334558,22327.472235,1,93,12,12,NA,5,1,0,2,0,1,32,1,2,5,NA +69372,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,23022.732862,22484.94345,2,102,5,3,0.92,5,1,2,1,0,1,24,1,4,6,NA +69373,7,2,2,20,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114492.825466,119073.624167,2,101,3,2,0.73,3,1,0,0,0,2,20,2,4,5,NA +69374,7,1,2,52,NA,2,2,NA,NA,NA,2,NA,2,2,5,NA,1,6,NA,2,2,2,1,2,2,NA,NA,NA,NA,24004.6026,0,2,91,1,1,0.17,4,4,0,1,0,1,49,2,1,6,NA +69375,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,148501.534483,154474.828602,2,91,15,15,5,2,2,0,0,1,2,66,1,5,3,NA +69376,7,2,1,19,NA,3,3,1,19,236,2,NA,2,1,5,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,41421.091412,40909.179995,1,94,3,3,0.93,2,2,0,0,0,2,41,2,2,3,NA +69377,7,1,1,70,NA,5,6,NA,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,17564.38036,0,2,102,5,5,1.36,2,2,0,0,2,1,70,2,5,1,4 +69378,7,2,2,20,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,3,5,2,2,2,2,1,2,2,2,2,2,2,39788.68078,43305.780488,2,99,3,3,0.52,3,3,0,0,1,2,38,2,3,3,NA +69379,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,22824.336433,1,92,1,1,0,2,1,0,0,0,1,30,1,3,6,NA +69380,7,2,1,20,NA,2,2,1,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,42587.888675,2,98,1,1,0.13,4,4,2,0,0,2,52,1,2,4,NA +69381,7,2,1,6,NA,2,2,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13837.588743,14145.695126,1,92,9,9,2.93,3,3,0,1,0,2,30,1,5,1,5 +69382,7,2,1,6,NA,5,6,2,6,79,NA,NA,2,2,1,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,9720.482616,11328.640802,2,91,99,99,NA,7,4,0,4,0,1,36,2,9,1,2 +69383,7,2,2,10,NA,5,7,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5010.242859,5375.15147,3,91,15,15,4.47,4,4,0,3,0,2,44,2,5,1,NA +69384,7,2,1,7,NA,4,4,2,7,90,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10665.048307,10877.092316,1,96,4,4,1.12,2,2,0,1,0,2,44,1,2,5,NA +69385,7,2,1,12,NA,5,6,2,12,154,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6666.045669,7091.184391,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +69386,7,2,1,52,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19541.667675,19738.253068,2,95,3,3,1.21,1,1,0,0,0,1,52,1,3,5,NA +69387,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,71632.519751,73567.29218,2,100,8,8,4.13,1,1,0,0,0,1,25,1,3,5,NA +69388,7,2,1,61,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,11568.876339,13082.418262,1,102,4,4,0.78,4,4,0,1,1,1,61,1,3,1,1 +69389,7,2,2,22,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,53638.260635,55237.528848,2,96,5,1,0.37,2,1,0,0,0,2,22,1,3,6,NA +69390,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,96485.877517,101155.423058,2,95,9,9,3.97,2,2,0,0,1,1,62,1,2,1,2 +69391,7,2,2,52,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,30868.065568,31427.853631,3,92,10,10,3.77,3,3,0,1,0,2,52,1,4,6,NA +69392,7,2,1,35,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,13147.594977,13793.622874,1,102,15,15,4.59,4,4,1,1,0,1,35,1,5,1,5 +69393,7,2,1,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23511.361566,23589.086028,1,100,14,14,4.45,3,3,1,0,0,1,33,1,4,1,4 +69394,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,39061.30289,2,101,4,4,1.22,2,2,1,0,0,2,25,1,4,5,NA +69395,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20813.587171,20953.352876,2,93,6,6,1.47,3,3,0,0,0,2,47,1,4,5,NA +69396,7,2,1,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8439.71412,8914.772112,2,99,7,7,1.19,6,6,1,3,0,2,38,1,3,5,NA +69397,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,30152.053647,30291.005728,2,101,14,14,4.03,4,4,0,1,0,2,40,1,5,1,5 +69398,7,2,1,3,NA,4,4,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9388.597537,2,100,99,99,NA,6,6,2,1,0,2,44,1,3,1,4 +69399,7,1,1,58,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,25583.266805,0,1,100,10,10,4.63,2,2,0,0,1,1,58,1,5,1,4 +69400,7,2,1,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,NA,NA,NA,1,2,2,1,21600.805431,21945.582953,2,96,3,3,0.38,5,5,1,2,0,2,30,1,3,5,NA +69401,7,2,1,0,0,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4724.065742,4677.378988,2,93,77,77,NA,7,7,3,1,0,2,43,2,1,1,9 +69402,7,2,2,59,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14262.400197,16582.236492,1,93,14,14,5,2,2,0,0,0,1,36,2,5,1,NA +69403,7,2,1,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,115789.798768,119024.647099,1,90,6,6,2.86,1,1,0,0,1,1,61,1,5,3,NA +69404,7,2,1,57,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20536.772571,20857.586819,1,90,15,15,5,2,2,0,0,0,1,57,2,4,1,5 +69405,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,152467.08796,155127.202914,1,91,8,8,2.17,4,4,0,0,0,1,59,1,4,1,5 +69406,7,2,1,16,NA,5,6,2,16,197,NA,NA,2,2,2,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8168.705487,9098.657657,1,93,7,7,1.64,5,5,0,2,0,1,47,2,5,1,1 +69407,7,2,1,14,NA,5,6,1,14,173,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,1,1,2,2,1,6121.087833,6878.034577,2,92,7,7,1.17,6,6,0,1,1,1,78,2,1,1,3 +69408,7,2,2,16,NA,1,1,1,16,202,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,2,2,1,1,2,2,1,13963.420591,14243.160208,2,103,2,2,0.42,3,3,0,2,0,2,51,2,2,5,NA +69409,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,21605.242088,21013.957961,3,91,14,14,5,1,1,0,0,0,2,50,1,5,5,NA +69410,7,2,2,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23409.362971,23343.581342,2,96,15,15,5,3,3,0,1,0,1,55,1,5,1,4 +69411,7,2,1,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,68266.732554,70856.701199,1,95,7,7,2.72,2,2,0,0,2,1,75,1,5,1,5 +69412,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,38833.86357,40362.1181,3,92,3,3,0.93,2,2,0,0,1,2,75,1,1,3,NA +69413,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15477.500537,2,100,5,5,1.08,3,3,0,1,0,2,50,1,4,3,NA +69414,7,2,2,4,NA,3,3,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,51483.624552,56822.002088,1,91,4,4,1.29,2,2,1,0,0,2,26,1,4,5,NA +69415,7,2,2,15,NA,1,1,2,15,182,NA,NA,2,2,4,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18368.872199,18995.639955,2,94,12,12,NA,4,4,0,2,0,1,47,2,2,1,2 +69416,7,2,1,2,NA,5,6,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8100.706553,9085.828699,1,98,15,15,5,4,4,1,1,0,1,40,NA,NA,1,5 +69417,7,2,1,27,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,124091.929364,126503.690206,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +69418,7,2,1,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,60803.589953,64579.113865,1,91,15,15,5,2,2,0,0,2,1,71,1,5,1,4 +69419,7,2,1,57,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,25963.141347,25880.331023,1,92,10,10,4.3,2,2,0,0,0,2,55,1,4,1,5 +69420,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,NA,NA,NA,1,2,2,NA,60163.952904,72064.333099,1,97,NA,NA,NA,2,1,0,0,2,1,80,1,3,6,NA +69421,7,2,2,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,149765.47604,152732.36321,1,92,7,7,2.64,2,2,0,0,2,2,68,1,4,1,4 +69422,7,2,2,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,38477.954475,38315.213578,1,97,15,15,5,6,6,0,1,1,2,53,1,4,1,NA +69423,7,2,1,6,NA,3,3,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58429.74688,62860.392832,1,100,6,6,1.78,3,3,1,1,0,2,35,1,5,4,NA +69424,7,2,1,4,NA,4,4,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7359.751824,8115.329859,2,99,5,5,1.26,3,3,1,0,0,2,50,2,3,5,NA +69425,7,2,2,66,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15268.186173,15857.48365,1,102,14,14,5,2,2,0,0,2,1,65,2,5,1,5 +69426,7,2,2,14,NA,5,6,2,14,175,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11975.458482,12226.374363,1,97,14,14,2.87,5,5,0,3,0,2,40,2,5,1,5 +69427,7,2,1,44,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,18774.610796,1,99,3,3,0.54,3,3,1,0,0,2,29,1,4,1,4 +69428,7,2,2,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,33331.144292,35071.927834,1,101,7,7,2.71,2,2,0,0,0,1,43,1,4,1,4 +69429,7,2,2,18,NA,1,1,1,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24481.187693,25353.22751,1,95,4,4,0.68,5,5,0,1,0,2,38,2,3,4,NA +69430,7,2,2,67,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,1,1,NA,1,2,1,1,2,1,1,2,2,NA,14102.354333,14719.644428,3,91,14,4,1.02,6,2,0,0,2,1,48,2,1,1,1 +69431,7,2,2,79,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,12183.823561,12607.778632,2,100,9,9,4.35,2,2,0,0,2,2,79,1,5,1,3 +69432,7,2,1,0,5,4,4,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5782.580039,5871.334502,2,99,7,7,1.65,4,4,2,1,0,2,29,1,3,4,NA +69433,7,2,1,53,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,29883.483388,29823.443389,1,102,7,7,1.89,3,3,0,0,0,1,53,2,1,1,1 +69434,7,2,2,43,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,40880.818805,42051.054889,1,101,4,4,0.84,3,3,0,1,0,1,42,1,4,1,4 +69435,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,47157.788417,52669.767304,2,95,15,15,5,2,2,0,0,2,1,80,1,5,1,5 +69436,7,2,1,46,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,28353.771379,28938.361413,1,92,8,8,4.66,1,1,0,0,0,1,46,1,4,5,NA +69437,7,2,2,6,NA,3,3,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19880.837381,19616.828143,1,95,6,6,1.3,4,4,0,3,0,2,46,1,4,3,NA +69438,7,2,1,16,NA,3,3,2,16,201,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,29222.804528,30590.757203,1,90,7,7,1.55,5,5,0,3,0,1,51,2,3,1,2 +69439,7,2,1,67,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7903.072331,8272.775405,2,99,8,8,3.57,2,2,0,0,1,1,67,1,2,1,2 +69440,7,2,1,3,NA,5,6,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6940.398869,7784.416682,2,100,15,15,5,4,4,1,1,0,1,36,2,5,1,5 +69441,7,2,2,9,NA,3,3,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,62419.284609,61940.470984,1,101,14,14,4.5,3,3,0,1,0,1,39,1,2,1,5 +69442,7,2,1,19,NA,4,4,1,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,2,1,0.18,4,1,0,0,0,1,19,1,4,NA,NA +69443,7,2,2,29,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,11378.639129,11910.020755,1,102,15,15,3.82,5,5,1,1,0,1,29,1,4,1,4 +69444,7,2,2,2,NA,4,4,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7618.827213,8513.998744,2,97,5,5,1.63,2,2,1,0,0,2,33,1,3,5,NA +69445,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,18490.479848,17984.43936,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +69446,7,2,1,25,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,5,NA,2,2,2,1,2,2,1,2,2,2,38560.502118,39812.43256,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +69447,7,2,2,13,NA,4,4,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16659.324602,16974.753267,1,92,15,15,4.44,5,5,0,3,0,2,43,1,5,6,NA +69448,7,2,1,3,NA,4,4,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8892.687359,9565.637195,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +69449,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19260.892847,19877.962631,2,97,12,12,NA,3,3,0,0,0,1,33,1,4,5,NA +69450,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,93796.829073,96460.739647,1,100,15,15,5,4,4,1,1,0,1,40,1,5,1,5 +69451,7,2,1,67,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7736.56115,7765.677873,1,99,13,13,NA,3,3,0,0,2,1,67,1,2,1,2 +69452,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,175633.860713,177416.12057,3,91,15,15,5,4,4,0,0,1,1,60,NA,NA,4,NA +69453,7,2,2,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,171038.159272,172773.783849,3,92,15,15,5,3,3,0,0,0,1,56,NA,NA,1,4 +69454,7,2,2,13,NA,4,4,2,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,6,6,0.96,5,5,0,4,0,2,36,1,4,4,NA +69455,7,2,2,80,NA,3,3,1,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,1,1,2,2,1,2,1,NA,49191.372812,61149.379277,3,91,15,15,3.33,6,6,0,2,2,1,80,2,3,1,3 +69456,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,21897.080981,21827.239495,3,91,12,12,NA,2,2,0,0,0,1,52,1,5,1,5 +69457,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,13408.721263,14895.884708,2,98,3,3,0.68,2,2,0,0,2,1,80,1,1,1,3 +69458,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,167711.394252,174540.034956,1,101,7,7,2.31,2,2,0,0,1,1,60,1,3,1,3 +69459,7,2,2,62,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,15207.312407,15896.113669,2,98,10,10,4.43,2,2,0,0,1,2,47,1,4,3,NA +69460,7,2,1,50,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,23259.140149,22917.848121,1,90,10,10,2.44,5,5,1,0,0,2,56,2,1,1,1 +69461,7,2,2,13,NA,5,6,2,13,160,NA,NA,1,1,NA,7,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6937.463063,7205.726089,3,90,15,15,3.23,6,6,0,2,0,1,50,2,2,1,2 +69462,7,2,2,36,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,42468.064168,42460.239922,2,101,6,6,0.96,5,5,0,4,0,2,36,1,4,4,NA +69463,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,27771.028362,29170.559675,3,92,4,4,1.16,2,2,0,0,0,2,20,1,2,1,2 +69464,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105261.096488,116369.237268,1,97,15,15,5,4,4,0,2,0,1,39,1,5,1,NA +69465,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,134213.669088,137679.44344,1,93,7,7,2.16,3,3,0,1,0,2,50,1,5,3,NA +69466,7,2,2,8,NA,5,6,1,8,99,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,1,2,1,1,6189.617175,6489.651129,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +69467,7,1,1,3,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,77702.196479,0,1,95,14,14,3.8,4,4,1,1,0,1,36,1,4,1,5 +69468,7,2,1,69,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,7736.56115,7645.782314,1,99,6,6,1.84,2,2,0,0,2,1,69,1,3,1,4 +69469,7,2,1,0,2,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8519.229538,8996.978293,1,101,4,4,0.57,5,5,1,2,0,1,28,2,1,1,1 +69470,7,2,2,4,NA,1,1,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,16462.187772,17500.018071,3,92,7,7,1.3,5,5,1,2,0,2,33,2,2,1,1 +69471,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,94,14,14,5,2,2,0,0,2,2,72,1,5,1,5 +69472,7,2,1,38,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18544.003944,19241.239961,2,100,14,14,3.76,4,4,1,1,0,1,38,1,3,1,NA +69473,7,2,1,79,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,8456.543684,8955.478754,2,92,7,7,3.13,1,1,0,0,1,1,79,1,1,2,NA +69474,7,2,2,66,NA,2,2,1,NA,NA,2,NA,2,2,5,NA,3,5,NA,2,2,2,1,2,2,1,2,2,2,11570.073931,12052.956309,2,93,7,7,1.74,4,4,1,0,1,2,24,NA,NA,4,NA +69475,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20430.250572,20111.803159,2,97,5,5,0.76,5,5,0,0,0,2,50,1,4,5,NA +69476,7,2,2,0,5,4,4,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4584.111679,4588.281921,1,97,4,4,0.46,7,7,3,3,0,2,31,1,3,1,NA +69477,7,2,1,0,5,1,1,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6390.260233,6748.618798,2,96,6,6,1,6,6,1,3,0,2,32,2,1,6,NA +69478,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,34874.122648,37228.07844,3,92,6,6,0.74,7,7,2,1,0,2,46,1,2,1,4 +69479,7,2,2,47,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,25713.328161,27565.019075,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +69480,7,2,2,1,13,4,4,1,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8480.466509,9125.076563,1,100,9,9,2.22,5,5,1,2,0,2,40,2,4,1,4 +69481,7,2,2,0,2,1,1,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6787.112205,7016.795893,2,94,7,7,1.33,6,6,2,0,0,2,32,2,2,1,2 +69482,7,2,2,3,NA,1,1,1,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17282.036547,19079.832121,2,102,3,3,0.45,4,4,2,0,0,1,21,2,2,6,NA +69483,7,2,1,4,NA,5,6,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10273.602479,10769.310961,1,92,77,77,NA,4,4,1,1,0,2,40,2,4,1,4 +69484,7,2,1,17,NA,1,1,1,17,210,2,NA,2,2,5,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,19996.544021,19901.195571,1,100,7,7,1.3,5,5,0,3,0,1,43,2,2,1,4 +69485,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22329.779038,21943.745693,1,98,14,14,3.93,3,3,1,0,0,1,36,1,5,1,5 +69486,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11679.736252,12242.903977,1,103,8,8,4.66,1,1,0,0,1,2,67,1,5,3,NA +69487,7,2,1,21,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14852.674152,15542.18804,1,92,14,14,3.9,4,4,0,0,0,2,55,2,5,1,5 +69488,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,33784.29429,34197.992084,1,95,5,5,1.3,3,3,0,0,1,2,19,1,3,NA,NA +69489,7,2,2,62,NA,5,6,2,NA,NA,2,NA,2,2,7,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,12941.046565,13394.767563,1,93,9,9,5,1,1,0,0,1,2,62,2,4,5,NA +69490,7,2,1,0,3,3,3,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22795.485282,22401.400888,1,95,9,9,2.46,4,4,2,0,0,2,25,1,5,1,5 +69491,7,2,2,67,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,2,NA,2,2,2,2,2,2,2,2,2,2,10490.803278,11351.088215,1,93,2,2,0.77,1,1,0,0,1,2,67,2,1,2,NA +69492,7,2,2,15,NA,4,4,2,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,18905.695776,2,101,3,3,0.54,3,3,0,2,0,2,36,1,3,5,NA +69493,7,2,2,17,NA,4,4,2,17,209,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,7,7,1.74,4,4,0,2,0,2,47,1,5,4,NA +69494,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,97803.500399,98104.213748,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +69495,7,2,2,22,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,3,5,2,1,2,2,1,2,2,1,2,2,3,16239.242782,18510.062544,2,101,9,3,1.1,4,1,0,0,0,1,22,2,3,5,NA +69496,7,2,2,9,NA,4,4,2,9,116,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7631.175557,7916.380746,1,93,12,12,NA,3,3,0,1,0,2,48,1,3,5,NA +69497,7,2,1,26,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,13749.764747,14666.581717,1,90,4,4,0.78,4,4,0,0,1,1,69,2,4,1,3 +69498,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,59510.728426,64021.429591,1,99,15,15,5,3,3,1,0,0,2,31,1,5,1,5 +69499,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,129098.803996,133683.475932,1,93,15,15,5,4,4,0,2,0,2,42,1,5,1,NA +69500,7,2,1,19,NA,3,3,2,19,234,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,119111.433099,126517.990149,2,94,15,15,3.82,5,5,0,0,0,1,50,1,5,1,5 +69501,7,2,2,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,11331.751026,1,101,2,2,0.22,4,4,1,0,0,2,25,1,4,6,NA +69502,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,143785.115498,143265.966876,1,99,8,8,4.87,1,1,0,0,0,2,50,1,5,5,NA +69503,7,2,2,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,35933.117795,41598.834451,1,98,2,2,0.72,1,1,0,0,0,2,44,1,4,3,NA +69504,7,2,1,54,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13002.519536,13402.475336,1,93,15,15,4.59,4,4,0,2,0,2,45,1,5,1,5 +69505,7,2,1,60,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,27043.072221,28144.17465,2,101,5,4,1.47,2,1,0,0,1,2,49,1,3,6,NA +69506,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,12256.510142,13615.881666,1,95,4,4,1.26,2,2,0,0,2,1,80,1,1,1,3 +69507,7,2,2,8,NA,5,6,2,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10699.45895,11290.011566,1,97,10,10,3.67,3,3,0,1,0,1,47,1,5,1,5 +69508,7,2,1,37,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,36924.956604,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +69509,7,2,1,62,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,1,2,2,NA,8609.250304,11228.904188,2,90,4,4,1.02,2,2,0,0,1,1,62,2,1,1,1 +69510,7,2,1,19,NA,5,6,1,19,234,2,NA,2,1,4,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6558.308393,6849.983523,2,92,99,1,0.28,4,1,0,0,0,1,19,1,4,NA,NA +69511,7,2,2,65,NA,4,4,1,NA,NA,2,NA,2,2,3,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,13998.494211,15077.525188,2,102,4,4,1.38,1,1,0,0,1,2,65,2,2,4,NA +69512,7,2,1,17,NA,3,3,2,17,213,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17395.533107,17264.495057,1,99,13,13,NA,4,4,0,2,0,1,55,NA,NA,1,4 +69513,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19320.837782,1,99,15,15,5,4,4,0,2,0,2,46,1,5,1,5 +69514,7,2,1,57,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20181.678047,20475.67653,1,96,14,14,3.99,4,4,0,0,0,2,53,1,3,1,4 +69515,7,2,1,63,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,6612.194774,6663.917441,2,99,7,7,3.55,2,1,0,0,1,1,63,1,4,3,NA +69516,7,2,1,74,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,52448.388619,54438.22579,1,99,9,9,3.74,2,2,0,0,2,2,73,1,3,1,4 +69517,7,2,1,0,7,4,4,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6246.568228,6652.820193,2,95,7,7,1.41,5,5,2,0,0,2,53,1,3,3,NA +69518,7,2,2,2,NA,4,4,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6226.488588,6570.976462,2,99,6,6,1.03,6,6,3,0,0,1,33,1,3,6,NA +69519,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,19520.240895,25185.107635,2,95,1,1,0.13,2,2,1,0,0,2,22,1,3,5,NA +69520,7,2,1,22,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,101419.325386,103801.228657,1,100,15,15,4.63,5,5,0,0,0,1,51,1,5,1,3 +69521,7,2,1,74,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,48254.793439,51076.634961,2,100,6,6,2.04,2,2,0,0,2,1,74,1,4,1,3 +69522,7,2,2,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,52701.331723,53172.517558,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +69523,7,2,1,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,128128.531162,128588.454794,1,99,8,8,4.78,1,1,0,0,0,1,56,1,3,3,NA +69524,7,2,2,61,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,9943.806181,2,100,12,12,NA,2,2,0,0,1,1,56,1,5,1,4 +69525,7,2,2,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,18462.756377,17957.474615,1,99,2,2,0.48,2,2,0,0,0,2,44,1,3,1,3 +69526,7,2,1,19,NA,3,3,2,19,239,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22313.526699,26201.091455,1,99,5,2,0.73,4,1,0,0,0,1,19,1,3,NA,NA +69527,7,2,1,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,39031.957066,39638.562591,1,95,6,4,1.47,2,1,0,0,0,2,28,1,2,6,NA +69528,7,2,1,80,NA,1,1,1,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,14673.422679,14929.213705,2,98,15,15,4.56,4,4,0,0,3,1,80,1,1,1,NA +69529,7,2,1,7,NA,3,3,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,82670.203859,85919.643529,1,97,14,14,3.36,4,4,0,2,0,2,49,1,5,1,5 +69530,7,2,2,9,NA,3,3,2,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,46660.163959,46766.329713,1,98,15,15,5,5,5,0,1,0,1,53,1,5,1,5 +69531,7,2,1,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,26847.643051,28917.411142,1,98,1,1,0.16,3,3,1,0,0,1,28,1,2,6,NA +69532,7,2,2,47,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,2,1,2,1,NA,NA,NA,NA,19150.604366,19847.194665,3,91,6,6,1.81,3,3,0,1,0,2,47,2,3,1,3 +69533,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114993.808573,116714.079488,1,98,7,4,1.34,4,1,0,0,0,2,20,NA,NA,5,NA +69534,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,21503.272394,20634.528185,1,96,14,10,5,2,1,0,0,0,2,29,1,5,6,NA +69535,7,2,1,16,NA,5,7,1,16,199,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,59545.101745,58762.542429,1,102,8,8,1.6,7,7,0,4,0,2,39,1,4,1,4 +69536,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126314.769628,126413.297707,2,95,8,8,3.53,2,2,0,0,0,1,57,1,4,1,4 +69537,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140932.152825,151077.472396,1,97,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +69538,7,2,2,19,NA,2,2,2,20,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,26657.121865,27597.898247,1,97,15,15,5,3,3,0,0,0,1,45,1,4,1,3 +69539,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,27199.141352,29187.923269,1,98,7,7,3.58,1,1,0,0,1,1,80,1,2,2,NA +69540,7,2,2,45,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,24625.307946,26182.57746,1,93,2,2,0.61,2,2,0,0,1,2,45,2,3,5,NA +69541,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,34952.089182,39581.970787,1,94,4,4,1,3,3,0,1,0,2,41,1,4,5,NA +69542,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,3,1,2,2,1,2,2,1,2,2,1,35126.205635,36772.568368,1,95,3,3,0.65,3,3,1,0,0,1,58,1,3,3,NA +69543,7,2,2,9,NA,4,4,1,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9139.784234,9759.758014,2,100,14,14,4.86,3,3,0,1,0,2,41,1,4,3,NA +69544,7,1,2,16,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,10,NA,NA,NA,2,2,2,1,2,2,NA,NA,NA,NA,20347.899985,0,2,94,5,5,0.65,6,6,0,2,0,1,53,NA,NA,6,NA +69545,7,2,2,17,NA,3,3,1,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30430.369428,31312.351655,3,92,5,5,1.03,4,4,0,3,0,1,55,1,4,4,NA +69546,7,2,1,26,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15976.466658,17286.192057,2,96,8,6,2.39,2,1,0,0,0,1,26,2,5,5,NA +69547,7,2,1,73,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,8543.37447,9341.78969,3,90,14,14,2.97,5,5,0,2,1,1,73,2,3,2,NA +69548,7,2,2,7,NA,4,4,2,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7710.907339,8302.634544,2,99,77,77,NA,4,4,1,1,0,2,47,1,2,77,NA +69549,7,2,2,66,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10429.953328,10902.368494,2,94,15,15,3.42,6,6,0,1,2,1,40,1,3,1,4 +69550,7,2,1,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,16287.780872,16385.890285,1,96,9,6,2.3,2,1,0,0,0,1,58,1,4,6,NA +69551,7,2,2,12,NA,4,4,1,12,148,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11838.873374,11750.256617,2,97,15,15,5,4,4,0,2,0,1,47,NA,NA,6,NA +69552,7,2,2,64,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,10999.00871,11813.793381,2,98,6,6,1.25,4,4,1,0,1,1,46,1,2,6,NA +69553,7,2,2,70,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,2,2,2,NA,15705.521724,21678.922586,3,90,12,12,NA,6,6,0,0,2,1,70,2,1,1,1 +69554,7,2,1,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9344.689579,9327.120408,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +69555,7,2,2,11,NA,4,4,2,11,136,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7282.523598,7776.514874,2,99,6,6,1.11,5,5,0,4,0,2,34,1,4,5,NA +69556,7,2,1,59,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17738.246838,17681.670095,2,95,2,2,0.54,1,1,0,0,0,1,59,1,4,1,NA +69557,7,2,2,0,1,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8775.375504,8746.463784,2,102,14,14,3.58,4,4,2,0,0,1,25,2,3,1,1 +69558,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,47973.37979,51335.952518,1,101,7,7,1.82,4,4,2,0,0,2,27,1,2,1,3 +69559,7,2,2,8,NA,1,1,2,8,100,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14300.71869,15541.734563,2,94,9,9,2.1,5,5,1,2,0,1,31,2,4,1,4 +69560,7,2,1,26,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,2,5,NA,2,2,2,2,2,2,1,2,2,1,59682.963348,66132.07802,2,102,5,5,1.08,3,3,0,0,0,1,55,2,1,5,NA +69561,7,2,2,19,NA,4,4,1,20,NA,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11224.041366,11682.365019,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +69562,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,1,2,NA,27199.141352,29187.923269,1,98,77,77,NA,2,2,0,0,2,1,80,1,1,1,3 +69563,7,2,2,5,NA,5,6,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8818.200077,8968.551716,2,102,6,6,1.52,4,4,2,0,0,1,30,2,4,1,4 +69564,7,2,1,37,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18743.758781,18547.428727,1,98,15,15,5,6,6,3,0,0,1,37,2,5,1,4 +69565,7,2,2,6,NA,2,2,2,6,72,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10276.40638,10435.186077,2,99,99,99,NA,5,3,0,1,0,1,40,2,1,6,NA +69566,7,2,1,80,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,2,2,2,2,2,1,NA,13654.270555,14429.301836,2,93,12,12,NA,2,2,0,0,2,2,79,NA,NA,1,1 +69567,7,2,2,10,NA,3,3,1,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18800.96526,18551.296274,1,94,3,3,0.37,5,5,0,3,0,2,29,1,4,4,NA +69568,7,2,2,11,NA,4,4,1,11,137,NA,NA,2,2,2,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8504.389189,8822.229593,2,93,6,6,2.24,3,1,1,1,0,2,31,2,3,3,NA +69569,7,2,2,61,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,17243.546687,17909.086027,1,92,6,6,2.15,2,2,0,0,2,2,61,2,4,1,5 +69570,7,1,1,8,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,73471.277275,0,2,101,8,8,1.72,5,5,0,3,0,1,37,1,3,1,3 +69571,7,2,1,19,NA,5,6,2,20,NA,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11506.937395,12032.024805,1,97,7,7,1.48,5,5,0,1,0,2,46,2,4,1,NA +69572,7,2,2,42,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,4,4,2,1,2,1,1,2,1,NA,NA,NA,NA,13568.706187,14164.354411,3,90,8,4,1.61,3,1,0,0,1,2,68,2,2,4,NA +69573,7,2,2,53,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,15790.702799,16017.473382,2,90,2,2,0.48,2,2,0,0,1,2,53,2,3,1,3 +69574,7,2,2,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,163194.688032,166437.638141,1,97,14,14,4.96,2,2,0,0,0,1,59,1,4,1,5 +69575,7,2,2,12,NA,4,4,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11990.226944,12023.57752,2,95,2,2,0.26,3,3,0,2,0,2,31,1,3,5,NA +69576,7,2,1,2,NA,4,4,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7325.198118,7777.386797,1,100,13,13,NA,5,5,2,0,0,2,54,1,4,5,NA +69577,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,18061.358948,18207.066814,2,93,3,3,1.07,1,1,0,0,0,1,52,1,3,4,NA +69578,7,2,2,6,NA,1,1,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16412.026403,2,98,2,2,0.35,3,3,0,1,0,2,43,1,3,1,3 +69579,7,2,2,4,NA,5,6,1,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6443.362832,6436.557151,1,98,15,15,5,3,3,1,0,0,2,37,2,5,1,5 +69580,7,2,1,23,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20623.434727,20610.774284,1,93,3,3,0.7,3,3,1,0,0,1,23,2,4,1,2 +69581,7,2,1,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,16386.190684,16050.428992,2,90,15,15,5,4,4,0,0,0,1,57,2,5,1,5 +69582,7,2,2,30,NA,2,2,2,NA,NA,2,NA,2,7,77,NA,1,2,2,2,2,2,2,2,2,NA,NA,NA,NA,35353.005268,36684.976775,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +69583,7,2,2,4,NA,5,6,2,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4962.240532,5199.576603,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +69584,7,2,2,0,6,5,7,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14926.308861,15231.47558,1,102,8,8,1.91,5,5,1,2,0,2,38,1,5,1,4 +69585,7,1,2,4,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53166.229434,0,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +69586,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5255.532858,5319.636438,2,99,1,1,0.1,3,3,1,1,0,2,28,1,4,5,NA +69587,7,2,1,77,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,16823.6553,18089.239033,1,92,9,9,3.64,2,2,0,0,2,1,77,1,5,1,4 +69588,7,2,2,10,NA,3,3,2,10,127,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,66519.408962,66670.760406,1,98,15,15,4.34,4,4,0,2,0,1,51,1,5,1,5 +69589,7,2,1,0,2,3,3,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17418.612172,17117.482228,1,91,14,14,5,3,3,1,0,0,2,30,1,5,1,5 +69590,7,2,2,19,NA,4,4,2,19,235,2,NA,1,1,NA,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,4,4,0.81,4,4,1,0,0,2,51,1,2,4,NA +69591,7,2,2,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,122655.643802,123752.268878,3,91,15,15,5,2,2,0,0,0,1,29,1,4,1,4 +69592,7,1,1,16,NA,1,1,NA,NA,NA,NA,NA,2,2,3,10,NA,NA,NA,1,2,2,1,2,1,NA,NA,NA,NA,18242.832494,0,1,102,99,99,NA,5,5,0,2,1,1,52,2,1,1,1 +69593,7,2,2,1,18,4,4,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6306.491784,6469.273037,2,90,9,9,3.18,3,3,1,0,0,2,38,2,4,5,NA +69594,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,22911.854766,1,95,6,6,1.09,5,5,0,3,0,1,31,1,4,1,4 +69595,7,2,2,3,NA,3,3,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,68579.013834,75690.025736,1,95,15,15,5,3,3,1,0,0,1,26,1,3,1,4 +69596,7,2,1,64,NA,4,4,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,8219.195224,8283.488354,2,99,10,10,3.67,3,3,0,0,1,1,64,2,4,1,5 +69597,7,2,2,2,NA,5,6,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6075.554662,6069.137471,1,93,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +69598,7,2,1,34,NA,3,3,2,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,87891.395784,90408.650551,2,99,15,15,5,1,1,0,0,0,1,34,2,5,1,NA +69599,7,2,1,21,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,5,NA,2,2,2,1,2,2,1,2,2,1,42077.383821,44759.048785,1,102,4,4,0.67,4,4,0,1,0,1,23,2,4,5,NA +69600,7,2,1,65,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,6815.198656,6994.794831,3,90,15,15,4.34,4,4,0,0,1,1,65,1,3,1,4 +69601,7,2,1,17,NA,3,3,2,17,205,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,93665.036597,95017.313859,1,91,15,15,5,4,4,0,1,0,1,45,1,5,1,5 +69602,7,2,1,49,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,1,2,2,1,2,1,1,2,NA,35406.972937,36103.049421,2,98,3,3,0.98,2,2,0,0,1,2,80,1,1,2,NA +69603,7,2,1,26,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,35669.2076,40318.090187,2,94,4,4,0.81,4,4,2,0,0,1,26,2,2,1,2 +69604,7,2,2,1,15,1,1,1,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,14326.094268,14518.763259,3,92,4,4,0.65,4,4,2,0,0,2,24,2,2,1,2 +69605,7,2,1,12,NA,2,2,1,12,147,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14532.438529,15479.089621,2,93,14,14,3.52,5,5,1,2,0,1,44,1,5,1,5 +69606,7,2,2,11,NA,4,4,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10332.067017,11124.939356,1,100,12,12,NA,3,3,0,1,0,2,52,1,3,1,3 +69607,7,2,1,40,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,34025.01199,1,95,2,2,0.46,1,1,0,0,0,1,40,1,1,3,NA +69608,7,2,1,75,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,9662.124837,10964.58979,2,92,4,4,1.43,1,1,0,0,1,1,75,1,3,3,NA +69609,7,2,1,4,NA,4,4,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9885.965005,10187.921537,2,97,3,1,0.44,3,1,2,0,0,2,20,1,2,5,NA +69610,7,2,1,20,NA,5,7,1,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14385.653726,15040.55165,2,101,99,2,0.46,4,1,0,0,0,1,18,NA,NA,NA,NA +69611,7,2,2,8,NA,5,7,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9007.62445,9504.796896,2,102,15,15,5,4,4,0,2,0,1,39,1,4,1,5 +69612,7,2,2,15,NA,3,3,1,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74658.856536,76060.378937,1,100,15,15,5,5,5,0,3,0,1,47,1,5,1,5 +69613,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,11739.283384,12336.327776,1,96,15,15,5,5,5,0,0,0,1,58,2,5,1,5 +69614,7,1,1,3,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,81535.075159,0,3,91,8,8,3.4,2,2,1,0,0,2,31,1,3,5,NA +69615,7,2,2,12,NA,1,1,1,12,150,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18515.058419,19360.671834,2,96,6,6,1.12,4,4,0,3,0,1,26,1,2,77,NA +69616,7,2,2,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,44672.331977,48301.986589,1,98,2,2,0.36,5,5,3,0,0,1,25,1,3,1,3 +69617,7,2,2,25,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,97925.559493,100647.602701,1,91,15,6,2.69,3,1,0,0,0,1,27,1,3,6,NA +69618,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,127865.461733,133989.246473,1,101,4,4,1.26,2,2,0,0,2,1,62,1,3,1,3 +69619,7,2,2,41,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,19075.861607,18884.31701,1,96,6,6,1.21,4,4,0,2,0,2,41,1,4,4,NA +69620,7,2,1,49,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,31347.36219,32073.699502,2,90,6,6,1.21,4,4,0,0,0,2,59,2,1,6,NA +69621,7,2,1,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,30631.476666,32101.68524,2,101,8,8,2.81,3,3,0,1,0,1,35,1,1,1,2 +69622,7,2,1,58,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,27140.404673,28346.53309,1,95,5,5,1.1,3,3,0,0,1,2,63,1,4,1,5 +69623,7,2,1,4,NA,1,1,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19411.993395,20798.549942,1,92,14,14,3.9,4,4,2,0,0,2,29,1,4,1,4 +69624,7,2,1,67,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,3,1,NA,1,2,1,NA,NA,NA,1,2,1,3,11145.558675,11717.869264,2,96,NA,NA,NA,4,4,0,0,1,1,67,2,3,1,2 +69625,7,2,1,29,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,111450.827181,113182.912698,3,91,15,15,5,2,2,0,0,0,1,29,1,4,1,4 +69626,7,2,1,53,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,161135.312305,165002.304429,2,101,14,14,4.86,3,3,0,1,0,1,53,1,4,1,5 +69627,7,2,2,13,NA,4,4,2,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13621.250519,13659.137754,1,93,7,7,2.72,2,2,0,1,0,2,45,1,3,3,NA +69628,7,2,1,9,NA,1,1,1,9,116,NA,NA,2,2,3,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,14821.597351,14686.992722,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +69629,7,2,2,16,NA,3,3,1,16,197,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,39616.634313,47751.80094,2,101,3,3,0.59,4,3,0,2,0,1,39,1,1,6,NA +69630,7,2,1,23,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,33592.259589,34050.148008,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +69631,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,1,2,1,2,2,1,2,2,NA,29183.224814,31443.714435,1,95,7,7,2.3,3,3,0,0,2,1,80,1,4,1,2 +69632,7,2,1,44,NA,2,2,2,NA,NA,1,2,2,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,31640.296506,32279.766727,2,94,8,8,2.01,4,4,1,1,0,1,44,2,4,1,4 +69633,7,2,1,38,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,42890.643983,44071.237251,1,98,15,15,5,5,5,2,1,0,1,38,1,4,1,5 +69634,7,2,2,14,NA,2,2,2,14,174,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22139.315046,23195.552704,3,91,6,6,0.83,6,6,1,3,0,1,37,1,4,1,4 +69635,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,175997.804296,180603.118894,1,101,7,7,2.31,2,2,0,0,1,1,60,1,3,1,3 +69636,7,2,1,2,NA,2,2,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10136.626471,10860.663695,2,100,14,14,3.58,4,4,1,1,0,1,33,1,4,1,5 +69637,7,2,2,58,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,189736.955264,194603.321172,1,98,6,6,2.6,1,1,0,0,0,2,58,1,2,3,NA +69638,7,2,2,5,NA,3,3,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,53166.229434,56500.79967,1,98,7,7,1.66,5,5,2,1,0,2,37,1,5,1,3 +69639,7,1,1,48,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,20480.361635,0,2,99,6,6,2.69,1,1,0,0,0,1,48,1,3,5,NA +69640,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,14883.664782,16969.371761,2,90,5,5,1.08,3,3,1,1,0,2,23,1,2,5,NA +69641,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,1,2,1,2,2,NA,NA,NA,NA,109290.289961,113677.204054,1,100,15,15,5,3,3,0,0,0,1,53,1,5,1,4 +69642,7,2,1,19,NA,4,4,1,19,232,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,1,1,0.05,1,1,0,0,0,1,19,1,4,NA,NA +69643,7,2,2,0,10,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7565.515117,8068.295221,1,100,3,3,0.43,4,4,2,0,0,1,20,1,3,6,NA +69644,7,2,2,64,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11838.431472,12295.352662,2,94,8,8,1.8,6,6,0,1,2,1,74,2,5,1,5 +69645,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,49260.413155,50771.674072,2,100,99,99,NA,2,2,0,0,2,1,72,1,4,1,4 +69646,7,2,1,9,NA,3,3,2,10,120,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,82670.203859,86374.629723,1,97,15,15,4.07,5,5,0,3,0,1,36,1,5,1,5 +69647,7,2,1,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,113559.363135,116811.761686,2,102,14,14,3.44,5,5,1,2,0,2,34,1,4,6,NA +69648,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,32471.790416,34987.007487,2,96,15,15,5,2,2,0,0,2,2,80,2,5,1,5 +69649,7,2,1,27,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,1,2,2,3,14385.653726,15533.829525,2,101,7,5,1.84,2,1,0,0,0,1,27,2,5,5,NA +69650,7,2,1,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,36244.629058,36151.524069,1,98,3,2,0.72,2,1,0,0,0,2,50,1,2,3,NA +69651,7,2,1,15,NA,4,4,1,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18120.648572,18071.489418,1,100,3,3,0.43,4,4,0,2,0,1,35,1,4,1,3 +69652,7,2,2,74,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,12833.793728,13278.897744,2,92,5,5,1.08,3,3,0,0,2,1,46,NA,NA,5,NA +69653,7,2,1,28,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,111887.48668,1,94,9,9,3.14,3,3,1,0,0,1,28,1,5,1,5 +69654,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,23484.626749,23642.328802,2,96,14,14,4.26,3,3,0,0,0,1,20,1,4,5,NA +69655,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,22419.63376,27869.657009,1,94,2,2,0.72,1,1,0,0,1,2,80,1,3,2,NA +69656,7,2,1,62,NA,4,4,2,NA,NA,2,NA,2,2,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,7514.993062,8122.478925,2,90,14,14,4.59,3,3,0,0,1,2,56,2,3,1,1 +69657,7,2,2,4,NA,5,6,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6899.969666,7508.722153,1,94,10,10,3.04,4,4,2,0,0,2,30,1,4,1,5 +69658,7,2,1,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,11034.04089,11250.172797,2,95,14,14,5,2,2,0,0,2,1,73,1,5,1,4 +69659,7,2,2,12,NA,3,3,2,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,42712.452836,43268.322789,2,94,3,3,0.95,2,2,0,1,0,2,45,1,5,3,NA +69660,7,2,1,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,11764.405491,12715.399053,1,97,NA,NA,NA,7,7,0,3,1,2,47,NA,NA,1,NA +69661,7,2,2,57,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11446.604914,11507.133903,2,92,3,3,0.45,4,4,0,0,1,1,64,2,1,1,1 +69662,7,2,2,7,NA,1,1,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14300.71869,14671.891945,2,94,7,7,1.17,6,6,1,2,0,2,30,2,3,6,NA +69663,7,2,1,3,NA,3,3,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78932.667512,89054.807173,3,92,14,14,2.74,6,6,2,2,0,1,35,1,5,1,4 +69664,7,2,1,3,NA,5,6,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5492.796032,5932.072263,2,100,14,14,3.06,5,5,1,0,1,2,31,2,5,1,5 +69665,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,16058.142925,15728.179634,2,101,7,7,1.3,5,5,2,0,1,2,50,1,4,1,3 +69666,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,69047.315371,69784.701831,1,95,8,8,2.7,3,3,0,1,2,1,69,1,5,1,3 +69667,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,8,8,3.4,2,2,0,0,2,1,66,1,5,1,4 +69668,7,2,1,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,120367.559207,121496.443862,2,95,15,15,5,2,2,0,0,1,1,61,1,5,1,5 +69669,7,2,2,66,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,9680.216878,10112.428208,1,96,15,15,5,1,1,0,0,1,2,66,1,5,2,NA +69670,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60148.377616,67408.231176,1,92,6,6,1.98,2,2,0,0,2,1,80,1,5,1,4 +69671,7,2,2,58,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,1,4,NA,2,2,2,2,2,2,2,2,1,2,20130.149569,20235.126587,1,90,99,99,NA,6,6,0,3,0,2,58,2,1,4,NA +69672,7,2,1,69,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,5201.567667,5487.342926,2,92,10,6,1.12,7,4,1,1,1,2,27,2,3,1,3 +69673,7,2,2,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6247.52442,6810.692829,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +69674,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,7736.56115,7645.782314,1,99,8,8,1.76,5,5,0,2,1,1,37,1,4,1,3 +69675,7,2,2,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,24977.658912,25631.246482,2,95,5,5,1.52,2,2,0,0,0,2,58,1,2,2,NA +69676,7,2,1,5,NA,2,2,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16632.464801,16654.939181,1,94,2,2,0.26,4,4,2,1,0,2,25,1,4,5,NA +69677,7,2,1,13,NA,4,4,1,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13653.432599,13680.426553,2,96,5,5,1.07,4,4,0,3,0,2,46,1,4,3,NA +69678,7,2,2,1,18,1,1,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13464.808163,14865.509546,1,101,9,9,2.88,3,3,1,0,0,1,36,2,2,1,4 +69679,7,2,1,26,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17095.959542,2,100,8,8,3.06,2,2,0,0,0,1,26,1,5,1,5 +69680,7,2,1,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,16058.989596,16124.245459,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +69681,7,2,1,4,NA,4,4,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7299.892005,7750.518524,2,99,9,9,1.78,6,6,1,1,0,1,46,1,3,6,NA +69682,7,2,1,67,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,2,NA,2,2,2,2,2,2,1,2,2,NA,8609.250304,11228.904188,2,90,4,4,1.02,2,2,0,0,1,1,67,2,1,2,NA +69683,7,2,1,8,NA,4,4,2,9,108,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8017.552697,8398.795399,1,99,10,10,2.07,7,7,2,3,1,2,35,1,5,4,NA +69684,7,2,1,65,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,1,3,NA,2,2,2,2,2,2,2,2,2,2,9404.30514,9554.950099,2,93,3,3,0.58,4,4,0,1,1,1,65,2,1,3,NA +69685,7,2,2,17,NA,1,1,1,17,205,2,NA,2,2,3,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24654.448233,25524.546766,2,96,6,6,1.12,4,4,0,1,0,1,57,2,1,1,4 +69686,7,2,1,5,NA,1,1,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17048.276421,17071.31266,1,94,5,5,0.87,4,4,1,1,0,1,35,2,1,1,1 +69687,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,141912.982157,152670.471787,1,97,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +69688,7,2,1,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,17036.36313,17063.789746,1,99,14,14,5,1,1,0,0,0,1,42,1,4,4,NA +69689,7,2,1,51,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15413.22404,15402.649971,1,97,15,15,5,4,4,0,0,0,1,51,2,5,1,5 +69690,7,2,2,2,NA,3,3,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,37915.354974,40293.39486,2,91,15,15,5,5,5,1,2,0,1,37,1,4,6,NA +69691,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,24919.497762,30093.052062,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +69692,7,2,1,50,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,29903.342494,29985.789069,1,95,12,5,1.84,4,1,0,0,0,1,29,1,3,6,NA +69693,7,2,2,37,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,43463.010321,44104.658285,1,98,6,6,1.98,2,2,0,1,0,2,37,1,4,3,NA +69694,7,2,1,15,NA,4,4,2,15,191,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9757.309092,9852.859452,1,96,15,15,5,6,6,1,1,1,2,44,1,3,1,3 +69695,7,2,1,80,NA,4,4,2,NA,NA,2,NA,2,1,9,NA,9,3,NA,1,2,2,1,2,2,1,2,2,NA,8992.410435,9337.125921,2,90,4,4,1.54,1,1,0,0,1,1,80,2,9,3,NA +69696,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32144.824104,32969.273278,2,97,3,3,1.1,1,1,0,0,0,2,56,1,2,3,NA +69697,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,12,2,0.54,4,1,0,0,0,1,21,1,4,6,NA +69698,7,2,1,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,20851.046913,21183.857295,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +69699,7,1,1,11,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10229.206765,0,1,96,14,14,2.96,5,5,0,3,0,1,46,NA,NA,1,5 +69700,7,2,2,27,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,NA,NA,NA,NA,42583.505439,50840.190326,2,91,2,2,0.42,3,3,1,1,0,2,27,1,3,5,NA +69701,7,2,1,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17636.923031,17665.316481,2,101,6,6,2.57,1,1,0,0,0,1,52,1,3,5,NA +69702,7,2,1,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,97539.00155,100726.587936,1,99,77,77,NA,3,3,0,0,0,1,42,1,4,6,NA +69703,7,2,1,0,3,4,4,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7441.732415,8231.273488,2,98,3,3,0.54,3,3,1,1,0,2,29,1,2,1,NA +69704,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,109181.566304,114466.270601,2,91,15,3,1.07,7,1,0,0,1,1,49,NA,NA,5,NA +69705,7,2,1,42,NA,4,4,1,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17221.349323,18312.731752,1,103,8,8,1.95,4,4,0,1,0,2,48,1,5,1,5 +69706,7,2,2,9,NA,5,6,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,8290.163782,8692.019106,1,92,2,2,0.24,5,5,0,2,0,1,35,2,4,1,3 +69707,7,2,2,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12736.176535,13301.727395,1,97,15,15,5,4,4,1,1,0,1,35,1,5,1,5 +69708,7,2,1,14,NA,1,1,1,14,179,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15469.666055,15805.71937,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +69709,7,2,2,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,128065.93322,127632.692688,1,98,4,4,1.52,1,1,0,0,1,2,62,1,4,5,NA +69710,7,2,2,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,51744.846443,52360.821424,1,97,4,3,0.93,3,2,0,0,0,1,35,1,3,1,4 +69711,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16675.763807,16530.996917,2,95,8,8,1.85,5,5,1,2,0,1,55,1,2,1,3 +69712,7,2,1,31,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,23631.037942,24059.753898,1,91,9,9,5,1,1,0,0,0,1,31,2,5,5,NA +69713,7,2,1,17,NA,2,2,2,17,207,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24585.624844,25010.051033,3,91,6,6,0.83,6,6,1,3,0,1,37,1,4,1,4 +69714,7,2,1,18,NA,4,4,1,18,226,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,99,99,NA,4,1,0,0,0,1,18,1,4,NA,NA +69715,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,15598.269927,16258.702668,1,99,4,4,0.41,7,7,2,4,0,2,43,1,4,4,NA +69716,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126687.376548,128757.240271,1,101,9,9,2.6,4,4,0,1,2,2,63,1,4,1,4 +69717,7,2,1,3,NA,1,1,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19476.194601,19502.51153,2,102,15,15,5,4,4,2,0,0,1,32,1,5,1,5 +69718,7,2,2,15,NA,3,3,1,15,182,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,82923.224369,87859.866176,2,100,8,8,2.91,3,3,0,2,0,2,48,1,5,1,NA +69719,7,2,1,3,NA,3,3,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,31190.854587,34157.026846,1,95,2,2,0.22,4,4,2,1,0,2,22,1,2,5,NA +69720,7,2,2,3,NA,4,4,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,10901.48845,2,100,5,5,0.94,4,4,2,0,0,2,33,1,4,6,NA +69721,7,2,2,22,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,14500.122872,13786.884381,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +69722,7,2,1,7,NA,4,4,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7758.863533,8127.805304,2,99,3,3,0.42,6,6,1,2,0,2,43,1,4,6,NA +69723,7,2,2,9,NA,3,3,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22371.648216,22397.198208,1,92,4,4,0.61,5,5,1,2,0,1,34,1,3,6,NA +69724,7,2,1,58,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,28585.875492,28917.983006,1,91,5,5,1.2,3,3,0,0,1,1,58,1,2,1,2 +69725,7,2,1,5,NA,3,3,1,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,73006.119819,82368.252941,1,101,14,14,3.15,5,5,2,1,0,1,35,1,4,1,5 +69726,7,1,1,53,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,30582.99679,0,1,97,4,3,1.07,2,1,0,0,1,2,66,NA,NA,5,NA +69727,7,2,1,4,NA,5,6,1,4,55,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7042.228842,7250.600343,2,103,9,9,3.14,3,3,1,0,0,1,32,2,5,1,5 +69728,7,2,1,35,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20071.705576,20986.552878,3,91,14,14,5,2,2,0,0,0,1,35,2,5,1,5 +69729,7,2,2,3,NA,4,4,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10389.292229,11178.99433,2,101,7,7,1.3,5,5,2,0,1,2,50,1,4,1,3 +69730,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,11194.560864,11943.741966,2,95,5,5,1.88,1,1,0,0,1,2,70,1,3,3,NA +69731,7,2,2,19,NA,4,4,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,99,1,0.02,2,1,0,0,0,2,19,1,4,NA,NA +69732,7,2,1,33,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,5,1,NA,1,2,1,1,2,1,1,2,1,3,12327.761744,13173.339372,3,90,5,5,0.93,4,4,1,0,0,1,48,2,4,1,NA +69733,7,1,1,67,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,7117.971973,0,2,100,3,3,0.75,2,2,0,0,2,1,67,1,3,1,2 +69734,7,2,1,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,74110.989124,87044.270957,2,95,8,8,4.48,1,1,0,0,0,1,26,1,5,5,NA +69735,7,2,1,20,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14949.232836,15463.9021,1,100,99,99,NA,6,6,0,1,0,1,53,2,2,1,3 +69736,7,2,2,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,1,1,0.14,4,1,0,0,0,2,21,1,4,5,NA +69737,7,2,1,31,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,58170.292683,59516.479078,3,92,8,8,2.36,3,3,0,0,0,1,34,NA,NA,5,NA +69738,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,34802.051557,35120.431265,1,101,4,4,1.16,2,2,0,1,0,2,51,1,4,3,NA +69739,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,17260.508485,17587.688781,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +69740,7,2,2,66,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,95538.505899,97099.44822,2,95,14,14,5,2,2,0,0,2,2,66,1,5,1,5 +69741,7,2,1,10,NA,1,1,1,10,129,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,17882.621856,17720.218058,3,92,3,3,0.51,5,5,1,2,0,2,34,2,1,6,NA +69742,7,2,1,4,NA,5,6,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6138.820061,6885.358348,1,99,10,10,4.76,2,2,1,0,0,2,36,2,5,3,NA +69743,7,2,1,46,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,29276.135189,1,94,7,7,1.65,5,4,0,0,0,1,46,1,4,1,4 +69744,7,1,1,12,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13416.172328,0,1,96,14,14,2.96,5,5,0,3,0,1,46,NA,NA,1,5 +69745,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,27005.036261,27122.782392,1,102,1,1,0,3,1,0,0,1,2,50,1,3,3,NA +69746,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,115926.402585,118970.086068,1,101,15,15,5,4,4,0,2,0,1,43,1,4,1,5 +69747,7,2,2,34,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,NA,NA,NA,1,2,2,1,21229.081867,21886.919672,3,90,5,5,0.87,4,4,0,0,0,2,43,2,3,5,NA +69748,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,162404.084268,1,95,7,7,2.86,2,2,0,0,0,2,50,1,3,1,3 +69749,7,2,1,12,NA,2,2,2,12,151,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16033.31661,17623.465787,2,90,5,5,0.76,5,5,0,4,0,2,32,1,2,3,NA +69750,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,79677.823556,83116.431703,1,99,15,15,4.47,4,4,0,2,0,2,43,1,5,1,5 +69751,7,2,2,0,5,1,1,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6787.112205,6644.319314,2,94,8,8,2.43,3,3,1,0,0,1,24,2,4,1,4 +69752,7,2,2,79,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,81062.798322,83549.725067,1,101,4,4,1.75,1,1,0,0,1,2,79,1,5,2,NA +69753,7,2,2,63,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14204.126838,14796.942631,1,92,5,5,1.41,2,2,0,0,2,1,60,1,2,1,4 +69754,7,2,1,80,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,10160.645851,10359.669924,1,96,77,77,NA,7,7,0,3,1,2,43,77,5,5,NA +69755,7,2,2,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,156359.467613,158914.124584,2,102,14,14,5,2,2,0,0,2,2,65,1,5,1,5 +69756,7,2,1,2,NA,4,4,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4778.010882,5139.584556,2,93,99,99,NA,7,6,1,0,0,1,19,1,3,NA,NA +69757,7,2,1,19,NA,5,7,2,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,10,10,3.04,4,4,0,1,0,2,43,1,5,1,4 +69758,7,2,2,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,21127.557839,23583.17383,1,102,4,4,0.97,3,3,0,1,0,2,19,1,2,NA,NA +69759,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,32838.149884,1,95,1,1,0.18,1,1,0,0,0,1,51,1,4,4,NA +69760,7,2,1,5,NA,4,4,2,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9446.305539,9734.833129,2,95,1,1,0,4,4,2,1,0,2,27,1,4,5,NA +69761,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,14859.685983,15314.825218,1,95,3,3,0.96,1,1,0,0,1,2,80,1,2,2,NA +69762,7,2,1,15,NA,1,1,1,15,190,NA,NA,2,2,3,9,NA,NA,NA,2,1,2,1,2,2,2,2,2,2,24230.15013,23997.357824,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +69763,7,2,2,6,NA,4,4,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7282.523598,8846.731146,2,99,5,5,0.76,5,5,0,2,0,1,51,1,2,1,2 +69764,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17328.248994,2,100,14,14,3.06,5,5,1,0,0,1,50,1,5,1,5 +69765,7,2,2,65,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,3,NA,2,2,2,1,2,2,1,2,1,2,11495.911371,12347.505602,2,99,3,3,0.52,3,3,0,0,1,2,38,2,3,3,NA +69766,7,2,2,4,NA,2,2,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15979.952759,16987.381382,2,102,14,14,3.25,5,5,2,0,0,1,27,1,5,1,5 +69767,7,2,1,56,NA,5,7,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,151766.599459,154414.492891,3,91,7,7,1.97,4,4,0,0,1,2,77,1,5,2,NA +69768,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,23041.888919,1,98,3,2,0.81,4,1,0,0,0,2,21,NA,NA,5,NA +69769,7,2,2,0,4,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21671.775435,21083.121886,1,98,7,7,1.83,3,3,1,0,0,2,26,1,5,1,4 +69770,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,13495.651715,13078.348337,2,99,NA,77,NA,7,7,1,0,1,2,51,1,2,1,3 +69771,7,2,1,3,NA,5,6,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,10276.262805,11525.953064,1,97,15,15,5,4,4,2,0,0,2,35,2,4,1,4 +69772,7,2,2,3,NA,4,4,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11671.9972,12190.293097,1,93,4,4,1.03,3,3,1,1,0,2,35,2,3,4,NA +69773,7,2,1,40,NA,4,4,1,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23242.990557,23331.304109,1,100,9,9,2.22,5,5,1,2,0,2,40,2,4,1,4 +69774,7,2,1,54,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,20167.650721,25203.089486,3,90,12,7,3.58,2,1,0,0,1,1,71,2,2,1,NA +69775,7,2,1,8,NA,2,2,2,8,101,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15039.041447,15306.786696,3,91,6,6,0.83,6,6,1,3,0,1,37,1,4,1,4 +69776,7,2,1,57,NA,1,1,2,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22446.308035,22116.943066,2,94,7,7,1.33,6,6,0,1,0,1,55,2,2,1,1 +69777,7,2,2,60,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10003.290711,10218.574955,1,99,10,10,2.58,5,5,0,1,2,1,65,1,5,1,3 +69778,7,2,1,42,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,3,6,NA,2,2,2,2,2,2,2,2,2,2,31640.296506,31576.726829,2,94,9,9,4.21,3,2,0,0,0,2,48,2,2,6,NA +69779,7,2,1,13,NA,3,3,2,13,166,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,77169.155154,76948.022242,1,98,14,14,3.9,4,4,0,3,0,2,31,1,4,1,NA +69780,7,2,1,9,NA,3,3,2,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,66868.503099,69864.859716,1,98,14,14,3.15,5,5,0,3,0,1,34,1,4,1,4 +69781,7,2,1,0,10,3,3,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26076.0211,27915.503824,2,91,15,15,5,4,4,2,0,0,2,33,1,5,1,5 +69782,7,2,1,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,20075.522681,20698.300141,2,98,77,77,NA,1,1,0,0,0,1,52,1,3,5,NA +69783,7,2,2,66,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13023.675419,13480.293434,2,96,2,2,0.55,1,1,0,0,1,2,66,2,5,5,NA +69784,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11218.730451,2,101,2,2,0.64,1,1,0,0,1,1,69,1,2,5,NA +69785,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,22419.63376,25250.873067,1,94,3,3,1.08,1,1,0,0,1,2,80,1,2,2,NA +69786,7,2,2,1,22,3,3,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46813.021927,47428.160802,1,94,15,15,4.77,4,4,2,0,0,1,48,1,4,1,5 +69787,7,2,2,57,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,22969.116046,23893.408664,2,93,9,9,3.97,2,2,0,0,1,2,57,2,3,1,1 +69788,7,2,1,14,NA,2,2,1,14,169,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,30061.88611,30025.949584,1,92,6,6,0.93,5,5,0,2,0,1,47,2,1,1,1 +69789,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,16181.169973,15916.061734,2,100,99,99,NA,1,1,0,0,0,2,53,1,2,3,NA +69790,7,2,1,12,NA,5,6,1,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6886.223812,7737.788899,2,92,7,7,1.61,4,4,0,2,0,1,51,2,3,1,3 +69791,7,1,2,63,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,30036.804187,0,2,100,4,4,1.29,2,2,0,0,2,1,65,1,3,1,3 +69792,7,2,1,5,NA,4,4,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11324.865632,11670.771889,2,96,3,3,0.54,4,4,2,1,0,2,25,1,4,2,NA +69793,7,2,1,35,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20181.692021,20449.370526,1,92,2,2,0.24,5,5,0,2,0,1,35,2,4,1,3 +69794,7,2,1,9,NA,2,2,1,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8889.501355,9473.596146,2,93,14,14,3.52,5,5,1,2,0,1,44,1,5,1,5 +69795,7,1,2,80,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,NA,NA,NA,NA,16321.652472,0,2,101,1,1,0.08,2,2,0,0,2,2,80,1,1,2,NA +69796,7,2,2,3,NA,4,4,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11990.08101,12901.460915,1,100,15,15,3.87,6,6,1,3,0,2,39,1,4,1,4 +69797,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,74517.751389,77393.175383,2,94,14,14,3.36,4,4,2,0,0,1,31,1,3,1,5 +69798,7,2,2,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,65591.951555,69705.816211,2,101,2,2,0.46,2,1,0,0,0,2,21,1,4,5,NA +69799,7,2,2,8,NA,4,4,2,8,96,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7814.742747,8587.431439,2,95,7,7,1.55,5,5,0,3,0,1,30,1,4,1,4 +69800,7,2,1,10,NA,5,6,2,10,131,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6262.834446,6755.01452,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +69801,7,2,2,3,NA,5,6,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3864.413878,3822.111022,1,99,14,14,2.66,7,7,3,1,0,1,35,1,5,1,5 +69802,7,2,2,17,NA,3,3,1,17,207,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,36586.371708,39087.782259,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +69803,7,2,1,44,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,20543.822351,1,97,15,15,5,4,4,1,1,0,1,44,2,5,1,5 +69804,7,2,1,6,NA,3,3,1,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47373.769078,49181.31317,1,103,15,15,5,3,3,0,1,0,1,46,1,5,1,5 +69805,7,2,1,1,19,5,6,1,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6389.003009,6767.308805,3,91,14,14,3.06,5,5,3,0,0,1,34,2,5,1,5 +69806,7,2,1,75,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,8763.51401,8935.17143,2,100,6,6,1.62,3,3,0,0,2,1,75,1,5,1,NA +69807,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,10083.559248,10533.779383,1,96,14,14,4.06,3,3,0,0,1,2,61,1,4,5,NA +69808,7,1,1,80,NA,4,4,NA,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,1,2,1,2,2,NA,NA,NA,NA,7041.644998,0,2,100,13,13,NA,2,2,0,0,2,2,77,1,3,1,4 +69809,7,2,1,4,NA,4,4,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8973.990262,9344.796725,2,95,1,1,0.09,5,5,3,1,0,2,31,1,2,1,NA +69810,7,2,2,14,NA,2,2,1,14,178,NA,NA,2,2,2,9,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15809.066118,16348.490248,2,93,5,5,1.26,3,3,0,1,0,1,55,2,2,1,2 +69811,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,124170.603852,124019.195449,2,98,6,6,2.75,1,1,0,0,0,1,59,1,4,4,NA +69812,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,47636.23298,52171.746701,1,91,9,9,4.27,2,2,0,0,2,1,80,1,4,1,3 +69813,7,2,2,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,28351.482206,28369.098474,1,96,9,9,3.35,3,3,0,0,0,2,42,1,4,5,NA +69814,7,2,2,15,NA,2,2,2,15,187,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18368.872199,19023.186366,2,91,10,10,2.95,4,4,0,1,0,2,18,1,3,NA,NA +69815,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,15205.189409,15734.277598,2,96,7,7,2.72,2,2,0,0,1,2,70,1,4,2,NA +69816,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,20000.263815,22894.1152,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +69817,7,2,1,33,NA,5,7,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16045.513116,17473.610556,1,90,6,6,0.92,6,6,2,0,2,2,30,2,5,1,5 +69818,7,2,2,19,NA,5,6,1,20,NA,2,NA,1,1,NA,15,NA,NA,NA,1,2,1,NA,NA,NA,1,2,2,1,9278.834813,9462.75742,1,92,2,2,0.33,5,5,0,1,0,1,51,2,1,4,NA +69819,7,2,2,11,NA,3,3,1,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71426.628275,70878.719996,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +69820,7,2,2,6,NA,1,1,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16664.698857,2,98,6,6,0.63,7,7,2,2,1,1,60,1,3,1,2 +69821,7,2,2,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,7869.59899,8476.202883,2,100,1,1,0.14,1,1,0,0,1,2,66,1,3,2,NA +69822,7,2,1,64,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,8636.698123,9111.200197,2,92,3,3,0.45,4,4,0,0,1,1,64,2,1,1,1 +69823,7,2,2,55,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,18441.731082,18102.807884,2,100,1,1,0,2,2,0,0,0,2,55,1,5,3,NA +69824,7,2,1,64,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,8275.049402,8531.146449,1,99,6,6,1.07,6,6,2,1,2,1,44,2,5,4,NA +69825,7,2,2,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,139800.409559,140918.856987,1,100,15,15,5,5,5,0,3,0,1,47,1,5,1,5 +69826,7,2,1,3,NA,3,3,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,20717.313101,23374.052614,2,97,5,5,0.8,5,5,1,2,0,1,46,2,4,1,2 +69827,7,2,1,30,NA,2,2,2,NA,NA,2,NA,2,2,4,NA,2,4,NA,2,2,2,2,2,2,1,2,1,2,27605.196104,27396.850962,2,99,12,77,NA,5,1,0,1,0,1,30,2,2,4,NA +69828,7,2,2,18,NA,4,4,2,19,228,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,13176.946531,13078.313981,2,99,6,3,0.94,3,2,0,0,0,1,41,1,3,6,NA +69829,7,2,1,18,NA,4,4,1,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19844.605924,19989.134915,2,102,14,14,4.05,3,3,0,1,0,1,18,1,2,NA,NA +69830,7,2,2,4,NA,2,2,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13301.733639,13724.969642,2,93,3,3,0.48,4,4,1,1,0,1,49,2,3,1,4 +69831,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,2,NA,1,2,1,1,2,1,1,2,1,NA,13689.379977,14234.742701,2,92,2,2,0.88,1,1,0,0,1,2,80,2,1,2,NA +69832,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,7074.645577,7351.348885,2,95,7,7,3.31,1,1,0,0,1,1,61,1,3,2,NA +69833,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,29534.722322,30544.805853,3,91,77,77,NA,2,2,0,0,2,1,73,1,5,1,5 +69834,7,1,2,37,NA,5,6,NA,NA,NA,2,NA,2,1,5,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,13379.422066,0,2,103,14,14,3.86,4,4,2,0,0,2,37,2,5,1,NA +69835,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,35334.703093,40990.264786,1,101,2,2,0.63,1,1,0,0,1,2,80,1,1,2,NA +69836,7,2,1,1,21,3,3,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,35290.29852,40086.22326,1,102,14,14,2.87,5,5,3,0,0,1,35,1,5,1,5 +69837,7,2,2,9,NA,1,1,1,9,114,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15962.145468,16535.37648,2,98,3,3,0.33,7,7,2,3,0,1,40,2,1,1,1 +69838,7,2,1,31,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,30626.581617,36447.669921,2,90,6,6,1.35,3,3,1,0,0,1,31,1,3,1,4 +69839,7,2,2,8,NA,1,1,1,8,97,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,15841.451259,17367.937444,3,92,4,4,0.55,6,6,0,4,0,1,36,2,1,1,3 +69840,7,2,1,67,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,6964.172059,2,95,6,4,1.5,2,1,0,0,1,1,67,1,4,3,NA +69841,7,2,1,16,NA,1,1,2,16,199,NA,NA,2,2,3,10,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,21633.039913,21721.097793,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +69842,7,2,1,37,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,34887.439952,35849.951626,2,94,6,6,1.34,4,4,0,2,0,1,37,2,4,1,2 +69843,7,2,1,40,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,20543.822351,1,97,15,15,5,4,4,2,0,0,1,40,2,5,1,5 +69844,7,2,1,6,NA,1,1,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11770.89642,11957.164501,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +69845,7,2,2,15,NA,3,3,2,15,186,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,29885.567338,31265.78413,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +69846,7,2,1,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,100807.076657,102674.431164,1,97,15,15,4.77,4,4,0,0,0,1,56,1,4,1,4 +69847,7,2,1,80,NA,5,6,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,14603.225127,15344.674112,1,98,15,15,5,2,2,0,0,2,1,80,2,5,1,NA +69848,7,2,1,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,15417.485683,15656.172471,1,92,3,3,0.98,2,2,0,0,1,1,70,1,2,1,2 +69849,7,2,1,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,9257.537917,9255.717695,1,99,7,6,1.84,3,2,0,0,2,1,70,1,2,1,4 +69850,7,2,2,10,NA,1,1,2,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,15225.935813,16547.241996,2,94,7,7,1.57,4,4,0,2,0,1,30,2,3,1,4 +69851,7,2,2,31,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,18901.436377,19544.076782,3,91,14,14,5,2,2,0,0,0,1,35,2,5,1,5 +69852,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,35434.580514,39416.921733,1,95,4,4,1.47,1,1,0,0,1,2,80,1,3,1,NA +69853,7,2,1,10,NA,4,4,2,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8227.856305,9153.104022,3,91,1,1,0.07,6,6,2,3,0,2,30,1,2,3,NA +69854,7,2,1,65,NA,5,7,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,168185.448935,166468.676858,1,95,10,10,4.76,2,2,0,0,2,1,65,1,4,1,4 +69855,7,2,2,41,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,11762.034222,12708.069605,3,90,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +69856,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,78240.016337,83257.203545,1,93,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +69857,7,2,1,16,NA,5,7,2,16,203,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21852.102821,22875.024578,3,91,5,5,0.65,7,7,0,4,0,2,39,1,3,4,NA +69858,7,2,1,65,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9655.271429,9541.978936,1,95,9,9,4.21,2,2,0,0,1,1,65,1,5,1,4 +69859,7,2,2,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9503.429019,9925.429486,1,91,3,3,0.66,4,4,1,2,0,2,33,1,3,5,NA +69860,7,2,2,18,NA,4,4,1,18,222,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11224.041366,11682.365019,1,96,5,5,0.53,7,7,2,2,0,2,38,1,9,6,NA +69861,7,2,2,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,15852.523312,16085.826144,2,97,6,6,2.04,2,2,0,0,2,2,80,1,3,2,NA +69862,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,75772.894935,76005.871473,1,94,15,15,5,2,2,0,0,0,1,29,1,4,1,5 +69863,7,2,1,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,28337.446334,29138.677291,2,95,14,14,3.34,4,4,0,0,0,1,43,1,3,1,3 +69864,7,2,1,52,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,25583.266805,26390.249407,1,100,12,99,NA,2,1,0,0,0,2,50,1,3,6,NA +69865,7,2,2,4,NA,3,3,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,28877.220658,31871.522389,1,94,6,6,1.21,4,4,2,0,0,1,27,1,2,1,2 +69866,7,2,1,63,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,1,1,NA,1,2,1,1,2,1,1,2,1,3,12579.986433,13337.268472,1,92,1,1,0.26,2,2,0,0,2,1,63,2,1,1,1 +69867,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17521.481386,17363.561951,2,97,15,12,NA,2,1,0,0,0,1,54,1,4,5,NA +69868,7,2,1,40,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,6,NA,2,2,2,2,2,2,1,2,2,2,31740.385214,32919.784432,2,96,5,5,0.89,4,4,1,1,0,2,36,2,4,6,NA +69869,7,2,2,36,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,1,6,2,2,2,2,1,2,2,NA,NA,NA,NA,38218.668882,37878.487888,2,102,5,5,0.59,7,7,1,3,0,1,37,2,1,6,NA +69870,7,2,1,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,131818.641085,133509.443669,1,102,15,15,5,2,2,0,0,2,2,68,1,4,1,5 +69871,7,2,2,1,22,1,1,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12602.647442,12772.138116,1,91,99,99,NA,4,4,2,1,0,2,36,2,2,4,NA +69872,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,105412.227726,110446.221907,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +69873,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,20135.920214,20700.031916,2,97,2,2,0.27,3,3,1,0,0,2,21,1,3,6,NA +69874,7,2,2,3,NA,3,3,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78448.332626,86582.701959,2,91,15,15,5,4,4,2,0,0,2,33,1,5,1,5 +69875,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,1,1,2,1,1,2,1,3,11762.034222,11824.231183,3,90,15,15,3.23,6,6,0,2,0,1,50,2,2,1,2 +69876,7,2,2,36,NA,1,1,2,NA,NA,2,NA,2,1,3,NA,3,1,2,2,2,2,2,2,2,2,2,2,2,35353.005268,34399.106917,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +69877,7,2,2,38,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,NA,NA,NA,NA,19257.047323,21540.196698,1,102,5,5,1.27,3,3,0,2,0,2,38,1,2,3,NA +69878,7,2,2,15,NA,5,7,1,15,189,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15844.005605,16354.571478,1,100,7,7,1.83,3,3,0,1,0,2,40,1,4,6,NA +69879,7,2,1,22,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,104488.914565,106745.836574,1,98,4,2,0.56,4,1,0,0,0,1,22,1,5,5,NA +69880,7,2,2,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,102720.446375,103036.277703,2,102,14,14,3.44,5,5,1,2,0,2,34,1,4,6,NA +69881,7,2,1,12,NA,2,2,1,12,155,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18242.832494,18053.229058,1,102,77,77,NA,6,6,0,2,1,2,37,1,4,1,4 +69882,7,2,2,14,NA,4,4,1,14,179,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11791.755593,11850.248564,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +69883,7,2,2,14,NA,1,1,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,23979.296993,29080.570096,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +69884,7,2,1,56,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18916.732604,18903.754992,2,91,8,8,2.34,4,4,0,2,0,1,56,2,5,1,5 +69885,7,2,2,42,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,19075.861607,19022.257361,1,96,9,9,2.78,4,4,0,2,0,1,54,2,5,4,NA +69886,7,2,2,5,NA,2,2,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,15979.952759,16987.381382,2,102,4,4,0.57,6,6,2,3,0,2,26,2,3,1,NA +69887,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,17260.508485,16474.419641,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +69888,7,2,1,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,19940.089683,1,94,3,3,0.8,2,2,0,0,1,2,66,1,4,3,NA +69889,7,2,1,13,NA,4,4,2,13,163,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13975.179508,14076.961252,1,96,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +69890,7,2,1,5,NA,3,3,1,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,76114.759421,89186.300704,1,98,15,15,4.34,4,4,1,1,0,1,41,1,5,1,5 +69891,7,2,1,79,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,8992.410435,11769.853451,2,90,10,10,4.76,2,2,0,0,1,1,79,1,2,2,NA +69892,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,8521.670488,9178.537312,2,95,4,4,1.34,1,1,0,0,1,2,63,1,3,2,NA +69893,7,2,1,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,32866.0119,33575.905633,1,98,12,4,1.52,3,1,0,0,0,2,22,NA,NA,5,NA +69894,7,2,2,3,NA,3,3,2,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27257.164734,28966.726071,1,95,4,4,0.65,6,6,2,2,0,2,36,1,4,6,NA +69895,7,1,1,17,NA,3,3,NA,NA,NA,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,68701.580401,0,2,94,14,14,2.87,5,5,2,1,0,1,37,1,3,1,4 +69896,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,146181.198007,148606.927767,2,91,15,6,2.86,7,1,0,0,1,1,49,NA,NA,5,NA +69897,7,2,2,1,16,1,1,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,15816.39252,3,92,7,7,2.1,3,3,1,1,0,2,25,1,4,5,NA +69898,7,2,1,71,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,19473.412374,20212.213332,1,95,6,6,2.04,2,2,0,0,2,1,71,1,3,1,4 +69899,7,2,2,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,30664.033268,30444.919975,2,102,5,5,0.67,6,6,0,4,0,2,33,1,2,6,NA +69900,7,2,2,40,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,1,2,1,2,2,1,2,2,1,2,2,NA,31334.47528,33406.965231,2,96,7,7,1.79,4,4,0,2,0,1,43,2,3,1,2 +69901,7,2,1,17,NA,1,1,1,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20638.769105,20614.097145,2,92,15,15,3.37,7,7,0,4,0,1,42,2,3,1,1 +69902,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,19130.246369,18964.171442,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +69903,7,2,1,3,NA,1,1,1,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,2,NA,NA,NA,NA,17865.135763,18076.339981,3,92,7,7,1.41,5,5,1,2,0,1,20,2,1,1,1 +69904,7,2,2,16,NA,2,2,2,16,198,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,7,7,1.66,4,4,0,3,0,2,34,1,5,3,NA +69905,7,2,1,65,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,1,1,2,1,1,2,1,3,9596.331248,10123.555774,2,92,8,8,2.43,3,3,0,1,1,2,58,NA,5,1,5 +69906,7,2,1,42,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,41410.39303,40802.759347,1,101,12,3,1.07,3,1,0,0,0,1,41,2,1,4,NA +69907,7,2,1,8,NA,1,1,2,8,100,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,11417.89405,11689.28796,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +69908,7,1,2,0,9,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4090.43871,0,2,99,6,6,1.73,3,3,1,1,1,2,60,1,4,3,NA +69909,7,2,2,15,NA,5,6,1,15,185,NA,NA,2,1,2,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11626.310625,12128.832209,1,92,7,7,1.56,4,4,0,2,0,2,38,2,4,6,NA +69910,7,2,1,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,102928.893739,104528.537732,1,101,6,6,0.97,7,7,2,1,0,1,43,1,2,1,NA +69911,7,2,2,80,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,2,NA,1,1,2,2,2,2,NA,NA,NA,NA,16490.79781,19016.592593,3,90,8,8,3.21,2,2,0,0,2,2,80,2,3,2,NA +69912,7,2,2,8,NA,4,4,2,8,103,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6388.247052,6617.403229,1,93,6,6,0.83,6,6,3,1,0,1,37,NA,NA,1,3 +69913,7,2,2,64,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,14102.354333,16246.228018,3,91,6,6,1.12,4,4,0,0,2,1,69,2,3,1,1 +69914,7,2,1,11,NA,3,3,2,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,46081.129115,51016.6207,2,95,9,9,2.6,4,4,0,2,0,1,42,1,4,1,4 +69915,7,2,1,6,NA,4,4,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,7970.311962,8205.827749,1,90,14,14,2.96,5,5,1,2,0,1,31,1,5,1,4 +69916,7,2,2,22,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,2,2,2,1,2,2,1,35710.33222,35554.798024,1,90,10,10,2.44,5,5,1,0,0,2,56,2,1,1,1 +69917,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,72686.111056,73189.163544,1,98,15,15,3.7,5,5,2,1,0,1,34,1,5,1,5 +69918,7,2,2,11,NA,4,4,2,11,140,NA,NA,2,2,3,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7659.302568,7901.193624,1,96,3,3,0.43,4,4,1,1,0,2,39,2,4,1,3 +69919,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,83819.702285,99717.125794,1,99,12,12,NA,1,1,0,0,0,1,31,1,4,5,NA +69920,7,2,2,9,NA,5,7,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22308.590534,22137.463018,1,101,5,5,1.15,3,3,0,1,0,1,49,1,3,1,4 +69921,7,2,1,75,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,10980.245706,10978.086763,1,91,12,6,2.39,2,1,0,0,2,2,73,NA,NA,77,NA +69922,7,2,1,42,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,31640.296506,33247.715312,3,92,6,6,1,6,6,1,1,0,1,42,2,1,1,4 +69923,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,169546.363168,172535.263747,2,91,15,15,5,2,2,0,0,1,2,60,1,5,1,5 +69924,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,27426.222967,30692.896319,2,95,3,3,0.95,2,2,0,0,2,2,80,1,1,1,2 +69925,7,2,2,80,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,NA,17563.671235,18809.520935,1,99,3,3,1.3,1,1,0,0,1,2,80,1,1,5,NA +69926,7,2,2,11,NA,2,2,1,11,132,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16699.231378,17036.994683,1,98,3,3,0.4,7,7,2,3,0,2,31,2,5,1,2 +69927,7,2,2,2,NA,2,2,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8645.395449,9311.129497,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +69928,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,9015.10987,2,95,1,1,0.36,1,1,0,0,1,2,63,1,1,2,NA +69929,7,2,1,6,NA,5,6,2,6,83,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11461.625841,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +69930,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,112992.533921,115858.21849,1,94,9,9,3.14,3,3,1,0,0,1,28,1,5,1,5 +69931,7,2,2,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,129336.409693,136474.939567,1,95,15,15,5,3,3,1,0,0,1,28,1,5,1,5 +69932,7,2,2,21,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,38177.662675,41078.639454,1,103,3,3,0.37,5,5,1,2,0,2,30,1,4,5,NA +69933,7,2,2,6,NA,3,3,1,6,79,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20531.504977,20629.491172,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +69934,7,2,2,56,NA,3,3,1,NA,NA,2,NA,2,2,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,153680.330235,152391.721814,1,103,15,15,5,2,2,0,0,1,1,61,1,4,1,5 +69935,7,2,1,80,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,8543.37447,9341.78969,3,90,9,9,3.65,2,2,0,0,2,1,80,1,2,1,3 +69936,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15072.065618,15224.718219,1,99,15,15,5,2,2,0,0,1,2,54,2,5,1,5 +69937,7,2,1,19,NA,3,3,1,19,233,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,23403.89977,23518.866268,1,98,4,4,0.75,4,4,0,1,0,2,48,1,2,1,3 +69938,7,2,2,16,NA,4,4,1,16,203,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11791.755593,11850.248564,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +69939,7,2,2,0,5,2,2,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7192.863376,7041.533956,1,90,3,3,0.52,3,3,2,0,0,2,20,1,4,5,NA +69940,7,2,1,61,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,3,1,NA,1,2,2,1,2,2,1,2,2,2,6638.80908,6954.569749,2,93,15,15,5,2,2,0,0,2,1,61,2,3,1,3 +69941,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,12098.219371,13033.848361,2,100,14,14,3.06,5,5,1,0,1,2,31,2,5,1,5 +69942,7,1,1,61,NA,2,2,NA,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,9691.985299,0,1,93,6,6,1.55,3,3,0,0,3,1,61,2,4,1,1 +69943,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,109679.354704,1,98,15,15,5,4,4,2,0,0,1,40,1,5,1,NA +69944,7,2,2,18,NA,4,4,2,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,NA,11072.776368,11285.58755,3,90,5,5,0.87,4,4,0,0,0,2,43,2,3,5,NA +69945,7,2,1,2,NA,5,7,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8100.706553,8340.3972,1,98,15,15,5,4,4,2,0,0,2,35,1,5,1,4 +69946,7,2,1,6,NA,3,3,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,42986.51011,44926.997612,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +69947,7,2,1,7,NA,2,2,2,7,88,NA,NA,2,2,1,0,NA,NA,NA,2,1,2,NA,NA,NA,NA,NA,NA,NA,8966.477743,10563.593323,2,99,12,3,0.52,5,3,0,1,0,1,30,2,2,4,NA +69948,7,2,1,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,27739.528889,28855.317795,1,90,4,3,1.07,2,1,0,0,0,2,25,1,5,6,NA +69949,7,2,2,12,NA,3,3,2,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38400.791741,41869.717003,1,95,6,6,1.09,5,5,0,3,0,1,31,1,4,1,4 +69950,7,2,2,10,NA,4,4,2,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8115.309776,8285.322178,2,95,7,7,2.78,2,2,0,1,0,2,32,1,4,5,NA +69951,7,2,1,4,NA,5,6,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6185.185728,6767.562311,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +69952,7,2,1,4,NA,3,3,2,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,77702.196479,91046.355703,1,95,15,15,5,3,3,1,0,0,1,28,1,5,1,5 +69953,7,2,1,8,NA,2,2,2,8,106,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13804.767816,14116.094161,2,91,9,9,2.6,4,4,1,1,0,2,31,2,4,1,5 +69954,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,1,1,2,2,1,2,2,NA,NA,NA,NA,15309.176013,16540.512525,1,90,14,14,3.33,5,5,1,2,0,1,41,1,5,1,5 +69955,7,2,1,10,NA,5,7,2,10,121,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7482.593572,7851.213843,1,101,4,4,0.78,4,4,1,2,0,2,31,1,4,3,NA +69956,7,2,1,3,NA,3,3,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,33334.752566,38103.457131,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +69957,7,2,1,32,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,37658.482129,38663.56389,1,100,10,10,2.91,4,4,1,1,0,1,32,1,5,1,5 +69958,7,2,1,12,NA,3,3,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71231.747774,75661.062324,2,95,9,9,2.6,4,4,0,2,0,1,42,1,4,1,4 +69959,7,2,2,51,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,2,4,NA,2,2,2,2,2,2,2,2,2,2,29695.385784,34065.080879,2,91,1,1,0,1,1,0,0,0,2,51,2,2,4,NA +69960,7,1,2,14,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,116754.883807,0,1,94,5,5,1.04,4,4,1,1,0,1,18,1,2,NA,NA +69961,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,204553.029374,204712.584881,1,100,15,15,5,2,2,0,0,0,2,56,1,5,1,NA +69962,7,2,1,69,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11992.012141,12562.386395,2,102,4,4,1.09,2,2,0,0,2,2,68,1,3,1,3 +69963,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,29672.504425,2,101,12,4,1.79,4,1,0,0,0,2,20,1,4,5,NA +69964,7,2,2,75,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,70652.532816,72526.815349,1,98,6,6,1.65,2,2,0,0,2,1,80,1,3,1,3 +69965,7,2,2,27,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16181.486766,17520.496205,1,90,4,4,0.78,4,4,0,0,1,1,69,2,4,1,3 +69966,7,2,1,3,NA,4,4,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13345.162299,13752.776418,2,102,4,4,0.81,3,3,2,0,0,2,23,1,4,5,NA +69967,7,2,1,8,NA,3,3,1,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28126.350642,29877.890829,2,91,5,5,1.2,3,3,0,1,0,2,40,1,5,1,5 +69968,7,2,1,16,NA,3,3,1,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,113571.164423,112715.649169,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +69969,7,2,1,11,NA,1,1,1,11,138,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14007.413517,2,98,1,1,0.18,4,4,0,2,0,1,29,1,4,6,NA +69970,7,2,2,13,NA,5,6,2,13,162,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9029.632215,9422.555256,1,90,77,77,NA,4,4,0,2,0,2,51,1,5,1,5 +69971,7,2,2,2,NA,3,3,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22159.470641,22450.653549,1,95,3,3,0.7,3,3,1,0,0,1,25,1,4,1,4 +69972,7,2,1,79,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,53149.251154,56449.488341,1,100,15,15,5,2,2,0,0,2,1,79,1,5,1,4 +69973,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,26637.81974,28307.564263,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +69974,7,2,1,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,15408.94893,15514.368855,1,99,13,13,NA,3,3,0,0,2,1,67,1,2,1,2 +69975,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,60071.993203,65791.533402,1,95,14,14,5,1,1,0,0,1,2,80,1,4,1,NA +69976,7,2,1,61,NA,2,2,2,NA,NA,2,NA,2,1,99,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,10585.549682,10952.862023,1,90,12,12,NA,3,3,0,0,1,1,35,2,4,5,NA +69977,7,2,2,12,NA,2,2,2,12,154,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,13824.001771,15649.805677,2,90,3,3,0.54,4,4,1,2,0,2,33,2,1,4,NA +69978,7,2,2,13,NA,4,4,1,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18698.220599,19300.762251,2,101,6,6,1.54,3,3,0,1,0,2,34,1,4,1,3 +69979,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,NA,NA,NA,NA,26465.930618,28724.649216,2,100,5,5,1.07,4,4,0,1,0,2,36,1,3,5,NA +69980,7,2,2,0,2,2,2,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4481.392842,4662.235074,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +69981,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15991.70237,16076.675652,1,99,3,3,1.29,1,1,0,0,1,1,62,1,3,5,NA +69982,7,2,2,8,NA,3,3,2,8,98,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,41790.228676,44382.642913,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +69983,7,2,1,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,19940.089683,1,94,3,3,0.95,2,2,0,0,1,2,67,1,2,2,NA +69984,7,2,2,16,NA,1,1,1,16,200,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27070.679378,29958.836982,1,92,4,4,0.74,4,4,1,1,0,1,51,2,1,1,1 +69985,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,19901.857177,20582.498016,3,92,3,3,1.29,1,1,0,0,1,2,73,1,4,2,NA +69986,7,2,1,14,NA,1,1,1,14,170,NA,NA,2,2,4,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,25525.43565,25915.600865,1,94,5,5,0.87,4,4,1,1,0,1,35,2,1,1,1 +69987,7,2,2,3,NA,1,1,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,17065.756351,3,92,3,3,0.54,4,4,3,0,0,2,22,1,3,5,NA +69988,7,2,1,14,NA,1,1,1,14,175,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18242.832494,19431.180704,1,102,7,7,1.41,5,5,0,2,2,1,72,1,4,1,3 +69989,7,2,2,75,NA,2,2,2,NA,NA,2,NA,2,1,99,NA,1,6,NA,2,2,2,2,2,2,1,2,2,NA,17318.187297,19970.708273,2,90,4,4,1.02,2,2,0,0,2,2,75,2,1,6,NA +69990,7,2,2,23,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,18412.14266,22203.276692,2,90,2,2,0.67,2,2,0,0,1,2,64,1,5,5,NA +69991,7,2,2,56,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,27407.957254,27308.998449,2,90,3,3,1.29,1,1,0,0,0,2,56,1,3,3,NA +69992,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,150082.940829,151424.784638,1,98,8,8,2.97,2,2,0,0,0,1,23,1,3,1,5 +69993,7,2,2,40,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,29650.79971,37801.89955,2,90,4,4,1.29,2,2,0,0,0,2,40,1,2,5,NA +69994,7,2,2,21,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,71351.478679,74215.528244,2,100,10,10,3.13,4,4,0,0,1,2,53,1,2,1,2 +69995,7,2,1,18,NA,1,1,2,18,226,2,NA,1,1,NA,11,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,18120.499457,19917.650851,1,90,1,1,0.02,5,5,0,1,0,2,39,2,1,1,2 +69996,7,2,2,40,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,18490.479848,21651.629766,2,100,6,6,0.99,5,5,0,3,0,2,40,1,3,1,3 +69997,7,2,1,46,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,25123.480232,25043.348036,1,92,15,15,4.44,5,5,0,3,0,2,43,1,5,6,NA +69998,7,1,1,17,NA,4,4,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,11125.932433,0,1,96,NA,NA,NA,4,4,1,1,0,2,37,NA,NA,1,4 +69999,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,20247.768461,20264.515513,2,93,5,5,1.05,3,3,1,0,0,2,29,1,3,5,NA +70000,7,2,2,59,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,19100.364335,18787.428747,1,96,4,4,1.34,1,1,0,0,0,2,59,2,3,3,NA +70001,7,1,2,61,NA,5,6,NA,NA,NA,2,NA,2,1,4,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17243.546687,0,1,95,3,3,0.43,4,4,0,1,2,1,65,2,5,1,3 +70002,7,2,2,9,NA,2,2,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,19084.197249,19808.05931,2,91,15,15,5,4,4,0,2,0,1,45,2,5,1,4 +70003,7,2,1,3,NA,5,6,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5953.107662,6677.061573,3,90,14,14,3.47,4,4,1,1,0,2,38,2,5,1,5 +70004,7,2,1,12,NA,3,3,2,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,99249.131685,98501.502244,1,101,15,15,5,4,4,0,2,0,1,43,1,4,1,5 +70005,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,1,2,1,2,2,NA,NA,NA,NA,33146.291352,36370.393263,1,90,5,5,1.05,3,3,0,0,3,2,60,1,5,77,NA +70006,7,2,1,29,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,5,5,NA,1,2,2,NA,NA,NA,1,2,2,1,38474.772527,40200.135096,2,93,NA,NA,NA,4,2,0,0,0,1,28,NA,NA,4,NA +70007,7,2,2,4,NA,4,4,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10389.292229,10850.629517,2,95,1,1,0.25,3,3,1,1,0,2,26,1,2,5,NA +70008,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,165029.101567,1,95,8,6,2.04,4,2,0,1,0,2,57,1,5,5,NA +70009,7,2,1,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,74929.366953,78437.058525,1,93,15,9,5,3,1,0,0,0,1,26,1,5,5,NA +70010,7,2,2,58,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12441.719186,13672.655562,1,96,7,7,1.83,3,3,0,0,1,1,66,2,5,1,3 +70011,7,2,1,14,NA,5,6,2,14,170,NA,NA,2,2,3,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8168.705487,9098.657657,1,93,7,7,1.64,5,5,0,2,0,1,47,2,5,1,1 +70012,7,2,1,0,5,4,4,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5719.440362,6091.410026,1,96,15,15,5,6,6,1,1,1,2,44,1,3,1,3 +70013,7,2,1,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,7526.944058,7674.379869,1,96,15,15,5,2,2,0,0,2,1,70,1,5,1,4 +70014,7,2,1,32,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,85120.619542,87558.517853,1,93,15,15,5,1,1,0,0,0,1,32,1,4,5,NA +70015,7,2,1,57,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,16851.334496,19427.051933,2,95,4,4,1.66,1,1,0,0,0,1,57,1,4,3,NA +70016,7,2,2,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,94,15,15,5,2,2,0,0,2,1,73,NA,NA,1,5 +70017,7,2,2,14,NA,4,4,2,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12209.74498,13384.042162,2,90,4,4,0.57,5,5,1,2,0,2,33,2,2,77,NA +70018,7,2,1,28,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27911.790319,31609.08818,3,91,7,7,1.57,4,4,2,0,0,2,29,2,3,1,3 +70019,7,2,1,38,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18544.003944,18279.674065,2,100,5,5,1.08,3,3,0,0,0,1,38,1,2,5,NA +70020,7,2,2,21,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,4,6,3,1,2,2,1,2,2,1,2,2,1,16929.836231,18556.498474,2,101,8,5,2.2,2,1,0,0,0,1,24,2,4,6,NA +70021,7,2,2,10,NA,3,3,1,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,45129.675368,44994.093254,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +70022,7,2,2,2,NA,5,6,2,3,36,NA,NA,2,2,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8313.181418,1,97,15,15,4.34,4,4,2,0,0,1,35,2,5,1,5 +70023,7,2,2,9,NA,4,4,2,10,120,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7659.302568,7901.193624,1,96,77,77,NA,7,7,0,3,1,2,43,77,5,5,NA +70024,7,2,2,9,NA,4,4,2,9,109,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7268.721126,7826.51541,2,99,4,4,0.41,7,7,0,2,0,2,36,1,3,5,NA +70025,7,2,2,16,NA,2,2,2,16,196,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,7,7,1.66,4,4,0,3,0,2,34,1,5,3,NA +70026,7,2,1,31,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17554.053699,17463.765652,2,100,7,7,2.72,2,2,0,0,0,2,59,1,4,3,NA +70027,7,2,1,7,NA,1,1,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10658.399025,10722.994279,1,102,8,8,1.33,7,7,1,4,0,2,32,1,3,1,2 +70028,7,2,2,2,NA,3,3,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22159.470641,22857.583467,1,95,2,2,0.22,4,4,2,1,0,2,22,1,2,5,NA +70029,7,2,1,16,NA,4,4,1,16,198,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,18413.211403,2,101,99,99,NA,3,3,0,1,1,2,78,1,1,2,NA +70030,7,1,2,61,NA,5,7,NA,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,10346.035773,0,1,99,9,1,0,2,1,0,0,2,2,61,1,4,6,NA +70031,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10192.188896,10440.656902,1,99,7,7,3.31,1,1,0,0,1,2,63,1,4,3,NA +70032,7,2,1,80,NA,5,6,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,11550.158096,12419.035396,2,92,77,77,NA,2,2,0,0,2,2,80,1,3,1,4 +70033,7,2,2,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,160743.928829,166234.629208,1,95,12,12,NA,2,2,0,0,0,2,53,1,4,1,NA +70034,7,2,2,4,NA,4,4,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9689.370244,10119.627445,1,99,2,2,0.43,3,3,2,0,0,2,26,1,4,5,NA +70035,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,91836.529686,93336.987794,1,93,10,10,5,1,1,0,0,1,2,65,1,5,3,NA +70036,7,2,2,7,NA,2,2,1,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16765.041162,17104.135554,1,98,4,4,0.94,3,3,0,1,0,2,35,2,5,1,5 +70037,7,2,2,1,23,2,2,2,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8563.768225,8593.010585,1,93,6,6,0.74,7,7,1,2,0,1,53,2,2,1,2 +70038,7,1,1,20,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,44074.735764,0,2,91,4,4,0.69,4,4,2,0,0,2,21,1,3,6,NA +70039,7,2,2,9,NA,3,3,2,9,109,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,NA,NA,NA,1,2,2,1,22933.149195,26924.921202,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +70040,7,2,1,3,NA,5,7,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12996.965152,13393.943951,1,101,5,5,1.23,3,3,2,0,0,2,24,1,2,5,NA +70041,7,1,2,80,NA,5,6,NA,NA,NA,2,NA,2,1,7,NA,1,2,NA,1,2,1,1,2,1,NA,NA,NA,NA,13689.379977,0,2,92,2,2,0.64,1,1,0,0,1,2,80,2,1,2,NA +70042,7,2,2,2,NA,3,3,2,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16635.553691,18360.507343,1,91,4,4,0.81,4,4,1,1,0,1,32,1,4,6,NA +70043,7,2,2,12,NA,3,3,2,12,150,NA,NA,2,1,4,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,74165.041171,75130.242541,2,91,15,15,5,4,4,0,2,0,2,48,1,5,1,5 +70044,7,2,1,9,NA,4,4,2,9,117,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9023.469661,9333.449986,2,90,8,6,1.46,4,3,1,1,0,2,21,1,5,6,NA +70045,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,70772.230318,73438.772102,1,93,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +70046,7,2,1,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,19541.667675,19517.839388,2,95,3,3,1.16,1,1,0,0,0,1,55,1,4,4,NA +70047,7,2,2,19,NA,4,4,1,19,233,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11838.873374,11750.256617,2,100,14,14,3.06,5,5,1,0,0,1,50,1,5,1,5 +70048,7,2,2,11,NA,4,4,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7891.243393,8330.261165,2,100,4,4,0.69,5,5,0,3,0,1,38,1,3,6,NA +70049,7,2,1,41,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,1,2,1,1,2,2,1,2,2,NA,20696.713928,21871.839567,2,102,9,9,2.68,4,4,1,1,0,2,38,2,5,1,2 +70050,7,2,2,49,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,29010.447112,29720.490657,1,100,9,9,3.64,2,2,0,0,0,2,49,1,4,5,NA +70051,7,2,1,10,NA,4,4,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11185.87189,11566.898318,1,92,7,7,2.25,3,3,0,2,0,2,35,1,4,77,NA +70052,7,2,2,28,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,11696.173591,12195.620792,1,93,15,5,1.84,6,1,0,0,0,1,34,2,5,5,NA +70053,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,32866.0119,33575.905633,1,98,99,99,NA,3,2,0,0,0,2,22,1,4,5,NA +70054,7,2,1,38,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,6,NA,2,2,2,1,2,2,NA,NA,NA,NA,32856.012738,34774.888791,2,103,77,77,NA,7,7,0,4,0,1,38,2,1,6,NA +70055,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,115926.402585,120043.284447,1,98,10,10,3.04,4,4,0,2,0,2,47,1,4,1,3 +70056,7,2,1,3,NA,5,7,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11821.601823,13035.249088,1,95,4,4,0.97,3,3,2,0,0,2,22,1,4,5,NA +70057,7,2,2,7,NA,1,1,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15352.601806,16028.326912,2,102,4,4,0.61,5,5,0,3,0,1,34,2,3,1,3 +70058,7,2,1,38,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20071.705576,20986.552878,3,91,7,7,2.45,2,2,0,0,0,2,29,2,5,1,5 +70059,7,2,2,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,25812.913537,27633.237354,2,95,3,3,1.27,1,1,0,0,1,2,74,1,2,2,NA +70060,7,2,1,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5447.377416,5513.820992,2,90,4,4,0.97,3,3,1,0,0,2,23,2,3,5,NA +70061,7,2,1,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,7101.739553,7433.956549,2,100,2,2,0.83,1,1,0,0,1,1,65,1,2,5,NA +70062,7,2,2,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,69726.261922,71865.394906,1,93,15,15,5,2,2,0,0,2,2,75,1,5,1,5 +70063,7,2,2,43,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,1,2,1,2,2,1,2,2,1,2,2,1,27585.470618,28524.896774,2,102,15,15,5,4,4,0,2,0,1,44,1,3,1,1 +70064,7,2,2,38,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,2,1,2,2,1,2,2,1,2,2,1,23725.035562,24103.855713,1,91,7,7,2.2,3,3,0,0,1,2,60,1,2,2,NA +70065,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,74518.988514,1,98,14,14,3.9,4,4,0,3,0,2,31,1,4,1,NA +70066,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,19260.892847,19199.459573,2,97,8,5,2.02,2,1,0,0,0,1,47,1,4,3,NA +70067,7,2,1,5,NA,3,3,1,5,64,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21357.821814,24096.698658,2,96,3,3,0.53,5,5,3,0,0,2,26,1,4,1,4 +70068,7,2,2,8,NA,4,4,2,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8147.287486,8590.325322,2,90,2,2,0.38,4,4,1,2,0,2,32,1,4,5,NA +70069,7,2,2,50,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,4,6,NA,2,2,2,1,2,2,2,2,2,2,24352.519425,24479.515743,1,97,3,3,0.5,5,5,0,2,0,1,56,2,2,6,NA +70070,7,2,2,2,NA,4,4,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9273.23044,9512.588252,2,96,NA,3,0.65,4,3,1,1,0,1,21,1,2,6,NA +70071,7,2,1,0,0,1,1,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,7757.493251,7980.837709,3,92,4,4,0.59,5,5,2,1,0,1,20,2,1,1,3 +70072,7,2,1,53,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,26659.265986,2,101,7,7,2.16,3,3,0,1,0,2,44,1,4,6,NA +70073,7,2,1,19,NA,3,3,2,19,239,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30943.024697,36334.060093,1,101,1,1,0.08,6,6,0,1,0,1,51,1,2,5,NA +70074,7,2,1,16,NA,1,1,1,16,195,NA,NA,1,1,NA,9,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,19996.544021,19901.195571,1,100,7,7,1.3,5,5,0,3,0,1,43,2,2,1,4 +70075,7,2,2,31,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,1,2,1,2,1,1,2,1,NA,NA,NA,NA,11608.998717,13948.968232,3,90,5,5,0.93,4,4,1,0,0,1,48,2,4,1,NA +70076,7,2,1,14,NA,5,6,2,14,172,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6232.587755,6661.015771,1,91,15,15,3.25,7,7,1,2,0,2,31,1,5,1,5 +70077,7,2,2,58,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,16119.136275,16768.999275,1,101,14,14,5,2,2,0,0,0,1,58,2,3,1,1 +70078,7,2,2,33,NA,1,1,2,NA,NA,2,NA,2,2,2,NA,2,1,2,2,2,2,2,2,2,2,2,2,2,32982.479382,35082.144563,2,99,99,3,0.66,4,2,0,0,0,1,35,2,4,1,2 +70079,7,2,2,1,21,2,2,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9267.834226,9392.475614,2,93,15,15,4.51,4,4,1,1,0,1,40,1,4,1,5 +70080,7,2,2,32,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16614.865368,17238.21833,3,91,15,15,4.47,4,4,2,0,0,1,33,1,5,1,5 +70081,7,2,2,19,NA,4,4,2,19,236,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,10154.02528,10568.655787,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +70082,7,2,2,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,21398.47235,20994.797177,1,103,14,8,4.39,2,1,0,0,0,2,29,1,5,5,NA +70083,7,1,2,24,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,3,3,1,2,2,1,2,2,NA,NA,NA,NA,129336.409693,0,1,92,4,4,1.29,2,2,1,0,0,2,24,1,4,3,NA +70084,7,2,1,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7117.971973,7450.948316,2,100,3,3,0.68,2,2,0,0,2,1,66,1,2,1,2 +70085,7,2,2,6,NA,3,3,2,7,84,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18732.936406,19089.39853,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +70086,7,2,1,18,NA,1,1,1,18,223,2,NA,2,2,4,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,23389.620035,23484.828122,3,91,3,3,0.39,6,6,1,1,0,1,39,2,1,6,NA +70087,7,2,2,7,NA,4,4,1,7,95,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7899.813226,8111.155436,2,100,15,15,4.47,4,4,0,2,0,1,39,NA,NA,1,5 +70088,7,2,1,47,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17452.049284,17389.002535,1,93,7,7,1.64,5,5,0,2,0,1,47,2,5,1,1 +70089,7,2,1,0,11,1,1,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7222.23638,7150.860834,1,94,4,4,0.32,7,7,3,2,0,2,28,2,2,1,9 +70090,7,2,2,7,NA,3,3,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39810.933651,39282.261038,2,95,15,15,4.77,4,4,0,2,0,2,36,1,4,1,5 +70091,7,2,2,4,NA,3,3,2,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,78813.208592,86985.412201,2,91,6,6,1.34,4,4,1,2,0,2,33,1,4,3,NA +70092,7,2,1,24,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,120604.496044,126250.391527,2,92,10,10,3.51,3,3,0,0,0,1,24,1,4,5,NA +70093,7,2,1,14,NA,4,4,2,14,177,NA,NA,2,2,3,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14853.30651,14966.239185,1,93,14,14,5,2,2,0,1,0,2,52,2,3,1,NA +70094,7,2,2,36,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,60859.550805,63845.233776,2,100,15,15,5,3,3,0,1,0,1,38,1,4,1,4 +70095,7,2,2,59,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,10420.55184,10475.655119,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +70096,7,2,2,77,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,66567.821082,68844.431611,3,91,7,7,1.97,4,4,0,0,1,2,77,1,5,2,NA +70097,7,2,2,7,NA,3,3,2,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,67046.323141,68322.122844,1,90,8,8,1.67,5,5,2,1,0,2,28,1,4,1,5 +70098,7,2,2,0,9,2,2,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5234.186769,5411.317673,2,90,14,14,3.08,6,6,1,1,1,2,60,2,5,2,NA +70099,7,2,1,17,NA,3,3,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,100370.520459,102294.664852,1,90,15,15,5,4,4,0,1,0,2,53,1,5,1,5 +70100,7,2,2,11,NA,4,4,1,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9399.281543,9696.12347,2,96,6,6,1.32,5,5,1,3,0,2,30,1,4,3,NA +70101,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,22109.546782,29180.501371,1,93,7,7,2.72,2,2,0,1,0,2,45,1,3,3,NA +70102,7,2,1,68,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,92308.775062,93174.50633,1,100,6,6,2.24,1,1,0,0,1,1,68,1,4,2,NA +70103,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,125443.355152,127362.409324,2,103,10,10,5,1,1,0,0,0,2,56,1,4,3,NA +70104,7,2,2,34,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16614.865368,17238.21833,3,91,15,15,5,4,4,2,0,0,1,36,2,5,1,5 +70105,7,2,1,25,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,NA,52698.05363,53416.368765,3,92,5,5,0.81,5,5,3,0,0,2,23,1,4,5,NA +70106,7,2,1,18,NA,3,3,2,19,228,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30100.326038,29873.584609,1,101,6,6,1.17,4,4,0,1,0,1,41,1,3,6,NA +70107,7,2,2,0,10,4,4,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,4358.100179,4799.448128,2,93,NA,NA,NA,4,4,1,0,1,1,63,NA,NA,6,NA +70108,7,2,2,11,NA,3,3,2,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49164.586897,48511.701666,2,95,15,15,4.63,5,5,1,2,0,2,36,1,5,1,3 +70109,7,2,1,57,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,27595.50738,28151.492876,1,98,15,15,5,5,5,0,1,1,2,55,1,5,1,5 +70110,7,2,2,0,11,4,4,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5576.185193,5739.245437,2,96,5,5,1.24,3,3,2,0,0,1,29,1,3,5,NA +70111,7,2,1,56,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12517.592486,15021.976783,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +70112,7,2,2,9,NA,3,3,2,9,110,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,55626.447796,54887.751745,1,95,14,14,3.8,4,4,0,2,0,2,37,1,5,1,5 +70113,7,1,1,28,NA,1,1,NA,NA,NA,2,NA,2,1,77,NA,1,3,NA,2,2,2,2,2,2,NA,NA,NA,NA,35669.2076,0,2,94,77,77,NA,4,4,0,0,0,1,28,2,1,3,NA +70114,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,14221.330587,18275.989104,3,90,12,12,NA,2,2,0,0,0,1,39,2,3,1,NA +70115,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,4,2,2,2,2,2,2,2,NA,NA,NA,NA,36453.846815,39554.044508,1,102,2,2,0.52,3,3,0,2,0,2,36,2,3,4,NA +70116,7,2,1,0,4,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23841.007913,24575.370543,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +70117,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,79677.823556,79777.881901,1,99,15,15,5,5,5,0,3,0,2,43,1,5,1,5 +70118,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,54095.581484,61529.339683,2,91,5,5,1.84,1,1,0,0,1,2,80,1,4,2,NA +70119,7,2,1,19,NA,3,3,1,19,229,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,110478.18082,109645.964567,2,101,1,1,0.11,2,1,0,0,0,1,19,1,4,NA,NA +70120,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,53541.401974,54113.194007,1,99,8,8,3.4,2,2,0,0,2,1,74,1,5,1,4 +70121,7,2,2,33,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,22758.541444,23956.866949,1,101,2,2,0.47,3,3,1,0,0,1,35,1,2,6,NA +70122,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,86578.861495,87453.974807,2,101,10,10,2.33,6,6,1,3,0,1,39,1,2,1,4 +70123,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11762.034222,11824.231183,3,90,77,77,NA,5,5,0,2,0,1,46,2,3,1,3 +70124,7,2,2,16,NA,4,4,1,17,205,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,12531.903464,13043.632492,2,100,4,4,0.85,4,4,0,2,0,2,39,1,3,6,NA +70125,7,2,1,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,28996.250643,29563.919546,2,101,4,4,1.52,1,1,0,0,0,1,30,1,3,5,NA +70126,7,2,1,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6992.24593,7077.532809,2,97,1,1,0.33,2,2,1,0,0,2,29,1,3,5,NA +70127,7,2,2,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,112960.559471,154652.396986,1,91,4,4,1.29,2,2,1,0,0,2,26,1,4,5,NA +70128,7,1,1,24,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,41383.258526,0,1,97,1,1,0.22,2,1,0,0,0,1,24,1,3,6,NA +70129,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,19384.896286,19940.089683,1,94,3,3,0.39,6,6,2,2,0,2,25,1,4,1,2 +70130,7,2,1,42,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,21600.805431,23858.641894,2,96,7,7,1.79,4,4,2,0,0,2,49,1,3,1,3 +70131,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12449.932013,12144.773422,3,90,15,15,4.34,4,4,0,0,1,1,65,1,3,1,4 +70132,7,2,1,62,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11761.359913,11893.852645,1,92,9,9,4.23,2,2,0,0,1,1,62,1,3,1,4 +70133,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,21490.337905,2,97,3,1,0.09,2,1,0,0,0,1,30,1,4,5,NA +70134,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,138322.767578,139738.299504,1,101,10,10,4.63,2,2,0,0,1,1,64,2,3,1,4 +70135,7,2,1,2,NA,1,1,1,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8481.734412,8582.006703,1,103,8,8,1.85,5,5,2,1,0,2,25,2,2,1,2 +70136,7,2,1,39,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,17643.563124,18168.544198,3,91,15,15,5,4,4,2,0,0,2,33,2,5,1,5 +70137,7,2,1,17,NA,2,2,2,17,210,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14081.782012,14391.713696,2,90,2,2,0.25,5,5,0,1,0,2,41,2,4,1,NA +70138,7,2,1,6,NA,5,7,2,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21147.476454,21752.181979,1,95,5,5,0.89,4,4,0,1,0,2,42,1,4,6,NA +70139,7,2,2,10,NA,4,4,1,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9453.111053,10178.533204,1,100,6,6,1.13,4,4,0,3,0,2,32,1,3,5,NA +70140,7,2,1,3,NA,3,3,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,60239.023202,67963.933877,1,98,7,7,1.66,5,5,2,1,0,2,37,1,5,1,3 +70141,7,2,1,0,11,2,2,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4854.394074,5092.044151,2,93,15,15,4.84,6,6,1,1,2,1,66,2,4,1,3 +70142,7,2,2,69,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,105434.067206,107522.739372,2,103,9,9,4.92,1,1,0,0,1,2,69,1,4,2,NA +70143,7,2,2,40,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,13510.18419,14596.8255,2,90,14,14,4.32,3,3,0,1,0,1,48,2,4,1,5 +70144,7,2,1,12,NA,1,1,1,12,149,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18987.489596,19405.392998,3,91,6,6,2.04,2,2,0,1,0,2,51,1,4,4,NA +70145,7,2,2,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,29010.447112,28216.500124,1,100,6,6,2.51,1,1,0,0,0,2,49,1,4,3,NA +70146,7,2,2,12,NA,5,7,2,12,152,NA,NA,2,1,4,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10767.566937,11183.935292,2,91,15,15,3.7,5,5,1,2,0,1,50,NA,NA,1,5 +70147,7,2,1,14,NA,5,6,1,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8915.81491,9312.338117,1,92,14,14,3.69,4,4,0,2,0,1,47,2,4,4,NA +70148,7,2,1,30,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,24460.137584,1,92,3,3,0.46,5,5,2,1,0,1,30,1,3,1,2 +70149,7,2,1,13,NA,5,6,2,13,160,NA,NA,2,1,4,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8965.57404,9581.867503,1,90,15,15,5,5,5,0,3,0,2,46,2,4,1,5 +70150,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,76374.321112,79950.814336,2,99,14,14,5,1,1,0,0,0,1,39,1,5,5,NA +70151,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,64679.499599,80402.538623,3,92,6,6,2.69,1,1,0,0,1,2,80,1,3,2,NA +70152,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,161992.272945,167997.905035,1,91,14,14,3.8,4,4,0,2,0,1,50,NA,NA,1,5 +70153,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,24930.322327,25181.116543,2,94,3,3,0.92,1,1,0,0,0,1,57,1,2,3,NA +70154,7,2,1,0,1,5,6,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5941.765349,6071.648885,2,102,3,3,0.38,5,5,3,0,0,2,30,2,2,1,4 +70155,7,2,1,18,NA,5,7,1,18,219,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13276.485807,15665.287637,2,100,99,99,NA,3,3,0,0,0,1,46,1,9,3,NA +70156,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,34853.379657,39642.894617,3,90,10,10,4.3,2,2,0,0,2,2,80,1,4,1,5 +70157,7,2,2,1,22,4,4,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9273.23044,9685.008923,2,96,5,5,1.24,3,3,2,0,0,1,29,1,3,5,NA +70158,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,24905.670199,24973.138542,2,101,8,8,2.7,3,3,0,1,0,1,53,1,4,1,2 +70159,7,2,1,13,NA,4,4,2,13,162,NA,NA,2,1,4,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,7,7,1.52,4,4,0,2,0,2,30,2,4,1,5 +70160,7,2,2,61,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,10288.382343,13758.61994,2,90,6,6,1.7,2,2,0,0,2,1,61,2,1,1,2 +70161,7,2,1,34,NA,1,1,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,37715.365512,38149.83984,2,102,7,7,1.33,6,6,1,3,0,1,34,2,2,1,1 +70162,7,2,1,34,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21288.18311,21326.274673,1,102,7,7,1.57,4,4,0,2,0,2,33,1,4,1,4 +70163,7,2,2,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,163605.682975,162710.354378,1,90,15,15,5,4,4,0,1,0,2,53,1,5,1,5 +70164,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,23884.62129,24647.381072,2,98,5,5,1.24,3,3,0,0,1,2,58,1,2,5,NA +70165,7,2,2,18,NA,2,2,2,19,228,2,NA,1,1,NA,13,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,15442.648697,16179.397194,3,90,77,77,NA,4,3,0,0,0,1,45,2,3,3,NA +70166,7,2,1,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,137038.746155,146586.432966,2,101,4,2,0.66,2,1,0,0,0,1,21,1,4,5,NA +70167,7,2,2,47,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,153972.608815,154123.803084,2,101,5,5,1.36,2,2,0,0,0,2,47,1,2,1,4 +70168,7,2,1,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,64901.456576,67363.75016,1,101,15,15,5,2,2,0,0,2,2,73,1,4,1,4 +70169,7,2,2,23,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,60324.348827,60863.689632,1,95,6,6,0.96,5,5,1,0,1,2,69,1,1,2,NA +70170,7,2,2,59,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,15497.844354,15073.705188,1,99,4,2,0.74,2,1,0,0,1,2,59,1,3,3,NA +70171,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,27532.825087,28260.668065,1,101,6,6,1.3,4,4,2,0,0,2,30,1,4,6,NA +70172,7,2,2,11,NA,5,7,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5147.116597,5520.448595,2,92,15,15,4.59,4,4,0,2,0,2,45,2,5,1,5 +70173,7,2,2,2,NA,2,2,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9653.164181,10331.416262,1,90,15,15,4.44,5,5,2,1,0,1,36,1,3,1,4 +70174,7,1,1,54,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,24930.322327,0,1,100,1,1,0.01,1,1,0,0,0,1,54,1,2,3,NA +70175,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,11699.431733,12221.798846,1,96,7,7,2.31,2,2,0,0,1,2,62,1,3,3,NA +70176,7,2,2,23,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,41953.42893,43056.968872,2,99,4,1,0.22,4,1,0,0,0,2,21,NA,NA,5,NA +70177,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,45403.540522,46903.566528,2,92,9,6,2.75,2,1,0,0,0,1,26,99,9,6,NA +70178,7,1,2,6,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,62595.719575,0,1,95,14,14,3.8,4,4,1,1,0,1,36,1,4,1,5 +70179,7,2,1,4,NA,4,4,1,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10690.995725,11017.541084,2,98,2,2,0.31,4,4,2,1,0,2,27,1,2,4,NA +70180,7,2,1,4,NA,4,4,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10510.490567,10944.785425,2,98,6,6,1,5,5,2,1,0,2,31,1,4,6,NA +70181,7,2,1,6,NA,1,1,2,6,72,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,13285.093011,13365.60735,2,94,77,77,NA,6,6,0,3,0,2,58,1,3,1,9 +70182,7,1,1,14,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10346.302718,0,2,91,4,4,0.65,5,5,1,3,0,1,43,2,3,5,NA +70183,7,2,2,37,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,2,1,2,2,2,2,1,2,2,1,2,2,2,41791.57979,40663.955172,2,102,6,6,1.03,5,5,1,1,0,1,37,1,2,1,2 +70184,7,2,1,16,NA,4,4,1,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16147.713323,16532.569027,1,92,15,15,4.44,5,5,0,3,0,2,43,1,5,6,NA +70185,7,2,2,4,NA,2,2,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13647.772496,15067.50708,2,93,7,7,1.83,3,3,1,0,0,1,40,2,5,1,4 +70186,7,2,1,48,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19320.837782,1,99,14,14,3.8,4,4,1,1,0,1,48,2,5,1,5 +70187,7,2,1,15,NA,5,6,2,15,180,NA,NA,2,1,99,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10567.840237,11294.273462,1,91,15,15,5,4,4,0,2,0,2,55,1,5,1,5 +70188,7,1,1,34,NA,5,6,NA,NA,NA,2,NA,2,2,4,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15057.879445,0,3,90,12,12,NA,3,3,0,0,0,2,29,2,5,1,5 +70189,7,2,2,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,5,3,2,1,2,2,2,2,NA,NA,NA,NA,32455.694722,32314.335903,1,103,5,5,0.74,5,5,1,1,0,2,40,99,3,1,1 +70190,7,2,1,9,NA,1,1,1,9,116,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14042.313177,3,92,4,4,0.6,6,6,2,2,0,2,24,1,3,6,NA +70191,7,2,2,52,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,3,NA,2,2,2,1,2,2,NA,NA,NA,NA,30346.899457,30505.155956,1,93,5,5,0.84,5,5,1,2,0,2,52,2,1,3,NA +70192,7,2,2,22,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,17397.027021,18573.153951,3,91,7,7,3.21,1,1,0,0,0,2,22,1,5,5,NA +70193,7,2,2,17,NA,2,2,2,17,208,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17277.331962,18186.067085,1,90,6,6,0.81,6,6,0,3,0,2,45,1,4,1,2 +70194,7,2,2,29,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,13440.945024,14349.620822,1,103,15,8,4.03,2,1,0,0,0,2,29,2,5,6,NA +70195,7,2,1,79,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,16888.31509,17277.940364,1,92,14,5,2.15,3,1,0,0,2,1,51,1,4,5,NA +70196,7,2,1,37,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,5,NA,2,2,2,1,2,2,2,2,2,2,34997.800447,35379.102239,2,96,5,5,0.78,5,5,0,2,0,1,37,2,1,5,NA +70197,7,2,1,0,6,2,2,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5385.874932,5867.351136,2,90,8,8,2.24,4,4,1,1,0,2,29,1,4,6,NA +70198,7,2,2,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,11862.334174,1,96,15,15,5,2,2,0,0,2,2,62,1,4,1,2 +70199,7,2,1,7,NA,3,3,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,60593.636684,64068.123183,1,91,10,10,2.77,5,5,0,3,0,1,43,1,5,1,5 +70200,7,2,1,52,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,27551.752692,27682.321328,1,98,3,3,0.73,3,3,0,0,0,1,52,1,4,1,3 +70201,7,1,2,26,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,130601.953362,0,2,91,15,9,5,2,1,0,0,0,2,26,1,5,5,NA +70202,7,2,1,22,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,9956.598907,10266.888978,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +70203,7,2,1,46,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12262.33683,12218.03828,2,100,4,4,0.44,7,7,1,2,2,1,71,2,1,1,1 +70204,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,18097.801029,17328.248994,2,100,7,7,1.38,5,5,1,0,0,2,45,1,2,3,NA +70205,7,2,2,7,NA,3,3,1,7,90,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,25527.806244,26565.240294,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +70206,7,2,2,34,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,12808.938247,13423.491647,2,100,15,15,5,4,4,1,1,0,1,36,2,5,1,5 +70207,7,2,2,8,NA,3,3,1,8,101,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,63195.899182,62711.128206,1,100,15,15,5,4,4,1,1,0,1,40,1,5,1,5 +70208,7,2,1,2,NA,3,3,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,29706.069213,32871.212026,1,99,10,10,2.48,5,5,2,1,0,1,33,1,5,1,5 +70209,7,2,2,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,27945.726298,28031.650144,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +70210,7,2,1,47,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,41527.444056,55523.849773,1,95,5,5,1.5,2,2,0,1,0,1,47,1,4,2,NA +70211,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,38758.039282,44961.529423,1,98,6,6,1.9,2,2,0,0,2,1,80,1,1,1,2 +70212,7,2,2,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,20048.680628,21335.7055,2,95,5,5,1.05,3,3,0,1,0,1,43,1,3,1,2 +70213,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,94698.084211,97410.286035,1,101,14,14,3.15,5,5,2,1,0,1,35,1,4,1,5 +70214,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,25212.845431,2,101,1,1,0.42,1,1,0,0,0,1,21,1,4,5,NA +70215,7,2,2,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,1,2,NA,44484.790948,49854.064081,1,103,15,15,5,3,2,0,0,3,2,63,1,5,77,NA +70216,7,2,2,0,8,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3941.796129,4340.984667,1,99,14,14,3.67,4,4,1,0,0,2,49,1,3,1,3 +70217,7,2,1,40,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19158.860679,19089.647955,1,100,15,15,5,2,2,0,0,0,1,40,2,5,1,5 +70218,7,2,1,0,11,1,1,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6298.658963,6412.943673,2,94,5,5,1.07,4,4,2,0,0,1,37,2,1,1,1 +70219,7,2,2,69,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,42101.975168,42617.525207,1,95,6,6,0.96,5,5,1,0,1,2,69,1,1,2,NA +70220,7,2,2,31,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,1,2,2,2,2,2,2,2,2,2,2,2,41791.57979,43231.925575,2,102,10,10,3.04,4,4,2,0,0,2,31,2,2,1,NA +70221,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9122.654131,9281.792212,1,96,9,9,3.14,3,3,0,2,0,2,39,NA,NA,3,NA +70222,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,88617.795432,87713.219218,1,91,15,15,5,1,1,0,0,1,1,60,1,5,1,NA +70223,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,146181.198007,145805.68861,2,91,15,2,0.79,7,1,0,0,1,1,49,NA,NA,5,NA +70224,7,2,2,19,NA,3,3,1,19,234,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,39616.634313,40360.331753,2,101,5,3,1.1,2,1,0,0,0,1,19,1,4,NA,NA +70225,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105262.341027,112370.874556,2,98,10,10,4.42,2,2,0,0,0,1,25,1,5,1,5 +70226,7,2,2,70,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,NA,12849.335508,13810.42202,1,96,4,4,1.18,2,2,0,0,1,2,70,1,1,5,NA +70227,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15819.48188,17091.862943,1,90,15,15,5,5,5,0,3,0,2,46,2,4,1,5 +70228,7,2,1,67,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7410.50521,7700.344649,2,96,3,3,0.82,2,2,0,1,1,1,67,1,3,3,NA +70229,7,2,2,30,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,3,1,2,2,2,2,1,2,2,1,2,2,1,41791.57979,41445.196731,2,102,4,4,0.61,5,5,0,3,0,1,34,2,3,1,3 +70230,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,15976.466658,17286.192057,2,96,7,7,2.45,2,2,0,0,0,1,24,2,5,5,NA +70231,7,2,2,37,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,21619.283038,22210.398171,2,102,15,15,5,4,4,0,2,0,1,39,1,4,1,5 +70232,7,2,2,18,NA,5,6,2,18,217,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12224.9472,12547.183925,1,97,14,14,2.72,7,7,0,2,0,1,40,1,5,1,5 +70233,7,2,2,12,NA,1,1,2,12,148,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,15591.526146,16856.688627,1,90,6,6,1.11,5,5,1,2,0,1,30,2,1,6,NA +70234,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,1,2,1,1,2,1,1,2,NA,28559.076421,28710.827523,1,95,2,2,0.87,1,1,0,0,1,1,63,1,1,5,NA +70235,7,2,1,61,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,2,NA,2,2,2,1,2,2,1,2,2,2,8609.250304,11228.904188,2,90,3,3,1.01,1,1,0,0,1,1,61,2,1,2,NA +70236,7,2,2,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,11862.334174,1,96,15,15,5,2,2,0,0,2,1,68,1,3,1,4 +70237,7,2,1,13,NA,3,3,2,14,168,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,68701.580401,72973.564721,2,94,15,15,5,5,5,0,3,0,1,44,1,5,1,4 +70238,7,2,2,25,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,32455.694722,32314.335903,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +70239,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,19075.861607,19022.257361,1,96,10,10,3.04,4,4,0,1,0,2,43,1,5,1,4 +70240,7,2,2,4,NA,4,4,1,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11015.482909,2,100,99,99,NA,6,6,2,1,0,2,44,1,3,1,4 +70241,7,2,1,13,NA,4,4,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11800.231369,11823.561392,1,96,7,7,1,7,7,2,1,1,2,53,1,4,1,3 +70242,7,2,1,1,22,4,4,2,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5799.129348,6038.750138,1,90,4,4,0.67,5,5,3,0,0,2,32,2,3,3,NA +70243,7,1,2,51,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,1,3,NA,1,2,1,1,2,1,NA,NA,NA,NA,21018.496735,0,1,91,9,9,2.68,4,4,0,0,1,1,20,NA,NA,5,NA +70244,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,9772.038079,10486.56257,1,95,77,77,NA,3,3,0,0,2,1,80,1,1,1,3 +70245,7,2,2,1,16,4,4,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6398.740074,6885.115697,1,93,6,6,0.83,6,6,3,1,0,1,37,NA,NA,1,3 +70246,7,2,2,72,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,14971.827573,15430.401607,2,97,8,8,2.7,3,3,0,0,1,2,72,1,2,3,NA +70247,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17852.668137,17947.072019,3,91,9,9,4.08,2,2,0,1,0,2,54,2,5,1,NA +70248,7,2,2,67,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,7278.790659,7875.678599,2,93,3,3,0.66,2,2,0,0,1,1,54,2,1,1,1 +70249,7,2,1,7,NA,3,3,2,8,96,NA,NA,2,1,3,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,38712.032122,41122.784973,3,91,15,15,5,4,4,1,1,0,2,41,1,5,1,5 +70250,7,2,2,0,5,2,2,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10218.497734,10897.586635,2,101,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +70251,7,2,2,43,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,43535.993088,45116.30779,2,102,77,77,NA,4,4,0,1,0,1,47,1,2,1,3 +70252,7,2,1,40,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,14227.821648,16178.124803,3,90,2,2,0.45,1,1,0,0,0,1,40,2,2,4,NA +70253,7,2,1,0,8,5,7,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6246.568228,6909.306675,2,95,1,1,0.03,3,3,1,0,0,1,23,1,3,6,NA +70254,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,115926.402585,128579.517653,1,101,14,14,3.25,4,4,0,1,0,1,48,1,4,1,2 +70255,7,2,2,38,NA,1,1,1,NA,NA,2,NA,2,2,99,NA,1,6,2,2,2,2,1,2,2,2,2,2,2,53370.792448,51930.736348,1,100,NA,13,NA,2,1,0,0,0,1,32,2,1,6,NA +70256,7,2,2,16,NA,5,6,1,16,198,NA,NA,2,1,4,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9098.177005,9288.806625,1,98,14,14,3.9,4,4,0,1,0,2,52,1,5,1,5 +70257,7,2,2,1,20,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5687.793894,6002.477845,2,90,8,6,1.67,5,3,2,0,0,2,25,2,3,5,NA +70258,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,61710.107686,72008.199278,1,98,3,3,0.9,1,1,0,0,0,2,24,1,5,5,NA +70259,7,2,1,65,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,1,1,7514.993062,8122.478925,2,90,2,2,0.48,2,2,0,0,1,2,53,2,3,1,3 +70260,7,2,2,0,11,2,2,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,6235.764746,6104.57156,2,92,NA,NA,NA,4,4,2,0,0,1,40,NA,NA,1,NA +70261,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,37814.382501,38402.065392,1,98,6,4,1.34,2,1,0,0,0,2,22,1,4,6,NA +70262,7,2,1,7,NA,2,2,1,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10738.959181,11444.574702,2,93,10,10,2.26,6,6,0,4,0,1,34,1,4,1,3 +70263,7,2,2,49,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,18522.193415,19195.925691,1,90,9,9,2.6,4,4,0,1,0,2,49,2,2,1,5 +70264,7,2,2,23,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,NA,NA,NA,1,2,2,1,11475.373333,11965.391974,2,92,12,NA,NA,7,1,0,0,2,1,53,2,3,1,3 +70265,7,2,2,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,19378.199212,21493.287569,2,100,5,5,1.3,3,3,0,1,0,2,46,1,3,2,NA +70266,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16420.864787,17154.038836,2,102,14,14,5,2,2,0,0,2,1,64,1,4,1,3 +70267,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,20891.980831,21490.337905,2,97,12,14,5,2,1,0,0,0,1,53,NA,NA,5,NA +70268,7,2,1,46,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,30549.358294,31009.655884,2,101,5,5,1.93,1,1,0,0,0,1,46,1,4,5,NA +70269,7,2,1,0,9,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8212.233655,8522.67606,2,91,2,2,0.33,5,5,1,1,0,2,48,1,4,3,NA +70270,7,2,2,2,NA,4,4,2,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6084.391121,6799.274602,2,99,3,3,0.56,4,4,1,0,0,2,38,1,3,5,NA +70271,7,1,1,34,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17879.023129,0,2,90,7,7,3.49,1,1,0,0,0,1,34,1,3,5,NA +70272,7,2,2,1,16,4,4,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6811.556363,7329.310628,1,96,12,12,NA,5,5,1,2,0,2,35,1,5,1,4 +70273,7,2,2,8,NA,1,1,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16371.237244,2,98,1,1,0.18,4,4,0,2,0,1,29,1,4,6,NA +70274,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,30212.098573,33743.401779,2,98,3,3,1.24,1,1,0,0,1,2,80,1,4,2,NA +70275,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,26999.643202,25671.572746,2,102,6,6,1.22,5,5,0,2,0,2,42,1,4,1,4 +70276,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,164908.075108,169304.25724,1,98,15,15,5,3,3,0,0,0,1,56,1,5,1,5 +70277,7,2,2,0,9,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6021.973783,5836.909368,1,102,2,2,0.19,7,7,2,2,0,1,48,2,9,1,9 +70278,7,2,2,36,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,2,1,3,1,2,2,1,2,2,NA,NA,NA,NA,21765.629914,21610.101161,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +70279,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,17521.481386,17626.852628,2,97,99,99,NA,1,1,0,0,0,2,53,1,3,3,NA +70280,7,2,1,18,NA,2,2,1,18,221,2,NA,2,2,3,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20606.470013,20581.836663,1,103,6,6,0.93,5,5,0,1,0,1,39,2,3,1,3 +70281,7,2,2,30,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,20012.879008,20053.743639,1,100,7,7,3.13,1,1,0,0,0,2,30,1,4,5,NA +70282,7,2,1,24,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,2,5,NA,2,2,2,2,2,2,1,2,2,1,35669.2076,36155.406423,2,94,7,7,1.23,6,6,2,1,0,1,33,2,1,6,NA +70283,7,2,1,11,NA,1,1,2,11,141,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13484.595524,13595.798197,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +70284,7,2,2,4,NA,5,6,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3864.413878,3822.111022,1,99,14,14,2.66,7,7,3,1,0,1,35,1,5,1,5 +70285,7,2,2,37,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,28958.579549,29304.033516,1,96,13,13,NA,5,5,1,1,0,1,42,1,3,5,NA +70286,7,2,1,18,NA,3,3,2,18,221,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,71231.747774,75661.062324,2,95,9,9,2.22,5,5,1,0,0,1,55,1,4,1,5 +70287,7,2,2,46,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18844.090639,18943.737107,2,96,15,15,5,2,2,0,0,0,1,45,1,5,1,4 +70288,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,2,1,2,2,1,2,2,1,2,2,1,71034.153987,76359.172033,1,98,6,6,1.11,5,5,0,2,1,2,37,1,1,1,1 +70289,7,2,1,8,NA,3,3,2,8,99,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,46228.073505,47549.950918,2,94,10,10,2.91,4,4,0,2,0,2,38,1,4,1,4 +70290,7,2,1,60,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,10880.024478,11166.738171,2,91,9,9,3.14,3,3,0,1,2,1,60,1,4,1,3 +70291,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,35313.648114,35629.376203,2,95,6,6,0.9,6,6,1,1,0,1,49,1,1,1,1 +70292,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19130.246369,22400.771377,2,95,15,10,3.67,5,3,0,0,0,1,47,1,5,1,3 +70293,7,2,2,51,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,17149.727778,17902.578105,1,90,4,4,0.78,4,4,0,0,1,1,69,2,4,1,3 +70294,7,2,1,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,8219.195224,8283.488354,2,99,15,15,5,2,2,0,0,2,1,60,1,5,1,5 +70295,7,2,1,47,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,21158.364877,21743.069946,1,96,15,15,4.9,4,4,0,1,0,1,47,1,3,1,5 +70296,7,2,2,0,4,3,3,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17674.326293,18731.006164,3,90,15,15,5,3,3,1,0,0,1,31,1,5,1,5 +70297,7,2,1,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,60942.568495,64726.722108,1,94,7,7,2.51,2,2,0,0,2,2,72,1,4,1,1 +70298,7,2,2,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,22707.329726,23560.698233,2,97,2,2,0.3,4,4,0,2,0,1,42,1,2,6,NA +70299,7,2,1,62,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,7192.368251,7796.453586,1,93,4,4,1.74,1,1,0,0,1,1,62,2,3,2,NA +70300,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,27466.648066,27396.091902,1,99,2,2,0.61,2,2,0,0,0,1,46,1,5,5,NA +70301,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,21143.964074,21647.100945,1,100,1,1,0.04,4,4,1,1,0,2,51,1,3,3,NA +70302,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,42894.724338,43561.362107,1,98,6,4,1.34,2,1,0,0,0,1,24,1,5,5,NA +70303,7,2,1,56,NA,2,2,2,NA,NA,1,1,2,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,34813.426994,34467.752983,1,97,15,15,5,1,1,0,0,0,1,56,2,4,3,NA +70304,7,2,2,65,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,122483.259869,138551.168646,3,91,7,7,3.49,1,1,0,0,1,2,65,1,3,2,NA +70305,7,2,1,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23912.171644,23498.78217,1,91,15,15,5,3,3,1,0,0,1,33,1,5,1,5 +70306,7,2,1,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25645.251384,25514.298117,1,92,6,6,1.31,3,3,0,0,1,2,80,1,3,4,NA +70307,7,2,1,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,47487.549895,49034.44781,1,102,6,6,1.48,3,3,0,0,1,2,57,2,1,1,4 +70308,7,2,1,5,NA,1,1,1,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20874.345556,20902.551716,3,92,2,2,0.47,3,3,1,1,0,2,33,1,4,5,NA +70309,7,2,1,2,NA,1,1,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12413.685227,12209.161559,1,102,6,6,1.46,3,3,1,1,0,2,28,2,4,3,NA +70310,7,1,2,11,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,1,2,NA,NA,NA,NA,9139.784234,0,2,100,6,6,1.18,5,5,0,2,1,2,70,1,2,77,NA +70311,7,2,1,7,NA,1,1,1,8,96,NA,NA,2,2,2,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13581.60325,14182.420159,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +70312,7,2,2,73,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,1,4,NA,2,2,2,1,2,2,1,2,2,NA,17318.187297,23904.945555,2,90,2,2,0.73,1,1,0,0,1,2,73,2,1,4,NA +70313,7,2,2,37,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,26465.930618,27183.288271,2,100,15,15,4.47,4,4,0,2,0,1,39,NA,NA,1,5 +70314,7,2,1,5,NA,3,3,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58618.419318,66135.507563,2,94,12,12,NA,5,5,1,1,0,1,37,1,4,1,3 +70315,7,2,2,5,NA,5,6,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4938.043177,5373.703942,1,91,5,5,0.89,4,4,2,0,0,1,39,1,4,1,5 +70316,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4667.634102,4955.769831,3,90,15,15,5,5,5,1,0,1,1,38,2,3,1,4 +70317,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,12813.519628,13398.278814,2,92,7,7,1.61,4,4,0,2,0,1,51,2,3,1,3 +70318,7,2,2,23,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,85402.868381,86166.428247,2,94,77,77,NA,2,2,0,0,0,2,23,1,3,6,NA +70319,7,2,1,55,NA,5,6,1,NA,NA,2,NA,2,2,7,NA,1,4,NA,1,2,2,1,2,2,1,2,2,1,16499.662173,17012.89406,3,91,6,6,1.77,2,2,0,0,0,2,57,2,1,1,1 +70320,7,2,1,4,NA,2,2,1,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16288.754504,16020.386509,2,92,15,15,5,3,3,1,0,0,2,48,2,5,1,5 +70321,7,2,1,63,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,2,2,2,1,2,2,1,2,2,2,9115.676792,9431.98541,2,90,5,5,1.84,1,1,0,0,1,1,63,2,4,3,NA +70322,7,2,1,16,NA,1,1,2,16,200,NA,NA,2,2,3,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,21633.039913,21721.097793,2,94,7,7,1.04,7,7,0,3,0,1,37,2,1,1,3 +70323,7,2,2,7,NA,4,4,2,7,89,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8757.841043,8910.615224,2,97,2,2,0.38,3,3,1,1,0,2,27,1,2,5,NA +70324,7,2,2,14,NA,3,3,2,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,109773.944307,112955.590462,1,98,15,15,4.34,4,4,0,2,0,1,51,1,5,1,5 +70325,7,2,2,6,NA,1,1,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14679.337943,15307.210901,1,90,15,15,4.77,4,4,1,1,0,2,41,1,5,1,2 +70326,7,2,1,35,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,22188.836739,23952.480361,1,95,5,5,0.89,4,4,0,1,0,2,42,1,4,6,NA +70327,7,2,2,62,NA,2,2,2,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,2,12121.359422,12627.249955,2,99,15,15,5,2,2,0,0,2,1,64,2,5,1,4 +70328,7,2,1,27,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,3,1,NA,2,2,2,1,2,2,1,2,2,2,35782.041084,36966.59793,2,96,1,1,0.06,5,5,2,1,0,1,27,2,3,1,4 +70329,7,2,2,60,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,9716.805546,12994.252166,2,90,3,3,0.46,5,5,0,2,2,1,75,2,1,1,2 +70330,7,2,1,77,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,8286.514589,8909.879599,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +70331,7,2,1,52,NA,1,1,1,NA,NA,2,NA,2,2,7,NA,1,1,NA,2,2,1,2,2,1,NA,NA,NA,NA,33162.406014,36437.864606,3,92,4,4,0.66,4,4,0,1,0,1,52,2,1,1,1 +70332,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,10676.164039,11456.797578,2,97,4,4,1.29,2,2,0,0,2,1,74,1,3,3,NA +70333,7,2,2,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,48470.428632,49964.788237,1,98,15,15,5,5,5,0,1,1,2,55,1,5,1,5 +70334,7,2,1,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10229.206765,10406.656985,1,96,15,15,4.52,6,6,0,4,0,1,46,1,4,1,4 +70335,7,2,2,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,38954.135779,44674.189003,1,91,3,3,1.15,1,1,0,0,0,2,53,1,4,3,NA +70336,7,2,2,74,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,2,2,2,NA,15730.58404,17568.357111,2,98,6,6,1.62,3,3,0,0,1,2,74,1,1,2,NA +70337,7,2,1,38,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19788.748292,24506.181083,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +70338,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,42468.064168,42915.721814,2,101,6,6,1.16,4,4,0,3,0,2,36,1,4,4,NA +70339,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,33248.548181,34134.900613,1,98,4,4,0.89,3,3,0,0,1,2,55,1,5,1,NA +70340,7,2,2,16,NA,5,6,2,16,197,NA,NA,1,1,NA,8,NA,NA,NA,1,2,1,1,2,1,1,2,2,1,10767.566937,11540.84845,2,91,12,12,NA,7,6,0,4,2,2,72,2,1,2,NA +70341,7,2,1,62,NA,5,6,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12579.986433,13271.133625,1,92,14,14,5,2,2,0,0,2,1,62,1,4,1,4 +70342,7,2,2,61,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,2,2,NA,1,2,1,1,2,1,1,2,1,3,11838.431472,12295.352662,2,92,7,7,1.89,3,3,0,0,1,1,36,2,3,5,NA +70343,7,2,1,11,NA,5,6,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7179.084455,7651.500738,2,98,9,9,2.29,5,5,0,2,0,1,36,1,4,1,4 +70344,7,2,1,1,18,4,4,1,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6376.965739,6390.839385,2,100,3,3,0.31,7,7,3,2,0,2,28,1,3,1,3 +70345,7,2,1,5,NA,1,1,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14321.363328,13945.949794,2,96,77,77,NA,7,7,3,2,0,2,33,2,2,6,NA +70346,7,2,2,11,NA,1,1,1,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16412.026403,2,98,14,14,2.87,5,5,0,3,0,2,34,1,2,1,2 +70347,7,2,1,70,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,10025.317761,10256.608873,2,103,15,15,5,3,3,0,0,1,2,55,1,4,1,5 +70348,7,2,2,9,NA,3,3,1,9,118,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22933.149195,23865.138008,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +70349,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,12535.973802,12972.182488,2,100,4,4,0.97,3,3,0,0,3,2,80,1,5,2,NA +70350,7,2,2,18,NA,3,3,1,18,221,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,71832.578284,79011.982474,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +70351,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,38799.676345,43482.761402,1,94,6,6,2.24,1,1,0,0,1,2,80,1,4,2,NA +70352,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,29167.119125,29652.805867,1,101,2,2,0.22,4,4,1,0,0,2,25,1,4,6,NA +70353,7,2,1,6,NA,4,4,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8227.856305,9153.104022,3,91,1,1,0.07,6,6,2,3,0,2,30,1,2,3,NA +70354,7,2,1,17,NA,4,4,2,17,207,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,8,8,2,4,4,1,2,0,2,40,1,4,5,NA +70355,7,2,1,65,NA,5,6,2,NA,NA,2,NA,2,1,4,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,9963.081107,10271.419526,1,91,4,4,1.33,2,2,0,0,2,1,65,2,4,1,3 +70356,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,5,2,1,2,2,1,2,2,1,2,2,1,67534.233567,86418.733625,1,97,3,3,0.83,2,2,0,0,0,2,25,1,1,5,NA +70357,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,12601.697316,12716.910215,1,91,15,15,5,6,6,0,2,2,1,50,2,5,1,5 +70358,7,2,2,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,154825.466557,155723.680504,1,91,8,8,4.41,1,1,0,0,0,2,44,1,4,3,NA +70359,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,46965.818538,50603.721684,1,95,14,14,5,2,2,0,0,2,1,80,1,4,1,NA +70360,7,2,2,8,NA,4,4,2,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8147.287486,8823.301862,2,90,5,5,1.63,2,2,0,1,0,2,38,2,3,5,NA +70361,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,1,1,2,NA,50879.818001,58591.132961,1,101,6,6,1.31,3,3,0,0,1,2,80,1,1,2,NA +70362,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,8308.628726,8679.600111,2,95,5,5,1.96,1,1,0,0,1,2,61,1,4,2,NA +70363,7,2,2,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,122483.259869,124909.680309,3,91,15,15,5,2,2,0,0,2,2,62,1,5,1,5 +70364,7,2,1,73,NA,5,7,1,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11532.082424,12399.599956,2,103,12,12,NA,2,2,0,0,2,1,73,2,5,1,4 +70365,7,2,2,7,NA,5,6,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8290.163782,8692.019106,1,92,2,2,0.24,5,5,0,2,0,1,35,2,4,1,3 +70366,7,2,2,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,19693.606802,19976.427063,1,99,12,12,NA,2,2,0,0,0,1,28,1,5,5,NA +70367,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,56938.907307,57514.428801,2,95,15,15,4.63,5,5,1,2,0,2,36,1,5,1,3 +70368,7,2,1,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19779.547388,20214.272069,2,96,15,15,5,3,3,0,1,0,1,55,1,5,1,4 +70369,7,2,2,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,60324.348827,64927.943097,1,95,4,4,0.97,3,3,2,0,0,2,22,1,4,5,NA +70370,7,2,1,6,NA,4,4,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8439.71412,8914.772112,2,99,7,7,1.19,6,6,1,3,0,2,38,1,3,5,NA +70371,7,2,2,2,NA,1,1,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11582.174418,12474.053558,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +70372,7,2,1,61,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,4,1,NA,2,2,2,1,2,2,1,2,2,1,11568.876339,11794.347884,1,102,77,77,NA,3,3,0,0,1,1,61,2,4,1,1 +70373,7,2,1,5,NA,1,1,2,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14505.510202,14676.996441,2,94,77,77,NA,5,5,1,1,0,1,41,2,2,1,2 +70374,7,2,1,4,NA,3,3,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,33334.752566,38103.457131,3,92,6,6,0.74,7,7,2,1,0,2,46,1,2,1,4 +70375,7,2,2,19,NA,1,1,1,19,231,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21062.314667,23105.758741,1,94,6,6,1.3,4,4,2,0,0,1,24,2,1,1,4 +70376,7,2,1,17,NA,1,1,1,17,215,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14432.845547,14415.592261,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +70377,7,2,1,3,NA,2,2,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12403.412256,12420.172189,2,90,2,2,0.49,3,3,2,0,0,2,26,1,4,1,NA +70378,7,2,1,53,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,18681.278463,18953.419735,1,93,7,7,1.79,4,4,0,2,0,1,53,2,4,1,4 +70379,7,2,2,2,NA,2,2,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11443.671453,12634.120381,1,100,15,15,4.34,4,4,2,0,0,2,35,1,5,1,5 +70380,7,2,1,9,NA,4,4,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7730.47951,9212.541007,1,99,6,6,1.3,5,5,1,2,0,1,34,1,2,1,3 +70381,7,2,1,24,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,39031.957066,39638.562591,1,95,6,6,0.96,5,5,1,0,1,2,69,1,1,2,NA +70382,7,2,1,1,22,1,1,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,10960.671575,11090.250219,2,96,4,4,0.69,5,5,2,0,0,2,57,2,1,4,NA +70383,7,2,2,4,NA,3,3,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,67177.961189,74143.696839,1,98,9,9,2.6,4,4,1,1,0,2,35,1,2,1,NA +70384,7,2,1,25,NA,4,4,1,NA,NA,2,NA,2,1,4,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,23484.626749,24110.252242,2,96,6,6,1.7,2,2,0,1,0,1,25,2,4,5,NA +70385,7,2,2,57,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,15002.194143,18506.393496,3,90,7,2,0.77,2,1,0,0,0,1,44,1,2,6,NA +70386,7,2,1,38,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17554.053699,17499.245836,1,96,2,2,0.73,1,1,0,0,0,1,38,1,3,5,NA +70387,7,2,2,60,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,3,6,NA,2,2,2,2,2,2,2,2,2,2,15876.871857,17052.998921,2,102,14,7,3.67,2,1,0,0,2,1,65,2,3,6,NA +70388,7,2,1,12,NA,3,3,2,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,56223.281913,55799.760014,1,99,14,14,4.86,3,3,0,1,0,1,56,1,5,1,5 +70389,7,2,2,56,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,3,4,NA,2,2,2,2,2,2,2,2,1,2,20734.495277,22784.232134,2,99,99,99,NA,4,1,0,0,0,2,42,2,4,5,NA +70390,7,2,2,8,NA,1,1,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10118.363218,10311.586628,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +70391,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,27681.279,30792.259764,1,91,3,3,1.29,1,1,0,0,1,2,80,1,3,5,NA +70392,7,2,1,0,10,2,2,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5610.286388,5712.081065,2,90,6,6,1.34,4,4,1,2,0,2,36,2,3,77,NA +70393,7,2,1,9,NA,4,4,1,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9418.975084,9571.535533,2,93,5,5,1.04,4,4,1,1,0,1,29,1,3,6,NA +70394,7,2,1,47,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13883.119445,13832.965705,1,103,15,15,5,1,1,0,0,0,1,47,1,5,5,NA +70395,7,1,1,36,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,114168.79702,0,1,95,14,14,3.8,4,4,1,1,0,1,36,1,4,1,5 +70396,7,2,1,6,NA,5,7,1,6,77,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8930.369586,9194.254241,3,91,14,14,3.8,4,4,0,2,0,1,47,1,5,1,5 +70397,7,2,1,19,NA,1,1,1,19,234,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21898.969807,22012.999264,2,102,15,15,3.92,5,5,0,0,0,1,19,1,4,NA,NA +70398,7,2,2,57,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,2,4,NA,2,2,2,1,2,2,1,2,2,NA,21097.069797,24201.517172,2,90,6,6,1.7,2,2,0,0,0,2,57,2,2,4,NA +70399,7,2,1,24,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14379.41014,15757.242021,1,94,7,3,0.9,4,1,0,0,0,1,24,NA,NA,5,NA +70400,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,18723.98095,17927.802584,2,101,7,7,1.3,5,5,2,0,1,2,50,1,4,1,3 +70401,7,2,1,47,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,14879.667962,15815.934168,3,91,15,15,5,3,3,0,1,0,1,47,2,5,1,5 +70402,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,8796.577101,9772.20689,2,95,5,5,1.32,2,2,0,0,2,1,80,1,3,1,3 +70403,7,2,1,13,NA,1,1,1,13,159,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,19242.904841,19537.039374,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +70404,7,2,2,7,NA,2,2,2,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20753.369981,21666.802981,1,97,5,5,1.04,4,4,1,1,0,1,32,1,3,6,NA +70405,7,2,2,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,118611.064701,118209.809508,1,91,15,15,5,2,2,0,0,2,1,63,1,4,1,5 +70406,7,2,2,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,31454.59168,33587.963223,1,94,4,4,1,3,3,0,1,0,2,41,1,4,5,NA +70407,7,1,2,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9492.170663,0,1,90,4,4,0.67,5,5,3,0,0,2,32,2,3,3,NA +70408,7,2,1,33,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,20803.970543,21557.298406,1,93,14,14,5,2,2,0,0,1,1,33,2,5,5,NA +70409,7,2,1,44,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,130374.456976,1,101,6,6,1.31,3,3,0,0,1,2,80,1,1,2,NA +70410,7,2,1,6,NA,2,2,1,6,80,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9741.585979,9800.624884,2,103,12,2,0.59,5,2,0,1,0,2,47,NA,NA,3,NA +70411,7,2,2,23,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,50915.06085,50693.303376,3,92,5,5,0.81,5,5,3,0,0,2,23,1,4,5,NA +70412,7,2,1,14,NA,1,1,2,15,180,NA,NA,1,1,NA,10,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,20398.562455,21727.336109,2,94,6,6,1.34,4,4,0,2,0,1,37,2,4,1,2 +70413,7,2,1,51,NA,5,6,2,NA,NA,2,NA,2,1,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9889.944368,10305.962662,1,99,10,10,3.51,3,3,0,1,0,2,44,1,3,1,5 +70414,7,2,2,25,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,128171.594518,136210.394705,1,93,15,15,5,2,2,0,0,0,1,28,1,5,6,NA +70415,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,52752.276869,57774.89643,1,98,12,12,NA,1,1,0,0,1,2,80,1,5,2,NA +70416,7,2,1,25,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,4,5,NA,1,2,2,1,2,2,1,2,1,2,38474.772527,40200.135096,2,93,7,2,0.81,3,1,0,0,0,1,25,2,4,5,NA +70417,7,2,1,80,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,2,2,2,1,2,2,1,2,2,NA,14200.083364,15006.095575,3,92,4,4,1.65,1,1,0,0,1,1,80,1,1,3,NA +70418,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,47566.45715,0,1,90,6,6,2.86,1,1,0,0,1,2,80,1,4,5,NA +70419,7,2,1,2,NA,2,2,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,2,2,1,NA,NA,NA,NA,10244.841997,10258.685193,1,96,5,5,0.94,4,4,2,0,0,1,32,2,3,1,4 +70420,7,2,2,55,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,2,NA,2,2,2,2,2,2,NA,NA,NA,NA,24004.6026,24129.784561,2,91,4,4,0.43,7,7,0,1,1,1,41,2,1,4,NA +70421,7,2,2,51,NA,2,2,2,NA,NA,2,NA,2,2,7,NA,2,3,NA,1,2,2,1,2,2,1,2,2,2,17054.056149,20556.446647,2,90,8,8,2.7,3,3,0,1,0,2,31,1,5,4,NA +70422,7,2,2,9,NA,2,2,2,9,114,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15148.721588,16989.423356,2,91,2,2,0.22,4,4,1,1,0,2,48,2,9,5,NA +70423,7,2,1,52,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32461.799549,39033.401297,1,101,5,5,0.89,5,5,1,0,0,1,25,1,2,77,NA +70424,7,2,1,28,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,1,2,2,1,2,2,1,41271.869706,41834.437137,1,96,9,9,3.97,2,2,0,0,0,1,28,2,2,6,NA +70425,7,2,1,77,NA,3,3,2,NA,NA,1,2,2,1,9,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,63054.867183,67969.319596,1,90,8,8,3.3,2,2,0,0,2,1,77,2,2,1,5 +70426,7,2,1,66,NA,1,1,1,NA,NA,2,NA,2,1,8,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,14488.953694,14844.946966,3,92,8,8,1.85,5,5,1,0,2,1,66,2,1,1,1 +70427,7,2,2,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,75152.05379,75383.121447,2,92,15,15,5,2,2,0,0,0,1,37,1,5,1,5 +70428,7,2,2,0,4,3,3,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10025.884543,10365.226844,3,92,6,6,0.74,7,7,2,1,0,2,46,1,2,1,4 +70429,7,2,2,44,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,134587.275919,139488.984678,1,92,8,8,2.17,4,4,0,1,2,2,80,1,3,2,NA +70430,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,97705.030285,101386.34066,2,94,14,14,4.71,3,3,1,0,0,1,35,1,5,1,5 +70431,7,2,2,20,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,2,5,2,1,2,2,2,2,2,1,2,2,1,32455.694722,32314.335903,2,103,5,5,0.65,6,6,1,0,1,2,61,2,1,2,NA +70432,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,145772.192378,152604.524555,1,95,15,15,5,4,4,0,2,0,2,42,1,5,1,5 +70433,7,2,1,16,NA,1,1,1,16,199,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,22768.423624,22944.003607,2,98,14,14,2.87,5,5,0,3,0,2,34,1,2,1,2 +70434,7,2,2,0,2,3,3,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18869.566209,19997.704869,2,92,15,15,5,3,3,1,0,0,1,48,1,5,1,5 +70435,7,2,2,17,NA,2,2,1,17,214,2,NA,2,1,4,14,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,14984.257718,15414.270546,2,92,10,7,2.38,3,2,0,1,0,1,29,2,4,6,NA +70436,7,2,2,8,NA,4,4,1,8,103,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11116.391625,11717.604707,2,98,6,6,1,5,5,2,1,0,2,31,1,4,6,NA +70437,7,2,1,43,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,2,2,2,2,2,2,2,34153.424332,40514.279864,1,100,7,7,1.3,5,5,0,3,0,1,43,2,2,1,4 +70438,7,2,1,42,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,138834.18124,143254.613293,1,100,15,15,5,4,4,0,2,0,2,47,1,5,1,5 +70439,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,76027.409363,76707.146234,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +70440,7,2,1,14,NA,4,4,2,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10081.970102,10544.115448,2,99,4,4,0.78,4,4,0,2,0,2,45,1,3,5,NA +70441,7,2,2,2,NA,2,2,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8134.473424,8243.872451,2,99,5,5,1.26,3,3,1,0,0,1,24,2,2,1,1 +70442,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,41309.21018,41341.432201,1,100,4,4,1.19,2,2,0,0,1,1,62,1,5,1,5 +70443,7,2,2,52,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,33018.025291,33777.066037,1,92,8,8,3.3,2,2,0,0,0,1,40,2,5,1,5 +70444,7,2,1,13,NA,1,1,1,13,160,NA,NA,2,2,3,6,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,27378.670648,27589.802811,2,96,3,3,0.95,2,2,0,1,0,2,38,2,3,3,NA +70445,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,52814.190351,53378.216173,1,98,12,12,NA,2,2,0,0,2,1,65,1,4,1,3 +70446,7,2,2,45,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,4,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,31235.666551,31398.557894,3,92,6,6,1,6,6,1,1,0,1,42,2,1,1,4 +70447,7,2,1,29,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,23484.626749,23642.328802,2,96,14,14,4.26,3,3,0,0,0,1,20,1,4,5,NA +70448,7,2,1,29,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,3,4,NA,2,2,2,1,2,2,2,2,2,2,40078.999044,48909.175469,3,91,6,6,0.89,7,7,1,1,0,1,59,2,1,1,1 +70449,7,2,2,12,NA,2,2,1,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20128.183753,21457.209224,2,100,14,14,3.58,4,4,0,2,0,2,40,NA,NA,1,4 +70450,7,2,1,15,NA,3,3,1,15,190,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,63633.689496,63154.346062,2,100,10,10,3.13,4,4,0,2,0,1,45,1,4,1,4 +70451,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,17286.767396,17743.751095,2,100,2,2,0.38,3,3,0,2,0,2,35,1,4,5,NA +70452,7,2,1,17,NA,5,6,2,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,6232.587755,6841.667882,1,91,7,7,1.57,4,4,0,3,0,2,38,2,2,3,NA +70453,7,2,2,1,22,4,4,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8221.160724,9187.103228,1,100,8,8,2.36,3,3,1,0,1,2,60,1,3,3,NA +70454,7,2,2,2,NA,2,2,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8200.025088,8716.981559,1,93,14,8,2.01,5,4,1,0,0,2,22,2,1,6,NA +70455,7,2,1,69,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,4526.005699,5855.572964,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +70456,7,2,1,0,4,1,1,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7594.427215,7594.567194,1,98,15,15,5,3,3,1,0,0,1,38,1,4,1,5 +70457,7,2,2,40,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,1,1,2,1,1,2,2,3,16797.688743,17484.356971,3,91,15,15,5,3,3,0,1,0,2,40,2,5,1,5 +70458,7,2,2,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,26465.930618,26765.106529,2,100,10,10,2.33,6,6,0,2,2,2,35,1,2,5,NA +70459,7,2,2,4,NA,4,4,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9727.363166,10466.751274,2,97,6,6,1.02,6,6,1,2,0,1,37,1,3,1,3 +70460,7,2,2,5,NA,4,4,2,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9156.613403,9392.96113,2,99,7,5,1.59,3,2,1,0,0,2,23,1,4,5,NA +70461,7,1,2,5,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13196.707564,0,2,96,3,3,0.24,7,7,2,3,1,2,40,1,3,3,NA +70462,7,2,1,8,NA,2,2,2,8,107,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13232.943476,13442.347662,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +70463,7,2,2,7,NA,3,3,2,8,96,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,35359.674949,35088.43355,1,99,10,10,2.48,5,5,2,1,0,1,33,1,5,1,5 +70464,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,11523.037911,11803.949722,2,97,4,4,1.65,1,1,0,0,1,2,60,1,4,5,NA +70465,7,2,1,4,NA,5,6,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9239.758777,10363.400393,2,91,14,14,3.47,4,4,1,1,0,2,40,2,5,1,NA +70466,7,2,2,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,1,1,2,2,1,2,2,NA,NA,NA,NA,43813.24867,46530.283453,1,98,1,1,0.16,3,3,1,0,0,1,28,1,2,6,NA +70467,7,2,1,12,NA,2,2,2,12,146,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21399.234084,21768.65302,1,91,15,15,5,4,4,0,2,0,1,49,1,5,1,5 +70468,7,2,2,0,8,5,7,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5820.770257,5884.32621,1,95,2,2,0.47,3,3,2,0,0,2,24,1,4,5,NA +70469,7,2,2,0,4,2,2,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4807.611315,4659.866106,1,103,4,4,0.54,7,7,2,2,0,2,35,2,1,6,NA +70470,7,2,2,43,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,15552.65085,16188.423507,2,92,15,15,5,3,3,0,1,0,1,45,2,4,1,4 +70471,7,2,2,16,NA,5,7,2,16,198,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,12440.215685,2,95,6,6,1.31,3,3,0,1,0,1,39,1,3,1,4 +70472,7,2,1,12,NA,3,3,2,13,157,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20152.417898,19887.568869,2,94,7,7,1.18,7,7,1,4,0,2,31,1,4,6,NA +70473,7,2,2,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,126117.5094,130777.186989,2,98,10,10,3.78,3,3,0,0,0,1,53,1,3,1,4 +70474,7,2,1,44,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,18116.816149,22904.074887,2,90,8,8,3.4,2,2,0,0,0,1,44,1,3,6,NA +70475,7,2,1,16,NA,5,6,2,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,6269.080236,6655.935643,1,93,NA,NA,NA,3,3,0,1,0,1,53,NA,NA,1,NA +70476,7,2,1,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16905.961576,20936.167849,2,94,7,7,1.62,5,5,0,3,0,1,30,1,2,1,9 +70477,7,2,1,9,NA,2,2,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15353.368573,15360.170072,1,97,7,7,1.74,4,4,0,3,0,2,32,1,4,5,NA +70478,7,2,2,34,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,17430.913214,17550.603029,1,90,15,15,5,2,2,0,0,0,2,34,2,5,1,5 +70479,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,17397.027021,18573.153951,3,91,2,2,0.73,1,1,0,0,0,2,25,2,4,5,NA +70480,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,136832.42119,141624.96623,2,91,15,15,5,2,2,0,0,1,2,60,1,5,1,5 +70481,7,2,1,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,32946.178621,33458.203523,2,96,3,3,0.53,5,5,3,0,0,2,26,1,4,1,4 +70482,7,2,1,17,NA,5,7,2,17,207,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11712.675291,11995.185902,3,91,15,15,4.47,4,4,0,1,2,2,79,1,4,3,NA +70483,7,2,1,20,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15740.336751,16168.874324,2,91,10,10,2.59,5,5,0,1,0,1,48,NA,NA,6,NA +70484,7,2,2,19,NA,1,1,2,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19557.287652,19933.266032,2,94,5,5,1.08,3,3,0,1,0,2,37,2,2,4,NA +70485,7,2,1,34,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14790.183811,15030.369455,3,90,14,14,4.71,3,3,0,0,2,1,64,NA,NA,1,NA +70486,7,2,1,10,NA,2,2,2,10,130,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13285.093011,13365.60735,2,94,2,2,0.41,2,2,0,1,1,2,66,2,3,5,NA +70487,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,12935.870815,12581.846775,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +70488,7,2,2,6,NA,4,4,2,6,83,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,1,2,NA,NA,NA,NA,7814.742747,7984.793423,2,95,2,2,0.26,4,4,0,2,0,2,44,NA,NA,5,NA +70489,7,2,1,40,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,5,1,NA,2,2,2,1,2,2,2,2,1,2,36225.654087,36329.951191,2,93,7,7,1.83,3,3,1,0,0,1,40,2,5,1,4 +70490,7,1,1,43,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,140932.152825,0,1,97,15,15,5,5,5,2,0,1,1,43,1,5,1,5 +70491,7,2,2,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8833.042831,8971.325329,1,99,4,4,0.53,7,7,3,1,0,2,26,1,1,5,NA +70492,7,2,2,0,0,4,4,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3516.231705,3777.543312,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +70493,7,2,1,52,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,19541.667675,20187.705923,2,95,2,2,0.67,1,1,0,0,0,1,52,1,2,5,NA +70494,7,2,1,25,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,44831.646235,2,98,7,7,1.97,4,4,0,1,0,1,40,1,3,1,3 +70495,7,2,1,68,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26026.192556,26360.023593,1,94,3,3,0.86,2,2,0,0,2,1,68,1,4,1,2 +70496,7,1,2,30,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,39483.840194,0,2,102,14,14,4.86,3,3,1,0,0,1,30,1,5,1,5 +70497,7,2,2,3,NA,4,4,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,10437.988787,11664.396755,2,100,NA,NA,NA,4,4,1,0,0,2,38,NA,NA,77,NA +70498,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,98514.948291,98181.677236,1,99,10,10,4.89,2,2,0,0,2,2,63,1,5,5,NA +70499,7,2,2,47,NA,1,1,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,2,2,2,2,2,2,1,2,2,2,23968.560941,24093.554947,2,90,6,6,1.15,5,5,0,2,0,2,47,2,1,1,5 +70500,7,2,1,15,NA,1,1,1,15,183,NA,NA,1,1,NA,9,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,24902.864049,25283.513039,1,94,8,8,1.85,5,5,0,2,0,1,44,2,1,6,NA +70501,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105873.555835,106383.882408,1,98,15,15,5,5,5,0,1,0,1,53,1,5,1,5 +70502,7,2,1,71,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,NA,48254.793439,51076.634961,2,100,14,10,5,2,1,0,0,2,1,71,1,2,6,NA +70503,7,2,2,18,NA,4,4,1,18,224,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,99,1,0.09,4,1,0,0,0,2,18,1,4,NA,NA +70504,7,2,1,59,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,19671.580166,20292.088214,2,99,7,7,2.31,2,2,0,0,1,1,62,1,3,5,NA +70505,7,2,2,40,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,3,1,2,2,2,2,2,2,2,1,2,2,2,23968.560941,24556.443674,2,90,99,99,NA,5,5,1,1,0,2,40,2,3,1,1 +70506,7,2,2,9,NA,4,4,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9153.600624,9398.485171,1,100,8,8,1.61,6,6,1,3,0,1,29,1,5,6,NA +70507,7,2,2,80,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,19066.820866,21138.377975,2,99,6,6,2.69,1,1,0,0,1,2,80,2,3,5,NA +70508,7,1,1,0,3,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6246.568228,0,2,95,9,9,1.81,6,6,1,1,0,2,56,1,4,3,NA +70509,7,2,1,8,NA,2,2,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13395.612951,13472.514863,2,102,15,12,NA,5,4,0,3,0,1,42,2,4,6,NA +70510,7,2,1,6,NA,5,6,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6905.911299,7686.337387,2,90,4,4,0.81,3,3,0,1,0,2,41,2,2,6,NA +70511,7,2,1,36,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17643.563124,18510.507534,3,91,15,15,5,4,4,2,0,0,1,36,2,5,1,5 +70512,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,2,1,2,2,1,2,2,1,2,2,3,16929.836231,20416.10433,2,101,5,3,0.92,2,1,0,0,0,2,20,NA,NA,5,NA +70513,7,1,1,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15682.233511,0,1,101,6,6,1.78,2,2,0,0,2,1,80,1,2,1,1 +70514,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,52160.006964,54246.901852,1,100,4,1,0,3,1,0,0,0,1,22,1,4,6,NA +70515,7,1,1,5,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7843.21745,0,1,96,12,12,NA,5,5,2,0,1,2,63,2,5,3,NA +70516,7,2,1,11,NA,4,4,2,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12176.538896,12609.8265,2,97,3,3,0.46,5,5,0,3,0,1,40,1,2,1,3 +70517,7,2,1,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19440.793325,20264.695737,2,95,14,14,3.47,4,4,0,0,0,2,45,1,4,1,4 +70518,7,2,2,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,7032.269464,7566.800387,2,99,3,3,0.44,5,5,1,1,0,2,53,1,4,1,3 +70519,7,2,1,5,NA,5,6,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8981.553859,10073.795326,3,91,15,15,5,4,4,2,0,0,1,36,2,5,1,5 +70520,7,2,1,67,NA,1,1,1,NA,NA,1,1,2,1,8,NA,3,1,NA,1,2,2,1,2,2,2,2,2,2,11992.012141,12562.386395,2,102,5,5,1.36,2,2,0,0,2,2,66,2,2,1,3 +70521,7,2,1,53,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19084.761772,19687.829911,1,91,15,15,5,4,4,0,2,0,2,52,1,5,1,5 +70522,7,2,2,21,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,41953.42893,43056.968872,2,99,4,1,0.08,4,1,0,0,0,2,21,NA,NA,5,NA +70523,7,2,1,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,86986.68246,93900.677523,2,94,14,14,3.36,4,4,2,0,0,1,31,1,3,1,5 +70524,7,2,1,0,6,3,3,2,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17113.022485,16817.175522,1,91,15,15,5,3,3,1,0,0,1,41,1,5,1,5 +70525,7,2,1,63,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,7410.50521,7700.344649,2,96,2,2,0.71,1,1,0,0,1,1,63,1,3,3,NA +70526,7,2,2,10,NA,5,7,1,10,131,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8063.227462,8462.212273,3,91,14,14,3.8,4,4,0,2,0,1,47,1,5,1,5 +70527,7,2,1,63,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,1,2,2,1,1,2,2,2,9235.951997,9462.879133,2,103,7,7,1.89,3,3,0,0,1,1,63,2,2,1,9 +70528,7,2,1,15,NA,4,4,1,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19163.050164,19302.61536,2,102,8,8,3.1,2,2,0,1,0,1,40,1,4,3,NA +70529,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,36244.629058,37702.525304,1,98,3,3,0.73,2,2,0,0,0,1,49,1,2,1,2 +70530,7,2,2,1,17,4,4,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6765.566493,7560.484444,2,103,6,6,1.3,4,4,1,1,0,2,26,1,4,1,3 +70531,7,2,1,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,30152.053647,30985.296608,2,101,10,10,3.89,3,3,0,1,0,2,49,1,4,1,3 +70532,7,2,2,9,NA,1,1,1,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20495.125801,21365.773499,3,92,8,8,1.55,6,6,1,3,0,2,38,1,5,1,4 +70533,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,196284.082305,1,91,7,7,3.31,1,1,0,0,0,2,51,1,5,3,NA +70534,7,2,2,48,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,2,6,NA,2,2,2,NA,NA,NA,2,2,2,2,46417.079566,59177.283457,1,97,NA,NA,NA,2,1,0,0,0,1,30,NA,NA,6,NA +70535,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,28813.038041,29206.765831,1,94,5,5,0.87,4,4,0,1,0,1,40,1,5,1,5 +70536,7,2,1,30,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,18838.303827,25198.281368,2,93,6,6,1.95,2,2,0,1,0,1,30,1,4,5,NA +70537,7,2,1,26,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37326.925742,39362.952436,2,91,6,77,NA,4,1,0,0,0,1,25,NA,NA,5,NA +70538,7,2,2,11,NA,1,1,1,11,134,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,19059.339877,19554.022514,1,95,4,4,0.68,5,5,0,1,0,2,38,2,3,4,NA +70539,7,1,1,22,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,13205.475858,0,1,102,1,1,0,2,1,0,0,0,1,18,NA,NA,NA,NA +70540,7,2,1,18,NA,3,3,1,18,227,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,105662.708061,105798.100528,1,94,12,12,NA,2,2,0,0,0,1,18,1,3,NA,NA +70541,7,2,2,13,NA,2,2,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19836.724169,20587.964512,1,98,4,4,0.75,4,4,0,1,0,2,48,1,2,1,3 +70542,7,2,2,14,NA,4,4,2,14,177,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11956.705842,11923.015236,1,96,15,15,5,5,5,0,3,0,2,47,1,5,1,5 +70543,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,1,2,NA,11684.182359,12558.119387,2,98,6,6,1.35,3,3,0,0,2,1,79,NA,NA,1,2 +70544,7,2,1,77,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,7608.031426,7606.53553,1,99,6,6,1.34,4,4,0,1,1,1,77,1,3,1,5 +70545,7,2,1,31,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32856.012738,39257.112915,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +70546,7,2,2,0,8,4,4,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4418.651245,4866.131244,2,95,3,3,0.43,4,4,2,0,0,2,23,1,2,5,NA +70547,7,2,2,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,23204.787354,24686.898455,1,98,3,3,0.43,4,4,0,1,0,2,39,1,2,5,NA +70548,7,2,1,34,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,3,4,NA,2,2,2,1,2,2,2,2,2,2,54095.173154,53686.899782,1,92,7,7,1.48,5,5,0,1,0,1,42,1,5,1,4 +70549,7,2,2,4,NA,1,1,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12468.876716,13254.955592,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +70550,7,2,1,76,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,14073.595908,14398.283636,1,92,14,14,5,3,3,0,0,2,1,76,1,4,1,4 +70551,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13209.159597,13903.918018,2,95,3,3,0.52,3,3,1,0,0,1,37,1,4,1,4 +70552,7,2,1,3,NA,4,4,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9969.040341,10992.497123,2,97,4,4,0.84,3,3,1,0,1,2,68,1,4,2,NA +70553,7,1,1,2,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6347.215153,0,2,95,1,1,0.09,7,7,2,4,1,2,60,1,3,5,NA +70554,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,71034.153987,74518.988514,1,98,15,15,5,4,4,1,1,0,1,40,1,4,1,5 +70555,7,2,2,22,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,16239.242782,17706.77205,2,101,12,12,NA,4,4,0,0,0,1,57,NA,NA,1,NA +70556,7,2,1,2,NA,4,4,2,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5125.369941,5513.229844,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +70557,7,2,1,1,22,4,4,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5547.430651,5776.651218,1,96,8,8,1.61,6,6,3,0,0,1,33,2,5,1,4 +70558,7,2,1,14,NA,4,4,2,14,172,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,6,6,1.21,4,4,0,2,0,2,41,1,4,4,NA +70559,7,2,2,1,22,4,4,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8221.160724,8586.221973,1,100,1,1,0,4,4,1,2,0,2,35,1,2,5,NA +70560,7,1,1,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7843.21745,0,1,96,12,12,NA,5,5,2,0,1,2,63,2,5,3,NA +70561,7,2,1,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,18533.049642,19320.837782,1,99,14,14,4.21,4,4,0,2,0,2,44,1,5,1,5 +70562,7,2,1,52,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,1,2,2,1,20958.247774,21169.083688,2,103,3,1,0.36,2,1,0,0,1,1,52,1,2,6,NA +70563,7,2,1,0,6,5,7,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6395.296043,7073.813977,2,95,4,4,0.79,3,3,1,0,0,1,50,1,4,6,NA +70564,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,8796.577101,9772.20689,2,95,3,3,1.03,1,1,0,0,1,1,80,1,3,2,NA +70565,7,2,2,76,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,18693.365067,19341.691824,1,92,7,7,3.58,1,1,0,0,1,2,76,1,4,3,NA +70566,7,2,2,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,28033.589927,29297.386717,2,95,2,2,0.26,3,3,0,2,0,2,31,1,3,5,NA +70567,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,28280.669788,30348.532296,1,99,13,13,NA,2,2,0,0,2,1,80,1,2,1,3 +70568,7,2,1,67,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,8561.661692,8628.633702,2,99,99,99,NA,3,3,0,1,1,1,67,1,4,2,NA +70569,7,2,1,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22570.662508,23265.895325,1,95,12,12,NA,6,6,2,0,0,2,42,1,2,1,5 +70570,7,2,1,62,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,8621.533452,8958.738589,2,99,7,7,2.31,2,2,0,0,1,1,62,1,3,5,NA +70571,7,2,1,0,11,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5707.173345,6119.621796,1,90,2,2,0.22,5,5,1,1,2,1,44,2,4,5,NA +70572,7,2,2,2,NA,2,2,2,2,25,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10806.348349,11487.615985,2,91,99,99,NA,6,6,1,3,0,2,20,2,2,5,NA +70573,7,2,1,24,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,59473.789098,60284.462735,3,92,7,7,2.78,2,2,0,0,0,1,24,1,3,5,NA +70574,7,2,2,36,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,42468.064168,44382.588967,2,101,1,1,0.27,3,3,0,2,0,2,36,1,3,5,NA +70575,7,2,2,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,149804.257477,155051.140087,1,97,9,9,4.92,1,1,0,0,1,2,69,1,4,3,NA +70576,7,1,1,31,NA,5,6,NA,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19091.246741,0,1,91,9,9,2.97,3,3,1,0,0,1,31,2,5,1,5 +70577,7,2,2,80,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,4,77,NA,1,2,1,1,2,1,1,2,1,NA,14314.616082,14811.078253,2,92,77,77,NA,1,1,0,0,1,2,80,2,4,77,NA +70578,7,2,1,16,NA,4,4,2,16,194,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12721.673656,12746.825446,2,97,7,7,2.65,2,2,0,1,1,2,61,1,4,3,NA +70579,7,2,2,4,NA,3,3,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,85219.527381,94056.007225,1,97,15,15,5,4,4,1,1,0,2,33,1,5,1,3 +70580,7,2,1,58,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,19581.573846,19613.097963,1,90,6,6,2.12,2,2,0,0,0,2,55,1,3,1,3 +70581,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,128226.88751,129797.060324,1,95,7,7,2.86,2,2,0,0,1,1,59,1,2,1,2 +70582,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,4,6,2,2,2,2,2,2,2,2,2,2,2,35464.8385,35311.584148,2,96,5,5,0.89,4,4,1,1,0,2,36,2,4,6,NA +70583,7,2,1,14,NA,2,2,1,14,170,NA,NA,2,2,4,8,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,22721.243258,22896.459408,2,102,8,8,1.09,7,7,1,3,0,2,33,2,1,6,NA +70584,7,2,2,36,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20039.469886,21581.359058,1,97,15,15,5,4,4,2,0,0,1,40,2,5,1,5 +70585,7,2,1,5,NA,5,7,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6138.820061,6435.022409,1,99,14,14,3.94,4,4,1,1,0,1,43,1,4,1,5 +70586,7,2,2,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,24905.670199,25753.835465,2,101,10,10,2.91,4,4,0,1,0,2,51,1,2,5,NA +70587,7,2,2,50,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,2,5,NA,2,2,2,2,2,2,NA,NA,NA,NA,17054.056149,17142.991601,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +70588,7,2,1,0,8,4,4,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5836.706781,6455.960401,2,93,12,12,NA,4,4,1,1,0,2,27,2,4,1,4 +70589,7,2,2,10,NA,4,4,2,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7889.400564,8100.464206,2,99,99,99,NA,3,3,0,1,1,1,67,1,4,2,NA +70590,7,2,2,51,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,27551.607232,31605.843936,1,90,12,9,5,2,1,0,0,0,2,51,1,3,3,NA +70591,7,1,2,65,NA,2,2,NA,NA,NA,2,NA,2,1,8,NA,1,3,NA,2,2,2,2,2,2,NA,NA,NA,NA,9716.805546,0,2,90,4,4,1.65,1,1,0,0,1,2,65,2,1,3,NA +70592,7,2,1,2,NA,4,4,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7561.636249,7792.598574,2,98,2,2,0.31,4,4,2,1,0,2,27,1,2,4,NA +70593,7,2,1,80,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,7608.031426,7725.81565,1,99,5,5,1.84,1,1,0,0,1,1,80,1,3,2,NA +70594,7,2,2,3,NA,4,4,1,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11729.417673,12620.984256,2,96,7,7,1.49,5,5,2,1,0,1,51,1,5,1,3 +70595,7,2,2,60,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,13057.178942,13648.591881,1,102,77,77,NA,6,6,0,2,1,2,37,1,4,1,4 +70596,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,85420.170155,89610.762168,1,91,15,15,5,3,3,1,0,0,1,36,1,4,1,5 +70597,7,2,2,49,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,35126.205635,35814.074718,1,95,6,6,0.96,5,5,1,0,1,2,69,1,1,2,NA +70598,7,2,2,28,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,12426.473257,13266.565637,2,92,15,14,5,2,1,0,0,0,1,27,1,5,6,NA +70599,7,2,1,54,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,36134.528328,36424.033955,2,101,6,6,2.04,2,2,0,0,0,2,51,1,5,1,4 +70600,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,2,7,NA,1,2,NA,2,2,2,1,2,2,2,2,2,NA,18142.687884,20262.262283,2,93,5,5,1.07,3,3,0,0,1,2,44,2,1,1,1 +70601,7,2,1,0,2,1,1,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,9064.168162,9064.335231,3,92,3,3,0.48,4,4,2,0,0,1,21,2,1,1,2 +70602,7,2,2,10,NA,3,3,2,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60197.256541,63931.531988,2,91,15,15,5,4,4,0,2,0,1,53,1,5,1,4 +70603,7,2,1,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,127000.852889,130891.431194,2,92,15,15,5,2,1,0,0,0,1,57,1,5,6,NA +70604,7,2,1,39,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,13855.593765,14267.864487,2,92,15,15,5,3,3,1,0,0,1,39,2,5,1,5 +70605,7,2,1,56,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20020.224623,20868.683381,1,96,15,15,5,4,4,0,1,0,1,56,1,4,1,5 +70606,7,2,1,80,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,16325.758272,16610.353254,2,93,8,8,2.17,4,4,0,0,3,1,80,2,2,1,2 +70607,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19870.689174,19814.851418,1,96,15,15,5,4,4,0,2,0,1,46,1,5,1,5 +70608,7,1,2,68,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,54217.266426,0,1,101,4,4,0.99,2,2,0,0,2,1,77,1,3,1,3 +70609,7,2,2,1,23,1,1,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8832.868731,9513.039058,1,102,13,13,NA,7,7,3,1,2,2,62,2,1,1,2 +70610,7,2,2,1,21,1,1,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11414.885224,11453.86318,1,94,4,4,0.5,7,7,2,3,0,2,32,1,4,6,NA +70611,7,2,2,12,NA,3,3,2,12,150,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,101168.631125,108085.531312,1,99,6,6,1.52,4,4,0,2,0,2,43,1,3,5,NA +70612,7,2,2,5,NA,2,2,1,5,60,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13647.772496,14082.018801,2,93,7,7,1.99,3,3,1,1,0,2,38,1,3,4,NA +70613,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,1,1,NA,1,2,1,1,2,2,1,2,1,3,12649.084278,13204.362319,3,90,8,3,1.25,3,1,0,0,1,2,68,2,2,4,NA +70614,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,1,1,2,2,1,2,2,1,2,2,1,22225.098465,28674.927734,2,97,2,2,0.34,2,2,1,0,0,2,20,1,3,5,NA +70615,7,2,1,8,NA,1,1,2,8,106,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,10591.186197,11123.758959,1,90,6,6,1.11,5,5,1,2,0,1,30,2,1,6,NA +70616,7,2,1,17,NA,5,6,2,17,214,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8869.170018,9434.816848,1,90,99,99,NA,3,3,0,1,1,1,60,1,5,1,5 +70617,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,21857.756498,23340.233721,2,97,5,5,1.08,3,3,0,1,0,2,45,1,4,6,NA +70618,7,2,1,13,NA,1,1,1,13,161,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,22768.423624,23297.239555,2,98,5,5,1.07,4,4,0,1,0,1,53,2,1,1,1 +70619,7,2,2,4,NA,1,1,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,16462.187772,17163.602129,3,92,12,12,NA,6,6,1,3,0,2,33,1,5,1,4 +70620,7,2,1,9,NA,1,1,2,9,113,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12477.812875,12364.493687,2,94,14,14,4.03,4,4,0,2,0,2,33,2,2,1,NA +70621,7,2,1,10,NA,5,7,1,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9375.648038,9390.261055,1,102,6,6,2.11,2,2,0,1,0,2,32,1,4,99,NA +70622,7,2,1,50,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,32274.162059,31800.588482,1,102,14,14,4.59,3,3,0,0,1,2,46,1,4,1,1 +70623,7,2,1,54,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,33691.382998,1,101,5,5,1.24,3,3,0,0,1,2,61,1,4,1,3 +70624,7,2,1,42,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,44926.921381,45636.571752,2,96,10,10,3.78,3,3,0,1,0,1,42,1,3,1,3 +70625,7,2,2,0,7,1,1,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5289.715679,5503.176989,1,90,3,3,0.23,7,7,3,1,1,2,35,2,2,5,NA +70626,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,13076.210481,13450.719873,2,97,5,5,0.84,5,5,0,2,0,2,33,1,4,1,3 +70627,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,15497.844354,15606.405341,1,99,14,14,4.05,3,3,0,1,0,2,52,1,4,4,NA +70628,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,47566.45715,54102.989916,1,90,7,7,3.22,1,1,0,0,1,2,80,1,4,2,NA +70629,7,2,2,28,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,16131.725974,16820.579069,1,99,14,7,3.4,2,1,0,0,0,2,28,2,5,1,NA +70630,7,2,1,11,NA,5,7,2,11,142,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,28060.491868,29807.930767,1,91,4,4,0.76,4,4,0,2,0,2,44,1,4,6,NA +70631,7,1,1,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,46965.818538,0,1,101,10,10,4.3,2,2,0,0,2,1,80,1,2,1,4 +70632,7,2,2,0,0,3,3,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22123.758463,21522.828051,1,95,7,7,1.57,4,4,1,1,0,1,37,1,3,1,5 +70633,7,2,1,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,123771.419917,127885.04228,2,98,15,15,5,3,3,0,1,0,1,56,1,5,1,5 +70634,7,2,2,9,NA,1,1,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16664.698857,2,98,7,7,1.33,6,6,0,3,0,1,31,1,3,6,NA +70635,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,129999.035519,131590.908764,1,98,12,12,NA,2,2,0,0,2,1,70,1,2,1,3 +70636,7,2,1,12,NA,3,3,2,12,147,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,93665.036597,95017.313859,1,91,10,10,2.77,5,5,0,3,0,1,43,1,5,1,5 +70637,7,2,1,8,NA,4,4,2,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8483.005475,8584.70346,1,96,7,7,1.52,4,4,0,2,0,2,30,2,4,1,5 +70638,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,32720.69734,34178.98356,1,95,5,5,1.08,3,3,0,1,0,1,53,1,4,1,4 +70639,7,2,2,34,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,2,2,2,2,1,2,2,1,2,2,2,40536.844796,42064.124353,3,91,7,7,1.42,6,6,1,3,0,1,37,2,1,1,1 +70640,7,2,1,6,NA,5,7,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11522.32071,1,97,15,15,4.77,4,4,1,1,0,1,41,2,4,1,5 +70641,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,7233.371983,2,95,2,2,0.75,1,1,0,0,1,1,63,1,1,5,NA +70642,7,2,1,12,NA,3,3,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30943.024697,30709.935341,1,95,6,6,0.81,6,6,2,2,0,1,30,1,3,1,4 +70643,7,2,1,7,NA,3,3,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39769.597728,42234.385729,2,92,15,15,5,5,5,0,3,0,2,46,1,5,1,5 +70644,7,2,1,41,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,130826.463813,1,101,9,9,2.6,4,4,0,2,0,2,38,1,4,1,4 +70645,7,2,1,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11543.27965,11681.665542,1,98,1,1,0.03,3,3,0,2,0,2,38,1,4,5,NA +70646,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,54095.581484,61529.339683,2,94,14,14,5,1,1,0,0,1,2,80,1,4,2,NA +70647,7,2,2,38,NA,5,7,1,NA,NA,1,2,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,58826.425292,59007.297053,1,102,8,8,1.91,5,5,1,2,0,2,38,1,5,1,4 +70648,7,2,1,9,NA,1,1,1,9,113,NA,NA,1,1,NA,2,NA,NA,NA,2,NA,2,1,2,2,1,2,2,1,13395.612951,13714.015605,2,102,4,4,0.61,5,5,0,3,0,1,34,2,3,1,3 +70649,7,2,1,63,NA,2,2,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,9745.303498,9901.410815,2,98,15,15,4.56,4,4,0,0,3,1,80,1,1,1,NA +70650,7,2,1,2,NA,3,3,2,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,43818.485,49437.664471,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +70651,7,2,2,3,NA,5,7,1,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10292.958129,10862.428258,3,91,10,10,2.48,5,5,2,1,0,2,27,1,2,1,4 +70652,7,2,2,16,NA,3,3,2,16,199,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,31716.869763,32155.152073,1,95,NA,NA,NA,2,2,0,1,0,2,51,NA,NA,3,NA +70653,7,2,1,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,137286.989143,140204.788291,3,91,14,14,5,1,1,0,0,0,1,43,1,5,5,NA +70654,7,2,2,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,52280.406546,52747.829022,1,95,6,4,1.47,2,1,0,0,0,2,28,1,2,6,NA +70655,7,2,2,17,NA,3,3,2,17,206,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,103298.858809,106172.653059,1,95,9,9,2.66,4,4,0,2,0,1,45,1,3,1,3 +70656,7,2,2,2,NA,1,1,1,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12260.86913,13033.834526,3,92,8,8,1.85,5,5,1,0,2,1,66,2,1,1,1 +70657,7,2,1,0,8,3,3,2,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,22595.741117,22205.109866,1,93,15,15,5,3,2,1,0,0,2,35,1,5,6,NA +70658,7,2,1,16,NA,1,1,1,16,200,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,27186.265479,27776.842846,1,92,14,9,3.77,3,2,0,1,0,2,39,2,4,6,NA +70659,7,2,2,0,5,1,1,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,6787.112205,7238.162123,2,94,99,99,NA,3,3,1,0,0,2,18,2,2,NA,NA +70660,7,2,2,19,NA,1,1,1,19,230,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12996.753859,13369.730018,2,103,10,10,1.63,7,7,1,4,0,1,31,NA,NA,1,4 +70661,7,2,2,65,NA,2,2,1,NA,NA,2,NA,2,1,2,NA,4,1,NA,2,2,2,1,2,2,2,2,2,2,15876.871857,16539.500436,2,102,15,15,5,3,3,0,0,2,1,36,2,5,5,NA +70662,7,2,1,11,NA,3,3,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,42986.51011,47590.55439,2,94,7,7,1.17,6,6,0,3,0,1,40,1,3,1,5 +70663,7,2,2,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,3,3,1,2,2,1,2,2,1,2,2,1,23740.353448,26106.078779,2,99,6,6,2.6,1,1,0,0,0,2,29,1,5,3,NA +70664,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,39561.827371,40611.330327,1,92,4,4,1.16,2,2,0,0,1,1,56,1,2,1,3 +70665,7,2,2,13,NA,4,4,2,13,164,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14241.099758,14200.972378,1,96,15,15,5,3,3,0,1,0,2,37,1,4,1,4 +70666,7,2,2,3,NA,1,1,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16462.187772,17500.018071,3,92,3,3,0.52,5,5,2,1,0,2,29,2,1,1,3 +70667,7,2,1,5,NA,3,3,1,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,73403.03993,82816.073154,1,92,8,8,1.45,6,6,1,3,0,1,36,1,3,1,4 +70668,7,2,2,41,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,1,1,2,2,2,2,2,2,2,NA,NA,NA,NA,37512.060155,37707.682357,1,92,6,6,0.93,5,5,0,2,0,1,47,2,1,1,1 +70669,7,2,2,3,NA,1,1,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13366.393396,14756.857003,2,94,8,8,2.33,4,4,2,0,0,1,24,1,2,6,NA +70670,7,2,2,56,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,20130.149569,20235.126587,1,90,10,10,2.44,5,5,1,0,0,2,56,2,1,1,1 +70671,7,2,2,5,NA,4,4,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10683.855206,11939.151167,1,96,15,15,5,4,4,1,1,0,1,50,1,3,1,4 +70672,7,2,2,1,19,2,2,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9534.013652,9566.569071,2,97,12,6,0.89,7,7,3,0,0,2,26,2,1,6,NA +70673,7,2,2,14,NA,5,7,2,14,173,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13124.737024,13189.842246,2,97,5,5,1.19,3,3,0,1,0,2,41,1,3,1,2 +70674,7,2,1,67,NA,3,3,2,NA,NA,2,NA,2,2,6,NA,5,2,NA,1,2,2,1,2,1,1,2,2,NA,21313.15842,21908.589414,2,90,2,2,0.87,1,1,0,0,1,1,67,2,5,2,NA +70675,7,2,1,65,NA,5,6,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12579.986433,13271.133625,1,92,14,14,5,2,2,0,0,2,2,62,1,4,1,4 +70676,7,2,2,75,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,44856.466004,46390.551109,2,94,10,10,4.69,2,2,0,0,1,2,59,1,3,3,NA +70677,7,2,1,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,11977.649578,12533.694613,2,92,15,14,5,3,1,0,0,0,1,29,1,5,5,NA +70678,7,2,1,21,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,37235.048974,39044.599947,2,93,6,6,1.48,4,4,0,1,0,1,53,2,2,1,3 +70679,7,2,1,4,NA,3,3,2,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,97310.423154,111231.170223,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +70680,7,2,2,2,NA,4,4,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,6543.852411,7133.732612,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +70681,7,2,1,61,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,125558.167126,127168.668278,3,91,15,15,5,2,2,0,0,2,2,62,1,5,1,5 +70682,7,2,2,22,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,24654.107413,23441.410215,1,100,10,10,2.59,5,5,0,1,0,2,40,1,5,1,NA +70683,7,2,2,0,1,1,1,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9767.083234,9561.595244,3,92,8,8,2.51,3,3,1,0,0,2,25,1,4,5,NA +70684,7,2,1,58,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,13189.987508,14124.702096,1,90,77,77,NA,4,4,0,2,0,2,51,1,5,1,5 +70685,7,2,2,5,NA,2,2,2,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13474.744062,14324.236113,1,93,5,5,0.84,5,5,1,2,0,2,52,2,1,3,NA +70686,7,2,2,48,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,29010.447112,28477.291441,1,100,15,15,5,2,2,0,0,1,2,48,1,5,5,NA +70687,7,2,1,59,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,169076.731628,169683.640829,1,98,14,14,5,1,1,0,0,0,1,59,1,5,2,NA +70688,7,2,2,13,NA,4,4,1,13,163,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16598.888685,16325.283055,2,102,4,4,0.53,6,6,2,2,0,2,27,1,2,1,2 +70689,7,2,1,56,NA,5,6,2,NA,NA,2,NA,2,2,99,NA,5,5,NA,1,2,1,1,2,1,1,2,1,3,11690.444016,11682.423918,3,90,77,77,NA,4,4,0,0,2,1,69,2,5,2,NA +70690,7,2,2,13,NA,5,6,1,13,160,NA,NA,2,1,3,6,NA,NA,NA,1,1,2,1,2,1,1,2,2,NA,8878.081187,9740.503961,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +70691,7,2,2,14,NA,4,4,1,14,172,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15114.677795,15072.08892,2,102,6,6,1.22,5,5,0,2,0,2,42,1,4,1,4 +70692,7,2,1,3,NA,4,4,2,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,10259.663981,2,97,4,4,0.81,4,4,1,0,0,2,51,1,2,4,NA +70693,7,2,1,5,NA,3,3,2,5,71,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,31190.854587,36547.404966,1,95,3,3,0.65,3,3,1,0,0,1,58,1,3,3,NA +70694,7,2,1,8,NA,5,6,2,8,106,NA,NA,2,2,2,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,7923.925927,8546.646915,1,91,10,10,3.22,4,4,1,1,0,1,38,2,5,1,5 +70695,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,4,2,2,1,2,2,1,2,2,NA,NA,NA,NA,20039.469886,21176.851739,1,97,8,8,2.51,3,3,0,2,0,2,39,2,4,2,NA +70696,7,2,2,47,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,3,1,NA,2,2,2,2,2,2,2,2,1,2,29105.053716,31982.273564,2,93,4,4,0.82,4,4,0,0,0,1,51,2,3,1,3 +70697,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,82917.179795,86800.065133,2,95,7,7,2.91,2,2,1,0,0,1,32,1,5,2,NA +70698,7,2,1,1,16,5,6,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8674.760516,9729.693026,3,91,10,10,3.67,3,3,1,0,0,2,30,2,4,1,4 +70699,7,2,1,0,7,2,2,1,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4724.065742,4677.378988,2,93,77,77,NA,7,7,3,0,1,2,40,2,4,1,NA +70700,7,2,1,0,2,2,2,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4854.394074,4994.155976,2,93,3,3,0.37,5,5,3,0,0,1,28,2,1,6,NA +70701,7,2,1,24,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14782.636003,15547.771991,3,91,10,9,5,2,1,0,0,0,1,24,1,4,5,NA +70702,7,2,1,26,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27681.749998,28652.049948,2,98,8,8,1.48,7,7,3,0,0,1,26,1,3,1,3 +70703,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,166234.629208,1,95,8,8,3.47,2,2,0,0,0,1,58,1,2,1,4 +70704,7,2,2,35,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,36453.846815,42702.950408,1,102,14,14,2.83,6,6,1,2,0,1,36,1,2,1,3 +70705,7,2,2,0,3,5,7,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5820.770257,5884.32621,1,95,1,1,0.13,3,3,1,0,0,1,31,1,4,1,4 +70706,7,2,2,48,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,1,1,NA,2,2,2,1,2,2,1,2,2,2,34639.996543,34820.641178,1,102,77,77,NA,3,3,0,0,1,1,61,2,4,1,1 +70707,7,2,2,10,NA,5,7,2,11,132,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8746.306586,9472.024073,1,91,3,3,0.66,4,4,1,2,0,2,33,1,3,5,NA +70708,7,2,1,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,173139.914798,178954.334223,1,101,7,7,2.64,2,2,0,0,0,1,57,1,2,1,2 +70709,7,2,1,9,NA,4,4,2,9,111,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8988.052978,9133.633722,2,95,8,8,1.85,5,5,1,2,0,1,55,1,2,1,3 +70710,7,2,2,57,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,29087.427528,30575.794656,1,101,3,3,1.07,3,1,0,1,0,2,57,1,4,3,NA +70711,7,2,2,12,NA,5,7,2,12,151,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,47404.963472,48778.930863,1,97,8,8,2.51,3,3,0,1,0,1,35,1,3,1,4 +70712,7,2,1,2,NA,5,6,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10123.286306,10611.741928,1,100,10,10,3.04,4,4,2,0,0,1,30,2,5,1,5 +70713,7,2,2,30,NA,5,6,2,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,15109.988743,16272.590756,1,90,6,6,0.92,6,6,2,0,2,2,30,2,5,1,5 +70714,7,2,2,1,21,5,6,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4576.510691,4795.397917,1,102,15,15,3.82,5,5,1,1,0,1,29,1,4,1,4 +70715,7,2,2,79,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,53541.401974,54113.194007,1,99,14,14,5,2,2,0,0,2,2,79,1,3,1,5 +70716,7,2,2,43,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,99538.625493,103163.851943,1,103,15,15,5,3,3,0,1,0,1,46,1,5,1,5 +70717,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,24480.331443,26311.37682,2,101,6,6,2.04,2,2,0,0,2,1,77,1,1,1,2 +70718,7,2,1,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,13555.672819,14397.395601,1,94,4,4,1.43,1,1,0,0,1,1,75,1,4,3,NA +70719,7,1,1,12,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,58479.782556,0,1,99,77,77,NA,4,4,0,2,0,2,45,1,3,1,NA +70720,7,2,2,7,NA,5,6,2,7,86,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8371.948513,8981.698617,1,90,15,15,5,3,3,0,1,0,2,34,2,5,1,5 +70721,7,2,2,79,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,2,2,2,2,2,1,NA,18241.877822,19614.829564,2,93,9,9,3.64,2,2,0,0,2,2,79,2,2,1,4 +70722,7,2,2,5,NA,4,4,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10936.097083,11421.715282,2,95,1,1,0.18,4,4,2,1,0,2,38,1,2,5,NA +70723,7,2,1,32,NA,3,3,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,86204.990126,88673.945369,2,103,14,14,5,2,2,0,0,0,1,32,2,5,1,NA +70724,7,2,1,5,NA,2,2,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,15527.966893,15272.133376,1,90,9,9,2.6,4,4,1,1,0,1,41,1,5,1,4 +70725,7,2,2,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11173.849134,11672.749546,2,93,10,10,3.93,3,3,0,0,2,1,54,1,5,1,5 +70726,7,2,1,5,NA,4,4,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9310.029529,9330.284312,1,97,4,4,0.46,7,7,3,3,0,2,31,1,3,1,NA +70727,7,2,2,44,NA,4,4,2,NA,NA,2,NA,2,1,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,18488.34481,18123.036332,2,99,15,15,4.34,4,4,0,0,0,1,59,2,4,1,5 +70728,7,2,2,42,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,2,1,2,2,1,2,2,NA,NA,NA,NA,24056.374863,24201.045855,2,99,1,1,0,1,1,0,0,0,2,42,1,3,5,NA +70729,7,2,1,80,NA,5,7,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,26344.362464,28384.957988,2,95,7,7,2.55,2,2,0,0,2,1,80,1,4,1,2 +70730,7,2,1,55,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,1,1,2,1,1,2,2,2,33162.406014,36437.864606,2,98,7,7,2.25,3,3,0,1,0,2,51,2,1,1,1 +70731,7,2,1,6,NA,5,6,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8580.826574,9087.233306,1,92,14,14,2.42,6,6,1,3,0,1,30,1,4,6,NA +70732,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,157061.455656,156201.940202,1,90,7,7,1.89,3,3,0,0,1,2,75,1,4,3,NA +70733,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,10634.832821,11430.282078,2,95,3,3,0.92,1,1,0,0,1,2,80,1,1,2,NA +70734,7,2,1,7,NA,3,3,1,7,92,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50961.223155,56419.394274,1,94,15,15,5,6,6,0,4,0,1,38,1,5,1,4 +70735,7,2,2,80,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,10072.885959,10826.303506,2,100,3,3,1.1,1,1,0,0,1,2,80,1,2,2,NA +70736,7,2,2,32,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,31816.953817,32705.969127,1,91,15,15,5,3,3,0,0,1,1,63,2,5,1,5 +70737,7,2,1,28,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,4,5,NA,2,2,2,2,2,2,2,2,1,2,38474.772527,40200.135096,2,93,NA,1,0.22,4,1,0,0,0,1,28,NA,NA,4,NA +70738,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,1,1,2,1,2,1,1,2,2,1,2,1,NA,18229.985416,18267.209527,1,93,7,7,1.64,5,5,0,2,0,1,47,2,5,1,1 +70739,7,2,1,63,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,22641.791224,22854.140555,1,101,5,5,0.71,6,6,1,1,1,1,63,1,2,1,5 +70740,7,2,2,7,NA,4,4,2,7,91,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9795.701448,10340.670956,1,96,13,13,NA,5,5,1,1,0,1,42,1,3,5,NA +70741,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,18723.98095,18120.118724,2,95,7,7,1.74,4,4,0,2,0,2,47,1,5,4,NA +70742,7,2,1,10,NA,2,2,2,10,124,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11316.846999,12445.832216,3,91,13,4,0.81,4,3,0,2,0,1,57,NA,NA,1,NA +70743,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,105376.658808,1,98,5,5,1.39,2,2,0,1,0,1,46,1,4,3,NA +70744,7,1,2,65,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,10135.841003,0,2,99,2,2,0.67,1,1,0,0,1,2,65,1,2,5,NA +70745,7,2,1,51,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,17206.320427,18234.571296,2,100,4,4,0.91,3,3,0,0,0,2,49,1,2,1,2 +70746,7,2,1,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,16589.308426,20972.932517,2,90,8,NA,NA,2,1,0,0,0,1,51,1,2,5,NA +70747,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,14359.447628,16592.595881,1,97,3,3,1.16,1,1,0,0,1,1,80,1,3,2,NA +70748,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,31335.13799,31552.004994,1,95,7,7,1.66,5,5,0,3,0,1,34,1,2,1,4 +70749,7,2,1,2,NA,2,2,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8571.222647,8842.539637,2,93,14,14,3.52,5,5,1,2,0,1,44,1,5,1,5 +70750,7,2,2,26,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16844.740449,17564.040518,3,91,1,1,0.11,1,1,0,0,0,2,26,1,5,5,NA +70751,7,2,1,27,NA,1,1,1,NA,NA,2,NA,2,7,3,NA,3,4,NA,2,2,2,2,2,2,1,2,2,2,35210.641637,36376.282426,1,100,8,3,0.9,6,1,1,0,0,1,33,2,3,6,NA +70752,7,1,1,40,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,18872.772727,0,1,91,6,6,1.13,6,6,1,3,0,1,40,1,4,6,NA +70753,7,2,1,30,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,1,2,2,2,2,2,2,37657.076964,37372.8671,1,90,6,6,1.11,5,5,1,2,0,1,30,2,1,6,NA +70754,7,2,2,15,NA,3,3,1,15,184,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,77001.138762,80653.195108,1,98,9,9,2.88,6,3,1,3,0,1,51,1,2,1,3 +70755,7,2,1,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,141736.66089,144209.560558,1,92,10,10,3.4,3,3,0,0,0,1,56,1,4,1,5 +70756,7,2,1,78,NA,3,3,2,NA,NA,2,NA,2,2,3,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,12786.51051,14057.405205,1,93,2,2,0.41,2,2,0,0,2,2,68,2,1,1,1 +70757,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,74874.432638,77018.874888,2,99,15,15,5,2,2,0,0,0,2,35,2,5,1,5 +70758,7,2,1,21,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,41120.308343,45563.612914,1,93,5,5,1.36,2,2,0,0,0,2,41,2,1,4,NA +70759,7,2,1,41,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,1,4,NA,2,2,2,1,2,2,2,2,2,2,41410.39303,40802.759347,1,101,12,7,3.58,3,1,0,0,0,1,41,2,1,4,NA +70760,7,2,1,7,NA,5,6,2,7,87,NA,NA,2,1,2,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6681.315407,7240.00549,3,91,15,15,4.33,7,6,1,3,0,2,40,1,5,1,5 +70761,7,2,1,46,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,4,1,NA,2,2,2,1,2,2,2,2,1,2,33629.261806,33135.804229,2,103,12,8,4.48,2,1,0,0,0,1,46,2,4,1,NA +70762,7,2,2,34,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,23408.914544,24510.72255,2,90,7,7,1.61,4,4,1,1,0,2,34,1,5,1,5 +70763,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,54095.581484,61529.339683,2,91,6,6,1.88,2,2,0,0,1,2,80,1,5,2,NA +70764,7,1,2,2,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,34597.213785,0,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +70765,7,2,2,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,44238.530111,44780.242841,1,95,6,6,2.04,2,2,0,0,2,2,67,1,1,2,NA +70766,7,2,2,45,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16354.688935,16518.054061,2,90,9,9,3.02,3,3,0,0,2,2,70,1,4,1,2 +70767,7,2,2,18,NA,1,1,2,19,228,2,NA,2,2,4,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19850.979841,20551.555585,1,97,3,3,0.5,5,5,0,2,0,1,56,2,2,6,NA +70768,7,2,2,9,NA,3,3,2,9,113,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,73410.202745,74807.098361,2,91,15,15,5,5,5,2,1,0,2,40,1,5,1,5 +70769,7,2,2,21,NA,1,1,1,NA,NA,2,NA,2,2,6,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,40653.73216,40476.667284,1,102,5,5,0.86,5,5,2,0,0,2,21,2,2,5,NA +70770,7,2,1,7,NA,1,1,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18107.947773,18211.90239,1,97,10,10,2.32,6,6,0,4,0,1,42,1,4,1,4 +70771,7,2,1,17,NA,5,6,2,17,213,2,NA,2,1,5,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8434.080857,8971.979116,1,91,77,77,NA,4,4,0,2,0,1,50,2,5,1,5 +70772,7,2,1,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,50383.817476,53512.338469,1,94,15,15,5,2,2,0,0,1,2,56,1,3,1,4 +70773,7,2,2,33,NA,2,2,1,NA,NA,2,NA,2,1,5,NA,5,1,1,1,2,2,1,2,2,1,2,2,1,38161.026403,38068.87516,1,100,10,10,2.91,4,4,1,1,0,1,32,1,5,1,5 +70774,7,2,2,49,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18811.641937,19081.796284,2,90,3,3,0.95,2,2,0,1,0,2,49,1,3,5,NA +70775,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,4,NA,5,1,NA,1,2,2,1,2,2,1,2,2,2,7807.558918,8078.476616,3,90,77,77,NA,2,2,0,0,1,1,60,2,5,1,5 +70776,7,2,1,60,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,1,1,2,1,1,2,1,NA,13133.86792,13808.275718,2,102,15,15,3.82,5,5,0,1,2,1,60,2,2,1,1 +70777,7,2,2,0,10,5,7,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8582.213422,8500.433306,2,94,77,77,NA,4,4,2,0,0,2,23,1,2,6,NA +70778,7,2,2,3,NA,3,3,2,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,54402.653374,57814.771756,1,98,15,15,3.7,5,5,2,1,0,1,34,1,5,1,5 +70779,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,32785.873783,35446.092694,1,94,6,6,1.82,2,2,0,0,2,1,80,1,4,1,3 +70780,7,2,2,11,NA,3,3,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49777.284509,49627.739683,1,98,15,15,5,5,5,0,3,0,2,44,1,5,1,5 +70781,7,2,1,19,NA,1,1,1,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20638.769105,20614.097145,2,92,15,15,3.37,7,7,0,4,0,1,42,2,3,1,1 +70782,7,2,1,64,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,138075.879417,141933.339512,2,94,15,15,5,2,2,0,0,2,1,64,1,5,1,5 +70783,7,2,2,37,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,13027.332011,13925.626381,2,103,15,15,5,3,3,0,1,0,2,37,2,5,1,5 +70784,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,196995.351093,203724.329642,1,91,15,15,5,2,2,0,0,0,1,53,1,5,1,5 +70785,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,20434.221508,19874.985431,1,102,1,1,0,5,5,0,3,0,2,41,1,4,1,4 +70786,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,153565.050575,157855.235487,1,97,15,15,5,4,4,0,0,1,1,60,1,5,1,5 +70787,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,164066.603708,163511.57474,1,95,7,7,2.86,2,2,0,0,1,1,58,1,4,1,3 +70788,7,2,1,34,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11793.151047,11949.568707,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +70789,7,2,1,5,NA,3,3,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,27873.065855,31447.442273,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +70790,7,2,1,49,NA,3,3,2,NA,NA,2,NA,2,2,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,120278.381994,2,91,15,15,5,4,4,0,2,0,2,48,1,5,1,5 +70791,7,2,2,45,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20303.639991,21936.687597,1,97,15,15,5,3,3,0,1,0,2,45,2,5,1,5 +70792,7,2,1,30,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,6,NA,2,2,2,2,2,2,NA,NA,NA,NA,27605.196104,27396.850962,2,99,12,3,0.52,5,3,0,1,0,1,30,2,2,4,NA +70793,7,2,1,66,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,100988.137931,101524.74706,1,99,9,9,4.35,2,2,0,0,1,1,66,1,2,1,3 +70794,7,2,2,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,9518.80186,10328.183799,2,100,3,3,0.68,2,2,0,0,2,1,66,1,2,1,2 +70795,7,2,1,12,NA,4,4,1,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11429.628358,11541.555232,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +70796,7,2,2,10,NA,5,6,1,10,125,NA,NA,2,2,2,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8281.624869,8692.694009,2,102,9,9,2.68,4,4,1,1,0,2,38,2,5,1,2 +70797,7,2,2,33,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,16614.865368,17760.536638,3,91,15,15,5,4,4,2,0,0,2,33,2,5,1,5 +70798,7,2,2,53,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,15693.813435,15736.327271,2,100,5,5,0.95,4,4,0,0,1,2,53,1,3,5,NA +70799,7,2,2,4,NA,5,7,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7143.995395,7774.277146,3,91,15,15,4.47,4,4,2,0,0,1,33,1,5,1,5 +70800,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,NA,NA,NA,1,2,2,1,23484.626749,23642.328802,2,96,NA,NA,NA,3,3,0,0,0,2,50,NA,NA,1,NA +70801,7,2,2,28,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,103632.167909,110131.87866,2,99,14,14,5,2,2,0,0,0,2,28,1,5,1,5 +70802,7,2,2,5,NA,3,3,1,5,67,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21760.206232,23124.999952,1,98,2,2,0.36,5,5,3,0,0,1,25,1,3,1,3 +70803,7,2,1,7,NA,3,3,1,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15279.821652,15716.743409,1,102,5,1,0.21,5,4,1,1,0,2,24,1,4,5,NA +70804,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12037.168211,11707.739526,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +70805,7,2,2,55,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12649.084278,13109.186175,3,90,77,77,NA,4,4,0,0,0,1,59,2,2,1,2 +70806,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,126334.218747,127212.680922,1,95,9,9,3.24,3,3,0,0,0,2,42,1,4,3,NA +70807,7,2,2,22,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,46606.430863,46728.795934,2,102,14,14,3.25,5,5,2,0,0,1,27,1,5,1,5 +70808,7,2,1,77,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,7225.866295,7367.404674,1,96,15,15,5,4,4,0,0,2,1,77,1,5,1,3 +70809,7,2,1,0,1,5,7,1,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9289.230808,9431.807424,2,102,6,6,1.65,3,3,1,0,0,2,21,1,4,1,5 +70810,7,2,2,3,NA,5,6,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,4735.146545,5152.906676,3,90,5,5,0.93,4,4,1,0,0,1,48,2,4,1,NA +70811,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,2,1,2,2,NA,NA,NA,NA,14138.631841,14167.501749,3,92,8,8,0.91,7,7,3,3,1,1,61,NA,NA,1,4 +70812,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25645.251384,25046.202404,1,92,14,14,4.96,2,2,0,0,0,1,25,1,4,5,NA +70813,7,2,2,7,NA,2,2,1,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15992.05837,16407.130123,2,93,7,7,1.99,3,3,1,1,0,2,38,1,3,4,NA +70814,7,2,2,7,NA,3,3,1,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,48532.852397,48387.04619,1,98,14,14,4.12,4,4,0,2,0,2,36,1,5,1,3 +70815,7,1,2,9,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6758.20346,0,2,103,1,1,0.04,2,2,0,1,0,2,28,1,4,5,NA +70816,7,2,2,30,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,26465.930618,26276.815338,2,100,5,5,0.88,5,5,2,1,0,2,30,1,4,6,NA +70817,7,2,2,21,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,32537.532358,33640.063825,2,90,8,8,2.01,4,4,0,0,1,2,67,2,4,2,NA +70818,7,2,1,0,1,2,2,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4997.17037,5277.406032,2,93,15,15,4.84,6,6,1,0,0,1,50,1,4,1,2 +70819,7,2,2,0,2,5,6,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9150.459338,9253.718962,1,97,15,15,4.34,4,4,2,0,0,1,35,2,5,1,5 +70820,7,2,2,13,NA,2,2,2,13,160,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20099.773776,21058.707597,1,90,15,15,5,3,3,0,1,0,1,55,2,3,1,5 +70821,7,2,1,63,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,112072.982256,113124.075015,2,98,14,14,5,2,2,0,0,1,1,63,1,4,1,4 +70822,7,2,2,0,3,4,4,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3484.44779,3522.493854,2,99,1,1,0.03,3,3,1,0,0,2,19,1,3,NA,NA +70823,7,2,1,9,NA,4,4,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10103.729975,10224.857915,1,96,15,15,5,4,4,0,2,0,2,39,1,4,6,NA +70824,7,2,1,10,NA,1,1,1,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8828.580268,8822.70874,1,103,7,7,0.51,7,7,3,4,0,1,54,2,1,1,1 +70825,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,129971.22201,129637.352703,1,93,15,15,5,1,1,0,0,0,1,47,1,5,3,NA +70826,7,2,1,60,NA,1,1,1,NA,NA,2,NA,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14488.953694,14771.336069,3,92,8,8,2.97,2,2,0,0,2,2,62,1,4,1,4 +70827,7,2,1,7,NA,3,3,2,8,96,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,23729.905536,29042.69522,1,101,3,3,0.61,4,4,1,2,0,1,38,1,2,4,NA +70828,7,2,1,26,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,94547.245282,96016.627954,2,94,77,77,NA,2,2,0,0,0,2,23,1,3,6,NA +70829,7,2,2,13,NA,4,4,1,13,159,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18163.985724,21329.621847,2,101,9,9,2.46,4,4,0,2,0,1,42,1,3,1,3 +70830,7,2,2,0,10,4,4,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4484.450821,4755.264461,1,91,6,6,0.99,5,5,3,0,0,2,33,2,3,1,4 +70831,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,2,1,2,1,1,2,1,1,2,2,1,19005.010125,19718.036027,1,92,12,12,NA,4,4,1,1,0,1,33,2,4,1,4 +70832,7,2,2,31,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,3,1,2,2,1,2,2,1,2,2,1,53830.599426,56471.452044,1,99,5,5,0.89,4,4,2,0,0,2,31,1,4,1,5 +70833,7,2,2,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,36053.766709,36629.803511,1,100,5,5,1.05,3,3,1,0,0,2,35,1,4,6,NA +70834,7,2,1,9,NA,3,3,2,9,115,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,53956.99815,55499.881764,1,93,15,15,5,4,4,0,2,0,2,42,1,5,1,NA +70835,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,20439.261207,20630.95379,2,95,4,2,0.81,2,1,0,0,1,1,62,1,5,3,NA +70836,7,2,1,6,NA,1,1,1,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19735.224235,20204.314213,2,102,6,6,1.35,3,3,0,1,0,1,37,2,1,1,3 +70837,7,2,1,60,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,1,NA,2,2,2,1,2,2,2,2,2,2,8489.547987,8893.33507,2,96,5,5,0.89,5,4,0,0,1,1,22,2,3,6,NA +70838,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,6,6,1.67,3,3,0,0,0,2,22,1,4,5,NA +70839,7,2,2,13,NA,3,3,2,13,167,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,132630.209478,133894.993306,1,97,8,8,2.72,3,3,0,2,0,2,43,1,1,3,NA +70840,7,2,2,10,NA,4,4,1,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12474.59761,12808.328162,1,100,3,3,0.43,4,4,0,2,0,1,35,1,4,1,3 +70841,7,2,1,11,NA,3,3,2,11,142,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21147.476454,21752.181979,1,95,1,1,0.12,3,3,0,2,0,2,40,1,5,3,NA +70842,7,2,1,32,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,16945.481829,17170.237079,1,99,77,77,NA,1,1,0,0,0,1,32,2,5,5,NA +70843,7,2,2,0,11,3,3,2,NA,13,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8383.207272,8554.601009,1,91,12,1,0.07,6,1,1,1,0,2,29,1,4,6,NA +70844,7,2,1,19,NA,4,4,2,19,235,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10817.360862,11313.215634,2,99,99,99,NA,5,5,0,2,0,2,20,1,3,6,NA +70845,7,2,2,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,1,1,2,2,1,2,2,1,2,2,1,20000.263815,19016.481945,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +70846,7,2,1,9,NA,2,2,2,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,11807.210833,12400.930816,1,90,7,7,2.1,3,3,0,2,0,2,37,1,3,5,NA +70847,7,2,2,19,NA,4,4,2,19,232,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11711.384457,11743.959438,2,95,3,3,0.43,4,4,2,0,0,2,23,1,2,5,NA +70848,7,2,1,80,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,6994.319065,7352.726651,2,99,3,3,0.9,1,1,0,0,1,1,80,1,3,2,NA +70849,7,2,2,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,37102.230755,38432.724809,2,101,5,2,0.73,2,1,0,0,1,2,49,1,3,6,NA +70850,7,2,2,28,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,17858.942687,20013.475913,1,97,14,14,4.5,3,3,1,0,0,1,30,1,5,1,5 +70851,7,2,1,36,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,73127.351507,77018.309866,1,103,9,9,3.64,2,2,0,0,0,1,36,1,5,1,5 +70852,7,2,1,14,NA,4,4,1,14,179,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10879.348751,11378.044973,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +70853,7,2,2,19,NA,4,4,1,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12531.903464,12935.738352,2,100,5,5,1.07,4,4,0,1,0,2,36,1,3,5,NA +70854,7,1,2,53,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,16033.091438,0,1,96,8,8,2.62,3,3,0,0,0,2,53,1,4,4,NA +70855,7,2,1,9,NA,1,1,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14820.807433,15173.085782,2,102,7,7,1.53,5,5,1,2,0,1,36,1,2,1,3 +70856,7,2,1,1,16,4,4,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,11283.202594,2,97,1,1,0.13,4,4,2,0,1,2,62,1,2,4,NA +70857,7,2,1,9,NA,3,3,1,9,119,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,26240.82746,27691.552263,1,94,4,4,0.56,5,5,1,2,0,1,34,1,2,3,NA +70858,7,2,2,9,NA,3,3,2,10,120,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,58907.362493,59749.51689,1,91,10,10,2.77,5,5,0,3,0,1,43,1,5,1,5 +70859,7,2,2,0,6,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4581.358327,4715.327587,2,100,6,6,1.34,4,4,1,2,0,2,31,1,4,5,NA +70860,7,2,2,44,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,2,1,2,1,2,2,1,2,2,NA,NA,NA,NA,19075.861607,19725.492117,1,96,7,7,1.69,4,4,0,1,0,2,19,2,4,NA,NA +70861,7,2,2,16,NA,2,2,2,16,201,NA,NA,2,2,2,10,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,17848.732433,20206.102312,2,91,99,99,NA,6,6,1,3,0,2,20,2,2,5,NA +70862,7,2,1,75,NA,5,6,2,NA,NA,2,NA,2,1,9,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,10818.545624,11805.931644,3,90,4,4,0.99,2,2,0,0,2,1,75,2,4,1,NA +70863,7,2,2,77,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,3,NA,1,2,1,1,2,1,1,2,1,NA,11462.813869,11819.991623,1,93,2,2,0.87,1,1,0,0,1,2,77,2,4,3,NA +70864,7,2,1,1,12,2,2,2,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12567.081957,13464.72134,1,97,5,5,1.04,4,4,1,1,0,1,32,1,3,6,NA +70865,7,2,1,45,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,116464.874823,119757.87667,2,94,9,9,3.35,3,3,0,0,1,2,52,1,2,1,3 +70866,7,2,2,16,NA,3,3,2,16,203,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,80091.55101,82618.226829,1,101,14,14,3.9,4,4,0,2,0,2,41,1,2,1,2 +70867,7,2,2,29,NA,1,1,2,NA,NA,2,NA,2,1,3,NA,4,6,1,2,2,2,2,2,2,2,2,2,2,39426.061521,39404.861746,2,94,7,7,1.34,5,5,2,1,0,1,32,2,1,1,NA +70868,7,2,1,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,32980.717958,32895.997285,1,95,4,4,1.21,2,2,0,0,0,1,46,1,2,1,2 +70869,7,2,1,38,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,1,2,2,1,2,2,2,37715.365512,45063.17837,2,102,7,7,1.04,7,7,1,2,0,2,37,2,1,1,2 +70870,7,2,1,7,NA,3,3,2,7,86,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,46228.073505,47549.950918,2,94,15,15,4.59,4,4,1,1,0,2,37,1,5,1,5 +70871,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11565.978374,12485.281365,1,99,6,6,1.12,4,4,0,2,0,1,39,1,3,1,3 +70872,7,1,2,23,NA,5,6,NA,NA,NA,2,NA,2,2,3,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,16844.740449,0,3,91,7,7,3.9,2,1,0,0,0,2,21,NA,NA,5,NA +70873,7,2,2,6,NA,1,1,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16371.237244,2,98,14,14,3.25,5,5,2,1,0,1,37,1,5,1,5 +70874,7,2,1,73,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,6725.306794,7069.929472,2,99,7,7,1.52,4,4,0,0,2,1,73,1,3,2,NA +70875,7,2,1,15,NA,3,3,1,15,191,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71757.969058,71552.342229,1,98,10,10,2.2,6,6,1,3,0,2,31,1,4,6,NA +70876,7,2,1,3,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9090.947573,10024.256259,1,90,6,6,1.57,3,3,1,0,0,2,25,1,3,6,NA +70877,7,2,1,56,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,2,2,2,2,2,2,2,22157.736644,21832.606015,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +70878,7,2,1,25,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,19163.076248,19068.627285,2,97,7,7,2.38,2,2,0,0,0,1,25,1,2,1,2 +70879,7,2,2,10,NA,5,6,2,10,122,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,9620.269705,10600.850342,2,91,6,6,1.57,3,3,0,1,0,1,41,2,3,1,3 +70880,7,2,2,0,1,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8114.787453,8336.925581,1,94,6,6,0.87,6,6,2,2,0,2,24,1,4,6,NA +70881,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,112935.983109,114691.149811,1,102,10,10,4.76,2,2,0,0,0,1,23,1,5,5,NA +70882,7,2,2,8,NA,4,4,1,8,98,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12120.418061,12942.575479,2,101,6,6,0.96,5,5,0,4,0,2,36,1,4,4,NA +70883,7,2,1,31,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,19117.284298,19849.243802,2,95,8,8,2.97,2,2,0,0,0,2,56,1,5,2,NA +70884,7,2,1,14,NA,4,4,2,14,175,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12721.673656,12746.825446,2,100,6,6,1.34,4,4,1,2,0,2,31,1,4,5,NA +70885,7,2,1,8,NA,1,1,1,8,106,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11399.23838,11468.323492,2,103,2,2,0.22,7,7,0,3,0,2,39,2,1,5,NA +70886,7,2,2,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,29040.300396,28462.118402,2,101,1,1,0.11,4,1,0,0,0,2,21,1,4,5,NA +70887,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,26668.458882,26178.344406,2,102,10,10,4.62,2,2,0,0,0,2,59,1,5,1,NA +70888,7,1,1,0,9,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17196.879565,0,2,94,14,14,2.87,5,5,2,1,0,1,37,1,3,1,4 +70889,7,2,2,18,NA,1,1,1,18,220,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16781.078148,17378.8338,2,103,2,2,0.22,7,7,0,3,0,2,39,2,1,5,NA +70890,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,16181.169973,15883.791498,1,96,9,7,3.21,2,1,0,0,0,1,58,1,4,6,NA +70891,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,4,2,1,2,2,1,2,2,NA,NA,NA,NA,14599.561708,14200.006402,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +70892,7,2,1,6,NA,4,4,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8453.214884,8437.321796,2,101,1,1,0.1,6,6,1,2,1,2,27,1,2,1,2 +70893,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,97101.614214,108614.152251,3,92,6,6,1.17,4,4,0,2,0,2,30,1,2,1,4 +70894,7,2,1,70,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,53149.251154,56449.488341,2,94,8,8,3.4,2,2,0,0,2,2,64,1,4,1,2 +70895,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,NA,27602.403077,28546.401551,1,94,2,2,0.55,2,2,0,0,2,2,75,1,1,3,NA +70896,7,2,1,15,NA,4,4,1,15,191,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13276.485807,13240.468288,2,100,10,7,2.05,4,3,0,2,0,1,20,1,4,6,NA +70897,7,2,1,52,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17801.655316,19397.911862,2,95,7,6,1.88,3,2,0,0,0,2,56,1,3,2,NA +70898,7,2,1,71,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,2,1,NA,2,2,2,2,2,2,1,2,2,NA,11755.776731,12827.229805,3,90,12,13,NA,2,1,0,0,1,1,71,2,2,1,NA +70899,7,2,2,66,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,136832.42119,141624.96623,2,91,15,15,5,2,2,0,0,1,2,66,1,5,3,NA +70900,7,2,1,59,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,19093.004278,19032.106491,2,99,2,2,0.19,6,6,0,1,0,1,59,1,2,5,NA +70901,7,2,2,0,11,4,4,1,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4943.553921,5444.191192,1,100,14,14,3.47,4,4,2,0,0,1,34,1,5,1,5 +70902,7,2,1,11,NA,4,4,2,11,140,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8930.369586,9237.151674,3,91,4,4,1.09,2,2,0,1,0,2,40,1,5,3,NA +70903,7,2,2,18,NA,1,1,2,19,228,2,NA,2,2,4,13,NA,NA,NA,1,2,2,1,2,2,2,2,2,2,17544.592739,19246.751055,3,92,6,6,1,6,6,1,1,0,1,42,2,1,1,4 +70904,7,2,1,19,NA,2,2,2,19,233,2,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15351.501195,16874.029415,2,90,4,4,1.29,2,2,0,0,0,2,40,1,2,5,NA +70905,7,2,2,1,16,1,1,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13322.479814,14708.37523,1,92,14,14,3.9,4,4,2,0,0,2,29,1,4,1,4 +70906,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,78529.577822,84771.37367,1,101,14,14,3.9,4,4,0,2,0,2,41,1,2,1,2 +70907,7,2,1,2,NA,4,4,2,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8064.791396,8892.751276,1,91,99,99,NA,3,3,1,0,0,1,33,2,5,5,NA +70908,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,74379.731652,76506.539917,2,92,15,7,3.67,4,1,0,0,0,1,28,1,5,5,NA +70909,7,1,2,13,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6587.470541,0,1,93,9,9,1.77,7,7,0,2,0,2,56,NA,NA,5,NA +70910,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,18404.681357,20079.255367,1,101,3,3,0.61,4,4,1,2,0,1,38,1,2,4,NA +70911,7,2,1,59,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,146786.506338,147038.128142,1,90,15,15,5,3,3,0,0,0,1,59,1,5,1,5 +70912,7,2,1,67,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,5,2,NA,2,2,2,1,2,2,2,2,2,2,7290.319536,7407.101145,2,93,10,10,5,1,1,0,0,1,1,67,2,5,2,NA +70913,7,2,1,28,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15507.441472,18423.236589,1,100,9,9,4.92,1,1,0,0,0,1,28,1,5,5,NA +70914,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,20568.024192,20733.954282,2,92,1,1,0.02,1,1,0,0,0,1,40,1,2,5,NA +70915,7,1,1,80,NA,3,3,NA,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,37318.801462,0,1,98,6,6,1.95,2,2,0,0,2,1,80,1,3,1,3 +70916,7,2,2,78,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,1,2,NA,2,2,2,2,2,2,1,2,2,NA,17318.187297,23904.945555,2,90,6,3,0.92,2,1,0,0,2,1,76,2,1,2,NA +70917,7,2,1,48,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,22165.906062,24153.500588,1,96,7,7,2.78,2,2,0,0,0,1,48,1,2,6,NA +70918,7,2,2,7,NA,3,3,2,7,89,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21910.300386,22612.118571,1,99,4,4,1.02,2,2,0,1,0,2,27,1,4,3,NA +70919,7,2,2,7,NA,3,3,1,7,89,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64166.795496,75335.746424,1,101,5,5,0.89,5,5,1,2,0,1,31,1,2,1,1 +70920,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20303.639991,21936.687597,1,97,7,7,1.48,5,5,0,1,0,2,46,2,4,1,NA +70921,7,2,2,29,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,13976.989712,14629.714123,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +70922,7,2,2,2,NA,5,7,2,2,28,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5588.504831,5743.223814,2,91,15,15,3.7,5,5,1,2,0,1,50,NA,NA,1,5 +70923,7,2,1,63,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,89103.220446,89938.887954,2,98,7,7,2.16,3,3,0,0,1,2,55,1,3,1,4 +70924,7,2,1,0,10,5,6,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5528.06179,5490.918184,1,91,14,14,4.48,3,3,1,0,0,1,31,2,5,1,5 +70925,7,2,1,57,NA,5,6,1,NA,NA,2,NA,2,2,7,NA,3,1,NA,1,2,2,1,2,2,1,2,2,3,18416.819037,20059.719948,2,96,5,5,1.36,2,2,0,1,0,1,57,2,3,1,NA +70926,7,1,2,15,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,66,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17848.732433,0,2,91,8,8,1.85,5,5,0,2,1,1,39,2,3,1,4 +70927,7,2,1,63,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,9946.027787,10495.972559,2,93,8,8,2.62,3,3,0,0,2,2,64,2,1,1,1 +70928,7,2,2,6,NA,4,4,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,7814.742747,8095.069503,2,95,6,6,0.97,6,6,2,1,0,1,54,1,3,6,NA +70929,7,2,2,29,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,17350.142808,18091.024448,1,92,14,14,2.42,6,6,1,3,0,1,30,1,4,6,NA +70930,7,2,1,6,NA,2,2,2,6,79,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9807.589376,10028.771,2,90,10,10,3.13,4,4,1,2,0,2,39,1,5,4,NA +70931,7,2,2,44,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,36945.168658,38286.242768,2,96,10,10,3.78,3,3,0,1,0,1,42,1,3,1,3 +70932,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,2,1,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,18396.558383,19503.669771,1,90,15,15,5,4,4,1,1,0,2,43,2,5,1,5 +70933,7,2,2,46,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19150.604366,19251.871661,3,91,15,15,5,2,2,0,0,0,2,46,1,5,1,5 +70934,7,2,1,0,4,4,4,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5089.464235,5316.261144,2,93,6,6,1.15,5,5,3,1,0,1,29,1,3,5,NA +70935,7,2,2,46,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,20084.755052,20430.629009,1,99,15,15,5,4,4,0,2,0,2,46,1,5,1,5 +70936,7,2,1,27,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,2,2,2,2,35669.2076,40318.090187,2,94,8,8,2.7,3,3,1,0,0,1,27,1,3,1,4 +70937,7,2,2,12,NA,4,4,2,12,154,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,4,4,0.57,5,5,1,3,0,2,33,1,3,5,NA +70938,7,2,1,49,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,52756.101074,53793.249362,3,92,8,8,2.97,2,2,0,0,1,1,49,1,2,3,NA +70939,7,2,2,28,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,6,2,1,2,2,1,2,2,1,2,2,1,39550.779175,41765.24601,2,96,14,14,3.36,4,4,1,1,0,2,28,1,2,6,NA +70940,7,2,1,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,131567.279219,134004.437006,1,97,15,15,5,3,3,0,0,0,1,53,NA,NA,1,4 +70941,7,2,1,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,87954.465296,90754.904886,2,100,10,10,3.13,4,4,0,2,0,1,45,1,4,1,4 +70942,7,2,2,16,NA,1,1,1,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15690.47168,16249.379042,1,102,8,8,1.33,7,7,1,4,0,2,32,1,3,1,2 +70943,7,2,1,8,NA,1,1,2,8,105,NA,NA,1,1,NA,3,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,10449.970381,10975.442173,1,90,2,1,0.17,5,2,0,1,0,1,25,2,2,6,NA +70944,7,2,2,0,0,1,1,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7798.643057,7634.568742,1,102,8,8,2.06,4,4,2,0,0,1,28,1,2,1,5 +70945,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,33558.731068,36590.680559,1,101,3,1,0,2,1,0,0,1,2,65,1,3,3,NA +70946,7,1,1,2,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24594.444896,0,1,98,5,2,0.42,4,3,2,0,0,1,24,1,3,6,NA +70947,7,2,2,4,NA,3,3,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,59430.588937,63158.057955,2,91,15,15,4.2,6,6,2,0,2,1,63,1,1,1,3 +70948,7,2,2,19,NA,4,4,1,19,231,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18905.695776,2,101,1,1,0.05,2,1,0,0,0,2,19,1,3,NA,NA +70949,7,2,2,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,128590.415432,131137.819973,1,102,15,15,5,2,2,0,0,2,2,68,1,4,1,5 +70950,7,2,1,50,NA,2,2,1,NA,NA,2,NA,2,2,6,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,34422.302712,34961.637568,2,92,2,2,0.4,3,3,0,0,0,1,50,2,4,1,4 +70951,7,2,1,7,NA,4,4,2,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8050.419807,8503.565046,2,99,4,4,0.41,7,7,0,2,0,2,36,1,3,5,NA +70952,7,1,2,64,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19125.640099,0,2,95,77,77,NA,2,2,0,0,2,1,64,NA,NA,1,3 +70953,7,1,2,9,NA,2,2,NA,NA,NA,NA,NA,2,1,2,4,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12789.411811,0,1,102,7,7,1.9,4,4,1,1,0,1,29,1,4,1,3 +70954,7,2,1,61,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,28559.076421,28710.827523,1,95,5,5,2.2,1,1,0,0,1,1,61,1,3,3,NA +70955,7,2,1,14,NA,5,6,1,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8915.81491,9312.338117,1,92,12,12,NA,4,4,0,1,0,1,53,2,5,1,4 +70956,7,2,1,15,NA,1,1,2,15,188,NA,NA,1,1,NA,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20398.562455,20481.595361,2,94,4,4,0.81,3,3,0,1,0,1,49,2,3,1,3 +70957,7,2,1,12,NA,1,1,2,12,154,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,20398.562455,20710.36162,2,94,13,13,NA,5,5,0,3,0,1,32,2,2,1,1 +70958,7,2,1,1,15,2,2,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9237.934626,9085.733547,2,90,5,5,0.89,4,4,2,0,0,2,26,2,2,4,NA +70959,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,44296.789734,46174.107604,2,102,4,1,0,2,1,0,0,0,2,43,1,5,6,NA +70960,7,2,2,8,NA,4,4,2,8,100,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7120.704736,7311.203604,1,99,15,8,2.7,4,3,0,2,0,1,49,1,4,6,NA +70961,7,2,2,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,NA,55881.349278,57792.483909,2,92,9,9,5,1,1,0,0,1,2,74,1,5,5,NA +70962,7,2,1,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,NA,NA,NA,1,2,2,1,14321.1466,14549.731107,1,96,15,15,5,6,6,1,1,1,2,44,1,3,1,3 +70963,7,2,2,17,NA,2,2,1,17,209,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,18556.092615,20535.833102,1,103,7,7,1.03,7,7,0,3,0,1,50,2,1,1,1 +70964,7,2,2,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,27738.890335,27824.17823,2,101,4,4,0.73,5,5,1,2,0,1,40,1,5,1,5 +70965,7,2,1,5,NA,2,2,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11161.439403,11514.748174,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +70966,7,2,1,20,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,14313.345971,15054.191928,3,91,5,3,0.92,2,1,0,0,0,1,20,1,4,6,NA +70967,7,2,1,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,22723.53676,24747.854656,1,92,NA,99,NA,4,1,0,2,0,2,56,1,4,4,NA +70968,7,2,2,8,NA,3,3,1,9,108,NA,NA,2,2,3,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,13450.606713,14078.286101,3,91,4,4,0.65,5,5,2,2,0,2,27,2,2,3,NA +70969,7,2,1,45,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,31233.526521,31366.480522,1,100,8,3,1.03,6,1,1,0,0,1,33,2,3,6,NA +70970,7,2,1,31,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,15867.258653,18200.873488,3,91,3,3,0.76,3,3,0,1,0,2,24,1,4,6,NA +70971,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,20486.987447,21605.827026,2,101,3,3,0.6,3,3,0,2,0,1,39,1,4,4,NA +70972,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,5950.975297,5997.525697,2,99,77,77,NA,3,3,0,1,1,1,61,1,4,3,NA +70973,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,18404.681357,19079.901799,1,101,7,7,1.83,3,3,0,0,2,1,67,1,1,1,2 +70974,7,2,1,49,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,30234.306382,1,101,5,5,1.15,3,3,0,1,0,1,49,1,3,1,4 +70975,7,2,2,22,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,118761.81384,123645.102237,3,91,4,4,1.02,2,2,0,0,0,1,22,1,5,1,5 +70976,7,2,1,17,NA,2,2,1,17,211,2,NA,2,1,4,11,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,20327.892981,20116.618863,2,93,4,4,0.69,4,4,0,1,1,2,66,2,3,2,NA +70977,7,2,1,3,NA,3,3,1,4,48,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,98584.614475,106037.774242,2,101,6,6,1.35,3,3,1,0,0,1,42,1,4,6,NA +70978,7,2,1,15,NA,4,4,2,15,183,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11834.781205,13035.394237,2,90,2,2,0.31,5,5,0,2,1,2,71,1,2,2,NA +70979,7,2,1,46,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,18230.629439,18292.13185,1,93,15,15,5,5,5,1,2,0,2,40,1,5,1,5 +70980,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,114168.79702,117438.65007,1,95,8,8,1.28,7,7,1,4,0,1,32,1,3,1,3 +70981,7,2,1,50,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,13525.38183,13953.637486,2,95,15,15,5,3,3,1,0,0,1,50,1,5,1,NA +70982,7,2,1,44,NA,2,2,2,NA,NA,2,NA,2,2,1,NA,2,1,NA,2,2,2,2,2,2,2,2,1,2,39096.402803,46193.238956,2,91,4,4,0.76,4,4,1,0,0,2,25,2,4,77,NA +70983,7,2,2,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,71746.365541,83232.546386,1,93,15,15,5,2,2,0,0,0,2,39,1,5,1,5 +70984,7,2,1,73,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,96955.880155,102625.661518,2,101,15,15,5,2,2,0,0,2,1,73,1,5,1,5 +70985,7,2,1,74,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,8601.453077,8734.617022,2,101,5,5,2.02,1,1,0,0,1,1,74,1,2,3,NA +70986,7,2,2,4,NA,4,4,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9268.093277,9507.318489,1,99,14,14,4.05,3,3,1,0,0,2,32,1,5,1,4 +70987,7,2,2,22,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,130601.953362,132156.64994,2,91,15,15,5,4,4,0,0,0,1,54,1,5,1,NA +70988,7,2,2,1,14,4,4,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8754.193667,9419.610037,2,98,8,8,1.8,5,5,2,1,0,1,32,1,4,1,5 +70989,7,2,1,16,NA,3,3,1,16,193,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,30943.024697,32205.010072,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +70990,7,2,2,6,NA,1,1,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15048.411882,15335.781033,1,103,14,14,2.96,5,5,1,2,0,1,34,1,4,1,5 +70991,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,25520.996455,28503.986081,1,93,3,3,0.75,2,2,0,0,1,2,80,1,1,2,NA +70992,7,2,2,1,14,2,2,2,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11412.410776,11898.666241,1,97,3,3,0.44,5,5,2,2,0,2,26,1,4,4,NA +70993,7,2,1,38,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,15399.847485,15604.102319,1,103,8,8,4.3,1,1,0,0,0,1,38,1,5,5,NA +70994,7,2,2,13,NA,2,2,2,13,159,NA,NA,2,2,3,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,12680.621719,13709.581084,2,90,99,99,NA,5,5,1,1,0,2,40,2,3,1,1 +70995,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,2,1,2,2,1,2,2,1,2,2,1,31335.13799,32015.561405,1,95,6,4,1.26,6,2,1,2,0,1,28,1,2,1,2 +70996,7,2,1,41,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,49072.976757,48585.714967,1,97,15,15,5,2,2,0,0,0,1,41,1,5,1,5 +70997,7,2,2,62,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,9570.416297,10279.373686,2,98,2,2,0.83,1,1,0,0,1,2,62,1,3,3,NA +70998,7,2,2,6,NA,2,2,2,6,73,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10762.400563,11527.105697,2,90,6,6,2.01,2,2,0,1,0,2,26,1,3,5,NA +70999,7,2,2,50,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,161992.272945,161249.908749,1,91,14,14,3.15,5,5,0,1,0,2,50,1,5,1,5 +71000,7,2,2,0,6,5,6,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,7065.624287,7145.357301,2,92,6,6,1.34,4,4,1,1,0,1,40,2,3,1,3 +71001,7,2,1,6,NA,4,4,2,6,74,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7386.979006,7738.237294,2,99,5,5,0.65,6,6,2,1,0,2,53,1,4,3,NA +71002,7,2,1,13,NA,1,1,1,13,165,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,24228.858782,24226.727855,2,102,7,7,2.16,3,3,0,2,0,2,41,1,5,3,NA +71003,7,2,1,78,NA,3,3,1,NA,NA,2,NA,2,1,7,NA,1,5,NA,1,2,1,1,2,1,1,2,1,NA,12184.871688,13005.96831,2,103,2,2,0.45,1,1,0,0,1,1,78,2,1,5,NA +71004,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,14809.997435,16069.288743,2,97,1,1,0.13,4,4,2,0,1,2,62,1,2,4,NA +71005,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,12230.621635,1,96,8,8,3.14,2,2,0,0,2,2,64,1,3,1,2 +71006,7,2,2,4,NA,1,1,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13366.393396,13546.155547,2,94,5,5,1.3,3,3,1,1,0,2,34,2,2,5,NA +71007,7,2,2,1,16,1,1,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,15816.39252,3,92,15,15,5,3,3,1,0,0,1,34,1,5,1,5 +71008,7,2,1,50,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,25969.864445,25963.066565,1,97,14,14,5,3,3,0,0,0,2,51,1,5,1,4 +71009,7,1,2,4,NA,5,7,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15046.736747,0,1,101,6,6,1.07,5,5,2,1,0,1,30,1,3,1,3 +71010,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,43813.24867,47156.814318,1,98,5,2,0.42,4,3,2,0,0,1,24,1,3,6,NA +71011,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,175997.804296,176135.086149,1,101,3,3,0.73,2,2,0,0,1,1,60,1,3,1,5 +71012,7,2,2,24,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,144794.522788,148845.957701,1,97,8,8,3.57,2,2,0,0,0,2,49,1,3,3,NA +71013,7,2,2,5,NA,4,4,2,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9986.420822,10886.623262,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +71014,7,2,2,16,NA,5,7,2,16,199,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11747.462633,12227.159724,2,99,6,6,1.18,5,5,0,3,0,2,38,1,2,5,NA +71015,7,2,2,49,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,23342.391629,23465.824854,1,92,15,15,5,2,2,0,0,0,2,49,1,5,3,NA +71016,7,2,2,5,NA,1,1,1,5,62,NA,NA,2,2,1,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,17282.036547,19079.832121,2,102,15,15,5,3,3,1,0,0,1,41,2,2,1,5 +71017,7,2,2,10,NA,3,3,2,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15442.305642,16400.253331,2,94,5,5,1.3,3,3,0,1,0,1,43,1,3,6,NA +71018,7,2,1,5,NA,3,3,2,5,62,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57680.74785,67586.530677,1,99,5,5,0.89,4,4,2,0,0,2,31,1,4,1,5 +71019,7,2,2,10,NA,1,1,1,10,130,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,15962.145468,16061.826248,2,98,2,2,0.27,4,4,2,1,0,2,32,2,2,5,NA +71020,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,30212.098573,34791.026267,1,92,3,3,1.01,1,1,0,0,1,2,80,1,3,2,NA +71021,7,2,1,64,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,6011.560142,6320.246286,2,99,3,3,1.29,1,1,0,0,1,1,64,2,4,3,NA +71022,7,2,1,11,NA,3,3,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19590.665143,20475.022602,3,91,5,5,0.87,4,4,0,2,0,2,38,1,2,3,NA +71023,7,2,1,10,NA,1,1,1,10,122,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13822.148996,13905.918164,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +71024,7,2,1,7,NA,3,3,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,47596.305609,49235.587472,1,99,14,14,5,3,3,0,1,0,1,35,1,5,1,5 +71025,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,7514.993062,9722.610426,2,90,1,1,0.28,1,1,0,0,1,1,61,1,2,5,NA +71026,7,2,1,14,NA,1,1,1,14,176,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19570.996814,19477.677478,2,100,4,4,0.81,4,4,0,2,0,1,56,1,4,1,2 +71027,7,2,1,10,NA,1,1,1,10,129,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13927.458372,14147.852881,2,98,3,3,0.33,7,7,2,3,0,1,40,2,1,1,1 +71028,7,2,1,2,NA,1,1,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10736.26749,11503.13577,1,103,5,5,1.02,4,4,2,0,0,1,25,1,2,1,4 +71029,7,2,2,25,NA,5,6,2,NA,NA,2,NA,2,1,3,NA,3,1,2,1,2,1,1,2,2,NA,NA,NA,NA,13820.210756,14687.211885,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +71030,7,2,2,13,NA,2,2,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14437.97544,15197.369043,2,90,14,14,3.45,4,4,1,1,0,2,34,2,5,6,NA +71031,7,1,1,27,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,34087.731449,0,3,92,4,3,0.52,5,4,0,0,0,2,57,1,4,1,2 +71032,7,2,2,12,NA,1,1,1,13,156,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,1,2,2,2,22424.988432,23223.784759,1,94,7,7,2.1,3,3,0,1,0,2,48,2,1,1,3 +71033,7,1,1,26,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17579.006909,0,2,103,15,15,5,1,1,0,0,0,1,26,1,3,5,NA +71034,7,2,1,11,NA,4,4,2,11,134,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8451.853606,8465.026785,1,93,7,7,1.97,4,4,1,2,0,2,33,1,4,3,NA +71035,7,2,1,7,NA,5,6,2,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10810.913614,11461.625841,1,97,14,14,2.87,5,5,0,3,0,2,40,2,5,1,5 +71036,7,2,1,29,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,105262.341027,110623.017272,2,98,8,8,3.67,2,2,0,0,0,2,54,1,4,3,NA +71037,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15497.844354,15358.163767,1,99,15,15,5,2,2,0,0,0,1,56,1,4,1,4 +71038,7,2,1,60,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,2,1,NA,2,2,2,2,2,2,1,2,2,2,8609.250304,11228.904188,2,90,1,1,0.27,2,2,0,0,1,1,60,2,2,1,1 +71039,7,2,2,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,81385.450947,85814.999376,1,93,15,15,5,2,2,0,0,0,2,30,1,5,1,5 +71040,7,2,1,63,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,36541.405352,36735.571242,1,101,4,4,1.22,2,2,0,0,1,1,63,1,2,1,2 +71041,7,2,1,9,NA,5,6,2,9,112,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10810.913614,11461.625841,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +71042,7,2,1,38,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,3,13147.594977,14207.241654,1,102,5,5,0.92,5,5,1,2,0,2,44,2,1,1,2 +71043,7,2,2,9,NA,4,4,1,9,110,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13192.206605,13608.834197,2,102,9,9,2.68,4,4,0,2,0,2,32,1,4,1,NA +71044,7,2,1,0,2,5,7,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9570.577309,9675.725524,1,95,6,6,1.15,5,5,2,1,0,1,29,1,4,6,NA +71045,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,NA,10947.445281,13128.299802,1,94,4,4,1.43,1,1,0,0,1,1,80,1,3,4,NA +71046,7,2,1,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,144353.133634,150786.620773,1,91,14,14,4.03,4,4,0,2,0,1,52,1,4,1,5 +71047,7,2,2,52,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,NA,16058.142925,17306.419461,2,95,5,5,1.18,3,3,0,1,0,2,55,1,4,5,NA +71048,7,2,2,52,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,NA,NA,NA,NA,24870.513993,26515.471818,2,98,1,1,0.13,4,4,2,0,0,2,52,1,2,4,NA +71049,7,2,2,20,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,57438.356061,66140.327263,2,101,1,1,0.08,1,1,0,0,0,2,20,1,4,5,NA +71050,7,2,2,0,4,2,2,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,4481.392842,4343.672823,2,90,12,12,NA,7,7,2,2,0,1,39,2,1,1,1 +71051,7,2,1,78,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,79754.311902,90534.066519,1,97,15,15,5,2,2,0,0,2,1,78,1,3,1,3 +71052,7,2,2,18,NA,1,1,1,18,217,2,NA,2,2,3,10,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,19993.78712,21491.713499,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +71053,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,9680.216878,10112.428208,1,96,12,10,5,2,1,0,0,1,2,61,1,4,3,NA +71054,7,2,2,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,140431.173819,139253.659476,1,94,10,6,2.42,2,1,0,0,0,1,59,1,4,6,NA +71055,7,2,2,0,4,5,6,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6580.402774,6856.045444,1,94,99,99,NA,5,5,1,1,0,2,21,1,3,5,NA +71056,7,1,1,59,NA,5,6,NA,NA,NA,2,NA,2,1,7,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,15409.233853,0,1,92,12,12,NA,4,4,0,0,0,1,59,2,3,1,4 +71057,7,2,2,62,NA,4,4,2,NA,NA,1,2,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,11190.39853,11690.037855,2,99,99,99,NA,2,2,0,0,2,2,62,1,5,3,NA +71058,7,2,2,19,NA,3,3,2,19,233,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,41202.729804,43105.611516,2,91,6,6,1.26,5,5,0,1,2,2,80,1,4,2,NA +71059,7,2,1,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,27227.937106,27501.844882,1,101,3,3,0.96,2,2,0,0,0,1,53,1,1,1,2 +71060,7,2,2,31,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,2,2,1,2,2,1,2,2,1,2,2,1,21306.824647,21870.080421,2,98,1,1,0.19,3,3,2,0,0,2,31,1,4,2,NA +71061,7,2,1,54,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,2,2,2,2,2,2,1,2,2,2,37557.946192,37296.340716,2,102,9,9,3.24,3,3,0,0,0,1,54,2,4,1,4 +71062,7,2,1,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,31291.360507,32453.566842,2,91,12,3,1.25,3,1,0,0,1,1,52,1,4,3,NA +71063,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,NA,NA,NA,NA,85610.546667,92292.669073,2,91,15,15,5,5,5,1,2,0,1,37,1,4,6,NA +71064,7,2,2,26,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,10783.449126,11243.921386,1,103,5,5,0.65,6,6,0,0,1,2,26,2,4,5,NA +71065,7,2,2,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,38739.556504,38769.774143,2,101,6,6,2.04,2,2,0,0,0,2,51,1,5,1,4 +71066,7,2,2,71,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,5,NA,2,2,2,2,2,2,1,2,2,NA,18697.677461,20882.090197,1,93,6,6,2.66,1,1,0,0,1,2,71,2,1,5,NA +71067,7,2,2,4,NA,1,1,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14812.229505,15746.041025,1,97,4,4,0.72,5,5,2,1,0,2,33,2,1,6,NA +71068,7,2,1,45,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,108839.502248,114346.356011,2,95,3,3,0.93,2,2,0,0,0,1,45,1,4,1,5 +71069,7,2,2,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,133022.268903,132572.26134,1,98,6,6,1.75,2,2,0,0,2,1,62,1,4,1,3 +71070,7,2,2,79,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,2,2,NA,1,2,1,1,2,1,1,2,1,NA,12344.929687,13268.288363,1,93,2,2,0.73,1,1,0,0,1,2,79,2,2,2,NA +71071,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,14939.690418,15327.735621,2,92,8,8,3.54,2,2,0,0,0,1,30,1,5,1,5 +71072,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,4,NA,2,2,2,1,2,2,1,2,2,1,19676.781212,20391.029456,1,103,6,6,1.57,3,3,0,1,0,2,50,2,3,4,NA +71073,7,2,2,18,NA,4,4,2,18,226,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12857.456314,12921.235691,2,97,8,8,2.7,3,3,0,0,1,2,72,1,2,3,NA +71074,7,1,2,1,14,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6565.095533,0,1,90,15,15,5,4,4,2,0,0,1,36,1,5,1,5 +71075,7,2,2,3,NA,3,3,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50908.326714,56187.051166,1,99,5,5,0.89,4,4,2,0,0,2,31,1,4,1,5 +71076,7,2,2,63,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15732.436891,16737.04767,1,97,14,14,3.93,3,3,0,1,2,2,63,1,4,1,4 +71077,7,2,2,13,NA,1,1,1,13,158,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,2,2,2,1,2,2,1,12970.724558,13432.752316,2,103,8,8,1.29,7,7,3,1,0,2,53,2,2,4,NA +71078,7,2,2,22,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23614.167119,30467.110717,2,97,3,3,0.82,2,2,1,0,0,2,22,1,4,5,NA +71079,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,78529.577822,81088.445647,1,98,14,14,3.15,5,5,0,3,0,1,34,1,4,1,4 +71080,7,1,1,22,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,88006.905716,0,1,92,6,6,1.51,3,3,0,0,0,1,46,1,3,3,NA +71081,7,2,1,4,NA,4,4,2,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7431.820906,7738.904727,1,99,5,5,0.84,5,5,2,1,0,1,35,1,3,1,2 +71082,7,2,1,78,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,11550.158096,13775.328408,2,92,7,7,1.17,6,6,0,1,1,1,78,2,1,1,3 +71083,7,2,2,62,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,9497.094386,9921.129492,2,100,15,15,5,2,2,0,0,1,1,51,1,5,1,3 +71084,7,2,1,55,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,23205.758348,23717.246496,3,92,5,5,1.03,4,4,0,3,0,1,55,1,4,4,NA +71085,7,2,1,1,15,4,4,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6837.992772,6921.398172,1,96,12,12,NA,2,2,1,0,0,2,32,1,5,5,NA +71086,7,2,1,24,NA,5,6,1,NA,NA,1,2,2,2,3,NA,4,5,NA,1,2,2,1,2,2,1,2,2,3,14979.624397,15387.451243,1,102,3,1,0.28,2,1,0,0,0,1,24,2,4,5,NA +71087,7,2,2,65,NA,1,1,1,NA,NA,2,NA,2,2,8,NA,1,2,NA,2,2,2,2,2,2,2,2,2,2,15207.312407,15896.113669,2,98,4,4,0.48,6,6,2,0,2,2,65,2,1,2,NA +71088,7,2,2,13,NA,2,2,2,13,160,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,16680.090857,17557.412914,1,90,15,15,5,4,4,0,2,0,2,43,1,5,1,5 +71089,7,2,2,32,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,3,4,2,2,2,2,2,2,2,1,2,2,2,49274.703023,52411.531429,2,102,77,77,NA,3,3,0,0,0,2,48,2,2,1,3 +71090,7,2,1,49,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11113.602843,11901.173467,3,90,15,15,5,4,4,0,2,0,2,41,2,5,1,5 +71091,7,2,2,39,NA,2,2,1,NA,NA,2,NA,2,1,NA,NA,4,6,2,1,2,2,1,2,2,NA,NA,NA,NA,45662.166351,45001.161705,1,92,14,9,3.77,3,2,0,1,0,2,39,2,4,6,NA +71092,7,2,2,71,NA,1,1,1,NA,NA,2,NA,2,2,77,NA,1,2,NA,2,2,2,2,2,2,2,2,2,NA,20127.084548,24087.460037,1,103,77,77,NA,4,4,1,0,1,1,20,1,3,6,NA +71093,7,2,1,50,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,185033.990584,188295.9196,1,97,15,15,5,2,2,0,0,0,1,50,1,3,6,NA +71094,7,2,2,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,140431.173819,139253.659476,1,94,9,9,3.97,2,2,0,0,0,1,59,1,3,5,NA +71095,7,2,1,31,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,81642.217375,85347.318656,3,91,14,14,5,3,3,1,0,0,2,30,1,4,1,5 +71096,7,2,2,13,NA,1,1,1,13,160,NA,NA,1,1,NA,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,18515.058419,19360.671834,2,96,6,6,1.11,6,6,0,2,1,1,40,2,2,1,2 +71097,7,2,1,21,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,25989.236835,2,101,99,1,0.21,3,1,0,0,0,1,20,1,4,5,NA +71098,7,2,2,19,NA,4,4,1,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,2,1,0.32,4,1,0,0,0,2,19,1,4,NA,NA +71099,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,47566.45715,54102.989916,1,90,9,9,5,1,1,0,0,1,2,80,1,5,3,NA +71100,7,2,2,80,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,12020.872946,12623.344251,3,90,15,15,4.07,5,5,0,2,1,1,42,1,5,1,4 +71101,7,2,1,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,19541.667675,20187.705923,2,95,2,2,0.75,1,1,0,0,0,1,51,1,2,5,NA +71102,7,2,1,19,NA,5,6,1,20,NA,2,NA,2,2,4,15,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,5904.602463,6308.718622,2,92,6,6,1.3,4,4,0,1,0,2,48,2,3,1,3 +71103,7,2,2,57,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,32709.179605,34590.259766,1,94,6,6,1.26,5,5,0,2,0,2,38,1,4,1,NA +71104,7,2,2,78,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,13141.36586,14020.834298,1,96,6,6,2.46,1,1,0,0,1,2,78,1,2,2,NA +71105,7,2,2,66,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,3,NA,2,2,2,2,2,2,2,2,1,2,8725.210615,9371.55685,2,93,14,14,2.43,7,7,1,1,1,2,66,2,2,3,NA +71106,7,2,1,1,19,3,3,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,31199.621619,36557.677601,1,97,5,5,0.87,4,4,2,0,0,1,35,1,5,1,5 +71107,7,2,2,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,2,1,2,2,1,2,2,1,2,2,1,64581.191728,65990.445093,2,94,15,10,5,3,1,0,0,0,1,26,NA,NA,77,NA +71108,7,2,2,20,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23845.8146,22808.13483,1,98,2,1,0.04,4,1,0,0,0,2,19,1,4,NA,NA +71109,7,2,2,0,9,1,1,1,NA,9,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8775.375504,9358.559086,2,102,14,14,3.8,4,4,2,0,0,2,41,2,4,1,5 +71110,7,2,1,2,NA,2,2,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13002.944731,13931.716845,2,91,4,4,0.69,4,4,2,0,0,2,21,1,3,6,NA +71111,7,2,2,75,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,18069.116427,18623.459107,2,100,2,2,0.62,1,1,0,0,1,2,75,1,4,2,NA +71112,7,2,2,55,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,22631.175755,22215.258702,2,96,7,7,2.58,2,2,0,0,1,2,55,1,4,3,NA +71113,7,2,2,26,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,12412.338679,12980.380959,3,90,15,15,3.7,5,5,0,0,0,1,56,2,3,1,3 +71114,7,2,2,20,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,132307.499792,154386.779868,1,98,1,1,0.31,1,1,0,0,0,2,20,1,4,5,NA +71115,7,2,2,12,NA,4,4,2,12,150,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11600.051433,12143.645666,3,90,14,14,2.97,5,5,0,2,1,1,73,2,3,2,NA +71116,7,2,2,7,NA,4,4,2,7,92,NA,NA,2,2,2,0,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,9412.419416,10343.079616,1,93,5,5,0.64,7,7,0,2,1,1,21,2,4,5,NA +71117,7,2,2,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,25241.487585,26857.231387,2,97,2,2,0.21,7,7,2,3,0,2,32,1,4,5,NA +71118,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,34802.051557,36349.694696,1,101,4,4,0.99,2,2,0,0,0,2,51,1,5,1,2 +71119,7,2,1,36,NA,3,3,1,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,71111.990643,75738.399435,2,103,15,15,5,4,4,2,0,0,1,36,2,4,1,5 +71120,7,2,1,69,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,28559.076421,28710.827523,1,95,2,2,0.88,1,1,0,0,1,1,69,1,3,3,NA +71121,7,2,2,0,11,5,6,2,NA,12,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4326.150649,4254.537398,1,99,14,14,2.66,7,7,3,1,0,1,35,1,5,1,5 +71122,7,2,1,63,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,15,15,5,2,2,0,0,2,1,63,1,4,1,5 +71123,7,2,1,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,23824.065321,24171.124621,1,100,14,14,3.6,4,4,1,1,0,1,41,1,4,1,5 +71124,7,1,1,0,10,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,4944.997189,0,1,103,13,13,NA,6,6,1,2,0,2,40,2,3,3,NA +71125,7,2,2,9,NA,5,6,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,5064.232234,5712.276567,2,92,99,2,0.31,7,4,3,3,1,1,61,2,1,1,3 +71126,7,2,1,5,NA,1,1,1,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,14321.363328,14968.737037,2,96,6,6,0.77,7,7,2,1,0,1,53,2,1,1,1 +71127,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,59282.809425,61101.54758,1,101,14,14,5,2,2,0,0,2,2,70,1,5,1,2 +71128,7,2,1,6,NA,3,3,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19998.804,20570.663593,1,94,3,3,0.37,5,5,0,3,0,2,29,1,4,4,NA +71129,7,2,1,16,NA,3,3,1,16,200,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,69211.537407,74163.290023,1,92,14,14,3.16,6,6,1,1,0,1,49,1,1,1,3 +71130,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,19130.568715,18607.010517,2,98,5,5,0.59,7,7,3,0,0,2,50,1,5,4,NA +71131,7,2,1,13,NA,3,3,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,71934.689876,71392.8162,1,100,15,15,5,4,4,0,1,0,1,50,1,4,1,4 +71132,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,134694.414609,139412.076132,2,94,10,10,4.3,2,2,0,0,2,1,69,1,4,1,5 +71133,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,82820.100138,94804.847305,1,90,7,7,3.13,1,1,0,0,0,2,36,1,5,5,NA +71134,7,2,1,3,NA,3,3,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,57680.74785,67586.530677,1,99,77,77,NA,4,4,1,1,0,1,31,2,3,1,3 +71135,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,33731.056243,35845.261325,2,98,3,3,0.88,2,2,0,0,2,1,77,1,1,1,3 +71136,7,2,1,21,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,9956.598907,12313.186759,1,95,5,5,0.73,6,6,1,0,1,1,62,2,3,1,NA +71137,7,2,1,61,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,NA,14488.953694,14771.336069,3,92,1,1,0.24,1,1,0,0,1,1,61,1,4,5,NA +71138,7,2,1,0,7,4,4,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10070.421465,10410.321555,2,101,4,4,0.76,4,4,1,1,0,1,28,1,2,1,4 +71139,7,2,1,7,NA,1,1,1,7,90,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11159.151566,11210.524757,1,102,4,4,0.5,6,6,2,2,0,1,25,1,2,1,3 +71140,7,2,1,26,NA,1,1,2,NA,NA,2,NA,2,2,2,NA,4,5,NA,2,2,2,2,2,2,2,2,2,2,35669.2076,36620.108921,2,94,15,15,5,3,3,0,0,0,1,41,2,3,1,NA +71141,7,2,2,78,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,20131.904783,20903.590301,1,92,8,8,2.51,3,3,0,0,1,2,78,1,5,2,NA +71142,7,1,1,8,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,1,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8943.919305,0,1,92,5,5,0.63,7,7,0,4,1,1,60,NA,NA,1,NA +71143,7,2,2,53,NA,4,4,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19548.136896,19371.951409,1,90,15,15,5,2,2,0,0,0,1,57,2,4,1,5 +71144,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,22758.541444,24464.617143,1,98,7,7,1.03,7,7,0,4,0,2,20,1,3,5,NA +71145,7,2,2,15,NA,1,1,1,15,191,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21062.314667,21467.226385,1,94,10,10,2.94,4,4,0,2,0,2,52,1,5,2,NA +71146,7,2,1,34,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,130589.073376,141489.20172,2,102,8,6,2.57,2,1,0,0,0,1,34,1,4,5,NA +71147,7,2,2,11,NA,4,4,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8757.841043,8910.615224,2,100,13,13,NA,4,4,0,2,0,2,28,1,2,6,NA +71148,7,2,1,0,0,4,4,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6433.441277,6898.375971,2,97,1,1,0,5,5,3,0,0,2,23,1,2,1,3 +71149,7,2,1,12,NA,5,7,2,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5504.178541,5957.59682,1,99,15,15,4.47,4,4,0,2,0,2,52,2,5,1,5 +71150,7,2,1,8,NA,4,4,2,8,100,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14125.862146,14295.209168,1,97,5,5,0.91,4,4,0,3,0,2,44,1,4,5,NA +71151,7,2,2,8,NA,4,4,1,8,102,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11334.095519,11753.9565,2,96,5,5,0.67,6,6,1,2,1,1,34,1,4,1,4 +71152,7,2,1,80,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,1,2,1,2,2,1,2,2,NA,18812.694081,19206.027387,1,102,14,14,4.59,3,3,0,0,1,2,46,1,4,1,1 +71153,7,2,2,7,NA,4,4,2,7,94,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6655.097829,7106.52929,2,99,15,15,4.9,7,7,1,4,0,2,53,1,5,1,5 +71154,7,2,2,11,NA,5,6,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10699.45895,11230.540406,1,97,15,15,2.33,7,7,2,4,0,2,40,2,5,1,4 +71155,7,2,1,41,NA,3,3,2,NA,NA,2,NA,2,2,5,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,117676.178911,119449.245993,2,99,14,14,5,1,1,0,0,0,1,41,2,5,5,NA +71156,7,2,2,16,NA,1,1,2,16,194,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,21120.105603,21750.292661,1,98,6,6,1.98,2,2,0,1,0,2,37,1,4,3,NA +71157,7,2,2,26,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,15967.106149,16195.487754,2,103,6,6,1.3,4,4,1,1,0,2,26,1,4,1,3 +71158,7,2,1,39,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,5,1,NA,1,2,1,1,2,1,1,2,2,3,16939.617906,17443.653216,3,91,14,14,3.58,4,4,1,1,0,1,39,2,5,1,5 +71159,7,2,2,37,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,97101.614214,100848.484003,3,92,15,15,5,4,4,2,0,0,1,38,1,5,1,5 +71160,7,2,2,3,NA,5,6,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7483.230909,7475.326886,2,96,7,7,2.27,3,3,1,0,0,1,34,2,5,1,5 +71161,7,2,1,45,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,18178.365056,18317.23991,1,94,6,6,2.05,2,2,0,1,0,1,45,1,2,5,NA +71162,7,2,1,13,NA,5,7,1,13,164,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14831.338089,14976.576871,1,98,3,3,0.43,4,4,0,1,0,2,39,1,2,5,NA +71163,7,2,1,11,NA,3,3,1,11,135,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,49922.147265,52289.098209,1,98,6,6,1.11,5,5,0,2,1,2,37,1,1,1,1 +71164,7,2,1,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,129656.862785,1,101,14,14,3.25,4,4,0,1,0,1,48,1,4,1,2 +71165,7,2,2,0,4,4,4,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4128.726485,4546.845595,2,93,5,5,1.05,3,3,1,0,0,2,29,1,3,5,NA +71166,7,2,1,55,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,NA,32720.69734,33802.428047,1,95,2,2,0.67,1,1,0,0,0,1,55,1,3,3,NA +71167,7,2,2,19,NA,5,7,2,19,231,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,91797.787708,94488.443358,1,95,5,5,1.3,3,3,0,0,1,2,19,1,3,NA,NA +71168,7,1,1,79,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,7,1,NA,1,2,2,NA,NA,NA,NA,NA,NA,NA,74473.849242,0,2,98,NA,NA,NA,2,2,0,0,2,1,79,1,7,1,NA +71169,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,121588.761604,120347.630506,1,91,10,10,3.78,3,3,0,0,2,1,62,1,5,1,5 +71170,7,1,1,23,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,106185.516032,0,2,96,5,5,2.02,1,1,0,0,0,1,23,1,4,5,NA +71171,7,2,2,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12331.419303,13281.948926,2,95,6,6,1.65,2,2,0,0,2,1,62,1,1,1,3 +71172,7,2,2,42,NA,4,4,1,NA,NA,2,NA,2,2,5,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,25774.834017,25516.02368,1,100,5,5,1.05,3,3,1,0,0,2,42,2,5,1,NA +71173,7,2,2,5,NA,1,1,1,5,69,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,1,1,2,1,NA,NA,NA,NA,13560.780585,14415.696661,2,96,3,3,0.46,5,5,1,2,0,1,37,1,1,1,2 +71174,7,2,1,11,NA,3,3,1,11,141,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19272.757026,20113.595939,1,94,6,6,1.18,5,5,1,2,0,1,30,1,3,1,3 +71175,7,2,1,73,NA,2,2,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,16928.800715,17540.589716,1,90,9,9,3.97,2,2,0,0,1,1,73,1,4,1,5 +71176,7,2,1,62,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,7611.107768,7521.80097,2,97,4,4,1.47,1,1,0,0,1,1,62,1,4,3,NA +71177,7,1,2,4,NA,2,2,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10308.095307,0,2,90,14,14,3.06,5,5,1,2,0,1,42,1,4,1,5 +71178,7,2,2,4,NA,2,2,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10308.095307,10747.298537,2,90,3,3,0.46,5,5,3,0,0,2,22,1,2,5,NA +71179,7,1,2,32,NA,4,4,NA,NA,NA,2,NA,2,1,2,NA,5,1,3,1,2,2,1,2,2,NA,NA,NA,NA,27303.803575,0,1,96,7,7,2.23,3,3,1,0,0,1,29,2,5,1,5 +71180,7,2,1,57,NA,4,4,2,NA,NA,2,NA,2,2,2,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,12517.592486,12477.667198,1,96,10,10,1.8,7,7,1,1,0,1,57,2,1,1,3 +71181,7,2,1,19,NA,4,4,1,19,235,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,17606.165994,17558.40257,2,101,6,1,0.23,3,1,0,0,0,1,21,1,4,5,NA +71182,7,2,2,47,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,20084.755052,20500.648257,1,99,15,8,2.7,4,3,0,2,0,1,49,1,4,6,NA +71183,7,2,1,38,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,107347.639721,117795.71535,3,92,6,6,1.17,4,4,0,2,0,2,30,1,2,1,4 +71184,7,2,1,64,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,12579.986433,13271.133625,1,92,14,14,5,1,1,0,0,1,1,64,1,5,3,NA +71185,7,2,1,29,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,50647.682308,56120.478778,2,96,7,7,2.38,2,2,0,0,0,1,29,1,3,1,4 +71186,7,2,1,1,17,1,1,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,6,6,1.25,4,4,1,0,1,1,46,1,2,6,NA +71187,7,2,2,63,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,3,NA,1,2,2,1,2,2,1,2,2,1,9609.522554,10094.833809,3,91,2,2,0.72,1,1,0,0,1,2,63,1,1,3,NA +71188,7,2,2,1,14,4,4,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,7710.515686,2,100,5,5,0.94,4,4,2,0,0,2,33,1,4,6,NA +71189,7,2,1,51,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,144353.133634,150786.620773,1,94,15,15,5,3,3,0,1,0,2,43,1,5,1,5 +71190,7,2,2,12,NA,4,4,1,12,150,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12327.773112,12176.001893,2,95,1,1,0.18,4,4,2,1,0,2,38,1,2,5,NA +71191,7,2,2,15,NA,4,4,2,16,192,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11711.384457,11558.024533,2,95,8,8,1.61,6,6,1,3,0,2,48,1,3,5,NA +71192,7,2,1,1,23,2,2,2,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13002.944731,13931.716845,2,91,9,9,2.6,4,4,1,1,0,2,31,2,4,1,5 +71193,7,2,2,7,NA,3,3,2,7,85,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,19880.837381,19616.828143,1,101,6,6,0.87,6,6,2,2,0,2,23,1,4,6,NA +71194,7,2,2,61,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,11696.973403,11982.125462,2,101,4,4,0.85,4,4,1,0,1,2,61,1,4,3,NA +71195,7,2,2,36,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,16663.714937,17273.763859,2,93,15,15,5,3,3,1,0,0,1,41,2,5,1,5 +71196,7,2,2,18,NA,5,6,1,18,223,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,1,1,2,2,1,5668.184078,5913.178809,2,92,10,8,2.01,7,4,1,1,1,2,27,2,3,1,3 +71197,7,2,1,36,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15867.258653,16587.349339,3,91,5,5,1.07,4,4,0,2,0,2,36,1,5,1,4 +71198,7,2,2,11,NA,4,4,1,11,138,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11195.065587,11726.17681,2,96,7,7,1.33,6,6,0,3,1,1,74,1,1,1,NA +71199,7,2,2,49,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21857.756498,23340.233721,2,97,7,7,1.92,3,3,0,1,0,1,57,1,4,1,4 +71200,7,2,1,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,151766.599459,151581.541662,3,91,15,15,5,1,1,0,0,0,1,51,1,5,5,NA +71201,7,2,2,57,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,17852.668137,18572.420627,3,91,6,6,1.77,2,2,0,0,0,2,57,2,1,1,1 +71202,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,65706.229298,75664.626338,1,101,7,7,2.64,2,2,0,0,2,1,80,1,1,1,3 +71203,7,2,2,63,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,10391.563983,10953.658293,3,90,14,14,4.96,2,2,0,0,2,1,68,1,3,1,5 +71204,7,2,2,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,46606.430863,46728.795934,2,102,14,14,3.25,5,5,2,0,0,1,27,1,5,1,5 +71205,7,2,2,12,NA,3,3,2,12,146,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,132630.209478,135755.422092,1,97,14,14,3.36,4,4,0,2,0,2,49,1,5,1,5 +71206,7,2,1,29,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,9938.495618,10209.075521,1,93,15,6,2.3,6,1,0,0,0,1,34,2,5,5,NA +71207,7,1,1,7,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10229.206765,0,1,96,14,14,2.96,5,5,0,3,0,1,46,NA,NA,1,5 +71208,7,2,1,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16905.961576,17805.493573,2,94,10,10,4.76,2,2,0,0,0,1,32,1,5,1,5 +71209,7,2,2,2,NA,1,1,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,10099.930724,10530.26456,2,96,6,6,0.87,6,6,1,3,0,1,46,2,1,1,1 +71210,7,2,1,0,0,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12909.068713,12685.898973,2,92,1,1,0.22,3,3,1,0,0,1,22,1,4,6,NA +71211,7,2,2,32,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23038.68441,23821.989403,1,92,6,6,1.92,2,2,0,0,0,2,33,2,4,5,NA +71212,7,2,2,65,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,49568.196121,50175.172049,1,101,3,3,1.24,1,1,0,0,1,2,65,1,2,2,NA +71213,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,65897.669973,68436.247366,1,99,77,77,NA,3,3,0,0,0,1,42,1,4,6,NA +71214,7,2,2,11,NA,1,1,1,11,138,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,14414.529053,14932.182215,2,96,6,6,0.87,6,6,1,3,0,1,46,2,1,1,1 +71215,7,2,1,60,NA,3,3,2,NA,NA,2,NA,2,1,77,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,19328.482066,19868.466665,3,90,77,77,NA,1,1,0,0,1,1,60,2,5,5,NA +71216,7,2,1,46,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,20197.354438,20310.389983,2,96,8,8,3.4,2,2,0,0,0,1,46,2,4,1,4 +71217,7,2,1,28,NA,1,1,1,NA,NA,2,NA,2,7,5,NA,3,5,NA,2,2,2,2,2,2,1,2,2,1,47487.549895,48753.51505,1,102,7,7,1.89,3,3,0,0,0,1,53,2,1,1,1 +71218,7,2,1,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,87891.395784,92007.216086,2,99,15,15,5,1,1,0,0,0,1,33,1,5,5,NA +71219,7,2,1,60,NA,4,4,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7915.816068,7977.736071,2,93,6,6,1.13,4,4,0,0,2,1,60,2,3,1,3 +71220,7,2,1,4,NA,4,4,1,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11920.911192,13144.753907,2,96,14,14,3.58,4,4,2,0,0,1,36,1,4,1,5 +71221,7,2,1,1,20,1,1,1,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13305.770449,13726.956753,3,92,5,5,0.68,6,6,3,0,0,2,19,1,4,NA,NA +71222,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,191547.714427,193526.009858,2,91,15,10,5,2,1,0,0,0,2,55,1,5,6,NA +71223,7,2,2,25,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,30275.274308,30320.430859,2,101,3,2,0.82,2,1,0,0,0,2,25,1,4,5,NA +71224,7,2,2,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,44636.780791,46200.180609,2,91,6,6,1.26,5,5,0,1,2,2,80,1,4,2,NA +71225,7,2,1,0,1,1,1,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6298.658963,6412.943673,2,94,77,77,NA,4,4,2,0,0,2,27,2,3,1,3 +71226,7,2,2,0,7,3,3,1,NA,7,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7272.728291,7471.815482,1,98,13,13,NA,5,5,2,1,0,1,31,1,3,1,3 +71227,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13209.159597,13930.540942,2,95,6,6,1.08,4,4,1,1,0,1,39,1,4,1,4 +71228,7,2,2,49,NA,1,1,2,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,31273.071103,31436.157508,1,90,12,12,NA,5,5,0,1,0,2,49,2,1,1,NA +71229,7,2,1,48,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,1,1,2,1,1,2,1,3,12066.381592,12177.318898,1,103,4,4,0.82,3,3,0,0,0,1,48,2,4,1,1 +71230,7,1,1,30,NA,1,1,NA,NA,NA,2,NA,2,2,4,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,34887.439952,0,2,94,4,4,0.72,4,4,1,1,0,1,30,2,1,1,3 +71231,7,2,1,52,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,17796.910402,18163.842064,1,103,2,2,0.63,1,1,0,0,0,1,52,1,3,4,NA +71232,7,2,2,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,32041.645327,32131.786508,1,94,2,2,0.73,1,1,0,0,0,2,55,1,3,3,NA +71233,7,2,1,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12267.215138,12511.113657,2,102,2,2,0.36,4,4,1,2,0,2,36,1,3,5,NA +71234,7,2,2,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,154825.466557,157902.106304,1,91,7,7,2.92,2,2,0,0,1,2,47,1,5,5,NA +71235,7,2,1,9,NA,3,3,1,9,115,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38712.032122,41122.784973,3,91,15,15,5,6,6,1,3,0,2,40,1,5,1,5 +71236,7,2,2,2,NA,4,4,2,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7338.212404,7527.624117,1,93,7,7,2.16,3,3,1,0,0,2,28,2,2,1,5 +71237,7,2,2,43,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,35469.911999,36868.395052,2,91,12,13,NA,3,1,0,0,1,1,52,1,4,3,NA +71238,7,2,2,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,20186.483875,20343.011032,1,99,13,13,NA,4,4,0,2,0,1,55,NA,NA,1,4 +71239,7,2,1,48,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,1,148090.195644,148420.972197,1,98,5,5,1.79,1,1,0,0,0,1,48,1,1,2,NA +71240,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,6512.729795,7017.196255,1,93,2,2,0.69,1,1,0,0,1,1,80,1,5,2,NA +71241,7,2,2,0,9,4,4,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4588.59937,4638.701468,2,95,10,10,3.82,3,3,1,0,0,1,25,1,4,1,4 +71242,7,2,1,48,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,19436.026093,19746.342802,2,97,9,9,1.45,7,7,1,2,2,2,45,1,3,5,NA +71243,7,2,1,17,NA,4,4,1,18,216,2,NA,2,1,5,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19163.050164,19648.623212,2,102,14,14,4.48,3,3,0,2,0,1,41,1,3,4,NA +71244,7,2,2,64,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,118437.327505,122585.585802,1,90,15,15,5,1,1,0,0,1,2,64,1,5,3,NA +71245,7,2,1,62,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,7654.035132,8195.014907,3,90,9,9,2.6,4,4,0,0,1,1,62,2,4,1,5 +71246,7,2,1,14,NA,1,1,1,14,178,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23389.620035,24913.232835,1,91,14,14,3.9,4,4,0,1,0,1,41,1,2,1,4 +71247,7,2,1,13,NA,4,4,1,13,162,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,NA,NA,NA,1,2,2,1,14650.502937,14679.468181,2,102,14,14,3.25,5,5,1,1,0,2,32,1,4,1,3 +71248,7,2,1,4,NA,5,6,1,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10123.286306,10422.822776,1,100,15,15,5,3,3,1,0,0,2,28,2,5,1,5 +71249,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,17420.978407,17335.115714,2,97,3,3,0.82,2,2,0,0,0,1,24,1,3,5,NA +71250,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,20486.987447,22351.0228,2,101,3,1,0,4,1,0,2,0,1,39,1,1,6,NA +71251,7,1,1,60,NA,4,4,NA,NA,NA,2,NA,2,1,99,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,12848.137255,0,1,101,15,15,5,2,2,0,0,2,1,60,2,5,1,NA +71252,7,2,2,41,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,4,1,2,2,2,2,1,2,2,1,2,2,2,25778.164795,25912.595732,2,90,2,2,0.25,5,5,0,1,0,2,41,2,4,1,NA +71253,7,1,2,47,NA,3,3,NA,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,125799.478905,0,1,100,15,15,4.63,5,5,0,0,0,1,51,1,5,1,3 +71254,7,2,2,50,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10964.859884,13217.672684,3,90,77,77,NA,3,3,0,1,0,1,54,2,3,1,3 +71255,7,2,2,2,NA,3,3,1,2,35,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14950.402914,15888.087777,1,102,5,1,0.21,5,4,1,1,0,2,24,1,4,5,NA +71256,7,2,2,7,NA,4,4,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7428.928475,8424.338415,3,91,1,1,0.07,6,6,2,3,0,2,30,1,2,3,NA +71257,7,2,1,7,NA,4,4,1,7,90,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8714.559478,8887.823591,2,96,7,7,1.04,7,7,0,4,0,2,37,1,3,3,NA +71258,7,2,2,19,NA,2,2,2,19,232,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,15442.648697,17482.235263,3,90,10,8,4.3,2,1,0,0,0,1,33,1,3,6,NA +71259,7,2,2,23,NA,5,6,2,NA,NA,1,2,1,1,NA,NA,3,5,2,1,2,2,1,2,2,1,2,2,1,16844.740449,19586.242825,3,91,99,1,0.28,3,1,0,0,0,2,23,1,3,5,NA +71260,7,2,2,14,NA,1,1,1,14,171,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20347.899985,21072.708732,3,92,15,15,3.15,7,7,0,4,0,2,35,2,3,3,NA +71261,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,1,3,NA,1,5,NA,2,2,2,1,2,2,1,2,2,2,24004.6026,24129.784561,2,91,6,6,0.93,5,5,1,2,0,2,50,2,1,5,NA +71262,7,2,1,15,NA,3,3,2,15,181,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,61479.689958,61628.148021,2,100,15,15,4.5,6,6,0,4,0,1,45,1,5,1,5 +71263,7,2,1,47,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,22685.373982,23664.393091,1,98,1,1,0,4,4,0,3,0,1,47,1,5,3,NA +71264,7,2,2,20,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,30253.427014,30121.660039,2,90,15,15,4.2,5,5,1,0,0,2,50,NA,NA,6,NA +71265,7,2,2,15,NA,4,4,2,15,187,NA,NA,1,1,NA,10,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7825.55935,7975.961244,3,90,15,15,5,5,5,0,1,1,2,61,1,5,2,NA +71266,7,2,2,68,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,117131.838201,119452.245796,1,94,14,14,5,2,2,0,0,2,1,74,1,4,1,4 +71267,7,2,2,41,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,20001.392001,20614.835005,1,100,8,8,2.62,3,3,0,1,0,1,41,2,5,1,5 +71268,7,2,1,5,NA,3,3,2,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,26500.001625,29898.299515,2,91,7,7,1.29,6,6,2,2,0,1,33,2,3,6,NA +71269,7,1,1,33,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,12556.207754,0,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +71270,7,2,2,15,NA,2,2,2,15,185,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17381.663677,18792.085501,1,90,7,7,2.1,3,3,0,2,0,2,37,1,3,5,NA +71271,7,2,1,57,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,31872.125984,31404.451666,2,96,6,6,1.12,4,4,0,1,0,1,57,2,1,1,4 +71272,7,2,1,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,77440.662578,92128.223811,2,93,8,8,3.3,2,2,0,0,0,2,26,1,4,1,5 +71273,7,2,1,11,NA,1,1,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,13933.628196,2,98,6,6,1.9,2,2,0,1,0,2,34,1,4,3,NA +71274,7,2,2,28,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,6,2,1,2,2,1,2,2,1,2,2,1,49473.624024,50829.110777,3,91,14,14,5,2,2,0,0,0,1,32,1,4,6,NA +71275,7,2,2,12,NA,4,4,1,12,148,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,20473.346601,20523.769333,2,102,15,15,3.82,5,5,1,2,0,1,34,1,3,1,4 +71276,7,2,2,0,5,3,3,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17070.097848,16606.436082,1,101,7,7,1.79,4,4,1,0,0,2,30,1,4,1,4 +71277,7,2,2,4,NA,1,1,1,4,52,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15457.736897,17065.756351,2,98,2,2,0.27,4,4,2,1,0,2,32,2,2,5,NA +71278,7,2,1,69,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7101.739553,7379.502561,1,96,99,99,NA,1,1,0,0,1,1,69,1,2,1,NA +71279,7,2,1,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,27356.080541,27285.808403,1,98,6,6,1.11,5,5,1,2,0,2,32,1,2,1,2 +71280,7,2,2,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,95778.224595,101717.815372,1,98,8,8,2.46,3,3,1,0,0,1,29,1,4,6,NA +71281,7,2,1,2,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7667.509064,7761.032365,2,91,2,2,0.41,3,3,1,1,0,2,30,1,3,5,NA +71282,7,2,2,25,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,12426.473257,13266.565637,2,92,14,7,3.4,2,1,0,0,0,1,26,NA,NA,5,NA +71283,7,2,2,0,1,2,2,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,8168.833251,8141.91987,2,91,5,5,1.05,3,3,2,0,0,2,26,2,3,4,NA +71284,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,10049.7347,10691.470743,2,90,2,2,0.67,2,2,0,0,1,2,64,1,5,5,NA +71285,7,2,1,10,NA,1,1,1,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13927.458372,14258.502552,2,98,5,5,1.07,4,4,0,1,0,1,52,2,1,1,3 +71286,7,2,2,56,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,22969.116046,23497.145655,2,93,6,6,2.69,1,1,0,0,0,2,56,2,4,3,NA +71287,7,1,2,3,NA,3,3,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,26966.264969,0,1,98,4,4,0.66,4,4,2,0,0,2,22,1,4,6,NA +71288,7,2,1,68,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,140586.349952,144513.945685,2,91,15,15,5,2,2,0,0,2,1,68,1,5,1,5 +71289,7,2,2,32,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,27375.405353,27906.494528,1,94,5,5,0.95,4,4,1,2,0,2,32,1,4,3,NA +71290,7,2,2,10,NA,2,2,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12737.089292,13281.887291,1,94,14,14,3.4,5,5,0,3,0,2,41,1,4,1,4 +71291,7,2,1,50,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,182279.501656,183739.903765,1,100,6,6,1.98,2,2,0,0,0,1,50,1,5,4,NA +71292,7,2,2,36,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,28747.860416,30448.398533,1,99,10,10,3.13,4,4,0,2,0,1,35,1,4,1,5 +71293,7,2,1,3,NA,2,2,2,3,41,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,13353.801759,13870.061432,1,93,6,6,0.99,5,5,1,0,0,1,28,2,2,5,NA +71294,7,2,1,16,NA,4,4,1,16,201,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19163.050164,19648.623212,2,102,14,14,4.48,3,3,0,2,0,1,41,1,3,4,NA +71295,7,2,1,25,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,110218.970616,129453.540645,1,93,7,7,3.21,1,1,0,0,0,1,25,1,4,5,NA +71296,7,2,2,32,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,27367.658704,28808.672115,1,91,4,4,0.81,4,4,1,1,0,1,32,1,4,6,NA +71297,7,2,1,19,NA,4,4,1,19,230,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12147.046136,12703.852077,2,100,4,4,0.91,3,3,0,0,0,2,49,1,2,1,2 +71298,7,2,2,7,NA,5,6,2,7,90,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10699.45895,11403.206057,1,97,14,14,2.29,7,7,1,2,2,1,40,2,1,1,1 +71299,7,2,1,2,NA,4,4,1,2,26,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,11283.202594,2,101,4,4,1.22,2,2,1,0,0,2,25,1,4,5,NA +71300,7,2,2,35,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,12381.032047,12845.540957,1,102,15,15,4.59,4,4,1,1,0,1,35,1,5,1,5 +71301,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,44417.237618,45651.906489,1,102,1,1,0.24,3,2,0,0,1,2,50,1,3,3,NA +71302,7,2,2,56,NA,4,4,1,NA,NA,2,NA,2,2,6,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,18146.994087,18265.36374,2,93,4,4,1.29,2,2,0,1,0,2,56,2,3,4,NA +71303,7,2,2,4,NA,4,4,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9707.610673,10138.677842,2,93,5,5,0.92,4,4,1,1,0,1,27,2,2,5,NA +71304,7,2,1,1,19,1,1,2,NA,19,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,11972.170914,12351.142913,1,97,8,8,1.45,6,6,2,2,0,2,36,2,2,1,1 +71305,7,2,1,7,NA,1,1,1,7,89,NA,NA,1,1,NA,0,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,14820.807433,15055.338709,2,102,7,7,1.89,3,3,0,1,0,1,41,2,2,6,NA +71306,7,2,2,52,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,12441.719186,12605.354834,2,100,15,15,5,3,3,0,1,0,1,58,2,5,1,5 +71307,7,2,1,58,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,132969.642582,132807.505002,2,91,5,5,1.39,2,2,0,0,0,1,58,1,4,3,NA +71308,7,2,2,69,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,8493.33267,8821.144988,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +71309,7,2,2,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,NA,25964.813959,27606.791932,2,101,NA,77,NA,2,1,0,0,0,1,55,1,2,3,NA +71310,7,2,2,67,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,11879.290971,12409.688606,2,96,6,6,2.04,2,2,0,0,1,2,67,1,4,2,NA +71311,7,2,2,80,NA,2,2,1,NA,NA,2,NA,2,1,9,NA,2,1,NA,2,2,2,1,2,2,2,2,2,NA,21810.940874,23452.513609,2,93,8,8,2.17,4,4,0,0,3,1,80,2,2,1,2 +71312,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15214.43631,2,100,8,8,2.67,3,3,0,0,1,1,61,1,3,1,4 +71313,7,2,1,52,NA,4,4,2,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,19374.410926,19463.695548,1,96,77,77,NA,4,4,0,0,0,1,52,2,5,1,5 +71314,7,2,1,51,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,30839.213846,30386.695922,1,92,4,4,0.74,4,4,1,1,0,1,51,2,1,1,1 +71315,7,2,1,44,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,105141.812429,112387.793787,1,98,6,6,1.11,5,5,0,2,1,2,37,1,1,1,1 +71316,7,2,1,57,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,100418.893093,106630.269812,2,100,10,10,3.13,4,4,0,0,1,2,53,1,2,1,2 +71317,7,2,1,0,1,4,4,2,NA,2,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5848.582979,6109.207769,2,97,4,4,0.57,5,5,1,3,0,2,33,1,3,5,NA +71318,7,2,2,2,NA,4,4,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6984.912286,7371.360851,2,93,10,10,2.26,6,6,2,0,0,1,34,1,4,1,4 +71319,7,2,2,2,NA,3,3,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,33502.281129,33942.512387,1,91,15,15,5,4,4,1,1,0,1,29,1,4,6,NA +71320,7,1,1,2,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,10273.602479,0,1,92,12,12,NA,4,4,1,1,0,1,33,2,4,1,4 +71321,7,2,2,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,24713.281483,24036.937705,1,92,14,14,4.96,2,2,0,0,0,1,25,1,4,5,NA +71322,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,20949.647122,21006.826162,2,91,4,4,0.84,3,3,1,0,0,2,21,1,4,1,2 +71323,7,2,1,9,NA,5,6,2,9,117,NA,NA,2,2,1,3,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,5855.595238,6345.238788,1,91,14,14,4.32,3,3,0,2,0,2,37,2,5,1,NA +71324,7,2,1,35,NA,2,2,2,NA,NA,2,NA,2,2,5,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,38923.140296,40970.697433,1,93,9,9,2.46,4,4,0,2,0,1,35,2,1,1,1 +71325,7,2,2,3,NA,3,3,2,3,42,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24600.429016,26143.360672,1,91,6,6,1.07,6,6,3,1,0,2,27,1,4,6,NA +71326,7,2,1,6,NA,4,4,2,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8655.162127,8668.652185,2,95,6,6,0.86,6,6,0,4,0,2,32,1,4,6,NA +71327,7,2,1,3,NA,1,1,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16775.083123,16797.750213,2,98,2,2,0.27,4,4,2,0,0,2,20,2,2,6,NA +71328,7,2,2,54,NA,2,2,1,NA,NA,2,NA,2,1,4,NA,4,3,NA,2,2,2,1,2,2,2,2,2,2,26226.50904,26977.257389,2,93,7,7,1.74,4,4,1,0,1,2,24,NA,NA,4,NA +71329,7,2,1,8,NA,3,3,2,8,100,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,63513.013195,68899.034203,2,101,7,7,1.57,4,4,0,2,0,2,28,1,3,6,NA +71330,7,2,1,39,NA,5,6,1,NA,NA,2,NA,2,1,3,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,9585.652672,9712.791327,2,92,10,6,1.12,7,4,1,1,1,2,27,2,3,1,3 +71331,7,2,2,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,9767.083234,9561.595244,3,92,10,10,2.82,4,4,2,0,0,1,26,2,3,1,3 +71332,7,2,2,10,NA,1,1,1,10,129,NA,NA,1,1,NA,4,NA,NA,NA,2,1,1,1,2,1,1,2,2,1,20495.125801,20710.596821,3,92,6,6,0.96,5,5,2,1,0,2,26,2,1,1,1 +71333,7,2,2,30,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,52521.960331,51104.807504,1,92,10,10,4.63,2,2,0,0,0,1,35,2,5,1,4 +71334,7,2,1,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,15682.233511,17550.107712,1,98,6,6,1.9,2,2,0,0,2,1,80,1,1,1,2 +71335,7,1,1,61,NA,2,2,NA,NA,NA,2,NA,2,1,6,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,6449.12882,0,2,93,77,77,NA,3,3,0,0,3,1,61,2,1,1,1 +71336,7,2,1,45,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14695.245859,15160.543049,2,92,15,15,5,3,3,0,1,0,1,45,2,4,1,4 +71337,7,2,1,7,NA,3,3,2,7,87,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64268.100156,67147.933534,1,98,15,15,4.07,5,5,0,3,0,1,38,1,2,1,4 +71338,7,2,2,8,NA,4,4,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11195.065587,11638.702248,2,96,2,2,0.43,3,3,0,2,0,2,50,1,2,5,NA +71339,7,2,2,69,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,39030.893313,39804.103933,1,91,5,5,1.2,3,3,0,0,1,1,58,1,2,1,2 +71340,7,2,2,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,24919.497762,26574.647337,1,95,5,5,1.1,3,3,0,0,1,2,63,1,4,1,5 +71341,7,2,1,58,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,14897.510053,14959.811939,1,101,15,15,5,3,3,0,0,1,1,58,2,4,1,5 +71342,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,46965.818538,52174.805072,1,101,7,7,2.64,2,2,0,0,2,1,80,1,1,1,3 +71343,7,2,2,29,NA,3,3,2,NA,NA,2,NA,2,1,6,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,105134.853452,122679.602456,2,99,14,14,5,1,1,0,0,0,2,29,2,5,5,NA +71344,7,2,1,65,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,28953.774534,29107.622897,1,98,4,4,1,3,3,0,1,1,1,65,1,2,1,NA +71345,7,1,1,60,NA,1,1,NA,NA,NA,2,NA,2,2,77,NA,2,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,12845.115724,0,1,100,4,4,0.78,4,4,0,0,1,1,33,2,1,1,1 +71346,7,2,2,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,NA,44856.466004,46390.551109,2,94,12,9,5,2,1,0,0,1,2,74,1,5,3,NA +71347,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,32461.799549,32422.216998,1,95,6,2,0.81,2,1,0,0,0,1,53,1,2,6,NA +71348,7,2,1,56,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,25118.469449,26051.81361,2,98,6,6,1.4,3,3,0,1,0,1,56,1,2,1,2 +71349,7,1,1,78,NA,5,6,NA,NA,NA,2,NA,2,1,6,NA,1,2,NA,1,2,1,1,2,2,NA,NA,NA,NA,9748.579573,0,3,90,8,8,1.85,5,5,0,0,1,2,25,1,5,5,NA +71350,7,2,2,6,NA,4,4,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9502.76472,9802.874785,1,96,3,3,0.93,2,2,0,1,0,2,40,1,5,5,NA +71351,7,2,2,52,NA,5,6,1,NA,NA,2,NA,2,1,8,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,11876.875273,12162.823626,2,103,15,15,5,3,3,0,0,0,2,52,2,4,1,5 +71352,7,2,2,10,NA,5,6,2,10,130,NA,NA,2,1,3,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9227.090107,9685.088635,2,100,5,5,0.89,4,4,0,1,0,2,40,2,3,1,3 +71353,7,2,2,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,36067.495928,37024.300659,1,95,3,3,1.29,1,1,0,0,1,2,76,1,3,2,NA +71354,7,2,1,50,NA,1,1,1,NA,NA,1,1,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,37557.946192,37666.079092,2,102,7,7,3.49,4,1,0,0,1,1,63,NA,NA,5,NA +71355,7,2,2,20,NA,5,6,1,NA,NA,2,NA,2,1,4,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,16026.446928,16774.880842,1,94,14,14,2.78,6,5,0,2,1,1,61,1,4,1,5 +71356,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,129867.826953,131085.811251,1,101,9,9,2.6,4,4,0,1,2,2,63,1,4,1,4 +71357,7,2,1,29,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15408.94893,15333.002917,1,99,7,7,2.38,2,2,0,0,0,2,27,1,5,1,5 +71358,7,2,2,1,22,2,2,1,NA,23,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,7815.664341,8308.38945,2,103,5,5,0.65,6,6,1,0,1,2,61,2,1,2,NA +71359,7,2,1,41,NA,2,2,2,NA,NA,2,NA,2,7,77,NA,1,1,NA,2,2,2,2,2,2,NA,NA,NA,NA,31640.296506,33247.715312,2,94,1,1,0.01,7,7,1,3,0,1,41,2,1,1,1 +71360,7,2,2,25,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,2,1,2,2,2,2,2,2,2,NA,NA,NA,NA,39426.061521,43773.817687,2,94,4,4,0.81,4,4,2,0,0,1,26,2,2,1,2 +71361,7,2,2,55,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,17852.668137,17947.072019,3,91,7,7,2.58,2,2,0,0,0,2,55,2,5,3,NA +71362,7,2,1,23,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,25815.880139,26503.609729,2,101,2,1,0.05,2,1,0,0,0,1,24,1,4,5,NA +71363,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,2,1,2,2,NA,NA,NA,1,2,2,1,16165.066826,16696.869727,2,96,NA,NA,NA,4,4,0,0,1,1,67,2,3,1,2 +71364,7,2,1,13,NA,4,4,1,13,157,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11666.009872,12200.765691,2,100,14,4,0.43,7,7,1,3,1,2,62,1,3,5,NA +71365,7,2,1,22,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21763.209029,22385.504537,2,92,4,4,1.38,4,1,0,0,0,1,21,1,4,5,NA +71366,7,2,2,20,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,114492.825466,119073.624167,2,101,3,1,0.06,3,1,0,0,0,2,20,2,4,5,NA +71367,7,2,1,7,NA,2,2,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13533.281742,13475.903543,1,100,10,10,2.91,4,4,1,1,0,1,32,1,5,1,5 +71368,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,82363.088109,88909.58429,1,90,14,14,3.93,3,3,1,0,0,1,35,1,2,1,5 +71369,7,2,2,3,NA,5,6,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3842.794137,4026.588867,1,93,6,6,1.15,5,5,1,0,2,2,70,NA,NA,1,NA +71370,7,2,1,9,NA,3,3,2,9,114,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,21087.869274,22686.932895,1,101,1,1,0.1,4,4,1,1,0,2,52,1,4,3,NA +71371,7,2,2,63,NA,5,7,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,28759.144922,29766.431764,3,90,7,7,2.51,2,2,0,0,2,1,62,2,3,1,4 +71372,7,2,1,37,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,1,6,NA,2,2,2,2,2,2,2,2,2,2,51543.062078,51154.050295,3,92,3,3,0.51,5,5,1,2,0,2,34,2,1,6,NA +71373,7,2,1,1,15,1,1,1,NA,15,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9925.934568,9762.398236,2,92,5,5,1.08,3,3,1,0,0,2,30,2,3,1,2 +71374,7,2,2,52,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,12059.495297,12169.751033,1,102,15,15,3.82,5,5,1,1,0,1,29,1,4,1,4 +71375,7,2,1,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,70819.746399,73506.573727,1,98,6,6,1.98,2,2,0,0,2,2,70,1,4,1,5 +71376,7,2,1,3,NA,1,1,1,3,39,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18754.85406,20094.472571,2,102,14,14,3.8,4,4,2,0,0,2,41,2,4,1,5 +71377,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,27199.141352,28737.286192,1,98,77,77,NA,2,2,0,0,2,1,80,1,5,1,5 +71378,7,2,1,5,NA,3,3,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39061.897809,44649.899401,1,95,15,15,3.62,7,7,2,4,0,1,59,1,5,1,2 +71379,7,2,2,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,27351.473517,27893.312251,2,94,2,2,0.83,1,1,0,0,1,2,60,1,5,5,NA +71380,7,1,2,80,NA,4,4,NA,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,15914.916287,0,2,99,5,5,1.59,2,2,0,0,1,2,80,1,3,2,NA +71381,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,1,2,2,3,12765.378725,13670.003215,2,90,14,14,4.32,3,3,0,1,0,1,48,2,4,1,5 +71382,7,2,2,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,54095.581484,61529.339683,2,94,9,9,3.97,2,2,0,0,2,1,80,1,5,1,5 +71383,7,2,2,3,NA,5,6,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,2,NA,NA,NA,NA,5060.292252,5371.954509,1,90,8,8,1.43,7,7,2,0,0,1,23,2,4,1,3 +71384,7,2,2,7,NA,1,1,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15962.145468,16285.000268,3,92,7,7,1.49,5,5,0,2,1,2,62,1,4,2,NA +71385,7,2,2,6,NA,3,3,2,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,28723.999699,28637.704803,1,97,6,6,1.03,6,6,2,2,0,2,38,1,5,1,4 +71386,7,2,2,1,23,1,1,1,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14326.094268,14518.763259,3,92,14,14,3.47,4,4,1,1,0,1,44,1,3,1,5 +71387,7,2,2,3,NA,4,4,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10437.988787,11378.89676,2,97,NA,99,NA,7,6,2,1,1,2,56,1,3,5,NA +71388,7,2,1,42,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,49060.272708,48340.388834,1,92,7,7,1.48,5,5,0,1,0,1,42,1,5,1,4 +71389,7,2,2,1,21,2,2,1,NA,22,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11443.671453,12634.120381,1,100,15,15,4.34,4,4,2,0,0,2,35,1,5,1,5 +71390,7,2,1,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,30626.145273,33111.125584,2,103,7,7,2.64,2,2,0,0,1,1,54,1,5,5,NA +71391,7,2,1,11,NA,3,3,1,11,137,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,38712.032122,41122.784973,3,91,15,15,5,6,6,1,3,0,2,40,1,5,1,5 +71392,7,2,2,43,NA,2,2,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,35485.230645,37305.51435,1,94,7,7,1.74,4,4,0,2,0,1,44,1,5,1,5 +71393,7,2,1,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,108410.783716,113500.095101,1,91,15,7,3.58,3,1,0,0,0,1,27,1,3,6,NA +71394,7,1,1,78,NA,5,6,NA,NA,NA,2,NA,2,1,5,NA,3,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,12320.168636,0,2,92,4,4,1.09,2,2,0,0,2,1,78,2,3,1,NA +71395,7,2,1,30,NA,2,2,2,NA,NA,2,NA,2,2,6,NA,1,4,NA,2,2,2,2,2,2,2,2,2,2,27605.196104,27396.850962,2,99,12,7,3.31,5,1,0,1,0,1,30,2,2,4,NA +71396,7,2,2,3,NA,4,4,2,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10936.097083,12221.030117,2,95,2,2,0.42,3,3,2,0,0,1,25,1,3,5,NA +71397,7,2,1,24,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,4,NA,1,2,2,1,2,2,1,2,2,1,23484.626749,26526.417464,2,96,14,14,5,1,1,0,0,0,1,24,1,4,4,NA +71398,7,2,1,13,NA,4,4,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11788.330261,12582.159913,2,95,6,6,0.97,6,6,2,2,0,1,37,1,3,1,4 +71399,7,2,1,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,103893.364631,104494.238956,2,95,9,9,2.22,5,5,1,0,0,1,55,1,4,1,5 +71400,7,1,1,18,NA,5,6,NA,NA,NA,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,7669.677276,0,2,95,3,3,0.99,2,2,0,0,0,1,18,1,3,NA,NA +71401,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,31785.728924,32871.467684,1,101,4,4,1.22,2,2,0,0,1,1,63,1,2,1,2 +71402,7,2,1,0,3,3,3,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21055.122405,20691.125102,1,93,15,15,4.47,4,4,2,0,0,1,31,1,5,1,5 +71403,7,2,2,30,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,31335.13799,31552.004994,1,95,5,5,0.92,5,5,1,2,0,2,30,1,4,1,4 +71404,7,2,1,18,NA,4,4,1,18,219,2,NA,1,1,NA,66,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13276.485807,15665.287637,2,100,99,99,NA,3,3,0,0,0,1,46,1,9,3,NA +71405,7,2,1,63,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,6910.118936,7233.371983,2,95,4,4,1.77,1,1,0,0,1,1,63,1,2,3,NA +71406,7,2,2,8,NA,4,4,1,8,106,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8558.832746,8898.001102,2,96,3,3,0.38,5,5,1,2,0,2,30,1,3,5,NA +71407,7,2,2,49,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,20418.635225,20918.390367,2,95,14,14,5,2,2,0,0,0,1,44,1,3,1,4 +71408,7,2,2,19,NA,2,2,2,19,238,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,16995.403684,17639.03984,2,97,2,2,0.27,3,3,2,0,0,2,19,1,3,NA,NA +71409,7,2,1,41,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,116464.874823,116165.700541,2,94,14,14,2.83,6,6,0,4,0,2,38,1,2,1,2 +71410,7,2,2,15,NA,3,3,2,15,182,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,103007.696238,104941.393061,1,101,15,15,5,4,4,0,2,0,1,43,1,4,1,5 +71411,7,2,1,8,NA,4,4,1,8,103,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,NA,9261.557132,9782.87535,2,100,1,1,0.08,5,5,1,2,0,2,19,1,3,NA,NA +71412,7,2,2,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,35269.9609,35902.08788,2,96,14,14,3.58,4,4,2,0,0,1,36,1,4,1,5 +71413,7,2,1,40,NA,2,2,1,NA,NA,2,NA,2,2,77,NA,4,6,NA,2,2,2,1,2,2,1,2,2,2,28726.575428,28964.259011,2,100,3,3,0.76,3,3,1,0,0,2,31,2,1,6,NA +71414,7,2,1,17,NA,1,1,1,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24228.858782,24355.020132,2,102,77,77,NA,4,4,0,1,0,1,47,1,2,1,3 +71415,7,2,1,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,78529.577822,86568.047729,1,98,7,7,1,7,7,2,2,0,2,34,1,4,3,NA +71416,7,2,2,39,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,16411.593279,16445.104385,2,103,15,15,5,2,2,0,0,0,2,39,2,5,5,NA +71417,7,2,1,64,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,12279.19827,12375.250021,2,102,6,6,2.04,2,2,0,0,1,1,64,1,3,1,4 +71418,7,2,2,7,NA,5,6,2,7,90,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10699.45895,11230.540406,1,97,15,15,4.77,4,4,1,1,0,2,40,1,5,1,5 +71419,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,NA,NA,NA,NA,74517.751389,77393.175383,2,94,15,15,4.59,4,4,1,1,0,2,37,1,5,1,5 +71420,7,2,2,54,NA,1,1,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,2,2,2,1,2,2,2,2,2,2,23953.14388,24078.057488,1,90,12,12,NA,4,4,0,0,0,1,54,2,4,1,2 +71421,7,2,1,3,NA,3,3,1,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,32621.433667,37288.094364,2,101,3,3,0.3,7,7,1,2,0,2,50,1,2,4,NA +71422,7,2,2,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,77778.949308,80709.488833,1,101,14,14,4.21,4,4,1,1,0,2,37,1,5,1,5 +71423,7,2,1,27,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,12540.575493,12881.998163,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +71424,7,2,1,19,NA,3,3,1,19,236,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,110478.18082,109645.964567,2,101,1,1,0.09,2,1,0,0,0,1,19,1,4,NA,NA +71425,7,2,2,13,NA,3,3,2,13,167,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,35589.982806,42898.287648,1,101,6,6,1.31,3,3,0,2,0,1,43,1,3,4,NA +71426,7,2,1,3,NA,4,4,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9016.053035,9035.668246,2,100,3,3,0.31,7,7,3,2,0,2,28,1,3,1,3 +71427,7,2,2,39,NA,5,6,1,NA,NA,2,NA,2,2,1,NA,5,1,2,1,2,1,1,2,1,NA,NA,NA,NA,15951.963269,17051.924396,3,91,14,14,3.58,4,4,1,1,0,1,39,2,5,1,5 +71428,7,2,1,35,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,99741.609501,104268.100538,1,94,6,6,1.57,3,3,0,1,0,2,28,1,4,1,4 +71429,7,2,2,9,NA,4,4,2,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8579.490652,8729.153641,2,97,3,3,0.4,6,6,2,3,0,2,25,1,2,5,NA +71430,7,2,2,65,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,1,10468.473646,11728.156896,2,90,7,7,1.61,4,4,1,1,1,2,65,1,3,2,NA +71431,7,2,2,2,NA,4,4,1,2,32,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7382.686927,8048.181894,2,100,3,3,0.27,7,7,2,1,0,2,41,1,2,5,NA +71432,7,2,2,13,NA,1,1,1,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,19329.26314,19883.967368,1,103,14,14,2.96,5,5,1,2,0,1,34,1,4,1,5 +71433,7,2,1,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,19020.83925,19736.003798,2,99,6,6,1.13,4,4,1,1,0,1,33,1,3,6,NA +71434,7,2,1,17,NA,5,6,2,17,214,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9202.202094,9789.088627,1,90,15,15,5,5,5,0,2,0,1,47,2,5,1,5 +71435,7,2,1,4,NA,5,6,2,4,49,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6564.381324,7362.671865,2,90,77,77,NA,4,3,1,0,0,2,30,2,2,5,NA +71436,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,11355.3308,11862.334174,1,96,9,9,4.13,2,2,0,0,1,2,55,1,4,5,NA +71437,7,1,2,3,NA,4,4,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,9707.610673,0,2,93,1,1,0.2,2,2,1,0,0,2,33,2,3,5,NA +71438,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,13549.492282,14020.967918,2,93,12,12,NA,4,4,0,0,2,1,72,1,2,1,4 +71439,7,2,2,3,NA,3,3,2,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,64475.568487,69419.338511,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +71440,7,2,1,10,NA,1,1,1,10,124,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12665.770043,13116.669484,1,100,9,9,2.02,6,6,0,3,1,2,39,1,4,1,5 +71441,7,2,2,12,NA,2,2,2,12,153,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,14437.97544,16344.869867,2,90,3,3,0.38,5,5,0,4,0,2,33,2,2,5,NA +71442,7,2,1,1,12,3,3,1,NA,12,NA,NA,2,2,1,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,21380.815125,22997.240081,1,103,15,15,5,3,3,1,0,0,1,26,2,5,1,5 +71443,7,2,1,7,NA,1,1,2,7,94,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,12477.812875,12553.43469,2,94,4,4,0.63,6,6,1,2,0,2,36,2,3,1,1 +71444,7,2,2,0,3,5,7,2,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6399.50062,6586.636465,1,101,2,2,0.33,4,4,2,1,0,2,26,1,4,5,NA +71445,7,2,1,2,NA,2,2,1,2,30,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,12005.116852,12547.788444,3,92,6,6,0.86,7,7,1,4,0,2,36,2,1,1,1 +71446,7,2,2,11,NA,1,1,1,11,135,NA,NA,2,2,3,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,16986.005478,17733.622754,2,102,4,4,0.57,5,5,0,3,0,1,41,2,1,1,2 +71447,7,2,2,1,19,4,4,2,NA,20,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7348.24433,8211.623817,2,95,2,2,0.33,2,2,1,0,0,2,21,1,1,5,NA +71448,7,2,2,6,NA,4,4,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9453.111053,10094.338553,1,100,6,6,1.39,4,4,0,3,0,2,29,1,4,5,NA +71449,7,2,2,40,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,3,2,1,2,2,1,2,2,1,2,2,1,128187.954928,128313.829811,1,99,12,7,3.81,2,1,0,0,0,2,40,1,4,3,NA +71450,7,2,2,34,NA,3,3,1,NA,NA,2,NA,2,2,2,NA,4,1,2,2,2,2,2,2,2,NA,NA,NA,NA,66218.994273,67969.524045,2,93,7,7,1.52,4,4,1,1,0,1,44,2,4,1,NA +71451,7,2,2,51,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,24217.957803,24014.890408,2,94,4,4,1.56,2,1,0,0,0,2,51,1,2,6,NA +71452,7,2,1,36,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,96897.480702,107123.014093,2,91,15,15,5,4,4,2,0,0,2,33,1,5,1,5 +71453,7,2,1,14,NA,5,6,1,14,171,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11657.164593,12175.606972,1,92,9,9,2.88,3,3,0,2,0,1,50,2,5,3,NA +71454,7,2,2,8,NA,3,3,1,8,106,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,18417.272091,18465.044105,1,94,5,5,1.04,4,4,0,2,0,2,29,1,3,1,3 +71455,7,2,1,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,NA,13838.08267,16302.45001,1,94,3,3,1.16,1,1,0,0,1,1,70,1,3,5,NA +71456,7,2,1,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,59473.789098,72577.011806,3,92,4,1,0.27,5,1,0,0,0,2,57,1,4,1,2 +71457,7,2,2,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,23325.73926,22687.369215,1,101,2,2,0.68,1,1,0,0,0,2,53,1,4,2,NA +71458,7,2,1,5,NA,5,6,1,5,66,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,1,NA,NA,NA,NA,8838.066777,9670.229845,3,92,77,77,NA,7,7,2,4,1,1,62,NA,NA,1,NA +71459,7,2,2,14,NA,3,3,2,14,176,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,93307.64449,95903.481223,2,94,15,15,5,3,3,0,1,0,1,49,1,3,1,1 +71460,7,2,2,47,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,19075.861607,19022.257361,1,96,15,15,5,4,4,1,1,0,1,50,1,3,1,4 +71461,7,2,1,7,NA,4,4,1,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13423.881856,13521.226684,2,101,8,8,2.43,3,3,0,1,0,1,35,1,4,6,NA +71462,7,2,1,7,NA,4,4,2,7,91,NA,NA,2,1,1,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10424.657432,11237.830079,1,93,6,6,1.35,3,3,0,1,0,1,32,2,4,1,4 +71463,7,2,1,0,4,1,1,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6298.658963,6651.880632,2,94,15,15,3.33,6,6,1,2,0,2,20,1,3,1,NA +71464,7,2,2,3,NA,1,1,2,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13366.393396,13791.68675,2,94,5,5,1.07,4,4,2,0,0,1,37,2,1,1,1 +71465,7,2,2,26,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,18070.666316,19871.407536,1,99,6,6,2.75,1,1,0,0,0,2,26,2,5,4,NA +71466,7,2,1,2,NA,2,2,1,2,33,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,11727.291842,11865.933582,2,91,2,2,0.19,5,5,3,0,0,1,24,2,1,1,3 +71467,7,2,1,48,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,141134.499671,148176.982862,2,101,8,8,2.81,3,3,0,2,0,1,48,1,3,3,NA +71468,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,17191.889135,17295.278265,2,93,2,2,0.75,1,1,0,0,0,2,50,1,3,3,NA +71469,7,2,1,12,NA,4,4,2,12,155,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9313.795042,9381.627752,1,96,77,77,NA,7,7,1,3,0,1,56,1,3,1,4 +71470,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,52209.836905,58077.47757,1,98,8,8,3.48,2,2,0,0,2,1,80,1,3,1,2 +71471,7,2,1,10,NA,3,3,2,10,123,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,44777.275016,47565.734765,1,91,7,7,1.88,4,4,1,2,0,2,43,1,5,4,NA +71472,7,2,1,32,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,16058.989596,15830.0816,2,97,3,3,0.33,6,6,2,0,0,2,32,1,2,1,3 +71473,7,2,2,38,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,34007.843648,34076.908664,2,98,10,10,4.76,2,2,0,0,0,1,42,1,2,6,NA +71474,7,2,1,25,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,18509.151292,19027.688747,2,95,2,2,0.42,3,3,2,0,0,1,25,1,3,5,NA +71475,7,2,2,12,NA,3,3,1,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39616.634313,47751.80094,2,101,3,3,0.59,4,3,0,2,0,1,39,1,1,6,NA +71476,7,2,2,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,35375.447072,38057.027004,1,97,8,8,2.51,3,3,0,1,0,1,35,1,3,1,4 +71477,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,12842.559946,13702.031196,2,95,13,13,NA,2,2,0,0,2,2,80,1,1,1,NA +71478,7,2,1,43,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,6,NA,1,2,2,1,2,2,1,2,2,1,35406.972937,35535.728875,2,98,7,7,1.53,5,5,0,0,0,2,48,1,3,5,NA +71479,7,2,2,15,NA,5,6,2,15,190,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,12224.9472,12547.183925,1,97,14,14,2.72,7,7,0,2,0,1,40,1,5,1,5 +71480,7,2,2,5,NA,4,4,2,5,65,NA,NA,2,1,2,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10544.002566,11127.362026,1,91,7,7,1.49,5,5,3,0,0,2,38,2,4,1,4 +71481,7,2,2,26,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,50915.06085,56529.78018,3,92,7,7,1.65,4,4,1,1,0,1,27,1,3,1,3 +71482,7,2,2,40,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,19075.861607,18884.31701,1,96,8,8,2,4,4,1,2,0,2,40,1,4,5,NA +71483,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,49191.372812,61149.379277,3,91,7,7,2.45,2,2,0,0,2,1,80,1,2,1,2 +71484,7,1,1,39,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,113827.590402,0,2,91,7,7,1.89,3,3,0,0,2,2,69,NA,NA,1,4 +71485,7,1,1,18,NA,5,6,NA,NA,NA,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,6666.045669,0,3,90,8,8,1.85,5,5,0,0,1,2,25,1,5,5,NA +71486,7,2,2,11,NA,4,4,2,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8549.049441,9128.952244,2,99,6,6,1.73,3,3,1,1,1,2,60,1,4,3,NA +71487,7,2,2,13,NA,5,6,1,13,159,NA,NA,2,2,4,7,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,6145.01663,6410.621394,2,92,6,6,1.3,4,4,0,1,0,2,48,2,3,1,3 +71488,7,2,2,41,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,23409.362971,23966.406748,2,96,5,5,1.08,3,3,0,1,0,2,41,1,3,1,NA +71489,7,2,2,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,23545.494186,22594.243077,2,99,8,8,3.47,2,2,0,0,1,2,74,1,5,2,NA +71490,7,2,2,11,NA,1,1,1,11,133,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13490.527555,13974.998066,2,96,5,5,0.68,6,6,0,3,2,1,60,2,1,1,1 +71491,7,2,1,12,NA,3,3,1,13,156,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,23588.786918,23619.012758,1,94,7,7,1.29,6,6,1,3,0,1,38,1,3,1,2 +71492,7,2,2,51,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,32041.645327,31772.976371,3,91,7,7,1.1,7,7,0,4,0,1,40,1,4,1,3 +71493,7,2,1,14,NA,1,1,1,15,180,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22768.423624,22944.003607,2,98,8,8,3.06,2,2,0,1,0,2,56,1,3,3,NA +71494,7,2,1,29,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,17191.065623,18600.361918,1,100,5,5,1.79,2,1,0,0,0,1,27,NA,NA,5,NA +71495,7,2,2,28,NA,2,2,2,NA,NA,2,NA,2,1,6,NA,3,6,2,1,2,2,1,2,2,1,2,2,1,43200.700326,51577.05558,1,97,5,5,1.04,4,4,1,1,0,1,32,1,3,6,NA +71496,7,2,1,65,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,1,4,NA,2,2,2,2,2,2,1,2,2,2,6564.099986,6927.048144,2,95,12,3,1.07,4,1,0,0,1,1,65,2,1,4,NA +71497,7,2,2,71,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,NA,27602.403077,28546.401551,1,94,2,2,0.55,2,2,0,0,2,2,75,1,1,3,NA +71498,7,2,2,5,NA,4,4,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10389.292229,10850.629517,2,95,4,4,0.65,4,4,1,2,0,2,27,1,3,5,NA +71499,7,2,1,16,NA,4,4,2,16,197,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11834.781205,12063.950506,2,90,15,15,5,4,4,1,1,0,1,53,2,5,1,5 +71500,7,2,1,6,NA,1,1,1,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13927.458372,14007.413517,2,98,15,15,4.97,5,5,0,3,0,1,39,1,5,1,5 +71501,7,2,2,2,NA,3,3,2,2,29,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,50995.241584,52601.79766,2,91,14,14,4.12,4,4,2,0,0,1,35,1,5,1,5 +71502,7,2,1,16,NA,1,1,1,16,193,NA,NA,1,1,NA,8,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,19570.996814,19477.677478,2,100,4,4,0.81,4,4,0,2,0,1,56,1,4,1,2 +71503,7,2,1,30,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21200.922169,24170.169783,2,99,9,9,4.92,1,1,0,0,0,1,30,1,4,5,NA +71504,7,2,2,16,NA,1,1,1,16,200,NA,NA,2,2,4,10,NA,NA,NA,2,2,2,1,2,2,1,2,2,1,22753.900764,24458.613732,1,100,2,2,0.35,4,4,0,1,0,2,40,2,2,5,NA +71505,7,2,1,33,NA,2,2,2,NA,NA,2,NA,2,1,3,NA,3,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,43108.74283,42989.380022,2,91,7,7,2.64,2,2,0,1,0,1,33,2,3,1,NA +71506,7,2,2,0,2,5,7,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9148.090461,9086.623516,1,92,9,9,3.14,3,3,1,0,0,2,30,1,5,1,5 +71507,7,2,1,1,15,1,1,2,NA,16,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11160.282155,11957.436882,2,97,2,2,0.27,3,3,2,0,0,2,19,1,3,NA,NA +71508,7,2,1,1,20,4,4,2,NA,21,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10232.679671,11283.202594,2,101,2,2,0.48,2,2,1,0,0,2,19,1,3,NA,NA +71509,7,2,2,60,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,3,2,NA,1,2,1,1,2,1,1,2,1,3,12627.660237,14547.347393,2,101,99,99,NA,2,2,0,0,1,2,60,2,3,2,NA +71510,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,1,2,1,2,2,1,2,2,NA,46372.402053,52744.849017,1,90,5,5,1.05,3,3,0,0,3,2,60,1,5,77,NA +71511,7,2,1,64,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,1,NA,1,2,2,NA,NA,NA,1,2,2,1,11842.156092,12450.236093,2,96,NA,NA,NA,3,3,0,0,2,1,64,2,4,1,NA +71512,7,2,1,18,NA,2,2,1,18,222,2,NA,2,2,2,13,NA,NA,NA,2,2,2,2,2,2,2,2,2,2,18206.126374,18280.234909,2,93,4,4,0.82,4,4,0,0,0,1,51,2,3,1,3 +71513,7,2,1,18,NA,2,2,1,18,217,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,2,2,2,1,2,2,1,17555.907575,17627.369376,2,93,6,6,1.39,4,4,0,0,0,1,53,2,3,1,3 +71514,7,2,2,1,15,2,2,2,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9955.153132,10089.038145,2,94,77,77,NA,4,4,2,0,0,2,32,2,4,1,4 +71515,7,2,1,55,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27735.830485,32770.478954,2,91,14,14,4.19,3,3,0,1,0,1,55,2,3,1,5 +71516,7,2,1,23,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,79607.896323,82775.96099,2,92,6,6,2.75,1,1,0,0,0,1,23,1,5,5,NA +71517,7,2,2,56,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,15521.115746,15563.161752,1,96,2,2,0.4,3,3,0,0,0,2,56,1,3,3,NA +71518,7,2,2,6,NA,5,6,1,6,75,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5139.061504,5511.809249,2,103,77,77,NA,5,5,0,2,0,2,39,2,5,1,5 +71519,7,2,1,12,NA,4,4,2,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11085.075029,10992.519505,1,93,7,7,1.97,4,4,1,2,0,2,33,1,4,3,NA +71520,7,2,2,2,NA,2,2,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10099.930724,10736.663476,2,96,1,1,0.06,5,5,2,1,0,1,27,2,3,1,4 +71521,7,2,1,18,NA,4,4,2,18,222,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,13416.172328,13513.882801,1,96,15,15,5,4,4,0,1,0,1,42,2,4,1,4 +71522,7,2,2,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,41983.304745,42669.243011,1,95,5,5,1.1,3,3,0,0,1,2,63,1,4,1,5 +71523,7,2,1,2,NA,4,4,2,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6441.733603,6707.906886,1,91,7,7,1.49,5,5,3,0,0,2,38,2,4,1,4 +71524,7,2,2,16,NA,5,6,1,16,199,NA,NA,2,2,2,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8391.252153,8753.945484,1,92,12,12,NA,7,7,1,2,1,2,45,2,3,1,3 +71525,7,2,2,70,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,72295.614975,73067.691445,1,98,6,6,1.98,2,2,0,0,2,2,70,1,4,1,5 +71526,7,2,2,39,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,17978.142628,18083.929198,1,91,15,15,5,5,5,0,3,0,1,40,1,5,1,5 +71527,7,2,2,54,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,32032.578233,33220.140308,1,91,4,4,0.86,3,3,1,0,0,2,54,1,4,3,NA +71528,7,2,2,30,NA,4,4,2,NA,NA,2,NA,2,1,4,NA,5,5,2,1,2,2,1,2,2,NA,NA,NA,NA,26462.874679,26479.317455,2,99,15,15,4.34,4,4,0,0,0,1,59,2,4,1,5 +71529,7,2,1,33,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,26972.787983,26588.312559,2,96,10,10,4.76,2,2,0,0,0,2,26,1,5,1,4 +71530,7,2,1,68,NA,1,1,1,NA,NA,1,1,2,1,9,NA,4,1,NA,2,2,2,1,2,2,1,2,2,2,11568.876339,11794.347884,1,102,77,77,NA,2,2,0,0,2,1,68,2,4,1,1 +71531,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,109181.566304,112308.582503,2,91,15,2,0.72,7,1,0,0,1,1,49,NA,NA,5,NA +71532,7,2,1,21,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,42077.383821,44759.048785,1,102,6,6,1.34,4,4,0,1,0,2,48,2,3,1,1 +71533,7,2,2,38,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,2,1,2,2,1,2,2,NA,NA,NA,NA,31646.000316,42635.226522,1,93,1,1,0,2,2,0,1,0,2,38,1,4,3,NA +71534,7,2,1,76,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,15844.527135,16703.540642,1,95,6,6,2.04,2,2,0,0,2,2,67,1,1,2,NA +71535,7,2,2,46,NA,2,2,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,32606.880052,33604.492246,2,93,14,14,3.25,4,4,0,2,0,2,46,2,5,1,4 +71536,7,2,2,44,NA,3,3,2,NA,NA,2,NA,2,1,5,NA,5,3,1,1,2,2,1,2,2,NA,NA,NA,NA,26763.110196,27429.212861,1,100,3,3,0.92,1,1,0,0,0,2,44,2,5,3,NA +71537,7,2,1,11,NA,4,4,1,11,135,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13423.881856,14179.490667,2,101,4,4,1.02,2,2,0,1,0,2,30,1,2,77,NA +71538,7,2,2,54,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,1,21143.964074,20565.30403,1,100,5,5,0.85,5,5,0,2,0,2,54,1,2,2,NA +71539,7,2,2,16,NA,5,6,1,16,195,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,4445.888073,4534.01329,1,103,77,77,NA,6,6,0,2,2,1,70,NA,NA,1,1 +71540,7,2,2,57,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,17364.980275,17214.230108,2,93,8,8,1.67,5,5,1,1,0,2,31,1,4,5,NA +71541,7,2,2,8,NA,1,1,2,8,104,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,1,2,2,NA,15225.935813,15373.8033,2,94,5,5,1.08,3,3,0,1,0,2,37,2,2,4,NA +71542,7,2,2,67,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,99831.393624,101809.075589,2,94,15,15,5,2,2,0,0,2,2,67,1,5,1,NA +71543,7,2,2,10,NA,1,1,1,11,132,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,1,12789.411811,13899.276526,1,102,4,4,0.67,4,4,0,1,0,1,23,2,4,5,NA +71544,7,2,1,49,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,140129.484883,1,98,10,10,3.04,4,4,0,2,0,2,47,1,4,1,3 +71545,7,2,1,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,39915.513053,42616.161803,2,98,9,9,4.01,2,2,0,0,0,1,27,1,5,1,4 +71546,7,2,1,9,NA,4,4,2,9,117,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6377.235034,7094.374704,2,90,6,6,0.84,6,6,1,3,1,2,43,1,2,5,NA +71547,7,2,2,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,NA,NA,NA,NA,61710.107686,63275.181919,1,98,5,3,0.9,3,1,0,0,0,2,21,1,4,5,NA +71548,7,2,2,13,NA,1,1,1,14,168,NA,NA,1,1,NA,7,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,26325.414456,26852.811114,3,92,3,3,0.51,5,5,1,2,0,2,34,2,1,6,NA +71549,7,2,1,80,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,7912.12564,8378.94011,2,99,5,5,1.88,1,1,0,0,1,1,80,1,1,2,NA +71550,7,2,2,0,3,3,3,2,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10692.488346,10402.056617,1,98,4,4,1.01,3,3,1,0,0,1,23,1,2,6,NA +71551,7,2,1,3,NA,3,3,2,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,39061.897809,44649.899401,1,95,15,15,3.62,7,7,2,4,0,1,59,1,5,1,2 +71552,7,2,1,65,NA,2,2,2,NA,NA,2,NA,2,1,9,NA,2,6,NA,2,2,2,2,2,2,1,2,2,2,8609.250304,9380.869295,2,90,4,4,1.02,2,2,0,0,2,2,75,2,1,6,NA +71553,7,2,1,2,NA,4,4,2,3,36,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4455.468915,4730.507566,3,90,3,3,0.37,5,5,2,2,0,2,36,2,4,4,NA +71554,7,2,2,33,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,25558.459243,25637.043034,1,101,3,3,0.44,5,5,0,3,0,1,35,1,3,1,4 +71555,7,2,1,60,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,14488.953694,14771.336069,3,92,6,6,1.65,2,2,0,0,1,1,60,1,3,1,4 +71556,7,2,1,0,2,1,1,1,NA,3,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6876.075003,7261.67751,1,100,4,4,0.56,5,5,3,0,0,2,28,2,2,6,NA +71557,7,2,1,6,NA,5,7,1,6,76,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13614.165673,13762.118902,1,95,14,14,3.04,6,6,0,4,0,1,56,1,5,1,4 +71558,7,2,2,12,NA,4,4,2,12,145,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12581.940435,12644.353117,2,97,6,6,0.92,7,7,1,4,0,2,29,1,3,5,NA +71559,7,2,2,51,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,2,5,NA,2,2,2,2,2,2,1,2,2,2,17054.056149,20556.446647,2,90,2,2,0.3,3,3,0,1,0,2,51,2,2,5,NA +71560,7,2,1,80,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,14979.892428,17964.055881,1,92,5,5,1.45,2,2,0,0,2,1,80,1,2,1,3 +71561,7,2,2,40,NA,5,6,1,NA,NA,2,NA,2,2,4,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,12544.244874,13057.037707,1,102,15,15,5,4,4,0,2,0,2,40,2,5,1,4 +71562,7,2,2,0,8,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4543.931297,5004.098497,1,96,7,7,2.23,3,3,1,0,0,1,29,2,5,1,5 +71563,7,2,1,4,NA,2,2,1,4,58,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,15745.774489,15931.923312,2,91,6,6,0.93,5,5,1,2,0,1,34,1,2,1,3 +71564,7,2,1,25,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,27374.067425,29791.861332,1,98,2,2,0.36,5,5,3,0,0,1,25,1,3,1,3 +71565,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,142639.05444,145244.474771,1,100,8,8,2.97,2,2,0,0,0,1,24,1,5,1,5 +71566,7,2,1,48,NA,5,6,2,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19184.316833,20543.822351,1,97,15,15,5,3,3,0,1,0,2,45,2,5,1,5 +71567,7,2,1,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,6,NA,1,2,2,1,2,2,1,2,2,1,114838.671743,123195.718665,1,91,15,3,0.92,2,1,0,0,0,1,30,1,5,6,NA +71568,7,2,1,13,NA,1,1,1,13,159,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,NA,NA,NA,1,2,2,1,22768.423624,22766.421142,3,92,7,7,1.49,5,5,0,2,1,2,62,1,4,2,NA +71569,7,2,1,56,NA,1,1,2,NA,NA,2,NA,2,2,77,NA,1,1,NA,2,2,2,1,2,2,2,2,2,2,22446.308035,22116.943066,2,94,6,4,1.38,2,1,0,0,0,1,40,2,3,1,NA +71570,7,2,1,3,NA,2,2,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,17458.543556,17482.134163,2,91,5,5,1.05,3,3,2,0,0,2,26,2,3,4,NA +71571,7,2,1,60,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,10717.375231,11136.552864,2,101,14,14,5,2,2,0,0,1,1,60,1,3,1,3 +71572,7,2,1,8,NA,3,3,1,8,104,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,54897.892683,57357.850008,2,98,14,14,3.58,4,4,0,2,0,1,36,1,3,1,4 +71573,7,2,2,11,NA,3,3,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,39810.933651,39282.261038,2,95,15,15,4.34,4,4,0,2,0,2,37,1,4,1,4 +71574,7,2,2,31,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,3,1,2,2,2,2,2,2,2,2,2,2,2,35464.8385,36323.14329,2,96,6,6,1.25,4,4,1,1,0,1,31,2,3,1,3 +71575,7,2,2,66,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,16420.864787,17817.127844,2,102,3,3,0.76,3,3,0,1,1,2,66,1,2,3,NA +71576,7,2,2,0,9,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8359.077295,8583.668456,3,92,5,5,0.68,6,6,3,0,0,2,19,1,4,NA,NA +71577,7,2,1,47,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17787.524589,17894.667705,2,100,4,4,1.02,2,2,0,0,1,1,79,1,1,2,NA +71578,7,2,1,41,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,126789.52929,152250.956405,1,101,8,8,1.85,5,5,0,3,0,1,41,1,3,1,4 +71579,7,2,1,0,9,1,1,1,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,6910.953528,6911.08091,2,96,3,3,0.59,3,3,1,0,0,2,28,2,1,77,NA +71580,7,2,2,50,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,19969.163208,20694.024637,2,93,8,8,2.57,3,3,0,0,1,1,59,2,3,1,3 +71581,7,2,1,36,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,51543.062078,57043.574316,3,92,10,10,2.82,4,4,0,1,1,1,36,1,3,1,5 +71582,7,2,1,29,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,3,6,NA,2,2,2,2,2,2,2,2,1,2,39084.166385,40378.039385,1,97,4,4,0.72,5,5,2,1,0,2,33,2,1,6,NA +71583,7,2,1,53,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19374.410926,19463.695548,1,96,12,12,NA,3,3,0,0,2,1,77,NA,NA,6,NA +71584,7,2,2,58,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21171.165283,21533.12194,1,100,15,15,5,3,3,0,0,1,1,69,1,5,1,4 +71585,7,2,2,39,NA,2,2,1,NA,NA,2,NA,2,2,4,NA,4,1,2,1,2,2,1,2,2,2,2,2,2,36904.965687,36815.84758,2,93,8,8,2,4,4,1,1,0,1,50,2,4,1,4 +71586,7,2,2,7,NA,5,7,1,7,87,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7252.281896,7644.510498,2,92,6,6,1.7,2,2,0,1,0,2,32,2,4,3,NA +71587,7,2,2,9,NA,1,1,1,9,116,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17053.854294,17379.519997,3,92,8,8,2.17,4,4,0,2,0,1,40,2,2,1,4 +71588,7,2,2,12,NA,3,3,2,12,152,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,86497.469217,90071.968674,1,91,14,14,2.44,7,7,2,4,0,1,33,1,5,1,5 +71589,7,2,1,4,NA,3,3,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,30883.231636,34843.624635,1,95,5,5,0.92,5,5,1,2,0,2,30,1,4,1,4 +71590,7,2,1,0,3,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5777.934266,5882.770795,2,103,9,9,2.6,4,4,2,0,0,2,35,1,4,1,3 +71591,7,2,2,55,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,38954.135779,39992.589933,1,91,4,3,0.82,3,2,0,0,0,2,22,1,5,6,NA +71592,7,2,2,8,NA,1,1,2,8,103,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,1,2,2,2,2,2,2,14300.71869,14671.891945,2,94,9,9,2.29,5,5,2,1,0,2,33,2,3,1,1 +71593,7,2,1,45,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,26215.80546,26132.189255,1,92,9,7,1.74,7,4,2,1,0,1,45,1,4,2,NA +71594,7,2,1,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,91704.59836,93129.802737,1,93,15,14,5,6,1,0,0,0,1,23,1,5,5,NA +71595,7,2,2,56,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,207590.346266,205849.702763,1,92,15,15,5,2,2,0,0,0,2,56,1,4,1,5 +71596,7,2,2,19,NA,1,1,1,19,237,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,NA,NA,NA,NA,26325.414456,27702.295836,3,92,5,5,0.68,6,6,3,0,0,2,19,1,4,NA,NA +71597,7,2,2,13,NA,3,3,2,13,158,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,29885.567338,31265.78413,1,94,7,7,0.94,7,7,1,4,0,2,46,2,5,1,5 +71598,7,2,2,27,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,1,1,2,2,1,2,2,1,2,2,1,77792.702831,79765.659277,1,102,14,14,4.32,3,3,1,0,0,1,25,1,4,1,4 +71599,7,2,1,59,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,105379.391148,106074.259408,1,93,15,15,3.92,5,5,0,1,0,2,54,1,5,1,5 +71600,7,2,1,1,14,1,1,1,NA,14,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,12493.910388,13386.323284,2,98,1,1,0.13,4,4,2,0,0,2,52,1,2,4,NA +71601,7,2,1,6,NA,5,7,2,6,81,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9502.15317,9616.069144,2,97,5,5,0.84,5,5,0,2,0,2,33,1,4,1,3 +71602,7,2,2,9,NA,3,3,1,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17685.703081,17770.107744,1,98,6,6,0.81,6,6,0,4,0,2,34,NA,NA,1,2 +71603,7,2,2,16,NA,4,4,2,16,201,NA,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10484.6104,10912.740054,2,99,13,13,NA,3,3,1,1,0,2,36,NA,NA,5,NA +71604,7,2,1,49,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,31640.296506,34765.415986,2,94,4,4,0.81,3,3,0,1,0,1,49,2,3,1,3 +71605,7,2,2,38,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,64581.191728,64779.757488,2,94,9,5,1.84,2,1,0,0,0,2,38,1,4,6,NA +71606,7,2,1,13,NA,5,6,1,13,163,NA,NA,2,1,3,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9048.093498,9416.694257,1,100,8,8,2.62,3,3,0,1,0,1,41,2,5,1,5 +71607,7,2,2,8,NA,1,1,1,8,104,NA,NA,2,2,2,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,NA,16986.005478,17733.622754,2,102,4,4,0.57,5,5,0,3,0,1,41,2,1,1,2 +71608,7,2,1,10,NA,4,4,1,10,125,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10138.00454,10211.52145,1,100,8,8,1.61,6,6,1,3,0,1,29,1,5,6,NA +71609,7,2,2,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,21640.010524,20970.872814,1,93,6,6,0.83,6,6,3,1,0,1,37,NA,NA,1,3 +71610,7,2,1,16,NA,1,1,1,16,200,NA,NA,2,2,2,8,NA,NA,NA,2,2,2,2,2,2,2,2,1,2,22203.024273,23172.92708,1,100,99,99,NA,7,7,2,3,0,2,35,2,1,1,NA +71611,7,2,2,15,NA,3,3,2,15,191,NA,NA,1,1,NA,9,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,103007.696238,104941.393061,1,101,14,14,3.25,4,4,0,1,0,1,48,1,4,1,2 +71612,7,2,2,4,NA,2,2,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11429.37307,11583.084593,2,90,2,2,0.54,2,2,1,0,0,2,32,2,2,4,NA +71613,7,2,1,75,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,12824.368043,13581.00423,2,101,9,9,4.08,2,2,0,0,1,1,75,1,1,2,NA +71614,7,2,1,4,NA,4,4,1,4,50,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10040.033098,11070.778245,1,100,14,14,3.47,4,4,2,0,0,1,34,1,5,1,5 +71615,7,2,1,41,NA,5,6,1,NA,NA,2,NA,2,1,7,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15952.616949,16443.31736,2,93,15,15,5,3,3,1,0,0,1,41,2,5,1,5 +71616,7,2,2,3,NA,2,2,2,3,46,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,13490.92482,14894.343037,1,90,2,2,0.56,2,2,1,0,0,2,27,1,3,5,NA +71617,7,2,1,2,NA,2,2,2,2,27,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9237.934626,9250.417252,2,90,3,3,0.7,3,3,1,1,0,2,25,1,1,1,NA +71618,7,2,1,4,NA,4,4,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7604.054172,7918.254694,2,99,6,6,1.03,6,6,3,0,0,1,33,1,3,6,NA +71619,7,2,1,55,NA,5,6,2,NA,NA,2,NA,2,1,2,NA,4,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11690.444016,12095.591726,3,90,3,3,0.75,3,3,0,0,0,1,55,2,4,1,3 +71620,7,2,1,65,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,1,NA,1,2,1,1,2,1,1,2,1,3,7289.557268,7804.776102,3,90,77,77,NA,2,2,0,0,1,1,65,2,3,1,5 +71621,7,2,2,12,NA,1,1,1,12,152,NA,NA,2,2,4,6,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,26325.414456,27702.295836,3,92,4,4,0.46,7,7,1,2,0,2,31,2,2,1,1 +71622,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,40157.007559,44610.827766,2,98,5,5,1.63,2,2,0,0,2,1,80,1,3,1,3 +71623,7,2,1,12,NA,4,4,2,12,144,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8364.097643,9212.617312,2,90,6,6,1.03,6,6,3,1,0,1,45,2,2,1,2 +71624,7,2,2,18,NA,5,6,1,18,219,2,NA,2,2,2,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,10767.566937,11183.935292,2,91,15,15,4.63,7,7,1,2,0,1,36,2,4,1,3 +71625,7,2,1,39,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,18353.275855,20139.588201,1,91,4,4,0.76,4,4,0,2,0,2,44,1,4,6,NA +71626,7,2,1,59,NA,2,2,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,1,2,2,1,2,2,2,2,2,2,30839.213846,31462.493685,1,92,10,10,2.93,4,4,1,0,0,2,55,1,4,1,4 +71627,7,2,1,19,NA,5,6,2,19,236,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,9099.599144,9725.105491,1,90,9,9,2.6,4,4,0,1,0,2,49,2,2,1,5 +71628,7,2,2,53,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,3,4,NA,1,2,2,1,2,2,1,2,2,1,28349.668436,29178.127765,1,102,5,5,1.56,2,2,0,0,0,2,53,1,3,4,NA +71629,7,2,2,16,NA,4,4,1,16,193,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,20473.346601,20523.769333,2,102,14,14,4.05,3,3,0,1,0,1,18,1,2,NA,NA +71630,7,2,1,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6121.794646,6421.491158,1,102,4,4,0.61,5,5,2,2,0,2,27,2,2,5,NA +71631,7,2,1,22,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,37970.860743,38488.432875,2,92,NA,3,0.92,5,1,0,0,0,1,22,1,5,5,NA +71632,7,2,1,18,NA,4,4,1,18,223,2,NA,1,1,NA,12,NA,NA,NA,1,2,2,NA,NA,NA,1,2,2,1,13276.485807,13885.0639,2,100,NA,NA,NA,4,4,1,0,0,2,38,NA,NA,77,NA +71633,7,2,2,64,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,1,2,1,1,2,1,1,2,1,NA,11838.431472,12356.62484,2,92,3,3,0.4,6,6,0,1,2,1,78,2,1,1,1 +71634,7,2,2,21,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,36850.868456,37875.214466,2,103,5,5,1.2,3,3,0,0,2,1,66,2,2,1,2 +71635,7,2,2,42,NA,4,4,2,NA,NA,2,NA,2,1,8,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,22513.236051,21981.065205,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +71636,7,2,1,9,NA,4,4,1,9,111,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10410.106675,10390.534388,2,96,4,4,0.57,5,5,0,3,0,2,26,1,2,5,NA +71637,7,2,1,14,NA,3,3,1,14,173,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,95925.820151,96188.020601,1,92,8,8,3.17,2,2,0,1,0,2,35,1,2,77,NA +71638,7,2,1,23,NA,4,4,1,NA,NA,1,2,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,25815.880139,26503.609729,2,101,99,13,NA,2,1,0,0,0,1,24,1,4,5,NA +71639,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,22109.546782,22635.660435,1,93,12,12,NA,3,3,0,1,0,2,48,1,3,5,NA +71640,7,2,2,51,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,15497.844354,15720.409191,1,99,14,14,5,2,1,0,0,0,2,51,1,5,1,NA +71641,7,2,2,7,NA,3,3,2,7,95,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,73810.484644,74865.697805,1,91,15,15,5,4,4,1,1,0,1,38,1,5,1,5 +71642,7,1,2,3,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,15358.480588,0,1,102,2,2,0.31,4,4,1,2,0,2,25,1,2,4,NA +71643,7,2,1,31,NA,2,2,1,NA,NA,1,2,2,1,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,53303.690379,53390.332272,1,100,8,8,3.17,2,2,0,0,0,1,31,2,4,1,5 +71644,7,2,2,80,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,45973.010529,51521.910389,1,91,7,7,2.68,2,2,0,0,2,1,80,1,4,1,4 +71645,7,2,1,7,NA,3,3,2,7,93,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,44777.275016,47565.734765,1,91,14,14,3.06,5,5,0,3,0,2,46,1,5,1,5 +71646,7,2,1,3,NA,1,1,1,3,44,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,16775.083123,16335.348923,2,98,3,3,0.33,7,7,2,3,0,1,40,2,1,1,1 +71647,7,2,2,80,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,16076.770364,16942.062244,1,90,14,14,5,2,2,0,0,1,1,58,1,5,5,NA +71648,7,2,1,7,NA,1,1,1,7,91,NA,NA,1,1,NA,1,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,13533.281742,14131.961026,1,100,7,7,1.74,4,4,0,2,0,2,39,2,1,1,3 +71649,7,2,1,12,NA,5,6,2,12,154,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7057.977053,7861.480262,2,92,12,12,NA,7,7,2,4,0,1,54,2,2,1,5 +71650,7,2,1,60,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,7140.457792,7196.312698,2,101,7,7,1.3,5,5,2,0,1,2,50,1,4,1,3 +71651,7,2,2,46,NA,5,6,2,NA,NA,2,NA,2,2,6,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,19294.309,26319.879121,1,93,14,14,5,2,2,0,1,0,2,46,2,5,3,NA +71652,7,2,1,5,NA,5,6,2,5,68,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,4858.407579,4952.635908,1,99,14,14,2.66,7,7,3,1,0,1,35,1,5,1,5 +71653,7,2,2,10,NA,5,6,1,10,124,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6779.975678,7239.998882,3,91,15,15,5,3,3,0,1,0,1,47,2,5,1,5 +71654,7,2,2,17,NA,3,3,1,17,213,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,49337.766842,51601.905979,2,103,15,15,3.44,7,7,0,1,2,2,79,1,3,2,NA +71655,7,2,1,65,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,7323.703412,7380.991723,2,97,NA,99,NA,7,1,2,1,1,2,56,1,3,5,NA +71656,7,2,1,58,NA,3,3,2,NA,NA,2,NA,2,1,9,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,163791.427718,171966.737289,1,93,15,15,5,2,2,0,0,0,1,58,2,5,1,5 +71657,7,2,2,49,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,2,2,2,1,2,2,1,2,2,1,30105.942022,31646.425257,1,96,8,8,2.17,4,4,0,0,2,1,80,NA,NA,1,NA +71658,7,2,1,25,NA,1,1,2,NA,NA,2,NA,2,2,3,NA,2,6,NA,2,2,2,2,2,2,1,2,1,2,37987.561992,39245.132137,1,90,2,1,0.13,5,3,0,1,0,1,25,2,2,6,NA +71659,7,2,2,33,NA,4,4,2,NA,NA,2,NA,2,2,3,NA,3,1,2,1,2,2,1,2,2,NA,NA,NA,NA,32799.237043,32564.866412,1,91,6,6,0.99,5,5,3,0,0,2,33,2,3,1,4 +71660,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,4,3,1,2,2,1,2,2,1,2,2,1,19498.713386,19652.836095,2,97,4,4,1.09,2,2,0,1,0,2,35,1,2,4,NA +71661,7,2,1,8,NA,5,6,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,5651.170392,5934.27615,1,102,5,5,0.92,5,5,1,2,0,2,44,2,1,1,2 +71662,7,2,1,74,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,79733.665046,84684.628619,1,92,9,9,3.8,2,2,0,0,2,2,66,1,4,1,5 +71663,7,2,2,9,NA,4,4,1,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,1,1,2,1,1,2,2,1,11195.065587,11548.620784,2,96,77,77,NA,7,3,1,4,0,2,32,NA,NA,1,NA +71664,7,2,1,4,NA,4,4,2,4,55,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6299.35077,6688.213305,3,90,3,3,0.37,5,5,2,2,0,2,36,2,4,4,NA +71665,7,2,2,7,NA,4,4,1,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11334.095519,11753.9565,2,96,4,4,0.65,5,5,0,3,0,1,30,1,4,1,2 +71666,7,2,1,61,NA,4,4,2,NA,NA,1,1,1,1,NA,NA,5,6,NA,1,2,2,1,2,2,1,2,2,1,7017.945976,7072.842557,2,99,1,1,0.36,3,1,1,0,1,2,55,1,4,6,NA +71667,7,2,2,9,NA,1,1,2,9,118,NA,NA,1,1,NA,4,NA,NA,NA,2,1,2,1,2,2,1,2,2,2,13231.432201,13706.598104,2,97,4,4,0.67,4,4,0,2,0,1,39,2,2,6,NA +71668,7,2,2,12,NA,4,4,1,12,154,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12531.903464,13043.632492,2,100,9,9,2.46,4,4,1,1,1,2,59,1,3,1,3 +71669,7,2,1,0,7,5,6,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6918.643947,7208.455005,1,101,8,8,1.81,5,5,2,0,1,2,37,2,4,1,2 +71670,7,2,1,24,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14860.312419,14555.816778,3,90,15,15,4.34,4,4,0,0,1,1,65,1,3,1,4 +71671,7,2,1,65,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,125558.167126,127168.668278,3,91,7,7,2.89,2,2,0,0,2,2,64,1,4,1,4 +71672,7,2,2,18,NA,4,4,2,18,227,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11372.489138,11836.874523,1,99,14,14,3.67,4,4,1,0,0,2,49,1,3,1,3 +71673,7,2,2,9,NA,5,7,2,9,112,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7294.840846,7578.01532,1,93,15,15,5,5,5,1,2,0,2,40,1,5,1,5 +71674,7,2,1,10,NA,4,4,2,10,127,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,9502.15317,9484.287948,2,97,3,3,0.4,6,6,2,3,0,2,25,1,2,5,NA +71675,7,2,2,73,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,66567.821082,76362.988288,3,91,7,7,2.92,2,2,0,0,2,1,74,1,3,1,3 +71676,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,37318.801462,40047.525745,1,98,8,8,3.48,2,2,0,0,2,1,80,1,3,1,2 +71677,7,2,1,35,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,29756.291619,30875.098449,2,101,5,5,1.19,3,3,1,0,0,2,32,1,4,1,3 +71678,7,2,2,70,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,98976.420245,102012.919253,2,101,15,15,5,2,2,0,0,2,1,73,1,5,1,5 +71679,7,2,2,27,NA,1,1,1,NA,NA,2,NA,2,2,5,NA,2,5,2,1,2,2,1,2,2,NA,NA,NA,NA,41537.508946,44104.799715,1,102,4,4,0.61,5,5,2,2,0,2,27,2,2,5,NA +71680,7,2,1,55,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,28575.926692,28541.082411,3,92,4,3,0.52,5,4,0,0,0,2,57,1,4,1,2 +71681,7,2,2,35,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,1,1,2,2,1,2,2,NA,NA,NA,NA,68146.615091,70082.037538,2,99,15,15,5,3,3,1,0,0,1,43,1,5,1,5 +71682,7,2,1,69,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,7101.739553,7379.502561,2,100,5,5,1.56,2,2,0,0,2,1,69,1,2,1,3 +71683,7,2,2,1,17,4,4,1,NA,18,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8412.350508,9400.756791,1,100,5,5,1.05,3,3,1,0,0,2,42,2,5,1,NA +71684,7,2,1,0,3,3,3,1,NA,4,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24509.975935,26238.985016,1,94,5,5,1.04,4,4,1,1,0,1,18,1,2,NA,NA +71685,7,2,2,11,NA,4,4,2,11,140,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10994.192555,11605.838362,2,97,2,2,0.27,4,4,0,2,0,1,51,1,2,4,NA +71686,7,2,1,31,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16505.268729,16996.380056,3,91,8,8,2.7,3,3,1,0,0,1,31,1,5,1,5 +71687,7,2,2,13,NA,5,6,2,13,157,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,6486.356303,6952.179218,1,91,7,7,1.57,4,4,0,3,0,2,38,2,2,3,NA +71688,7,2,1,51,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,16628.326744,17325.680634,2,102,10,10,3.62,3,3,0,0,0,1,51,2,5,1,5 +71689,7,2,2,17,NA,4,4,1,17,210,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16659.324602,16974.753267,1,92,15,15,4.44,5,5,0,3,0,2,43,1,5,6,NA +71690,7,2,1,2,NA,2,2,1,2,31,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,9382.177239,9806.283152,2,93,6,6,0.64,7,7,2,1,3,2,60,2,3,2,NA +71691,7,2,2,76,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,62212.598767,64340.261278,1,91,10,10,4.3,2,2,0,0,2,1,78,1,4,1,4 +71692,7,2,1,8,NA,3,3,1,8,104,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22651.436723,23515.701302,3,92,7,7,0.81,7,7,2,4,0,1,40,NA,NA,1,4 +71693,7,2,2,4,NA,5,6,2,4,53,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7497.268293,8158.717681,1,101,10,10,3.67,3,3,1,0,0,1,36,2,5,1,5 +71694,7,2,1,0,6,5,6,1,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5024.464768,5303.683185,2,92,10,6,1.12,7,4,1,1,1,2,27,2,3,1,3 +71695,7,2,2,54,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,1,1,NA,1,2,2,1,2,1,1,2,2,1,14680.520497,14758.150245,3,91,6,6,1.34,4,4,0,2,0,1,52,2,3,1,1 +71696,7,1,2,58,NA,5,6,NA,NA,NA,2,NA,2,2,4,NA,1,2,NA,1,2,1,1,2,1,NA,NA,NA,NA,12649.084278,0,3,90,12,12,NA,4,4,0,0,0,2,58,2,1,2,NA +71697,7,2,1,74,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,NA,15176.622228,16685.078243,1,101,4,4,1.16,2,2,0,0,2,1,74,1,1,1,2 +71698,7,2,2,46,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,127315.335607,133282.596235,1,91,14,14,4.03,4,4,0,2,0,1,52,1,4,1,5 +71699,7,2,2,15,NA,2,2,1,15,184,NA,NA,2,1,4,9,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,15809.066118,17342.845429,2,93,3,3,0.52,5,5,0,2,0,1,41,2,4,1,4 +71700,7,2,2,1,16,5,6,1,NA,17,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5610.22155,6105.185511,2,92,15,15,5,3,3,1,0,0,1,39,2,5,1,5 +71701,7,2,2,17,NA,3,3,1,17,210,2,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,113907.203714,124196.980527,1,94,8,8,1.67,5,5,1,2,0,1,52,1,4,1,4 +71702,7,2,2,70,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,2,NA,1,2,2,1,2,2,1,2,2,NA,12669.609493,13517.506264,2,98,99,99,NA,1,1,0,0,1,2,70,1,3,2,NA +71703,7,2,1,53,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,NA,NA,NA,NA,26240.791307,26334.983911,1,90,4,4,1.34,1,1,0,0,0,1,53,1,4,6,NA +71704,7,2,1,77,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,71070.181743,73766.510327,1,95,4,4,1.12,2,2,0,0,2,2,78,1,4,1,2 +71705,7,2,1,67,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,14488.953694,14771.336069,3,92,3,3,0.95,2,2,0,0,2,2,63,1,4,1,1 +71706,7,2,2,30,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,4,2,1,2,2,1,2,2,1,2,2,1,25423.189953,34604.094756,2,98,2,2,0.34,2,2,0,1,0,2,30,1,4,4,NA +71707,7,2,2,7,NA,4,4,1,7,91,NA,NA,1,1,NA,2,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11195.065587,11638.702248,2,96,13,13,NA,4,4,1,1,0,2,40,1,3,77,NA +71708,7,2,1,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,6612.194774,6663.917441,2,99,5,5,1.88,1,1,0,0,1,1,64,1,5,5,NA +71709,7,2,2,45,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,40760.712736,41570.695949,1,98,3,3,0.73,2,2,0,0,0,1,49,1,2,1,2 +71710,7,2,1,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,8491.292032,8557.713588,1,96,15,15,5,2,2,0,0,2,1,68,1,3,1,4 +71711,7,2,1,3,NA,4,4,1,3,43,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10273.522239,11328.238204,1,100,14,6,1.85,3,2,1,0,0,1,33,1,5,5,NA +71712,7,2,2,53,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,19927.035776,20217.558558,2,96,8,8,3.67,2,2,0,0,0,1,56,2,5,1,5 +71713,7,2,1,17,NA,5,6,2,17,213,2,NA,2,1,4,12,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,8965.57404,9581.867503,1,90,15,15,5,5,5,0,3,0,2,46,2,4,1,5 +71714,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,29470.441678,31861.649147,1,103,6,6,1.98,2,2,0,0,2,1,80,1,5,1,4 +71715,7,2,2,47,NA,4,4,2,NA,NA,2,NA,2,2,6,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,21969.841763,21566.078744,1,96,14,14,5,2,2,0,0,0,2,47,2,4,5,NA +71716,7,2,2,21,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,14516.765165,13843.248577,3,90,15,15,4.89,5,5,0,0,0,2,57,2,3,1,3 +71717,7,2,2,27,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,5,2,1,2,2,1,2,2,1,2,2,1,23255.074483,22360.893796,2,98,4,4,1.29,2,2,0,1,0,2,27,1,2,5,NA +71718,7,2,2,68,NA,4,4,2,NA,NA,2,NA,2,2,4,NA,4,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,9644.668529,10075.292662,1,93,3,3,1.1,1,1,0,0,1,2,68,2,4,1,NA +71719,7,2,1,59,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,1,5,NA,1,2,2,1,2,2,1,2,2,1,26135.885159,26946.665552,2,101,2,2,0.74,1,1,0,0,0,1,59,1,1,5,NA +71720,7,1,1,80,NA,3,3,NA,NA,NA,1,2,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,6882.452425,0,1,99,3,3,1.19,1,1,0,0,1,1,80,1,5,2,NA +71721,7,2,2,11,NA,3,3,2,11,138,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,73810.484644,74865.697805,1,94,10,10,2.67,5,5,0,3,0,1,40,1,5,1,2 +71722,7,2,2,48,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,4,NA,1,2,2,1,2,2,1,2,2,1,19258.69251,18731.627868,2,99,12,3,1.16,6,1,0,0,0,2,57,1,5,2,NA +71723,7,2,2,5,NA,5,6,2,6,72,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5520.445386,5614.569811,2,100,15,15,4.83,4,4,1,1,0,1,43,2,5,1,5 +71724,7,2,1,54,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,37557.946192,39249.822004,2,102,99,3,1.29,3,1,0,0,1,1,61,NA,NA,5,NA +71725,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,9177.295801,9548.31812,2,92,15,3,0.92,3,1,0,0,0,2,25,1,5,5,NA +71726,7,2,2,5,NA,4,4,2,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9268.093277,9507.318489,1,99,3,3,0.82,2,2,1,0,0,2,29,1,4,4,NA +71727,7,1,2,11,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,5,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,8851.712341,0,1,92,5,5,0.63,7,7,0,4,1,1,60,NA,NA,1,NA +71728,7,2,2,61,NA,2,2,1,NA,NA,2,NA,2,1,3,NA,5,1,NA,2,2,2,1,2,2,1,2,2,2,11291.029617,11762.265953,2,102,14,14,5,2,2,0,0,2,1,68,1,4,1,5 +71729,7,2,1,33,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,16214.132654,20271.082789,3,90,8,8,3.3,2,2,0,0,1,2,64,2,2,1,NA +71730,7,2,2,40,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,1,3,2,2,2,2,2,2,2,1,2,2,2,33737.181071,33913.1176,2,91,99,99,NA,6,6,1,3,0,2,20,2,2,5,NA +71731,7,1,2,24,NA,5,6,NA,NA,NA,2,NA,2,1,4,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,15265.136017,0,1,93,15,5,1.84,3,1,0,0,0,2,24,2,5,5,NA +71732,7,2,1,63,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,1,6,NA,2,2,2,2,2,2,1,2,2,2,10596.142548,10856.489537,1,94,12,3,1.07,4,1,0,0,1,2,37,NA,NA,6,NA +71733,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,1,2,NA,1,2,2,1,2,2,1,2,2,NA,24816.484998,26631.048773,1,91,3,3,1.33,1,1,0,0,1,1,80,1,1,2,NA +71734,7,2,1,5,NA,4,4,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7311.663111,7613.781996,2,93,6,6,1.15,5,5,3,1,0,1,29,1,3,5,NA +71735,7,2,2,67,NA,2,2,1,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,14204.126838,15368.918135,2,98,4,4,1.34,2,2,0,0,2,1,66,1,1,1,1 +71736,7,2,1,74,NA,3,3,1,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,1,2,1,2,2,1,2,2,NA,62359.83753,66231.994715,1,94,14,14,5,2,2,0,0,2,1,74,1,4,1,4 +71737,7,2,2,36,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,1,5,2,2,2,2,2,2,2,2,2,2,2,45655.090694,49537.803198,3,92,4,4,0.67,4,4,0,3,0,2,36,2,1,5,NA +71738,7,1,2,80,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,NA,NA,NA,NA,47254.485787,0,1,90,8,8,4.21,1,1,0,0,1,2,80,1,4,2,NA +71739,7,2,1,80,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,NA,13116.035678,14391.817492,2,91,4,4,1.02,2,2,0,0,2,1,80,1,4,1,2 +71740,7,2,2,20,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,NA,NA,NA,1,2,2,1,20443.961017,19438.354372,2,99,3,3,0.44,5,5,1,1,0,2,53,1,4,1,3 +71741,7,2,1,63,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,5,3,NA,2,2,2,1,2,2,2,2,2,2,6449.12882,6552.435629,2,93,3,3,0.9,1,1,0,0,1,1,63,2,5,3,NA +71742,7,2,1,0,10,5,6,2,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,5441.212985,5743.59084,1,93,8,8,1.2,7,7,1,1,1,1,24,2,2,5,NA +71743,7,2,2,0,4,1,1,1,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,2,2,2,NA,NA,NA,NA,8359.077295,8418.658174,3,92,6,6,1.06,5,5,2,0,0,2,54,2,1,77,NA +71744,7,2,2,40,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,144726.059187,145423.66071,2,98,15,15,4.17,6,6,1,1,0,2,40,1,4,1,4 +71745,7,2,2,21,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,5,2,1,2,2,1,2,2,1,2,2,1,130601.953362,132156.64994,2,91,15,15,5,4,4,0,0,0,1,54,1,5,1,NA +71746,7,2,2,18,NA,3,3,1,18,219,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,32725.110579,34226.88515,2,92,3,1,0.28,2,1,0,0,0,2,18,1,4,NA,NA +71747,7,2,1,7,NA,5,7,1,7,88,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11800.806722,11886.381633,1,100,9,9,2.78,4,4,0,2,0,1,39,1,5,1,5 +71748,7,2,2,36,NA,1,1,2,NA,NA,2,NA,2,2,4,NA,3,6,2,2,2,2,2,2,2,2,2,1,2,32910.619435,32637.844845,1,90,2,1,0.17,5,2,0,1,0,1,25,2,2,6,NA +71749,7,2,2,0,4,1,1,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7011.218293,6863.710472,2,97,6,6,1.84,2,2,1,0,0,2,27,1,4,5,NA +71750,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,NA,19552.617734,21912.600615,2,92,4,4,1.12,2,2,0,0,1,2,80,1,5,2,NA +71751,7,2,2,42,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,2,1,2,2,1,2,2,1,2,2,1,110070.015649,117535.388004,3,91,14,14,3.4,4,4,0,2,0,1,40,1,4,1,4 +71752,7,2,1,36,NA,1,1,1,NA,NA,2,NA,2,2,4,NA,2,1,NA,1,2,2,1,2,2,2,2,2,2,45660.210546,48177.324946,1,101,9,9,2.88,3,3,1,0,0,1,36,2,2,1,4 +71753,7,2,2,80,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,NA,33147.414266,37148.276517,2,94,14,14,5,2,2,0,0,1,2,80,1,4,2,NA +71754,7,2,1,0,0,3,3,1,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20173.318836,21596.406788,2,103,15,15,5,4,4,2,0,0,1,36,2,4,1,5 +71755,7,2,1,22,NA,2,2,1,NA,NA,2,NA,2,2,3,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,38474.772527,42632.210531,2,93,7,3,0.9,3,1,0,0,0,1,25,2,4,5,NA +71756,7,2,1,63,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,133262.624177,131902.330801,1,98,9,9,3.97,2,2,0,0,2,1,63,1,5,1,4 +71757,7,2,1,23,NA,5,6,1,NA,NA,2,NA,2,2,3,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,13254.861315,15747.113823,1,101,8,8,4.48,1,1,0,0,0,1,23,2,5,5,NA +71758,7,2,2,24,NA,2,2,2,NA,NA,2,NA,2,1,3,NA,4,6,2,2,2,2,2,2,2,1,2,2,2,30253.427014,30121.660039,2,90,6,6,0.66,7,7,2,2,0,2,24,2,4,6,NA +71759,7,2,1,16,NA,4,4,1,17,204,NA,NA,1,1,NA,10,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,17606.165994,17558.40257,2,101,8,8,2.7,3,3,0,1,0,1,53,1,4,1,2 +71760,7,2,2,60,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,14994.337564,16150.13007,1,100,8,8,2.36,3,3,1,0,1,2,60,1,3,3,NA +71761,7,2,1,38,NA,1,1,1,NA,NA,2,NA,2,7,77,NA,2,1,NA,2,2,2,1,2,2,NA,NA,NA,NA,32907.512068,32659.148672,2,92,12,12,NA,7,7,0,1,2,2,64,2,1,2,NA +71762,7,2,1,12,NA,3,3,1,12,155,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,30943.024697,32205.010072,1,101,4,4,0.58,6,6,0,4,0,2,41,1,3,5,NA +71763,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,109309.268477,116308.99629,3,91,14,14,3.4,4,4,0,2,0,1,40,1,4,1,4 +71764,7,2,1,33,NA,5,6,1,NA,NA,2,NA,2,1,5,NA,4,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,20181.692021,21173.351412,1,92,12,12,NA,4,4,1,1,0,1,33,2,4,1,4 +71765,7,2,1,39,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,19144.719218,23354.203452,1,101,8,8,1.81,5,5,2,0,1,2,37,2,4,1,2 +71766,7,2,2,38,NA,2,2,1,NA,NA,2,NA,2,1,2,NA,3,1,3,2,2,2,2,2,2,NA,NA,NA,NA,40476.413979,41456.006766,2,93,5,5,0.87,4,4,1,1,0,1,41,2,5,1,3 +71767,7,2,1,38,NA,1,1,2,NA,NA,2,NA,1,1,NA,NA,5,3,NA,1,2,2,1,2,2,1,2,2,1,39133.405322,40210.578118,1,91,12,8,4.59,5,1,0,2,0,1,38,1,5,3,NA +71768,7,2,2,7,NA,3,3,2,7,88,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,24070.467912,25563.654853,1,95,15,15,3.62,7,7,2,4,0,1,59,1,5,1,2 +71769,7,2,1,24,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,4,5,NA,2,2,2,2,2,2,2,2,2,2,35669.2076,36155.406423,2,94,14,8,3.06,5,2,0,0,0,1,24,2,4,5,NA +71770,7,2,2,64,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,10687.292889,11164.469085,2,99,3,3,0.75,2,2,0,0,1,2,64,1,4,3,NA +71771,7,2,1,3,NA,1,1,2,3,47,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18363.136017,19674.774959,1,91,4,4,0.86,3,3,1,0,0,2,54,1,4,3,NA +71772,7,2,2,52,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,NA,NA,NA,NA,37518.850453,37204.255172,1,98,3,3,1.18,1,1,0,0,0,2,52,1,4,3,NA +71773,7,2,1,53,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,4,3,NA,1,2,2,1,2,2,1,2,2,1,23775.734331,23918.947415,2,96,12,99,NA,2,1,0,0,1,1,53,1,4,3,NA +71774,7,1,1,2,NA,1,1,NA,NA,NA,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,10412.950357,0,1,90,15,15,5,5,5,1,1,0,1,32,2,1,1,4 +71775,7,2,1,62,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,28216.191929,29365.059825,1,101,6,6,1.52,3,3,0,1,1,1,62,1,2,1,3 +71776,7,2,2,0,10,1,1,1,NA,11,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,5328.475628,5508.797375,1,103,13,13,NA,6,6,1,2,0,1,42,2,9,1,9 +71777,7,2,2,77,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,9807.668192,10541.248354,2,95,5,5,0.87,4,4,0,0,2,2,77,1,2,1,1 +71778,7,2,1,20,NA,2,2,2,NA,NA,2,NA,2,1,3,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,43798.832177,56306.768819,1,90,3,3,0.79,2,2,0,0,1,1,70,2,2,1,NA +71779,7,2,1,19,NA,4,4,2,19,239,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11125.932433,11147.929312,1,96,6,6,1.21,4,4,0,2,0,2,41,1,4,4,NA +71780,7,2,1,10,NA,4,4,2,10,128,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,14125.862146,14370.909235,1,97,15,15,5,4,4,0,2,0,1,48,1,5,1,5 +71781,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,17152.714252,16683.285229,1,102,12,12,NA,7,7,3,2,0,2,52,1,4,5,NA +71782,7,2,1,5,NA,5,6,1,5,70,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,10498.222836,11004.769407,1,100,15,15,5,4,4,2,0,0,1,39,2,5,1,5 +71783,7,1,1,12,NA,5,6,NA,NA,NA,NA,NA,2,1,3,5,NA,NA,NA,1,1,1,1,2,1,NA,NA,NA,NA,6174.283826,0,2,92,77,77,NA,5,5,0,1,2,2,80,NA,NA,1,1 +71784,7,2,2,24,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,41018.498876,42180.331054,2,98,6,6,1.07,5,5,3,0,0,2,24,1,3,1,3 +71785,7,2,1,64,NA,4,4,1,NA,NA,1,1,1,1,NA,NA,2,3,NA,1,2,2,1,2,2,1,2,2,1,7101.739553,7433.956549,2,100,77,77,NA,1,1,0,0,1,1,64,1,2,3,NA +71786,7,2,2,42,NA,5,7,1,NA,NA,2,NA,2,1,7,NA,5,4,2,1,2,2,1,2,2,1,2,2,1,18588.235275,19331.159141,2,96,15,15,5,3,3,0,2,0,2,42,2,5,4,NA +71787,7,2,2,50,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,16859.368198,17492.963343,1,99,13,13,NA,4,4,1,0,0,2,26,1,4,4,NA +71788,7,2,1,6,NA,1,1,1,6,82,NA,NA,1,1,NA,0,NA,NA,NA,2,1,1,2,2,1,NA,NA,NA,NA,14880.007592,15997.505807,3,92,4,4,0.66,4,4,0,1,0,1,52,2,1,1,1 +71789,7,2,2,50,NA,5,7,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,13149.417265,14101.663559,2,103,15,15,5,3,3,0,0,0,2,50,1,4,1,4 +71790,7,2,2,11,NA,5,7,1,11,139,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,10332.067017,11032.916236,1,100,9,9,2.22,5,5,0,3,0,2,52,1,4,1,4 +71791,7,2,1,18,NA,1,1,1,18,221,2,NA,1,1,NA,12,NA,NA,NA,2,2,2,1,2,2,1,2,2,2,32262.881978,32260.04446,2,102,8,8,2.01,4,4,0,0,0,2,48,2,4,3,NA +71792,7,2,1,34,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,69548.324117,71540.223881,2,95,6,6,2.69,1,1,0,0,0,1,34,1,5,5,NA +71793,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,170311.62251,168883.560827,3,91,15,15,5,2,2,0,0,0,2,57,1,5,1,5 +71794,7,2,1,4,NA,4,4,2,4,57,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8973.990262,9527.959827,2,101,7,7,1.3,5,5,2,0,1,2,50,1,4,1,3 +71795,7,2,2,8,NA,5,7,1,9,108,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,17706.623308,17924.842987,1,94,2,2,0.3,5,5,1,2,0,1,23,1,1,6,NA +71796,7,2,2,45,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,2,NA,1,2,2,1,2,2,1,2,2,1,135834.019526,140154.312816,2,92,10,10,3.51,3,3,0,0,0,1,24,1,4,5,NA +71797,7,2,1,80,NA,3,3,1,NA,NA,1,1,1,1,NA,NA,3,2,NA,1,2,2,NA,NA,NA,1,2,2,NA,26771.485907,29740.715741,2,100,NA,NA,NA,4,4,0,0,2,2,51,NA,NA,1,NA +71798,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,8491.292032,8557.713588,1,96,15,15,5,2,2,0,0,2,2,62,1,4,1,2 +71799,7,2,1,59,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,151766.599459,151581.541662,3,91,14,1,0.41,2,1,0,0,0,1,47,NA,NA,5,NA +71800,7,2,2,33,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,2,1,2,2,2,2,1,2,2,1,2,2,1,45655.090694,44423.220436,3,92,7,7,1.3,5,5,1,2,0,2,33,2,2,1,1 +71801,7,2,2,4,NA,1,1,1,4,56,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17887.570772,19748.358154,1,92,10,10,3.04,4,4,1,1,0,1,32,1,3,1,2 +71802,7,2,1,53,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,NA,1,2,2,1,2,2,1,2,2,1,27250.100481,27216.872857,1,99,6,3,0.92,2,1,0,0,0,2,50,1,3,6,NA +71803,7,2,2,52,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,16063.886913,15924.431895,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +71804,7,2,2,9,NA,1,1,1,9,110,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,13616.85154,13950.045541,1,102,6,6,0.96,5,5,0,2,0,1,32,2,2,1,3 +71805,7,2,1,22,NA,5,6,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,1,2,2,1,14313.345971,14977.822328,3,91,7,7,1.33,6,6,0,0,2,2,51,2,5,1,5 +71806,7,2,2,12,NA,4,4,1,12,147,NA,NA,1,1,NA,6,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12412.374308,12473.945857,2,96,4,4,0.57,6,6,0,3,0,2,29,1,3,4,NA +71807,7,2,1,12,NA,2,2,1,12,147,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,2,2,2,2,2,2,2,20560.901695,20667.963739,2,96,7,7,1.57,4,4,0,2,0,1,40,2,2,1,5 +71808,7,2,1,12,NA,1,1,1,12,147,NA,NA,1,1,NA,5,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,24228.858782,24355.020132,2,102,7,7,1.53,5,5,0,3,0,1,43,2,2,1,4 +71809,7,2,1,5,NA,4,4,1,5,65,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,14467.4421,14643.906573,2,101,4,4,1.22,2,2,1,0,0,2,31,1,4,77,NA +71810,7,2,1,33,NA,2,2,2,NA,NA,2,NA,2,2,2,NA,3,1,NA,2,2,2,2,2,2,2,2,2,2,34887.439952,34624.133414,2,94,14,4,1.47,5,1,0,0,0,1,24,2,4,5,NA +71811,7,2,2,53,NA,5,6,2,NA,NA,2,NA,2,1,99,NA,1,3,NA,1,2,1,1,2,2,1,1,1,3,14813.321679,14891.653673,2,94,77,77,NA,6,6,2,0,0,2,18,1,3,NA,NA +71812,7,2,1,3,NA,2,2,1,3,38,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,11179.43727,11533.315753,2,93,14,14,2.91,6,6,2,0,1,2,74,NA,NA,2,NA +71813,7,2,1,36,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17091.959624,18613.193853,1,90,15,15,5,4,4,2,0,0,1,36,1,5,1,5 +71814,7,2,1,3,NA,1,1,1,3,45,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,20874.345556,22365.354744,3,92,14,14,3.25,4,4,2,0,0,2,33,1,5,1,5 +71815,7,2,1,0,0,2,2,2,NA,1,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,2,2,2,NA,NA,NA,NA,4857.494088,5095.295928,2,90,4,4,0.57,5,5,1,0,2,2,80,2,1,2,NA +71816,7,2,1,2,NA,1,1,1,2,34,NA,NA,1,1,NA,NA,NA,NA,NA,2,1,2,1,2,2,NA,NA,NA,NA,14457.854197,14219.651494,1,92,6,6,1.34,4,4,1,0,0,1,25,2,3,1,3 +71817,7,2,1,8,NA,4,4,1,8,103,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8294.996898,8761.908989,2,100,8,8,1.1,7,7,3,3,0,2,58,1,3,5,NA +71818,7,2,1,8,NA,1,1,1,8,105,NA,NA,1,1,NA,2,NA,NA,NA,2,1,2,2,2,2,1,2,2,1,11036.458246,10927.552283,1,102,13,13,NA,6,6,1,2,0,2,36,2,4,6,NA +71819,7,2,2,25,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,4,1,2,2,2,2,1,2,2,1,2,1,2,51600.2972,52672.714014,1,101,9,9,2.88,3,3,1,0,0,1,36,2,2,1,4 +71820,7,2,1,47,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,138834.18124,139448.476692,1,100,15,15,5,5,5,0,3,0,1,47,1,5,1,5 +71821,7,2,2,50,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,NA,NA,NA,NA,16181.169973,16286.716901,2,100,6,6,2.04,2,2,0,0,0,2,50,1,2,1,3 +71822,7,2,2,19,NA,4,4,1,19,229,2,NA,1,1,NA,15,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,18163.985724,18749.311901,2,101,2,1,0.32,2,1,0,0,0,2,19,1,4,NA,NA +71823,7,2,2,4,NA,3,3,1,4,51,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,87448.870731,96516.512941,2,94,14,14,4.71,3,3,1,0,0,1,35,1,5,1,5 +71824,7,2,1,48,NA,2,2,2,NA,NA,2,NA,2,2,3,NA,5,1,NA,2,2,2,1,2,2,2,2,2,2,44123.284536,45145.647683,2,91,3,3,0.73,3,3,0,0,0,2,22,2,2,5,NA +71825,7,2,2,53,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,102322.335011,107871.941405,2,100,10,10,3.13,4,4,0,0,1,2,53,1,2,1,2 +71826,7,2,2,77,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,2,2,NA,1,2,2,1,2,2,1,2,2,NA,30880.887565,31700.101057,1,98,1,1,0.04,1,1,0,0,1,2,77,1,2,2,NA +71827,7,2,1,14,NA,5,6,1,14,169,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7669.677276,8194.5967,2,92,15,15,4.59,4,4,0,2,0,2,48,1,5,1,5 +71828,7,2,2,49,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,34954.173075,38933.293222,2,98,7,7,1.97,4,4,0,1,0,1,40,1,3,1,3 +71829,7,2,1,57,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,4,NA,1,2,2,1,2,2,1,2,2,1,23857.322871,24256.958876,2,103,2,2,0.46,2,2,0,0,0,1,57,1,2,4,NA +71830,7,2,2,34,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,3,6,2,2,2,2,2,2,2,NA,NA,NA,NA,34898.504426,34609.253559,1,100,8,3,0.68,6,3,1,0,0,1,33,2,3,6,NA +71831,7,2,2,41,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,3,1,2,1,2,2,1,2,2,1,2,2,1,33767.584626,40865.10406,2,102,14,14,2.44,7,7,0,2,1,2,71,1,3,3,NA +71832,7,2,2,49,NA,1,1,2,NA,NA,2,NA,2,1,6,NA,1,3,NA,2,2,2,1,2,2,2,2,2,2,40880.818805,41857.641766,1,101,5,5,0.51,7,7,0,3,2,1,75,2,1,1,1 +71833,7,2,2,30,NA,5,6,2,NA,NA,2,NA,2,2,2,NA,5,1,2,1,2,1,1,2,2,1,2,2,1,20963.809917,22126.306943,1,93,10,10,4.76,2,2,0,0,0,1,29,2,5,1,5 +71834,7,2,2,0,5,4,4,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3861.876549,4016.370213,1,96,8,8,1.61,6,6,3,0,0,1,33,2,5,1,4 +71835,7,2,2,17,NA,4,4,2,17,207,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,11133.192774,11654.909373,3,91,2,2,0.25,4,4,0,2,0,2,35,1,3,5,NA +71836,7,2,1,65,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,6036.688933,6083.909812,2,99,15,15,5,2,2,0,0,2,1,65,1,4,1,5 +71837,7,2,2,13,NA,2,2,2,13,161,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13824.001771,14551.102227,2,90,12,12,NA,4,4,0,2,0,2,38,2,4,1,4 +71838,7,2,2,10,NA,4,4,2,10,126,NA,NA,1,1,NA,4,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,7814.742747,8106.808519,2,95,4,4,0.65,4,4,1,2,0,2,27,1,3,5,NA +71839,7,2,2,57,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,160743.928829,165029.101567,1,95,8,6,2.04,4,2,0,1,0,2,57,1,5,5,NA +71840,7,2,2,11,NA,2,2,2,11,134,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,13450.921832,14026.252281,1,90,6,6,0.81,6,6,0,3,0,2,45,1,4,1,2 +71841,7,2,1,45,NA,2,2,1,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,28726.575428,29281.498535,2,100,14,14,3.36,4,4,1,1,0,1,45,2,5,1,2 +71842,7,2,1,6,NA,2,2,2,7,84,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,18107.947773,18211.90239,1,97,7,7,2.2,3,3,0,1,0,1,34,2,3,1,4 +71843,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,11507.810748,11454.924313,2,99,13,13,NA,6,6,2,1,0,2,31,1,4,6,NA +71844,7,2,2,43,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,1,1,2,1,2,2,1,2,2,1,2,2,1,19943.783243,19397.969296,2,95,2,2,0.4,2,2,0,0,0,2,43,1,1,1,NA +71845,7,2,1,8,NA,5,7,2,8,97,NA,NA,1,1,NA,1,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,8246.426933,10295.491756,1,99,10,10,3.99,3,3,0,1,0,1,36,2,2,6,NA +71846,7,2,1,72,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,NA,15429.860615,16015.253437,1,98,12,12,NA,3,3,0,0,2,1,72,1,5,1,3 +71847,7,2,1,37,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,94644.050918,104631.781207,2,91,15,15,5,3,3,1,0,0,1,37,1,5,1,5 +71848,7,2,1,26,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,10559.047286,11105.574109,2,92,8,6,2.75,2,1,0,0,0,1,26,2,5,5,NA +71849,7,2,2,56,NA,2,2,2,NA,NA,2,NA,2,1,7,NA,3,4,NA,2,2,2,2,2,2,1,2,2,2,21097.069797,24201.517172,2,90,3,3,1.1,1,1,0,0,0,2,56,2,3,4,NA +71850,7,2,2,6,NA,4,4,1,7,84,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8437.316833,8584.499702,2,96,4,4,0.4,7,7,3,2,0,2,25,1,2,5,NA +71851,7,2,1,17,NA,1,1,1,17,213,2,NA,2,2,3,11,NA,NA,NA,2,2,2,2,2,2,1,2,2,1,29234.272259,28953.402615,3,92,4,4,0.67,4,4,0,3,0,2,36,2,1,5,NA +71852,7,2,1,19,NA,5,7,1,19,232,2,NA,1,1,NA,13,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24231.355333,25219.610889,2,100,5,5,1.3,3,3,0,1,0,2,46,1,3,2,NA +71853,7,2,1,14,NA,4,4,1,14,169,NA,NA,1,1,NA,7,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,12046.265019,11945.683979,1,102,7,7,1.57,4,4,0,2,0,2,33,1,4,1,4 +71854,7,2,2,0,7,4,4,2,NA,8,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3756.765605,3760.183196,1,99,4,4,0.53,7,7,3,1,0,2,26,1,1,5,NA +71855,7,2,2,62,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,1,60351.409248,61337.452183,2,101,3,3,0.98,2,2,0,0,2,1,62,1,4,1,3 +71856,7,2,2,32,NA,5,6,2,NA,NA,2,NA,2,2,3,NA,5,1,2,1,2,2,1,2,2,1,2,2,1,16369.916397,16695.550655,1,101,10,10,3.67,3,3,1,0,0,1,36,2,5,1,5 +71857,7,2,1,39,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,78529.577822,81088.445647,1,98,15,15,5,5,5,0,3,0,2,41,1,5,6,NA +71858,7,2,1,27,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,NA,NA,NA,1,2,2,1,33510.443506,34234.256724,1,98,4,4,0.89,3,3,0,0,1,2,55,1,5,1,NA +71859,7,2,2,0,9,4,4,2,NA,10,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,NA,NA,NA,NA,NA,NA,NA,3516.231705,3777.543312,2,99,2,2,0.19,7,7,3,1,0,2,43,1,2,4,NA +71860,7,2,1,28,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,16436.212192,16355.203111,1,99,12,12,NA,2,2,0,0,0,1,28,1,5,5,NA +71861,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,1,2,2,1,11862.436765,15907.964192,1,90,3,3,1.07,1,1,0,0,1,2,68,1,2,5,NA +71862,7,2,2,54,NA,5,6,1,NA,NA,2,NA,2,2,6,NA,1,4,NA,1,1,2,1,2,2,NA,NA,NA,NA,10489.35334,11245.538838,3,91,14,14,2.5,6,6,1,1,1,2,37,2,2,1,5 +71863,7,2,1,38,NA,3,3,2,NA,NA,1,2,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,67281.364849,72381.052566,2,100,15,15,5,3,3,0,1,0,1,38,1,4,1,4 +71864,7,2,1,18,NA,2,2,2,18,221,2,NA,1,1,NA,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,16033.31661,16386.200415,2,90,8,8,2.01,4,4,0,0,1,2,67,2,4,2,NA +71865,7,2,2,1,23,4,4,2,NA,24,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6247.52442,6810.692829,1,99,7,7,1.06,7,7,3,1,0,1,38,1,4,6,NA +71866,7,2,1,32,NA,1,1,1,NA,NA,2,NA,2,2,3,NA,4,3,NA,2,2,2,1,2,2,2,2,2,2,37080.526463,37974.333878,2,103,12,77,NA,2,1,0,0,0,1,46,2,4,1,NA +71867,7,2,2,26,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,5,5,2,1,2,2,1,2,2,1,2,2,1,11696.173591,12753.148801,1,93,10,10,3.09,4,4,0,0,1,2,41,NA,NA,1,NA +71868,7,2,1,43,NA,1,1,1,NA,NA,2,NA,2,1,6,NA,3,1,NA,2,2,2,2,2,2,1,2,2,2,35406.972937,38657.357615,3,92,9,9,2.46,4,4,0,2,0,1,43,2,3,1,4 +71869,7,2,1,69,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,130234.912635,128905.524968,1,95,8,8,2.7,3,3,0,1,2,1,69,1,5,1,3 +71870,7,2,2,41,NA,3,3,1,NA,NA,2,NA,2,1,5,NA,2,3,2,1,2,2,1,2,2,1,2,2,1,26595.398371,26621.513872,1,94,3,3,0.93,2,2,0,0,0,2,41,2,2,3,NA +71871,7,2,2,43,NA,5,6,2,NA,NA,2,NA,2,1,6,NA,3,3,2,1,2,1,1,2,1,1,2,1,NA,18255.735511,18352.270791,2,91,12,12,NA,5,5,1,1,0,1,39,NA,NA,1,NA +71872,7,2,1,77,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,NA,12468.859946,13204.521198,2,96,6,6,1.77,2,2,0,0,2,1,77,1,2,1,2 +71873,7,2,2,20,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,4,6,2,1,2,2,1,2,2,1,2,2,1,122726.905904,130163.310429,1,101,8,6,2.69,2,1,0,0,0,2,20,1,4,6,NA +71874,7,2,1,24,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,14385.653726,15564.966804,2,101,8,4,1.7,2,1,0,0,0,1,24,2,5,5,NA +71875,7,2,1,42,NA,4,4,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,23766.023166,23781.059132,1,91,15,15,5,6,6,1,2,0,2,42,2,5,1,5 +71876,7,2,1,14,NA,1,1,1,14,177,NA,NA,1,1,NA,8,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,22621.505951,24307.488585,1,92,4,4,0.65,4,4,0,1,0,1,47,2,2,1,3 +71877,7,2,1,72,NA,2,2,1,NA,NA,2,NA,2,2,2,NA,2,1,NA,2,2,2,2,2,2,1,2,1,NA,14336.984082,15039.787037,2,100,99,99,NA,6,6,1,1,2,1,37,2,3,1,3 +71878,7,2,1,35,NA,2,2,1,NA,NA,2,NA,2,1,3,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,39943.378263,40565.140919,2,93,7,7,1.56,4,4,1,1,0,1,35,2,4,1,4 +71879,7,2,1,24,NA,4,4,1,NA,NA,2,NA,1,1,NA,NA,4,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,25815.880139,26556.735732,2,101,2,2,0.51,2,1,0,0,0,1,24,1,4,5,NA +71880,7,2,1,46,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,21158.364877,21285.812242,1,96,12,12,NA,2,2,0,0,0,1,46,1,4,1,5 +71881,7,2,1,20,NA,5,6,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,13370.868197,14159.618266,1,97,15,15,5,4,4,0,0,0,1,51,2,5,1,5 +71882,7,2,2,60,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,2,1,NA,1,2,2,1,2,2,1,2,2,1,12331.419303,13379.957577,2,95,3,3,0.75,2,2,0,0,2,1,60,1,2,1,2 +71883,7,2,1,42,NA,5,6,2,NA,NA,2,NA,2,2,5,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,17210.953493,17934.928395,1,91,77,77,NA,4,4,1,1,0,1,42,2,5,1,5 +71884,7,2,1,49,NA,5,6,1,NA,NA,2,NA,2,2,5,NA,1,1,NA,1,2,1,1,2,1,NA,NA,NA,NA,11601.882948,11708.549693,2,92,77,77,NA,4,4,0,0,0,1,27,2,2,5,NA +71885,7,2,1,35,NA,1,1,2,NA,NA,2,NA,2,2,5,NA,2,6,NA,2,2,2,1,2,2,2,2,2,2,31045.881083,33019.807379,2,97,4,4,0.6,6,6,2,2,0,1,35,2,2,6,NA +71886,7,2,1,61,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,5,NA,1,2,2,1,2,2,1,2,2,1,6612.194774,6870.810722,2,99,6,6,2.28,1,1,0,0,1,1,61,1,3,5,NA +71887,7,2,2,68,NA,2,2,2,NA,NA,2,NA,2,1,8,NA,1,1,NA,1,2,2,NA,NA,NA,1,2,2,1,12689.611047,13462.268549,1,90,4,4,1.12,2,2,0,0,2,1,68,2,4,1,1 +71888,7,2,2,67,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,3,3,NA,1,2,2,1,2,2,1,2,2,1,10346.035773,10764.448363,1,99,2,2,0.31,4,4,1,0,1,2,67,1,3,3,NA +71889,7,2,2,5,NA,5,7,1,5,61,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7483.230909,8143.441843,2,96,15,15,5,4,4,1,1,0,2,35,2,5,1,5 +71890,7,1,2,31,NA,3,3,NA,NA,NA,2,NA,1,1,NA,NA,3,5,3,1,2,2,1,2,2,NA,NA,NA,NA,76271.00266,0,3,91,8,8,3.4,2,2,1,0,0,2,31,1,3,5,NA +71891,7,2,2,54,NA,1,1,1,NA,NA,2,NA,2,1,7,NA,4,1,NA,2,2,2,2,2,2,2,2,2,2,30976.631116,32561.666417,2,102,9,9,3.24,3,3,0,0,0,1,54,2,4,1,4 +71892,7,2,1,0,3,4,4,2,NA,5,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,6327.979262,6425.104835,1,90,6,6,1.92,2,2,1,0,0,2,51,2,1,5,NA +71893,7,2,2,3,NA,5,7,2,3,40,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,8173.816615,8894.95474,1,97,15,15,5,3,3,1,0,0,1,40,1,3,1,5 +71894,7,2,1,11,NA,2,2,2,11,143,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,11113.498573,11364.131177,1,94,14,14,3.4,5,5,0,3,0,2,41,1,4,1,4 +71895,7,2,1,31,NA,5,6,1,NA,NA,2,NA,2,2,2,NA,5,1,NA,1,2,2,1,2,2,1,2,2,3,17165.91562,17929.203991,2,96,15,6,2.3,3,1,0,0,0,1,31,2,5,1,NA +71896,7,2,1,4,NA,4,4,2,4,59,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,9304.437652,9588.632035,2,97,14,14,3.91,4,4,1,1,0,1,38,1,4,1,5 +71897,7,2,2,68,NA,4,4,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,12331.419303,12882.003985,2,95,77,77,NA,2,2,0,0,2,1,68,1,4,1,4 +71898,7,2,2,65,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,15207.312407,15896.113669,1,92,9,9,3.97,2,2,0,0,2,2,65,1,4,1,4 +71899,7,2,2,3,NA,3,3,1,3,37,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,66833.888628,73763.947124,2,98,7,7,1.61,4,4,1,1,0,1,43,NA,NA,6,NA +71900,7,1,2,26,NA,2,2,NA,NA,NA,2,NA,1,1,NA,NA,5,5,3,1,2,2,1,2,2,NA,NA,NA,NA,55675.708832,0,1,93,3,2,0.46,2,1,0,0,0,2,26,1,5,5,NA +71901,7,2,2,48,NA,5,7,2,NA,NA,2,NA,1,1,NA,NA,4,1,NA,1,2,2,1,2,2,1,2,2,1,30442.30641,31779.541767,1,101,3,3,0.88,2,2,0,0,0,1,56,1,2,1,4 +71902,7,2,2,67,NA,5,6,2,NA,NA,2,NA,2,1,8,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,11494.286549,11937.924974,2,94,8,8,3.4,2,2,0,0,2,1,80,1,3,1,5 +71903,7,2,2,6,NA,4,4,1,6,73,NA,NA,1,1,NA,0,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,11076.064101,11514.984987,2,102,2,2,0.36,4,4,1,2,0,2,36,1,3,5,NA +71904,7,2,2,30,NA,5,6,1,NA,NA,2,NA,2,1,6,NA,4,5,2,1,2,2,1,2,1,NA,NA,NA,NA,11032.714892,11055.242776,2,92,5,5,0.64,7,7,1,2,1,1,66,2,1,1,3 +71905,7,1,2,8,NA,5,6,NA,NA,NA,NA,NA,1,1,NA,3,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,7405.452085,0,1,95,6,6,1.34,4,4,0,2,0,2,32,2,3,2,NA +71906,7,2,2,4,NA,5,6,2,4,54,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,3788.132941,4021.443194,3,90,77,77,NA,7,7,1,2,0,1,41,2,3,6,NA +71907,7,2,1,80,NA,3,3,2,NA,NA,1,1,1,1,NA,NA,3,1,NA,1,2,2,1,2,2,1,2,2,NA,47098.572584,50542.386793,1,95,9,9,4.08,2,2,0,0,2,1,80,1,3,1,NA +71908,7,2,2,66,NA,3,3,1,NA,NA,2,NA,1,1,NA,NA,5,2,NA,1,2,2,1,2,2,1,2,2,1,93265.413087,94789.216803,2,98,10,10,4.55,2,2,0,0,1,2,66,1,5,2,NA +71909,7,2,1,28,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,2,5,NA,1,2,2,1,2,2,NA,NA,NA,NA,37911.437415,38428.199561,2,103,2,2,0.46,2,2,0,0,0,1,57,1,2,4,NA +71910,7,2,2,0,5,3,3,2,NA,6,NA,NA,1,1,NA,NA,NA,NA,NA,1,1,2,1,2,2,NA,NA,NA,NA,17151.556324,17621.071345,1,98,14,14,3.37,5,5,1,2,0,1,27,1,5,1,5 +71911,7,2,1,27,NA,1,1,1,NA,NA,2,NA,1,1,NA,NA,5,1,NA,1,2,2,1,2,2,1,2,2,1,42165.369652,43039.787442,2,102,14,14,3.25,5,5,2,0,0,1,27,1,5,1,5 +71912,7,2,1,40,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,1,1,NA,1,2,2,1,2,2,1,2,2,1,19633.637051,20770.138122,1,98,6,6,1.73,3,3,0,1,0,2,39,1,4,1,1 +71913,7,2,2,18,NA,5,6,1,18,226,2,NA,2,1,4,11,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,7382.152016,8028.485773,1,94,14,14,2.78,6,5,0,2,1,1,61,1,4,1,5 +71914,7,2,2,10,NA,3,3,2,10,131,NA,NA,1,1,NA,5,NA,NA,NA,1,1,2,1,2,2,1,2,2,1,60197.256541,63931.531988,2,94,14,14,2.63,6,6,1,3,0,1,39,1,4,1,4 +71915,7,2,1,60,NA,3,3,2,NA,NA,2,NA,1,1,NA,NA,5,5,NA,1,2,2,1,2,2,1,2,2,1,88961.259215,91446.591982,3,90,10,10,5,1,1,0,0,1,1,60,1,5,5,NA +71916,7,2,1,16,NA,3,3,1,16,198,NA,NA,1,1,NA,9,NA,NA,NA,1,2,2,1,2,2,1,2,2,1,24446.632088,24751.360191,1,94,4,4,0.79,3,3,0,1,0,1,49,1,2,3,NA diff --git a/pandas/io/tests/data/DRXFCD_G.XPT b/pandas/io/tests/data/DRXFCD_G.XPT new file mode 100644 index 0000000000000..15de11e8f9f49 Binary files /dev/null and b/pandas/io/tests/data/DRXFCD_G.XPT differ diff --git a/pandas/io/tests/data/DRXFCD_G.csv b/pandas/io/tests/data/DRXFCD_G.csv new file mode 100644 index 0000000000000..3fceacd1273bd --- /dev/null +++ b/pandas/io/tests/data/DRXFCD_G.csv @@ -0,0 +1,7619 @@ +"DRXFDCD","DRXFCSD","DRXFCLD" +1.1e+07,"MILK, HUMAN","Milk, human" +11100000,"MILK, NFS","Milk, NFS" +11111000,"MILK, COW'S, FLUID, WHOLE","Milk, cow's, fluid, whole" +11111100,"MILK, COW'S, FLUID, WHOLE, LOW SODIUM","Milk, cow's, fluid, whole, low-sodium" +11111150,"MILK, CALCIUM FORTIFIED, WHOLE, COW'S, FLUID","Milk, calcium fortified, cow's, fluid, whole" +11111160,"MILK, CALCIUM FORTIFIED, COW'S, FLUID, 1% FAT","Milk, calcium fortified, cow's, fluid, 1% fat" +11111170,"MILK, CALCIUM FORTIFIED, SKIM/NONFAT, COW, FLUID","Milk, calcium fortified, cow's, fluid, skim or nonfat" +11112110,"MILK, COW'S, FLUID, 2% FAT","Milk, cow's, fluid, 2% fat" +11112120,"MILK, COW'S, FLUID, ACIDOPHILUS, 1% FAT","Milk, cow's, fluid, acidophilus, 1% fat" +11112130,"MILK, COW'S, FLUID, ACIDOPHILUS, 2% FAT","Milk, cow's, fluid, acidophilus, 2% fat" +11112210,"MILK, COW'S, FLUID, 1% FAT","Milk, cow's, fluid, 1% fat" +11113000,"MILK, COW'S, FLUID, SKIM OR NONFAT","Milk, cow's, fluid, skim or nonfat, 0.5% or less butterfat" +11114300,"MILK, LOW LACTOSE, 1% FAT","Milk, cow's, fluid, lactose reduced, 1% fat" +11114310,"MILK, LOW LACTOSE, 1% FAT, FORTIFIED WITH CALCIUM","Milk, cow's, fluid, lactose reduced, 1% fat, fortified with calcium" +11114320,"MILK, LOW LACTOSE, NONFAT","Milk, cow's, fluid, lactose reduced, nonfat" +11114321,"MILK, LOW LACTOSE, NONFAT, W/ CALCIUM","Milk, cow's, fluid, lactose reduced, nonfat, fortified with calcium" +11114330,"MILK, COW'S FL LACTOSE REDUCED 2% FAT (LACTAID)","Milk, cow's, fluid, lactose reduced, 2% fat" +11114350,"MILK, COW'S, FLUID, LACTOSE REDUCED, WHOLE","Milk, cow's, fluid, lactose reduced, whole" +11115000,"BUTTERMILK, FLUID (INCLUDE KEFIR MILK)","Buttermilk, fluid, nonfat" +11115100,"BUTTERMILK, FLUID, 1% FAT","Buttermilk, fluid, 1% fat" +11115200,"BUTTERMILK, FLUID, 2% FAT","Buttermilk, fluid, 2% fat" +11115300,"BUTTERMILK, FLUID, WHOLE","Buttermilk, fluid, whole" +11116000,"MILK, GOAT'S, FLUID, WHOLE","Milk, goat's, fluid, whole" +11120000,"MILK, DRY, RECONSTITUTED, NFS","Milk, dry, reconstituted, NFS" +11121100,"MILK, DRY, RECONSTITUTED, WHOLE","Milk, dry, reconstituted, whole" +11121210,"MILK, DRY, RECONSTITUTED, LOWFAT","Milk, dry, reconstituted, lowfat" +11121300,"MILK, DRY, RECONSTITUTED, NONFAT","Milk, dry, reconstituted, nonfat" +11210050,"MILK, EVAPORATED, NS AS TO FAT CONTENT","Milk, evaporated, NS as to fat content (formerly NS as to dilution, used in coffee or tea, assume undiluted)" +11211050,"MILK, EVAPORATED, WHOLE","Milk, evaporated, whole (formerly NS as to dilution, used in coffee or tea)" +11211400,"MILK, EVAPORATED, 2% FAT","Milk, evaporated, 2% fat (formerly NS as to dilution)" +11212050,"MILK, EVAPORATED, SKIM","Milk, evaporated, skim (formerly NS as to dilution, used in coffee or tea)" +11220000,"MILK, CONDENSED, SWEETENED","Milk, condensed, sweetened (formerly NS as to dilution)" +11320000,"MILK, SOY, READY-TO-DRINK, NOT BABY","Milk, soy, ready-to-drink, not baby's" +11320100,"MILK, SOY, LIGHT, READY-TO-DRINK, NOT BABY'S","Milk, soy, light, ready-to-drink, not baby's" +11320200,"MILK, SOY, NONFAT, READY-TO-DRINK, NOT BABY'S","Milk, soy, nonfat, ready-to-drink, not baby's" +11321000,"MILK, SOY, READY-TO-DRINK, NOT BABY'S, CHOCOLATE","Milk, soy, ready-to-drink, not baby's, chocolate" +11321100,"MILK, SOY, LIGHT, READY-TO-DRINK, NOT BABY'S, CHOCOLATE","Milk, soy, light, ready-to-drink, not baby's, chocolate" +11321200,"MILK, SOY, NONFAT, READY-TO-DRINK, NOT BABY'S, CHOCOLATE","Milk, soy, nonfat, ready-to-drink, not baby's, chocolate" +11340000,"MILK,IMITATION,FLUID,NONSOY,SWEETENED,NOT CHOCOLATE","Milk, imitation, fluid, non-soy, sweetened, flavors other than chocolate" +11350000,"MILK, ALMOND, READY-TO-DRINK","Milk, almond, ready-to-drink" +11350010,"MILK, ALMOND, READY-TO-DRINK, CHOCOLATE","Milk, almond, ready-to-drink, chocolate" +11410000,"YOGURT, NS AS TO TYPE OF MILK/FLAVOR","Yogurt, NS as to type of milk or flavor" +11411010,"YOGURT, PLAIN, NS AS TO TYPE OF MILK","Yogurt, plain, NS as to type of milk" +11411100,"YOGURT, PLAIN, WHOLE MILK","Yogurt, plain, whole milk" +11411200,"YOGURT, PLAIN, LOWFAT MILK","Yogurt, plain, lowfat milk" +11411300,"YOGURT, PLAIN, NONFAT MILK","Yogurt, plain, nonfat milk" +11420000,"YOGURT, VANILLA, LEMON, COFFEE, NS AS TO MILK TYPE","Yogurt, vanilla, lemon, or coffee flavor, NS as to type of milk" +11421000,"YOGURT, VANILLA, LEMON, COFFEE, WHOLE MILK","Yogurt, vanilla, lemon, or coffee flavor, whole milk" +11422000,"YOGURT, VANILLA, LEMON, COFFEE, LOWFAT MILK","Yogurt, vanilla, lemon, maple, or coffee flavor, lowfat milk" +11422100,"YOGURT, VANILLA, LEMON, COFFEE, LOWFAT MILK, LOW CAL SWTNR","Yogurt, vanilla, lemon, maple, or coffee flavor, lowfat milk, sweetened with low calorie sweetener" +11423000,"YOGURT, VANILLA, LEMON, COFFEE, NONFAT MILK","Yogurt, vanilla, lemon, maple, or coffee flavor, nonfat milk" +11424000,"YOGURT, VANILLA, LEMON, COFFEE, NONFAT MILK, LOW CAL SWEET","Yogurt, vanilla, lemon, maple, or coffee flavor, nonfat milk, sweetened with low calorie sweetener" +11425000,"YOGURT, CHOCOLATE, NS AS TO TYPE OF MILK","Yogurt, chocolate, NS as to type of milk" +11426000,"YOGURT, CHOCOLATE, WHOLE MILK","Yogurt, chocolate, whole milk" +11427000,"YOGURT, CHOCOLATE, NONFAT MILK","Yogurt, chocolate, nonfat milk" +11430000,"YOGURT, FRUIT VARIETY, NS AS TO MILK TYPE","Yogurt, fruit variety, NS as to type of milk" +11431000,"YOGURT, FRUIT VARIETY, WHOLE MILK","Yogurt, fruit variety, whole milk" +11432000,"YOGURT, FRUIT VARIETY, LOWFAT MILK","Yogurt, fruit variety, lowfat milk" +11432500,"YOGURT, FRUIT VARIETY, LOWFAT MILK, W/ LOW CAL SWEETENER","Yogurt, fruit variety, lowfat milk, sweetened with low-calorie sweetener" +11433000,"YOGURT, FRUIT VARIETY, NONFAT MILK","Yogurt, fruit variety, nonfat milk" +11433500,"YOGURT, FRUITED, NONFAT MILK, LOW CAL SWEETENER","Yogurt, fruit variety, nonfat milk, sweetened with low-calorie sweetener" +11446000,"FRUIT AND LOWFAT YOGURT PARFAIT","Fruit and lowfat yogurt parfait" +11459990,"YOGURT, FROZEN, NS AS TO FLAVOR, NS TO TYPE OF MILK","Yogurt, frozen, NS as to flavor, NS as to type of milk" +11460000,"YOGURT, FROZEN, NOT CHOCOLATE, TYPE OF MILK NS","Yogurt, frozen, flavors other than chocolate, NS as to type of milk" +11460100,"YOGURT, FROZEN, CHOCOLATE, TYPE OF MILK NS","Yogurt, frozen, chocolate, NS as to type of milk" +11460150,"YOGURT, FROZEN, NS AS TO FLAVOR, LOWFAT MILK","Yogurt, frozen, NS as to flavor, lowfat milk" +11460160,"YOGURT, FROZEN, CHOCOLATE, LOWFAT MILK","Yogurt, frozen, chocolate, lowfat milk" +11460170,"YOGURT, FROZEN, NOT CHOCOLATE, LOWFAT MILK","Yogurt, frozen, flavors other than chocolate, lowfat milk" +11460190,"YOGURT, FROZEN, NS AS TO FLAVOR, NONFAT MILK","Yogurt, frozen, NS as to flavor, nonfat milk" +11460200,"YOGURT, FROZEN, CHOCOLATE, NONFAT MILK","Yogurt, frozen, chocolate, nonfat milk" +11460250,"YOGURT,FROZEN,NOT CHOCOLATE,W/ SORBET/SORBET-COATED","Yogurt, frozen, flavors other than chocolate, with sorbet or sorbet-coated" +11460300,"YOGURT, FROZEN, NOT CHOCOLATE, NONFAT MILK","Yogurt, frozen, flavors other than chocolate, nonfat milk" +11460400,"YOGURT,FRZ,CHOCOLATE,NONFAT MILK,W/ LOW-CAL SWEET","Yogurt, frozen, chocolate, nonfat milk, with low-calorie sweetener" +11460410,"YOGURT,FRZ,NOT CHOC,NONFAT MILK,W/ LOW-CAL SWEET","Yogurt, frozen, flavors other than chocolate, nonfat milk, with low-calorie sweetener" +11460420,"YOGURT, FROZEN, NS AS TO FLAVOR, WHOLE MILK","Yogurt, frozen, NS as to flavor, whole milk" +11460430,"YOGURT, FROZEN, CHOCOLATE, WHOLE MILK","Yogurt, frozen, chocolate, whole milk" +11460440,"YOGURT, FROZEN, NOT CHOCOLATE, WHOLE MILK","Yogurt, frozen, flavors other than chocolate, whole milk" +11461000,"YOGURT, FROZEN, CHOCOLATE-COATED","Yogurt, frozen, chocolate-coated" +11461200,"YOGURT, FROZEN, SANDWICH","Yogurt, frozen, sandwich" +11461250,"YOGURT, FROZEN, CONE, CHOCOLATE","Yogurt, frozen, cone, chocolate" +11461260,"YOGURT, FROZEN, CONE, NOT CHOCOLATE","Yogurt, frozen, cone, flavors other than chocolate" +11461270,"YOGURT, FROZEN, CONE, NOT CHOCOLATE, LOWFAT MILK","Yogurt, frozen, cone, flavors other than chocolate, lowfat milk" +11461280,"YOGURT, FROZ, CONE, CHOCOLATE, LOWFAT MILK","Yogurt, frozen, cone, chocolate, lowfat milk" +11480010,"YOGURT, WHOLE MILK, BF","Yogurt, whole milk, baby food" +11480020,"YOGURT, WHOLE MILK, BF, W/FRUIT& MULTIGRAIN CEREAL,NFS","Yogurt, whole milk, baby food, with fruit and multigrain cereal puree, NFS" +11480030,"YOGURT, WHOLE MILK, BF, W/FRUIT&MULTIGRAIN CEREAL + IRON","Yogurt, whole milk, baby food, with fruit and multigrain cereal puree, plus iron" +11480040,"YOGURT, WHOLE MILK, BF, W/FRUIT&MULTIGRAIN CEREAL + DHA","Yogurt, whole milk, baby food, with fruit and multigrain cereal puree, plus DHA" +11511000,"MILK, CHOCOLATE, NFS","Milk, chocolate, NFS" +11511100,"MILK, CHOCOLATE, WHOLE MILK BASED","Milk, chocolate, whole milk-based" +11511200,"MILK, CHOCOLATE, RED FAT, 2%","Milk, chocolate, reduced fat milk-based, 2% (formerly ""lowfat"")" +11511300,"MILK, CHOCOLATE, SKIM MILK BASED","Milk, chocolate, skim milk-based" +11511400,"MILK, CHOCOLATE, LOWFAT MILK BASED","Milk, chocolate, lowfat milk-based" +11512000,"COCOA,HOT CHOCOLATE,NOT FROM DRY MIX, W/WHOLE MILK","Cocoa, hot chocolate, not from dry mix, made with whole milk" +11512500,"HOT CHOCOLATE, P.R., MADE W/ WHOLE MILK","Hot chocolate, Puerto Rican style, made with whole milk" +11512510,"HOT CHOCOLATE, P.R., MADE W/ LOW FAT MILK","Hot chocolate, Puerto Rican style, made with low fat milk" +11513000,"COCOA & SUGAR MIXTURE, MILK ADDED, NS TYPE MILK","Cocoa and sugar mixture, milk added, NS as to type of milk" +11513100,"COCOA & SUGAR MIXTURE, WHOLE MILK ADDED","Cocoa and sugar mixture, whole milk added" +11513150,"COCOA & SUGAR MIXTURE, REDUCED FAT MILK ADDED","Cocoa and sugar mixture, reduced fat milk added" +11513200,"COCOA & SUGAR MIXTURE, LOWFAT MILK ADDED","Cocoa and sugar mixture, lowfat milk added" +11513300,"COCOA & SUGAR MIXTURE, SKIM MILK ADDED","Cocoa and sugar mixture, skim milk added" +11513350,"COCOA AND SUGAR MIXTURE, REDUCED SUGAR, MILK ADDED, NS TYPE","Cocoa and sugar mixture, reduced sugar, milk added, NS as to type of milk" +11513355,"COCOA AND SUGAR MIXTURE, REDUCED SUGAR, WHOLE MILK ADDED","Cocoa and sugar mixture, reduced sugar, whole milk added" +11513360,"COCOA AND SUGAR MIXTURE, REDUCED SUGAR, REDUCED FAT MILK ADD","Cocoa and sugar mixture, reduced sugar, reduced fat milk added" +11513365,"COCOA AND SUGAR MIXTURE, REDUCED SUGAR, LOWFAT MILK ADDED","Cocoa and sugar mixture, reduced sugar, lowfat milk added" +11513370,"COCOA AND SUGAR MIXTURE, REDUCED SUGAR, SKIM MILK ADDED","Cocoa and sugar mixture, reduced sugar, skim milk added" +11513400,"CHOCOLATE SYRUP, MILK ADDED, NS AS TO TYPE OF MILK","Chocolate syrup, milk added, NS as to type of milk" +11513500,"CHOCOLATE SYRUP, WHOLE MILK ADDED","Chocolate syrup, whole milk added" +11513550,"CHOCOLATE SYRUP, RED FAT MILK ADDED","Chocolate syrup, reduced fat milk added" +11513600,"CHOCOLATE SYRUP, LOWFAT MILK ADDED","Chocolate syrup, lowfat milk added" +11513700,"CHOCOLATE SYRUP, SKIM MILK ADDED","Chocolate syrup, skim milk added" +11514100,"COCOA, SUGAR, & DRY MILK MIXTURE, WATER ADDED","Cocoa, sugar, and dry milk mixture, water added" +11514300,"COCOA W/ NF DRY MILK, LO CAL SWEETENER, WATER ADDED","Cocoa with nonfat dry milk and low calorie sweetener, mixture, water added" +11514500,"COCOA W/ WHEY, LO CAL SWEETNR, FORTIFD, WATER ADDED","Cocoa, whey, and low calorie sweetener, mixture, fortified, water added" +11515100,"COCOA & SUGAR W/ MILK, FORTIFIED, PUERTO RICAN","Cocoa and sugar mixture fortified with vitamins and minerals, milk added, NS as to type of milk, Puerto Rican style" +11516000,"COCOA, WHEY, LO CAL SWEETNER MIX, LOWFAT MILK ADDED","Cocoa, whey, and low-calorie sweetener mixture, lowfat milk added" +11518050,"MILK BEV W/NF DRY MILK, LO CAL SWEET,WATER,NOT CHOC","Milk beverage with nonfat dry milk and low calorie sweetener, water added, flavors other than chocolate" +11519000,"MILK BEVERAGE, NOT CHOCOLATE, W/ WHOLE MILK","Milk beverage, made with whole milk, flavors other than chocolate" +11519040,"MILK, FLAVORS OTHER THAN CHOCOLATE, NFS","Milk, flavors other than chocolate, NFS" +11519050,"MILK, NOT CHOCOLATE, WHOLE MILK BASED","Milk, flavors other than chocolate, whole milk-based" +11519105,"MILK, FLAVORS OTHER THAN CHOCOLATE, REDUCED FAT MILK-BASED","Milk, flavors other than chocolate, reduced fat milk-based" +11519200,"MILK, FLAVORS OTHER THAN CHOCOLATE, LOWFAT MILK-BASED","Milk, flavors other than chocolate, lowfat milk-based" +11519205,"MILK, FLAVORS OTHER THAN CHOCOLATE, SKIM-MILK BASED","Milk, flavors other than chocolate, skim-milk based" +11520000,"MILK, MALTED, UNFORTIFIED, FLAVOR NS","Milk, malted, unfortified, NS as to flavor, made with milk" +11521000,"MILK, MALTED, UNFORTIFIED, CHOCOLATE FLAVOR","Milk, malted, unfortified, chocolate, made with milk" +11522000,"MILK, MALTED, UNFORTIFIED, NATURAL FLAVOR","Milk, malted, unfortified, natural flavor, made with milk" +11525000,"MILK,MALTED,FORTIFIED,NATURAL FLAVOR (INCL OVALTINE","Milk, malted, fortified, natural flavor, made with milk" +11526000,"MILK, MALTED, FORTIFIED, CHOCOLATE (INCL OVALTINE)","Milk, malted, fortified, chocolate, made with milk" +11527000,"MILK, MALTED, FORTIFIED, (INCL OVALTINE)","Milk, malted, fortified, NS as to flavor, made with milk" +11531000,"EGGNOG, MADE W/ WHOLE MILK (INCLUDE EGG NOG, NFS)","Eggnog, made with whole milk" +11531500,"EGGNOG, MADE W/ 2% REDUCED FAT MILK","Eggnog, made with 2% reduced fat milk (formerly eggnog, made with ""2% lowfat"" milk)" +11541000,"MILK SHAKE, NS AS TO FLAVOR OR TYPE","Milk shake, NS as to flavor or type" +11541100,"MILK SHAKE,HOMEMADE/ FOUNTAIN-TYPE, NS AS TO FLAVOR","Milk shake, homemade or fountain-type, NS as to flavor" +11541110,"MILK SHAKE, HOMEMADE OR FOUNTAIN-TYPE, CHOCOLATE","Milk shake, homemade or fountain-type, chocolate" +11541120,"MILK SHAKE, HOMEMADE/FOUNTAIN-TYPE, NOT CHOCOLATE","Milk shake, homemade or fountain-type, flavors other than chocolate" +11541400,"MILK SHAKE WITH MALT (INCL MALTED MILK W/ICE CREAM)","Milk shake with malt" +11541500,"MILK SHAKE, MADE W/ SKIM MILK, CHOCOLATE","Milk shake, made with skim milk, chocolate" +11541510,"MILK SHAKE,MADE W/ SKIM MILK, NOT CHOCOLATE","Milk shake, made with skim milk, flavors other than chocolate" +11542000,"CARRY-OUT MILK SHAKE, NS AS TO FLAVOR","Carry-out milk shake, NS as to flavor" +11542100,"CARRY-OUT MILK SHAKE, CHOCOLATE","Carry-out milk shake, chocolate" +11542200,"CARRY-OUT MILK SHAKE, NOT CHOCOLATE","Carry-out milk shake, flavors other than chocolate" +11551050,"MILK FRUIT DRINK (INCL LICUADO)","Milk fruit drink" +11552200,"ORANGE JULIUS","Orange Julius" +11553000,"FRUIT SMOOTHIE DRINK, W/ FRUIT OR JUICE & DAIRY PRODUCTS","Fruit smoothie drink, made with fruit or fruit juice and dairy products" +11553100,"FRUIT SMOOTHIE DRINK, NFS","Fruit smoothie drink, NFS" +11560000,"CHOC-FLAVORED DRINK, WHEY-&MILK-BASED(INCL YOO-HOO)","Chocolate-flavored drink, whey- and milk-based" +11560020,"MILK DRINK, WHEY&MILK-BASE, NOT CHOC (INCL YOO-HOO)","Flavored milk drink, whey- and milk-based, flavors other than chocolate" +11561000,"CAFE CON LECHE","Cafe con leche" +11561010,"CAFE CON LECHE PREPARED W/ SUGAR","Cafe con leche prepared with sugar" +11710000,"INFANT FORMULA, NFS","Infant formula, NFS" +11710050,"SIMILAC EXPERT CARE ALIMENTUM, INFANT FORMULA, NS AS TO FORM","Similac Expert Care Alimentum, infant formula, NS as to form" +11710051,"SIMILAC EXPERT CARE ALIMENTUM, INFANT FORMULA, READY-TO-FEED","Similac Expert Care Alimentum, infant formula, ready-to-feed" +11710053,"SIMILAC EXPERT CARE ALIMENTUM,INF FORM,PREP FR PDR,WATER NFS","Similac Expert Care Alimentum, infant formula, prepared from powder, made with water, NFS" +11710054,"SIMILAC EXPERT CARE ALIMENTUM,INF FORM,PREP FR PDR,TAP WATER","Similac Expert Care Alimentum, infant formula, prepared from powder, made with tap water" +11710055,"SIMILAC EXPERT CARE ALIMENTUM, INF FORM, FR PDR, BTL WATER","Similac Expert Care Alimentum, infant formula, prepared from powder, made with plain bottled water" +11710056,"SIMILAC EXPERT CARE ALIMENTUM,INF FORM,PREP FR PDR,BABY WATR","Similac Expert Care Alimentum, infant formula, prepared from powder, made with baby water" +11710350,"SIMILAC ADVANCE, INFANT FORMULA, NS AS TO FORM","Similac Advance, infant formula, NS as to form" +11710351,"SIMILAC ADVANCE, INFANT FORMULA, READY-TO-FEED","Similac Advance, infant formula, ready-to-feed" +11710352,"SIMILAC ADVANCE, INF FORMULA, PREP FRM LIQ CONC, W/WATER,NFS","Similac Advance, infant formula, prepared from liquid concentrate, made with water, NFS" +11710353,"SIMILAC ADVANCE, INFANT FORMULA, PREP FRM PDR, W/WATER NFS","Similac Advance, infant formula, prepared from powder, made with water, NFS" +11710354,"SIMILAC ADVANCE, INF FORMULA, PREP FRM LIQ CONC, W/TAP WATER","Similac Advance, infant formula, prepared from liquid concentrate, made with tap water" +11710355,"SIMILAC ADVANCE, INF FORMULA, PREP FRM LIQ CONC, W/BOT WATER","Similac Advance, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710356,"SIMILAC ADVANCE, INF FORMULA, PREP FR LIQ CONC, W/ BABY WATR","Similac Advance, infant formula, prepared from liquid concentrate, made with baby water" +11710357,"SIMILAC ADVANCE, INFANT FORMULA, PREP FRM PDR, W/TAP WATER","Similac Advance, infant formula, prepared from powder, made with tap water" +11710358,"SIMILAC ADVANCE, INFANT FORMULA, PREP FRM PDR, W/BOT WATER","Similac Advance, infant formula, prepared from powder, made with plain bottled water" +11710359,"SIMILAC ADVANCE, INFANT FORMULA, PREP FRM PDR, W/BABY WATER","Similac Advance, infant formula, prepared from powder, made with baby water" +11710360,"SIMILAC ADVANCE ORGANIC, INFANT FORMULA, NS AS TO FORM","Similac Advance Organic, infant formula, NS as to form" +11710361,"SIMILAC ADVANCE ORGANIC, INFANT FORMULA, READY-TO-FEED","Similac Advance Organic, infant formula, ready-to-feed" +11710363,"SIMILAC ADVANCE ORGANIC,INF FORM,PREP FR PDR,W/WATER,NFS","Similac Advance Organic, infant formula, prepared from powder, made with water, NFS" +11710367,"SIMILAC ADVANCE ORGANIC,INF FORM,PREP FR PDR,W/TAP WATER","Similac Advance Organic, infant formula, prepared from powder, made with tap water" +11710368,"SIMILAC ADVANCE ORGANIC,INF FORM,PREP FR PDR,W/BOT WATER","Similac Advance Organic, infant formula, prepared from powder, made with plain bottled water" +11710369,"SIMILAC ADVANCE ORGANIC,INF FORM,PREP FR PDR,W/BABY WATER","Similac Advance Organic, infant formula, prepared from powder, made with baby water" +11710370,"SIMILAC SENSITIVE, INFANT FORMULA, NS AS TO FORM","Similac Sensitive, infant formula, NS as to form" +11710371,"SIMILAC SENSITIVE, INFANT FORMULA, READY-TO-FEED","Similac Sensitive, infant formula, ready-to-feed" +11710372,"SIMILAC SENSITIVE, INF FORM, PREP FRM LIQ CONC, W/WATER,NFS","Similac Sensitive, infant formula, prepared from liquid concentrate, made with water, NFS" +11710373,"SIMILAC SENSITIVE, INF FORM, PREP FRM PDR, W/ WATER,NFS","Similac Sensitive, infant formula, prepared from powder, made with water, NFS" +11710374,"SIMILAC SENSITIVE, INF FORM, PREP FRM LIQ CONC, W/TAP WATER","Similac Sensitive, infant formula, prepared from liquid concentrate, made with tap water" +11710375,"SIMILAC SENSITIVE, INF FORM, PREP FRM LIQ CONC, W/BOT WATER","Similac Sensitive, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710376,"SIMILAC SENSITIVE, INF FORM, PREP FRM LIQ CONC, W/BABY WATER","Similac Sensitive, infant formula, prepared from liquid concentrate, made with baby water" +11710377,"SIMILAC SENSITIVE, INF FORM, PREP FRM PDR, W/TAP WATER","Similac Sensitive, infant formula, prepared from powder, made with tap water" +11710378,"SIMILAC SENSITIVE, INF FORM, PREP FRM PDR, W/ BOT WATER","Similac Sensitive, infant formula, prepared from powder, made with plain bottled water" +11710379,"SIMILAC SENSITIVE, INF FORM, PREP FRM PDR, W/ BABY WATER","Similac Sensitive, infant formula, prepared from powder, made with baby water" +11710380,"SIMILAC SENSITIVE FOR SPIT-UP, INFANT FORMULA, NS AS TO FORM","Similac Sensitive for Spit-Up, infant formula, NS as to form" +11710381,"SIMILAC SENSITIVE FOR SPIT-UP, INFANT FORMULA, READY-TO-FEED","Similac Sensitive for Spit-Up, infant formula, ready-to-feed" +11710383,"SIMILAC SENSITIVE SPIT-UP,INF FORM, FR PDR, W/ WATER, NFS","Similac Sensitive for Spit-Up, infant formula, prepared from powder, made with water, NFS" +11710387,"SIMILAC SENSITIVE SPIT-UP,INF FORM,PREP FR PDR,W/TAP WATER","Similac Sensitive for Spit-Up, infant formula, prepared from powder, made with tap water" +11710388,"SIMILAC SENSITIVE SPIT-UP,INF FORM,PREP FR PDR,W/BOT WATER","Similac Sensitive for Spit-Up, infant formula, prepared from powder, made with plain bottled water" +11710389,"SIMILAC SENSITIVE SPIT-UP,INF FORM,PREP FR PDR,W/BABY WATER","Similac Sensitive for Spit-Up, infant formula, prepared from powder, made with baby water" +11710470,"SIMILAC EXPERT CARE NEOSURE, INFANT FORMULA, NS AS TO FORM","Similac Expert Care NeoSure, infant formula, NS as to form" +11710471,"SIMILAC EXPERT CARE NEOSURE, INFANT FORMULA, READY-TO-FEED","Similac Expert Care NeoSure, infant formula, ready-to-feed" +11710473,"SIMILAC EXPERT CARE NEOSURE,INF FORM,PREP FR PDR,W/WATER,NFS","Similac Expert Care NeoSure, infant formula, prepared from powder, made with water, NFS" +11710477,"SIMILAC EXPERT CARE NEOSURE,INF FORM,PREP FR PDR,W/TAP WATER","Similac Expert Care NeoSure, infant formula, prepared from powder, made with tap water" +11710478,"SIMILAC EXPERT CARE NEOSURE,INF FORM,PREP FR PDR,W/BOT WATER","Similac Expert Care NeoSure, infant formula, prepared from powder, made with plain bottled water" +11710479,"SIMILAC EXPERT CARE NEOSURE,INF FORM,PREP FR PDR,W/BABY WAT","Similac Expert Care NeoSure, infant formula, prepared from powder, made with baby water" +11710480,"SIMILAC GO AND GROW, INFANT FORMULA, NS AS TO FORM","Similac Go and Grow, infant formula, NS as to form" +11710481,"SIMILAC GO AND GROW,INF FORM,PREP FR PDR,W/WATER,NFS","Similac Go and Grow, infant formula, prepared from powder, made with water, NFS" +11710482,"SIMILAC GO AND GROW,INF FORM,PREP FR PDR,W/TAP WATER","Similac Go and Grow, infant formula, prepared from powder, made with tap water" +11710483,"SIMILAC GO AND GROW,INF FORM,PREP FR PDR,W/BOT WATER","Similac Go and Grow, infant formula, prepared from powder, made with plain bottled water" +11710484,"SIMILAC GO AND GROW,INF FORM,PREP FR PDR,W/BABY WATER","Similac Go and Grow, infant formula, prepared from powder, made with baby water" +11710620,"ENFAMIL PREMIUM NEWBORN, INFANT FORMULA, NS AS TO FORM","Enfamil PREMIUM Newborn, infant formula, NS as to form" +11710621,"ENFAMIL PREMIUM NEWBORN, INFANT FORMULA, READY-TO-FEED","Enfamil PREMIUM Newborn, infant formula, ready-to-feed" +11710626,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRO PDR, WATER NFS","Enfamil PREMIUM Newborn, infant formula, prepared from powder, made with water, NFS" +11710627,"ENFAMIL PREMIUM NEWBORN, INFANT FORMULA, PREP FRM PDR,TAP","Enfamil PREMIUM Newborn, infant formula, prepared from powder, made with tap water" +11710628,"ENFAMIL PREMIUM NEWBORN, INF FORM, PREP FRM PDR,BOTTLE WATER","Enfamil PREMIUM Newborn, infant formula, prepared from powder, made with plain bottled water" +11710629,"ENFAMIL PREMIUM NEWBORN, INFANT FORMULA, PREP FRM PDR, BABY","Enfamil PREMIUM Newborn, infant formula, prepared from powder, made with baby water" +11710630,"ENFAMIL PREMIUM INFANT, INFANT FORMULA, NS AS TO FORM","Enfamil PREMIUM Infant, infant formula, NS as to form" +11710631,"ENFAMIL PREMIUM INFANT, INFANT FORMULA, READY-TO-FEED","Enfamil PREMIUM Infant, infant formula, ready-to-feed" +11710632,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM LIQ CONC,WATER NF","Enfamil PREMIUM Infant, infant formula, prepared from liquid concentrate, made with water, NFS" +11710633,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM LIQ CONC,TAP WATE","Enfamil PREMIUM Infant, infant formula, prepared from liquid concentrate, made with tap water" +11710634,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM LIQ CONC,BOT WATE","Enfamil PREMIUM Infant, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710635,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM LIQ CONC, BABY","Enfamil PREMIUM Infant, infant formula, prepared from liquid concentrate, made with baby water" +11710636,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM PDR, WATER NFS","Enfamil PREMIUM Infant, infant formula, prepared from powder, made with water, NFS" +11710637,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM PDR, TAP WATER","Enfamil PREMIUM Infant, infant formula, prepared from powder, made with tap water" +11710638,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM PDR, BOT WATER","Enfamil PREMIUM Infant, infant formula, prepared from powder, made with plain bottled water" +11710639,"ENFAMIL PREMIUM INFANT, INF FORM, PREP FRM PDR, BABY WATER","Enfamil PREMIUM Infant, infant formula, prepared from powder, made with baby water" +11710640,"ENFAMIL PREMIUM LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil PREMIUM LIPIL, infant formula, NS as to form" +11710642,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR LIQ CONC,W/WATER,NFS","Enfamil PREMIUM LIPIL, infant formula, prepared from liquid concentrate, made with water, NFS" +11710643,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR PDR,W/WATER,NFS","Enfamil PREMIUM LIPIL, infant formula, prepared from powder, made with water, NFS" +11710644,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR LIQ CONC,W/TAP WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from liquid concentrate, made with tap water" +11710645,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR LIQ CONC,W/BOT WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710646,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR LIQ CONC,W/BABY WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from liquid concentrate, made with baby water" +11710647,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR PDR,W/TAP WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from powder, made with tap water" +11710648,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR PDR,W/BOT WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710649,"ENFAMIL PREMIUM LIPIL,INF FORM,PREP FR PDR,W/BABY WATER","Enfamil PREMIUM LIPIL, infant formula, prepared from powder, made with baby water" +11710650,"ENFAMIL LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil LIPIL, infant formula, NS as to form" +11710651,"ENFAMIL LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil LIPIL, infant formula, ready-to-feed" +11710652,"ENFAMIL LIPIL, INFANT FORMULA, PREP FR LIQ CONC, W/WATER,NFS","Enfamil LIPIL, infant formula, prepared from liquid concentrate, made with water, NFS" +11710653,"ENFAMIL LIPIL, INFANT FORMULA, PREP FRM PDR, W/WATER,NFS","Enfamil LIPIL, infant formula, prepared from powder, made with water, NFS" +11710654,"ENFAMIL LIPIL, INFANT FORMULA, PREP FR LIQ CONC, W/TAP WATER","Enfamil LIPIL, infant formula, prepared from liquid concentrate, made with tap water" +11710655,"ENFAMIL LIPIL, INFANT FORMULA, PREP FR LIQ CONC, W/BOT WATER","Enfamil LIPIL, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710656,"ENFAMIL LIPIL, INFANT FORMULA, PREP FR LIQ CONC, W/BABY WAT","Enfamil LIPIL, infant formula, prepared from liquid concentrate, made with baby water" +11710657,"ENFAMIL LIPIL, INFANT FORMULA, PREP FRM PDR, W/TAP WATER","Enfamil LIPIL, infant formula, prepared from powder, made with tap water" +11710658,"ENFAMIL LIPIL, INFANT FORMULA, PREP FRM PDR, W/BOT WATER","Enfamil LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710659,"ENFAMIL LIPIL, INFANT FORMULA, PREP FRM PDR, W/BABY WATER","Enfamil LIPIL, infant formula, prepared from powder, made with baby water" +11710660,"ENFAMIL A.R. LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil A.R. Lipil, infant formula, NS as to form" +11710661,"ENFAMIL A.R. LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil A.R. Lipil, infant formula, ready-to-feed" +11710663,"ENFAMIL A.R., INFANT FORMULA, PREP FR PDR, W/WATER, NFS","Enfamil A.R. LIPIL, infant formula, prepared from powder, made with water, NFS" +11710664,"ENFAMIL A.R., INFANT FORMULA, PREP FR PDR, W/TAP WATER","Enfamil A.R. LIPIL, infant formula, prepared from powder, made with tap water" +11710665,"ENFAMIL ENFACARE LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil EnfaCare LIPIL, infant formula, NS as to form" +11710666,"ENFAMIL ENFACARE LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil EnfaCare LIPIL, infant formula, ready-to-feed" +11710667,"ENFAMIL ENFACARE LIPIL, INF FORM, PREP FR PDR, W/ WATER,NFS","Enfamil EnfaCare LIPIL, infant formula, prepared from powder, made with water, NFS" +11710668,"ENFAMIL A.R., INFANT FORMULA, PREP FR PDR, W/BOT WATER","Enfamil A.R. LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710669,"ENFAMIL A.R., INFANT FORMULA, PREP FR PDR, W/BABY WATER","Enfamil A.R. LIPIL, infant formula, prepared from powder, made with baby water" +11710670,"ENFAMIL GENTLEASE LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil Gentlease LIPIL, infant formula, NS as to form" +11710671,"ENFAMIL GENTLEASE LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil Gentlease LIPIL, infant formula, ready-to-feed" +11710673,"ENFAMIL GENTLEASE LIPIL, INF FORM, PREP FRM PDR, W/WATER,NFS","Enfamil Gentlease LIPIL, infant formula, prepared from powder, made with water, NFS" +11710674,"ENFAMIL ENFACARE LIPIL, INF FORM, PREP FR PDR, W/ TAP WATER","Enfamil EnfaCare LIPIL, infant formula, prepared from powder, made with tap water" +11710675,"ENFAMIL ENFACARE LIPIL, INF FORM, PREP FR PDR, W/ BOT WATER","Enfamil EnfaCare LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710676,"ENFAMIL ENFACARE LIPIL, INF FORM, PREP FR PDR, W/BABY WATER","Enfamil EnfaCare LIPIL, infant formula, prepared from powder, made with baby water" +11710677,"ENFAMIL GENTLEASE LIPIL, INF FORM, PREP FRM PDR, W/TAP WATER","Enfamil Gentlease LIPIL, infant formula, prepared from powder, made with tap water" +11710678,"ENFAMIL GENTLEASE LIPIL, INF FORM, PREP FRM PDR, W/BOT WATER","Enfamil Gentlease LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710679,"ENFAMIL GENTLEASE LIPIL, INF FORM, PREP FRM PDR, W/ BABY WAT","Enfamil Gentlease LIPIL, infant formula, prepared from powder, made with baby water" +11710680,"ENFAMIL ENFAGROW PREM NEXT STEP LIPIL , INF FORMULA, NS FORM","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, NS as to form" +11710681,"ENFAMIL ENFAGROW PREM NEXT STEP, INF FORMULA, RTF","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, ready-to-feed" +11710683,"ENFAMIL ENFAGROW PREM NEXT STEP,INF FORMULA,PDR,W/WATER,NFS","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, prepared from powder, made with water, NFS" +11710687,"ENFAMIL ENFAGROW PREM NEXT STEP,INF FORMULA,PDR,W/TAP WATER","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, prepared from powder, made with tap water" +11710688,"ENFAMIL ENFAGROW PREM NEXT STEP,INF FORMULA,PDR,W/BOT WATER","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710689,"ENFAMIL ENFAGROW PREM NEXT STEP,INF FORMULA,PDR,W/BABY WATER","Enfamil Enfagrow PREMIUM Next Step LIPIL, infant formula, prepared from powder, made with baby water" +11710690,"ENFAMIL GENTLEASE NEXT STEP LIPIL, INFANT FORMULA, NS FORM","Enfamil Gentlease Next Step LIPIL, infant formula, NS as to form" +11710693,"ENFAMIL GENTLEASE NEXT STEP,INF FORM,PREP FR PDR,W/WATER,NFS","Enfamil Gentlease Next Step LIPIL, infant formula, prepared from powder, made with water, NFS" +11710697,"ENFAMIL GENTLEASE NEXT STEP,INF FORM,PREP FR PDR,W/TAP WATER","Enfamil Gentlease Next Step LIPIL, infant formula, prepared from powder, made with tap water" +11710698,"ENFAMIL GENTLEASE NEXT STEP,INF FORM,PREP FR PDR,W/BOT WATER","Enfamil Gentlease Next Step LIPIL, infant formula, prepared from powder, made with plain bottled water" +11710699,"ENFAMIL GENTLEASE NEXT STEP,INF FORM,PREP FR PDR,W/BABY WAT","Enfamil Gentlease Next Step LIPIL, infant formula, prepared from powder, made with baby water" +11710800,"PEDIASURE, INFANT FORMULA, NS AS TO FORM","Pediasure, infant formula, NS as to form" +11710801,"PEDIASURE,INFANT FORMULA, READY-TO-FEED","Pediasure, infant formula, ready-to-feed" +11710805,"PEDIASURE FIBER, INFANT FORMULA, NS AS TO FORM","Pediasure Fiber, infant formula, NS as to form" +11710806,"PEDIASURE FIBER, INFANT FORMULA, READY-TO-FEED","Pediasure Fiber, infant formula, ready-to-feed" +11710910,"GERBER GOOD START GENTLE PLUS, INF FORM, NS FORM","Gerber Good Start Gentle Plus, infant formula, NS as to form" +11710911,"GERBER GOOD START GENTLE PLUS, INFANT FORMULA, READY-TO-FEED","Gerber Good Start Gentle Plus, infant formula, ready-to-feed" +11710912,"GERBER GOOD START GENTLE PLUS,PREP FRM LIQ CONC,W/WATER,NFS","Gerber Good Start Gentle Plus, infant formula, prepared from liquid concentrate, made with water, NFS" +11710913,"GERBER GOOD START GENTLE PLUS, PREP FRM PDR,W/WATER,NFS","Gerber Good Start Gentle Plus, infant formula, prepared from powder, made with water, NFS" +11710914,"GERBER GOOD START GENTLE PLUS,PREP FRM LIQ CONC,W/TAP WATER","Gerber Good Start Gentle Plus, infant formula, prepared from liquid concentrate, made with tap water" +11710915,"GERBER GOOD START GENTLE PLUS,PREP FRM LIQ CONC,W/BOT WATER","Gerber Good Start Gentle Plus, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710916,"GERBER GOOD START GENTLE PLUS,PREP FRM LIQ CONC,W/BABY WATER","Gerber Good Start Gentle Plus, infant formula, prepared from liquid concentrate, made with baby water" +11710917,"GERBER GOOD START GENTLE PLUS, PREP FRM PDR,W/TAP WATER","Gerber Good Start Gentle Plus, infant formula, prepared from powder, made with tap water" +11710918,"GERBER GOOD START GENTLE PLUS, PREP FRM PDR,W/BOT WATER","Gerber Good Start Gentle Plus, infant formula, prepared from powder, made with plain bottled water" +11710919,"GERBER GOOD START GENTLE PLUS, PREP FRM PDR,W/BABY WATER","Gerber Good Start Gentle Plus, infant formula, prepared from powder, made with baby water" +11710920,"GERBER GOOD START PROTECT PLUS, INFANT FORMULA, NS FORM","Gerber Good Start Protect Plus, infant formula, NS as to form" +11710923,"GERBER GOOD START PROTECT PLUS, PREP FRM PDR,W/WATER,NFS","Gerber Good Start Protect Plus, infant formula, prepared from powder, made with water, NFS" +11710927,"GERBER GOOD START PROTECT PLUS, PREP FRM PDR,W/TAP WATER","Gerber Good Start Protect Plus, infant formula, prepared from powder, made with tap water" +11710928,"GERBER GOOD START PROTECT PLUS, PREP FRM PDR,W/BOT WATER","Gerber Good Start Protect Plus, infant formula, prepared from powder, made with plain bottled water" +11710929,"GERBER GOOD START PROTECT PLUS, PREP FRM PDR,W/BABY WATER","Gerber Good Start Protect Plus, infant formula, prepared from powder, made with baby water" +11710930,"GERBER GOOD START 2 GENTLE PLUS, INFANT FORMULA, NS FORM","Gerber Good Start 2 Gentle Plus, infant formula, NS as to form" +11710933,"GERBER GOOD START 2 GENTLE PLUS, PREP FRM PDR,W/WATER,NFS","Gerber Good Start 2 Gentle Plus, infant formula, prepared from powder, made with water, NFS" +11710937,"GERBER GOOD START 2 GENTLE PLUS, PREP FRM PDR,W/TAP WATER","Gerber Good Start 2 Gentle Plus, infant formula, prepared from powder, made with tap water" +11710938,"GERBER GOOD START 2 GENTLE PLUS, PREP FRM PDR,W/BOT WATER","Gerber Good Start 2 Gentle Plus, infant formula, prepared from powder, made with plain bottled water" +11710939,"GERBER GOOD START 2 GENTLE PLUS, PREP FRM PDR,W/BABY WATER","Gerber Good Start 2 Gentle Plus, infant formula, prepared from powder, made with baby water" +11710940,"GERBER GOOD START 2 PROTECT PLUS, INFANT FORMULA, NS FORM","Gerber Good Start 2 Protect Plus, infant formula, NS as to form" +11710943,"GERBER GOOD START 2 PROTECT PLUS, PREP FRM PDR,W/WATER,NFS","Gerber Good Start 2 Protect Plus, infant formula, prepared from powder, made with water, NFS" +11710947,"GERBER GOOD START 2 PROTECT PLUS, PREP FRM PDR,W/TAP WATER","Gerber Good Start 2 Protect Plus, infant formula, prepared from powder, made with tap water" +11710948,"GERBER GOOD START 2 PROTECT PLUS, PREP FRM PDR,W/BOT WATER","Gerber Good Start 2 Protect Plus, infant formula, prepared from powder, made with plain bottled water" +11710949,"GERBER GOOD START 2 PROTECT PLUS, PREP FRM PDR,W/BABY WATER","Gerber Good Start 2 Protect Plus, infant formula, prepared from powder, made with baby water" +11710960,"AMERICA'S STORE BRAND, INFANT FORMULA, NS AS TO FORM","America's Store Brand, infant formula, NS as to form" +11710961,"AMERICA'S STORE BRAND,INF FORM,PREP FRM LIQ CONC,W/WATER,NFS","America's Store Brand, infant formula, prepared from liquid concentrate, made with water, NFS" +11710962,"AMERICA'S STORE BRAND,INF FORM,PREP FRM PDR,W/ WATER, NFS","America's Store Brand, infant formula, prepared from powder, made with water, NFS" +11710963,"AMERICA'S STORE BRAND, INFANT FORMULA, READY-TO-FEED","America's Store Brand, infant formula, ready-to-feed" +11710964,"AMERICA'S STORE BRAND,INF FORM,PREP FRM LIQ CONC,W/TAP WATER","America's Store Brand, infant formula, prepared from liquid concentrate, made with tap water" +11710965,"AMERICA'S STORE BRAND,INF FORM,PREP FRM LIQ CONC,W/BOT WATER","America's Store Brand, infant formula, prepared from liquid concentrate, made with plain bottled water" +11710966,"AMERICA'S STORE BRAND,INF FORM,PREP FRM LIQ CONC,W/BABY WATR","America's Store Brand, infant formula, prepared from liquid concentrate, made with baby water" +11710967,"AMERICA'S STORE BRAND,INF FORM,PREP FRM PDR,W/ TAP WATER","America's Store Brand, infant formula, prepared from powder, made with tap water" +11710968,"AMERICA'S STORE BRAND,INF FORM,PREP FRM PDR,W/ BOT WATER","America's Store Brand, infant formula, prepared from powder, made with plain bottled water" +11710969,"AMERICA'S STORE BRAND,INF FORM,PREP FRM PDR,W/ BABY WATER","America's Store Brand, infant formula, prepared from powder, made with baby water" +11720310,"ENFAMIL PROSOBEE LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil ProSobee LIPIL, infant formula, NS as to form" +11720311,"ENFAMIL PROSOBEE LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil ProSobee Lipil, infant formula, ready-to-feed" +11720312,"ENFAMIL PROSOBEE LIPIL,INF FORM, FR LIQ CONC,W/ WATER,NFS","Enfamil ProSobee LIPIL, infant formula, prepared from liquid concentrate, made with water, NFS" +11720313,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR PDR, W/WATER, NFS","Enfamil ProSobee LIPIL, infant formula, prepared from powder, made with water, NFS" +11720314,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR LIQ CONC,W/ TAP WATE","Enfamil ProSobee LIPIL, infant formula, prepared from liquid concentrate, made with tap water" +11720315,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR LIQ CONC,W/ BOT WATE","Enfamil ProSobee LIPIL, infant formula, prepared from liquid concentrate, made with plain bottled water" +11720316,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR LIQ CONC,W/ BABY WAT","Enfamil ProSobee LIPIL, infant formula, prepared from liquid concentrate, made with baby water" +11720317,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR PDR, W/TAP WATER","Enfamil ProSobee LIPIL, infant formula, prepared from powder, made with tap water" +11720318,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR PDR, W/BOT WATER","Enfamil ProSobee LIPIL, infant formula, prepared from powder, made with plain bottled water" +11720319,"ENFAMIL PROSOBEE LIPIL,INF FORM,PREP FR PDR, W/BABY WATER","Enfamil ProSobee LIPIL, infant formula, prepared from powder, made with baby water" +11720320,"ENFAMIL ENFAGROW SOY NEXT STEP LIPIL, INF FORMULA, NS FORM","Enfamil Enfagrow Soy Next Step LIPIL, infant formula, NS as to form" +11720323,"ENFAGROW SOY NEXT STEP LIPIL, INF FOR,FR PDR,W/WATER,NFS","Enfamil Enfagrow Soy Next Step LIPIL, infant formula, prepared from powder, made with water, NFS" +11720327,"ENFAGROW SOY NEXT STEP LIPIL,INF FORM,PREP FR PDR,TAP WATER","Enfamil Enfagrow Soy Next Step LIPIL, infant formula, prepared from powder, made with tap water" +11720328,"ENFAGROW SOY NEXT STEP LIPIL,INF FORM,PREP FR PDR, BOT WATER","Enfamil Enfagrow Soy Next Step LIPIL, infant formula, prepared from powder, made with plain bottled water" +11720329,"ENFAGROW SOY NEXT STEP LIPIL,INF FORM,PREP FR PDR,BABY WATER","Enfamil Enfagrow Soy Next Step LIPIL, infant formula, prepared from powder, made with baby water" +11720410,"SIMILAC SENSITIVE ISOMIL SOY, INFANT FORMULA, NS AS TO FORM","Similac Sensitive Isomil Soy, infant formula, NS as to form" +11720411,"SIMILAC SENSITIVE ISOMIL SOY, INFANT FORMULA, READY-TO-FEED","Similac Sensitive Isomil Soy, infant formula, ready-to-feed" +11720412,"SIMILAC SENSITIVE ISOMIL SOY, PREP FR LIQ CONC,W/WATER,NFS","Similac Sensitive Isomil Soy, infant formula, prepared from liquid concentrate, made with water, NFS" +11720413,"SIMILAC SENSITIVE ISOMIL SOY,INF FORM,FR PDR,W/WATER,NFS","Similac Sensitive Isomil Soy, infant formula, prepared from powder, made with water, NFS" +11720414,"SIMILAC SENSITIVE ISOMIL SOY,PREP FR LIQ CONC,W/TAP WATER","Similac Sensitive Isomil Soy, infant formula, prepared from liquid concentrate, made with tap water" +11720415,"SIMILAC SENSITIVE ISOMIL SOY,PREP FR LIQ CONC,W/BOT WATER","Similac Sensitive Isomil Soy, infant formula, prepared from liquid concentrate, made with plain bottled water" +11720416,"SIMILAC SENSITIVE ISOMIL SOY,PREP FR LIQ CONC,W/BABY WATER","Similac Sensitive Isomil Soy, infant formula, prepared from liquid concentrate, made with baby water" +11720417,"SIMILAC SENSITIVE ISOMIL SOY,INF FORM,PREP FR PDR+TAP WATER","Similac Sensitive Isomil Soy, infant formula, prepared from powder, made with tap water" +11720418,"SIMILAC SENSITIVE ISOMIL SOY,INF FORM,PREP FR PDR,W/BOT WATE","Similac Sensitive Isomil Soy, infant formula, prepared from powder, made with plain bottled water" +11720419,"SIMILAC SENSITIVE ISOMIL SOY,INF FORM,PREP FR PDR,W/BABY WAT","Similac Sensitive Isomil Soy, infant formula, prepared from powder, made with baby water" +11720430,"SIMILAC EXPERT CARE FOR DIARRHEA, INFANT FORMULA, NS FORM","Similac Expert Care for Diarrhea, infant formula, NS as to form" +11720431,"SIMILAC EXPERT CARE FOR DIARRHEA, INFANT FORMULA, RTF","Similac Expert Care for Diarrhea, infant formula, ready-to-feed" +11720440,"SIMILAC GO AND GROW SOY, INFANT FORMULA, NS AS TO FORM","Similac Go and Grow Soy, infant formula, NS as to form" +11720443,"SIMILAC GO AND GROW SOY, INF FORM, PREP FR PDR, WATER, NFS","Similac Go and Grow Soy, infant formula, prepared from powder, made with water, NFS" +11720447,"SIMILAC GO AND GROW SOY,INF FORM,PREP FR PDR,TAP WATER","Similac Go and Grow Soy, infant formula, prepared from powder, made with tap water" +11720448,"SIMILAC GO AND GROW SOY,INF FORM,PREP FR PDR,BOT WATER","Similac Go and Grow Soy, infant formula, prepared from powder, made with plain bottled water" +11720449,"SIMILAC GO AND GROW SOY,INF FORM,PREP FR PDR,BABY WATER","Similac Go and Grow Soy, infant formula, prepared from powder, made with baby water" +11720610,"GERBER GOOD START SOY PLUS, INFANT FORMULA, NS AS TO FORM","Gerber Good Start Soy Plus, infant formula, NS as to form" +11720611,"GERBER GOOD START SOY PLUS, INFANT FORMULA, READY-TO-FEED","Gerber Good Start Soy Plus, infant formula, ready-to-feed" +11720612,"GERBER GOOD START SOY PLUS,INF FORM,PREP FR LIQ CONC,W/WATER","Gerber Good Start Soy Plus, infant formula, prepared from liquid concentrate, made with water, NFS" +11720613,"GERBER GOOD START SOY PLUS,INF FORM, PREP FR PDR,W/WATER,NFS","Gerber Good Start Soy Plus, infant formula, prepared from powder, made with water, NFS" +11720614,"GERBER GOOD START SOY PLUS,INF FORM,FR LIQ CONC,W/TAP WATER","Gerber Good Start Soy Plus, infant formula, prepared from liquid concentrate, made with tap water" +11720615,"GERBER GOOD START SOY PLUS,INF FORM,FR LIQ CONC,W/BOT WATER","Gerber Good Start Soy Plus, infant formula, prepared from liquid concentrate, made with plain bottled water" +11720616,"GERBER GOOD START SOY PLUS,INF FORM,FR LIQ CONC,W/BABY WTR","Gerber Good Start Soy Plus, infant formula, prepared from liquid concentrate, made with baby water" +11720617,"GERBER GOOD START SOY PLUS,INF FORM, PREP FR PDR,W/TAP WATER","Gerber Good Start Soy Plus, infant formula, prepared from powder, made with tap water" +11720618,"GERBER GOOD START SOY PLUS,INF FORM, PREP FR PDR,W/BOT WATER","Gerber Good Start Soy Plus, infant formula, prepared from powder, made with plain bottled water" +11720619,"GERBER GOOD START SOY PLUS,INF FORM, PREP FR PDR,W/BABY WATE","Gerber Good Start Soy Plus, infant formula, prepared from powder, made with baby water" +11720620,"GERBER GOOD START 2 SOY PLUS, INFANT FORMULA, NS AS TO FORM","Gerber Good Start 2 Soy Plus, infant formula, NS as to form" +11720623,"GERBER GOOD START 2 SOY PLUS, INF FORM,PREP FR PDR,WATER,NFS","Gerber Good Start 2 Soy Plus, infant formula, prepared from powder, made with water, NFS" +11720627,"GERBER GOOD START 2 SOY PLUS,INF FORM,PREP FR PDR,TAP WATER","Gerber Good Start 2 Soy Plus, infant formula, prepared from powder, made with tap water" +11720628,"GERBER GOOD START 2 SOY PLUS,INF FORM,PREP FR PDR,BOT WATER","Gerber Good Start 2 Soy Plus, infant formula, prepared from powder, made with plain bottled water" +11720629,"GERBER GOOD START 2 SOY PLUS,INF FORM,PREP FR PDR,BABY WATER","Gerber Good Start 2 Soy Plus, infant formula, prepared from powder, made with baby water" +11720800,"AMERICA'S STORE BRAND SOY, INFANT FORMULA, NS AS TO FORM","America's Store Brand Soy, infant formula, NS as to form" +11720801,"AMERICA'S STORE BRAND SOY, INFANT FORMULA, READY-TO-FEED","America's Store Brand Soy, infant formula, ready-to-feed" +11720802,"AMERICA'S STORE BRAND SOY,INF FORM, FR LIQ CONC,W/WATER NFS","America's Store Brand Soy, infant formula, prepared from liquid concentrate, made with water, NFS" +11720803,"AMERICA'S STORE BRAND SOY,INF FORM,FR PDR,W/WATER,NFS","America's Store Brand Soy, infant formula, prepared from powder, made with water, NFS" +11720804,"AMERICA'S STORE BRAND SOY,INF FORM, FR LIQ CONC,W/TAP WATER","America's Store Brand Soy, infant formula, prepared from liquid concentrate, made with tap water" +11720805,"AMERICA'S STORE BRAND SOY,INF FORM,FR LIQ CONC,W/BOT WATER","America's Store Brand Soy, infant formula, prepared from liquid concentrate, made with plain bottled water" +11720806,"AMERICA'S STORE BRAND SOY,INF FORM,FR LIQ CONC,W/BABY WATER","America's Store Brand Soy, infant formula, prepared from liquid concentrate, made with baby water" +11720807,"AMERICA'S STORE BRAND SOY,INF FORM,PREP FR PDR,W/TAP WATER","America's Store Brand Soy, infant formula, prepared from powder, made with tap water" +11720808,"AMERICA'S STORE BRAND SOY,INF FORM,PREP FR PDR,W/BOT WATER","America's Store Brand Soy, infant formula, prepared from powder, made with plain bottled water" +11720809,"AMERICA'S STORE BRAND SOY,INF FORM,PREP FR PDR,W/BABY WATER","America's Store Brand Soy, infant formula, prepared from powder, made with baby water" +11740310,"ENFAMIL NUTRAMIGEN LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil Nutramigen LIPIL, infant formula, NS as to form" +11740311,"ENFAMIL NUTRAMIGEN LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil Nutramigen LIPIL, infant formula, ready-to-feed" +11740312,"ENFAMIL NUTRAMIGEN LIPIL,INF FORM,PREP FR LIQ CONC,W/WAT,NFS","Enfamil Nutramigen LIPIL, infant formula, prepared from liquid concentrate, made with water, NFS" +11740313,"ENFAMIL NUTRAMIGEN LIPIL, INF FORM, PREP FR PDR, W/WATER,NFS","Enfamil Nutramigen LIPIL, infant formula, prepared from powder, made with water, NFS" +11740314,"ENFAMIL NUTRAMIGEN LIPIL,INF FORM,FR LIQ CONC,W/TAP WATER","Enfamil Nutramigen LIPIL, infant formula, prepared from liquid concentrate, made with tap water" +11740315,"ENFAMIL NUTRAMIGEN LIPIL,INF FORM,FR LIQ CONC,W/BOT WATER","Enfamil Nutramigen LIPIL, infant formula, prepared from liquid concentrate, made with plain bottled water" +11740316,"ENFAMIL NUTRAMIGEN LIPIL,INF FORM,FR LIQ CONC,W/BABY WATER","Enfamil Nutramigen LIPIL, infant formula, prepared from liquid concentrate, made with baby water" +11740317,"ENFAMIL NUTRAMIGEN LIPIL, INF FORM, PREP FR PDR, W/TAP WATER","Enfamil Nutramigen LIPIL, infant formula, prepared from powder, made with tap water" +11740318,"ENFAMIL NUTRAMIGEN LIPIL, INF FORM, PREP FR PDR, W/BOT WATER","Enfamil Nutramigen LIPIL, infant formula, prepared from powder, made with plain bottled water" +11740319,"ENFAMIL NUTRAMIGEN LIPIL, INF FORM, PREP FR PDR, W/BABY WATR","Enfamil Nutramigen LIPIL, infant formula, prepared from powder, made with baby water" +11740320,"ENFAMIL NUTRAMIGEN AA LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil Nutramigen AA LIPIL, infant formula, NS as to form" +11740323,"ENFAMIL NUTRAMIGEN AA LIPIL,INF FORM,PREP FR PDR,W/WATER,NFS","Enfamil Nutramigen AA LIPIL, infant formula, prepared from powder, made with water, NFS" +11740327,"ENFAMIL NUTRAMIGEN AA LIPIL,INF FORM,PREP FR PDR,W/TAP WATER","Enfamil Nutramigen AA LIPIL, infant formula, prepared from powder, made with tap water" +11740328,"ENFAMIL NUTRAMIGEN AA LIPIL,INF FORM,PREP FR PDR,W/BOT WATER","Enfamil Nutramigen AA LIPIL, infant formula, prepared from powder, made with plain bottled water" +11740329,"ENFAMIL NUTRAMIGEN AA LIPIL,INF FORM,PREP FR PDR,W/BABY WAT","Enfamil Nutramigen AA LIPIL, infant formula, prepared from powder, made with baby water" +11740400,"ENFAMIL PREGESTIMIL LIPIL, INFANT FORMULA, NS AS TO FORM","Enfamil Pregestimil LIPIL, infant formula, NS as to form" +11740401,"ENFAMIL PREGESTIMIL LIPIL, INFANT FORMULA, READY-TO-FEED","Enfamil Pregestimil LIPIL, infant formula, ready-to-feed" +11740403,"ENFAMIL PREGESTIMIL LIPIL,INF FORM,PREP FR PDR, W/WATER,NFS","Enfamil Pregestimil LIPIL, infant formula, prepared from powder, made with water, NFS" +11740407,"ENFMAIL PREGESTIMIL LIPIL,INF FORM,PREP FR PDR, W/TAP WATER","Enfmail Pregestimil LIPIL, infant formula, prepared from powder, made with tap water" +11740408,"ENFMAIL PREGESTIMIL LIPIL,INF FORM,PREP FR PDR, W/BOT WATER","Enfmail Pregestimil LIPIL, infant formula, prepared from powder, made with plain bottled water" +11740409,"ENFMAIL PREGESTIMIL LIPIL,INF FORM,PREP FR PDR, W/BABY WATER","Enfmail Pregestimil LIPIL, infant formula, prepared from powder, made with baby water" +11740510,"ENFAMIL PREMATURE LIPIL 20, LOW IRON, INF FORMULA, NS FORM","Enfamil Premature LIPIL 20, low iron, infant formula, NS as to form" +11740511,"ENFAMIL PREMATURE LIPIL 20, LOW IRON, INFANT FORMULA, RTF","Enfamil Premature LIPIL 20, low iron, infant formula, ready-to-feed" +11740520,"ENFAMIL PREMATURE LIPIL 20, W/IRON, INFANT FORMULA, NS FORM","Enfamil Premature LIPIL 20, with iron, infant formula, NS as to form" +11740521,"ENFAMIL PREMATURE LIPIL 20, WITH IRON, INFANT FORMULA, RTF","Enfamil Premature LIPIL 20, with iron, infant formula, ready-to-feed" +11740540,"ENFAMIL PREMATURE LIPIL 24, LOW IRON, INF FORMULA, NS FORM","Enfamil Premature LIPIL 24, low iron, infant formula, NS as to form" +11740541,"ENFAMIL PREMATURE LIPIL 24, LOW IRON, INFANT FORMULA, RTF","Enfamil Premature LIPIL 24, low iron, infant formula, ready-to-feed" +11740550,"ENFAMIL PREMATURE LIPIL 24, W/IRON, INFANT FORMULA, NS FORM","Enfamil Premature LIPIL 24, with iron, infant formula, NS as to form" +11740551,"ENFAMIL PREMATURE LIPIL 24, WITH IRON, INFANT FORMULA, RTF","Enfamil Premature LIPIL 24, with iron, infant formula, ready-to-feed" +11810000,"MILK, DRY, NOT RECONSTITUTED, NS AS TO FAT","Milk, dry, not reconstituted, NS as to whole, lowfat, or nonfat" +11811000,"MILK, DRY, WHOLE, NOT RECONSTITUTED","Milk, dry, whole, not reconstituted" +11812000,"MILK, DRY, LOWFAT, NOT RECONSTITUTED","Milk, dry, lowfat, not reconstituted" +11813000,"MILK, DRY, NONFAT, NOT RECONSTITUTED","Milk, dry, nonfat, not reconstituted" +11825000,"WHEY, SWEET, DRY","Whey, sweet, dry" +11830100,"COCOA W/DRY MILK & SUGAR, DRY MIX, NOT RECONST","Cocoa (or chocolate) with dry milk and sugar, dry mix, not reconstituted" +11830110,"COCOA POWDER W/ NFD MILK, LOW CAL SWEETENER, DRY","Cocoa powder with nonfat dry milk and low calorie sweetener, dry mix, not reconstituted" +11830120,"COCOA W/ WHEY, LO CAL SWEETENER, FORTIFIED, DRY MIX","Cocoa, whey, and low calorie sweetener, fortified, dry mix, not reconstituted" +11830140,"CHOCOLATE, INST, DRY MIX, FORTIFD, NOT RECONST,P.R.","Chocolate, instant, dry mix, fortified with vitamins and minerals, not reconstituted, Puerto Rican style" +11830150,"COCOA POWDER, NOT RECONSTITUTED (NO DRY MILK)","Cocoa powder, not reconstituted (no dry milk)" +11830160,"COCOA-FLAVORED BEVERAGE POWDER W/ SUGAR, DRY MIX","Cocoa (or chocolate) flavored beverage powder with sugar, dry mix, not reconstituted" +11830165,"COCOA FLAV BEV PDR W/ RED SUGAR,DRY MIX,NOT RECONSTITUTED","Cocoa (or chocolate) flavored beverage powder with reduced sugar, dry mix, not reconstituted" +11830170,"COCOA FLAV BEV PDR W/ LOW CAL SWTNR,DRY MIX,NOT RECONSTITUTD","Cocoa (or chocolate) flavored beverage powder with low-calorie sweetener, dry mix, not reconstituted" +11830200,"MILK, MALTED, DRY, UNFORTIFD, NOT RECONST, NOT CHOC","Milk, malted, dry mix, unfortified, not reconstituted, flavors other than chocolate" +11830210,"MILK, MALTED, DRY, FORTIFD, NOT RECONST, NOT CHOC","Milk, malted, dry mix, fortified, not reconstituted, flavors other than chocolate" +11830250,"MILK, MALTED, DRY, UNFORTIFIED, NOT RECONST, CHOC","Milk, malted, dry mix, unfortified, not reconstituted, chocolate" +11830260,"MILK, MALTED, DRY, FORTIFIED, NOT RECONST, CHOC","Milk, malted, dry mix, fortified, not reconstituted, chocolate" +11830400,"MILK BEV POWDER, DRY, NOT RECONST, NOT CHOC","Milk beverage, powder, dry mix, not reconstituted, flavors other than chocolate" +11830450,"MILK BEV MIX, W/ SUGAR,EGG WHITE, NOT RECONSTITUTED","Milk beverage with sugar, dry milk, and egg white powder, dry mix, not reconstituted" +11830500,"MILK BEV POWDER W/ NFD MILK, LOW CAL, DRY, CHOC","Milk beverage, powder, with nonfat dry milk and low calorie sweetener, dry mix, not reconstituted, chocolate" +11830550,"MILK BEV POWDER W/ NFD MILK, LOW CAL, DRY, NOT CHOC","Milk beverage, powder, with nonfat dry milk and low calorie sweetener, dry mix, not reconstituted, flavors other than chocolate" +12100100,"CREAM, FLUID, NS AS TO LIGHT, HEAVY OR HALF & HALF","Cream, NS as to light, heavy, or half and half" +12110100,"CREAM, LIGHT, FLUID (INCL COFFEE CRM, TABLE CREAM)","Cream, light, fluid" +12110300,"CREAM, LIGHT, WHIPPED, UNSWEETENED","Cream, light, whipped, unsweetened" +12120100,"CREAM, HALF & HALF","Cream, half and half" +12120105,"CREAM, HALF & HALF, LOW FAT","Cream, half and half, low fat" +12120110,"CREAM, HALF & HALF, FAT FREE","Cream, half and half, fat free" +12130100,"CREAM, HEAVY, FLUID","Cream, heavy, fluid" +12130200,"CREAM, HEAVY, WHIPPED, UNSWEETENED","Cream, heavy, whipped, unsweetened" +12140000,"CREAM, HEAVY, WHIPPED, SWEETENED","Cream, heavy, whipped, sweetened" +12140100,"CREAM, WHIPPED, PRESSURIZED CONTAINER","Cream, whipped, pressurized container" +12140105,"CREAM, WHIPPED, PRESSURIZED CONTAINER, LIGHT","Cream, whipped, pressurized container, light" +12140110,"WHIPPED TOPPING, DAIRY BASED, FAT FREE, PRESSURIZED CONTAINR","Whipped topping, dairy based, fat free, pressurized container" +12200100,"CREAM SUBSTITUTE, NS AS TO FROZEN,LIQUID OR POWDER","Cream substitute, NS as to frozen, liquid, or powdered" +12210100,"CREAM SUBSTITUTE, FROZEN","Cream substitute, frozen" +12210200,"CREAM SUBSTITUTE, LIQUID (INCLUDE COFFEE WHITNER)","Cream substitute, liquid" +12210210,"CREAM SUBSTITUTE, FLAVORED, LIQUID","Cream substitute, flavored, liquid" +12210250,"CREAM SUBSTITUTE, LIGHT, LIQUID","Cream substitute, light, liquid" +12210255,"CREAM SUBSTITUTE, LIGHT, FLAVORED, LIQUID","Cream substitute, light, flavored, liquid" +12210260,"CREAM SUBSTITUTE, FAT FREE, LIQUID","Cream substitute, fat free, liquid" +12210270,"CREAM SUBSTITUTE, FAT FREE, FLAVORED, LIQUID","Cream substitute, fat free, flavored, liquid" +12210305,"CREAM SUBSTITUTE, SUGAR FREE, LIQUID","Cream substitute, sugar free, liquid" +12210310,"CREAM SUBSTITUTE, SUGAR FREE, FLAVORED, LIQUID","Cream substitute, sugar free, flavored, liquid" +12210400,"CREAM SUBSTITUTE, POWDERED","Cream substitute, powdered" +12210410,"CREAM SUBST, LIGHT, POWDERED (INCL COFFEE MATE, CRE","Cream substitute, light, powdered" +12210420,"CREAM SUBSTITUTE, FLAVORED, POWDERED","Cream substitute, flavored, powdered" +12210430,"CREAM SUBSTITUTE, FAT FREE, POWDER","Cream substitute, fat free, powder" +12210440,"CREAM SUBSTITUTE, FAT FREE, FLAVORED, POWDER","Cream substitute, fat free, flavored, powder" +12210500,"CREAM SUBSTITUTE, SUGAR FREE, POWDER","Cream substitute, sugar free, powder" +12210505,"CREAM SUBSTITUTE, SUGAR FREE, FLAVORED, POWDER","Cream substitute, sugar free, flavored, powder" +12220000,"WHIPPED TOPPING, NONDAIRY, NS AS TO CND/FRZ/POWDER","Whipped topping, nondairy, NS as to canned, frozen, or made from powdered mix" +12220100,"WHIPPED TOPPING, NONDAIRY, PRESSURIZED CAN","Whipped topping, nondairy, pressurized can" +12220200,"WHIPPED TOPPING, NONDAIRY, FROZEN (INCL COOL WHIP)","Whipped topping, nondairy, frozen" +12220250,"WHIPPED TOPPING, NONDAIRY, FZN, LOWFAT (INCL COOL)","Whipped topping, nondairy, frozen, lowfat" +12220270,"WHIPPED TOPPING, NONDAIRY, FROZEN, FAT FREE","Whipped topping, nondairy, frozen, fat free" +12220280,"WHIPPED TOPPING, NONDAIRY, FROZEN, SUGAR FREE","Whipped topping, nondairy, frozen, sugar free" +12220300,"WHIPPED CREAM SUBST, NONDAIRY, FROM POWDERED MIX","Whipped cream substitute, nondairy, made from powdered mix" +12220400,"WHIP CREAM SUB,NONDAIRY,LOWFAT,LO SUGAR,FROM MIX","Whipped cream substitute, nondairy, lowfat, low sugar, made from powdered mix" +12310100,"SOUR CREAM (INCL W/ CHIVES)","Sour cream" +12310200,"SOUR CREAM, HALF & HALF","Sour cream, half and half" +12310300,"SOUR CREAM, REDUCED FAT","Sour cream, reduced fat" +12310350,"SOUR CREAM, LIGHT","Sour cream, light" +12310370,"SOUR CREAM, FAT FREE","Sour cream, fat free" +12320100,"SOUR CREAM, IMITATION","Sour cream, imitation (nondairy)" +12320200,"SOUR CREAM, FILLED, SOUR DRESSING, NONBUTTERFAT","Sour cream, filled, sour dressing, nonbutterfat" +12350000,"DIP, SOUR CREAM BASE (INCLUDE BUTTERMILK-TYPE DIP)","Dip, sour cream base" +12350020,"DIP, SOUR CREAM BASE, REDUCED CALORIE","Dip, sour cream base, reduced calorie" +12350100,"SPINACH DIP","Spinach dip" +12350110,"SPINACH AND ARTICHOKE DIP","Spinach and artichoke dip" +13110000,"ICE CREAM, NFS","Ice cream, NFS" +13110100,"ICE CREAM, REGULAR, NOT CHOCOLATE","Ice cream, regular, flavors other than chocolate" +13110110,"ICE CREAM, REGULAR, CHOCOLATE","Ice cream, regular, chocolate" +13110120,"ICE CREAM, RICH, FLAVORS OTHER THAN CHOCOLATE","Ice cream, rich, flavors other than chocolate" +13110130,"ICE CREAM, RICH, CHOCOLATE","Ice cream, rich, chocolate" +13110140,"ICE CREAM, RICH, NS AS TO FLAVOR","Ice cream, rich, NS as to flavor" +13110200,"ICE CREAM, SOFT SERVE, NOT CHOCOLATE","Ice cream, soft serve, flavors other than chocolate" +13110210,"ICE CREAM, SOFT SERVE, CHOCOLATE","Ice cream, soft serve, chocolate" +13110220,"ICE CREAM, SOFT SERVE, NS AS TO FLAVOR","Ice cream, soft serve, NS as to flavor" +13110310,"ICE CREAM, NO SUGAR ADDED, NS AS TO FLAVOR","Ice cream, no sugar added, NS as to flavor" +13110320,"ICE CREAM, NO SUGAR ADDED, FLAVORS OTHER THAN CHOCOLATE","Ice cream, no sugar added, flavors other than chocolate" +13110330,"ICE CREAM, NO SUGAR ADDED, CHOCOLATE","Ice cream, no sugar added, chocolate" +13120050,"ICE CREAM BAR OR STICK, NOT CHOC- OR CAKE-COVERED","Ice cream bar or stick, not chocolate covered or cake covered" +13120100,"ICE CREAM BAR/STICK, CHOCOLATE COVERED","Ice cream bar or stick, chocolate covered" +13120110,"ICE CREAM BAR, CHOCOLATE/CARAMEL COVERED, W/ NUTS","Ice cream bar or stick, chocolate or caramel covered, with nuts" +13120120,"ICE CREAM BAR,RICH CHOC ICE CREAM,THICK CHOC COVER","Ice cream bar or stick, rich chocolate ice cream, thick chocolate covering" +13120121,"ICE CREAM BAR,RICH ICE CREAM,THICK CHOC COVER","Ice cream bar or stick, rich ice cream, thick chocolate covering" +13120130,"ICE CREAM BAR/STICK,RICH ICE CREAM,CHOC COVER,W/NUT","Ice cream bar or stick, rich ice cream, chocolate covered, with nuts" +13120140,"ICE CREAM BAR/STICK, CHOC ICE CREAM, CHOC COVER","Ice cream bar or stick, chocolate ice cream, chocolate covered" +13120300,"ICE CREAM BAR, CAKE-COVERED","Ice cream bar, cake covered" +13120310,"ICE CREAM BAR, STICK OR NUGGET, WITH CRUNCH COATING","Ice cream bar, stick or nugget, with crunch coating" +13120400,"ICE CREAM BAR/STICK W/ FRUIT","Ice cream bar or stick with fruit" +13120500,"ICE CREAM SANDWICH","Ice cream sandwich" +13120550,"ICE CREAM COOKIE SANDWICH (INCLUDE CHIPWICH)","Ice cream cookie sandwich" +13120700,"ICE CREAM CONE, W/ NUTS, NOT CHOCOLATE","Ice cream cone with nuts, flavors other than chocolate" +13120710,"ICE CREAM CONE, CHOC-COVERED, W/ NUTS, NOT CHOC","Ice cream cone, chocolate covered, with nuts, flavors other than chocolate" +13120720,"ICE CREAM CONE, CHOC-COVERED OR DIPPED, NOT CHOC","Ice cream cone, chocolate covered or dipped, flavors other than chocolate" +13120730,"ICE CREAM CONE, NO TOPPING, NOT CHOCOLATE","Ice cream cone, no topping, flavors other than chocolate" +13120740,"ICE CREAM CONE, NO TOPPING, NS AS TO FLAVOR","Ice cream cone, no topping, NS as to flavor" +13120750,"ICE CREAM CONE, W/NUTS, CHOCOLATE ICE CREAM","Ice cream cone with nuts, chocolate ice cream" +13120760,"ICE CREAM CONE, CHOC-COVERED, CHOC ICE CREAM","Ice cream cone, chocolate covered or dipped, chocolate ice cream" +13120770,"ICE CREAM CONE, NO TOPPING, CHOCOLATE ICE CREAM","Ice cream cone, no topping, chocolate ice cream" +13120780,"ICE CREAM CONE, CHOC-COVERED, W/NUT, CHOC ICE CREAM","Ice cream cone, chocolate covered, with nuts, chocolate ice cream" +13120790,"ICE CREAM SUNDAE CONE (INCL DRUMSTICK, ALL FLAVORS)","Ice cream sundae cone" +13120800,"ICE CREAM SODA, NOT CHOCOLATE","Ice cream soda, flavors other than chocolate" +13120810,"ICE CREAM SODA, CHOCOLATE","Ice cream soda, chocolate" +13121000,"ICE CREAM SUNDAE, TOPPING NS, W/ WHIPPED CREAM","Ice cream sundae, NS as to topping, with whipped cream" +13121100,"ICE CREAM SUNDAE, FRUIT TOPPING, W/ WHIPPED CREAM","Ice cream sundae, fruit topping, with whipped cream" +13121200,"ICE CREAM SUNDAE, PREPACKAGED, NOT CHOCOLATE","Ice cream sundae, prepackaged type, flavors other than chocolate" +13121300,"ICE CREAM SUNDAE,CHOCOLATE TOPPING,W/ WHIPPED CREAM","Ice cream sundae, chocolate or fudge topping, with whipped cream" +13121400,"ICE CREAM SUNDAE, NOT FRUIT/ CHOC TOP,W/ WHIP CREAM","Ice cream sundae, not fruit or chocolate topping, with whipped cream" +13121500,"ICE CREAM SUNDAE, FUDGE TOPPING, W/ CAKE","Ice cream sundae, fudge topping, with cake, with whipped cream" +13122100,"ICE CREAM PIE, NO CRUST","Ice cream pie, no crust" +13122500,"ICE CREAM PIE,COOKIE CRUST,FUDGE TOPPING,WHIP CREAM","Ice cream pie, with cookie crust, fudge topping, and whipped cream" +13126000,"ICE CREAM, FRIED","Ice cream, fried" +13127000,"DIPPIN' DOTS, ICE CREAM, FLAVORS OTHER THAN CHOCOLATE","Dippin' Dots, flash frozen ice cream snacks, flavors other than chocolate" +13127010,"DIPPIN' DOTS, ICE CREAM, CHOCOLATE","Dippin' Dots, flash frozen ice cream snacks, chocolate" +13130100,"LT ICE CREAM, NS FLAV ( ICE MILK)","Light ice cream, NS as to flavor (formerly ice milk)" +13130300,"LIGHT ICE CREAM,NOT CHOCOLATE (FORMERLY ICE MILK)","Light ice cream, flavors other than chocolate (formerly ice milk)" +13130310,"LIGHT ICE CREAM,CHOCOLATE (FORMERLY ICE MILK)","Light ice cream, chocolate (formerly ice milk)" +13130320,"LIGHT ICE CREAM, NO SUGAR ADDED, NS AS TO FLAVOR","Light ice cream, no sugar added, NS as to flavor" +13130330,"LIGHT ICE CREAM, NO SUGAR ADDED, NOT CHOCOLATE","Light ice cream, no sugar added, flavors other than chocolate" +13130340,"LIGHT ICE CREAM, NO SUGAR ADDED, CHOCOLATE","Light ice cream, no sugar added, chocolate" +13130590,"LIGHT ICE CREAM,SOFT SERVE, NS FLAVOR (FORMERLY ICE MILK)","Light ice cream, soft serve, NS as to flavor (formerly ice milk)" +13130600,"LIGHT ICE CREAM,SOFT SERVE, NOT CHOC (FORMERLY ICE MILK)","Light ice cream, soft serve, flavors other than chocolate (formerly ice milk)" +13130610,"LIGHT ICE CREAM,SOFT SERVE CHOC (TASTEE FRZ, DAIRY QUEEN)","Light ice cream, soft serve, chocolate (formerly ice milk)" +13130620,"LIGHT ICE CREAM,SOFT SERVE CONE,NOT CHOC (DAIRY QUEEN)","Light ice cream, soft serve cone, flavors other than chocolate (formerly ice milk)" +13130630,"LIGHT ICE CREAM,SOFT SERVE CONE, CHOC (FORMERLY ICE MILK)","Light ice cream, soft serve cone, chocolate (formerly ice milk)" +13130640,"LIGHT ICE CREAM,SOFT SERVE CONE, NS FLAV(FORMERLY ICE MILK)","Light ice cream, soft serve cone, NS as to flavor (formerly ice milk)" +13130700,"LIGHT ICE CREAM, SOFT SERVE, BLENDED W/ CANDY OR COOKIES","Light ice cream, soft serve, blended with candy or cookies" +13135000,"ICE CREAM SANDWICH, MADE W/ LIGHT ICE CREAM, NOT CHOCOLATE","Ice cream sandwich, made with light ice cream, flavors other than chocolate" +13135010,"ICE CREAM SANDWICH, MADE W/ LIGHT CHOCOLATE ICE CREAM","Ice cream sandwich, made with light chocolate ice cream" +13136000,"ICE CREAM SANDWICH, MADE W/ LIGHT, NO SUGAR ADDED ICE CREAM","Ice cream sandwich, made with light, no sugar added ice cream" +13140100,"LIGHT ICE CREAM,BAR/STICK, CHOC-COATED (FORMERLY ICE MILK)","Light ice cream, bar or stick, chocolate-coated (formerly ice milk)" +13140110,"LIGHT ICE CREAM,BAR, CHOC COVERED,W/NUTS (FORMERLY ICE MILK)","Light ice cream, bar or stick, chocolate covered, with nuts (formerly ice milk)" +13140450,"LIGHT ICE CREAM,CONE, NFS (FORMERLY ICE MILK)","Light ice cream, cone, NFS (formerly ice milk)" +13140500,"LIGHT ICE CREAM,CONE, NOT CHOCOLATE (FORMERLY ICE MILK)","Light ice cream, cone, flavors other than chocolate (formerly ice milk)" +13140550,"LIGHT ICE CREAM,CONE, CHOCOLATE (FORMERLY ICE MILK)","Light ice cream, cone, chocolate (formerly ice milk)" +13140570,"LIGHT ICE CREAM, NO SUGAR ADDED, CONE, NS AS TO FLAVOR","Light ice cream, no sugar added, cone, NS as to flavor" +13140575,"LIGHT ICE CREAM, NO SUGAR ADDED, CONE, NOT CHOC","Light ice cream, no sugar added, cone, flavors other than chocolate" +13140580,"LIGHT ICE CREAM, NO SUGAR ADDED, CONE, CHOCOLATE","Light ice cream, no sugar added, cone, chocolate" +13140600,"LIGHT ICE CREAM,SUNDAE,SOFT SERVE,CHOC/FUDGE TOP (ICE MILK)","Light ice cream, sundae, soft serve, chocolate or fudge topping, with whipped cream (formerly ice milk)" +13140630,"LIGHT ICE CREAM,SUNDAE,SOFT SERVE,FRUIT TOPPING (ICE MILK)","Light ice cream, sundae, soft serve, fruit topping, with whipped cream (formerly ice milk)" +13140650,"LIGHT ICE CREAM,SUNDAE,SOFT SERVE,NOT FRUIT/CHOC TOPPING","Light ice cream, sundae, soft serve, not fruit or chocolate topping, with whipped cream (formerly ice milk)" +13140660,"LIGHT ICE CREAM,SUNDAE,CHOC / FUDGE TOP (W/O WHIP CREAM)","Light ice cream, sundae, soft serve, chocolate or fudge topping (without whipped cream) (formerly ice milk)" +13140670,"LIGHT ICE CREAM,SUNDAE,FRUIT TOP (W/O WHIP CREAM)(ICE MILK)","Light ice cream, sundae, soft serve, fruit topping (without whipped cream) (formerly ice milk)" +13140680,"LIGHT ICE CREAM,SUNDAE,NO FRUIT/CHOC TOP (W/O WHIP CREAM)","Light ice cream, sundae, soft serve, not fruit or chocolate topping (without whipped cream) (formerly ice milk)" +13140700,"LIGHT ICE CREAM,CREAMSICLE OR DREAMSICLE (FORMERLY ICE MILK)","Light ice cream, creamsicle or dreamsicle (formerly ice milk)" +13140710,"LIGHT ICE CREAM, CREAMSICLE OR DREAMSICLE, NO SUGAR ADDED","Light ice cream, creamsicle or dreamsicle, no sugar added" +13140900,"LIGHT ICE CREAM,FUDGESICLE (FORMERLY ICE MILK)","Light ice cream, fudgesicle (formerly ice milk)" +13142000,"MILK DESSERT BAR/STICK, FROZEN, W/ COCONUT","Milk dessert bar or stick, frozen, with coconut" +13150000,"SHERBET, ALL FLAVORS","Sherbet, all flavors" +13160150,"FAT FREE ICE CREAM, NO SUGAR ADD, CHOC","Fat free ice cream, no sugar added, chocolate" +13160160,"FAT FREE ICE CREAM, NO SUGAR ADD, FLAVORS OTHER THAN CHOC","Fat free ice cream, no sugar added, flavors other than chocolate" +13160400,"FAT FREE ICE CREAM, FLAVORS OTHER THAN CHOC","Fat free ice cream, flavors other than chocolate" +13160410,"FAT FREE ICE CREAM, CHOC","Fat free ice cream, chocolate" +13160420,"FAT FREE ICE CREAM, NS AS TO FLAVOR","Fat free ice cream, NS as to flavor" +13161000,"MILK DESSERT BAR, FROZEN, MADE FROM LOWFAT MILK","Milk dessert bar, frozen, made from lowfat milk" +13161500,"MILK DESSERT SANDWICH BAR, FROZEN, DIETARY","Milk dessert sandwich bar, frozen, made from lowfat milk" +13161520,"MILK DESSERT SANDWICH BAR,FRZ,W/LOW-CAL SWEET,LOFAT","Milk dessert sandwich bar, frozen, with low-calorie sweetener, made from lowfat milk" +13161600,"MILK DES BAR, FROZEN, LOFAT MILK&LO CAL SWEETENER","Milk dessert bar, frozen, made from lowfat milk and low calorie sweetener" +13161630,"LIGHT ICE CREAM,BAR/STICK, W/ LOW-CAL SWEETENER, CHOC COAT","Light ice cream, bar or stick, with low-calorie sweetener, chocolate-coated (formerly ice milk)" +13170000,"BAKED ALASKA","Baked Alaska" +13200110,"PUDDING, NFS","Pudding, NFS" +13210110,"PUDDING, BREAD (INCLUDE W/ RAISINS)","Pudding, bread" +13210150,"PUERTO RICAN BREAD PUDDING MADE W/ EVAP MILK & RUM","Puerto Rican bread pudding made with evaporated milk and rum (Budin de pan)" +13210160,"DIPLOMAT PUDDING, P.R. (BUDIN DIPLOMATICO)","Diplomat pudding, Puerto Rican style (Budin Diplomatico)" +13210180,"PUDDING, MEXICAN BREAD (CAPIROTADA)","Pudding, Mexican bread (Capirotada)" +13210190,"PUDDING, MEXICAN BREAD (CAPIROTADA), LOWER FAT","Pudding, Mexican bread (Capirotada), lower fat" +13210220,"PUDDING, CHOCOLATE, NS AS TO FROM DRY MIX/RTE","Pudding, chocolate, NS as to from dry mix or ready-to-eat" +13210250,"PUDDING, CHOC, LO CAL, W/ART SWTNER, NS DRY/RTE","Pudding, chocolate, low calorie, containing artificial sweetener, NS as to from dry mix or ready-to-eat" +13210260,"RICE FLOUR CREAM, P.R.STYLE (MANJAR BLANCO)","Rice flour cream, Puerto Rican style (manjar blanco)" +13210270,"CUSTARD, P.R. (MAICENA, NATILLA)","Custard, Puerto Rican style (Maicena, Natilla)" +13210280,"PUDDING, NOT CHOC, NS FROM DRY OR RTE","Pudding, flavors other than chocolate, NS as to from dry mix or ready-to-eat" +13210290,"PUDDING, NOT CHOC, LO CAL, W/ART SWTNER, NS DRY MIX OR RTE","Pudding, flavors other than chocolate, low calorie, containing artificial sweetener, NS as to from dry mix or ready-to-eat" +13210300,"CUSTARD","Custard" +13210350,"FLAN","Flan" +13210410,"PUDDING, RICE","Pudding, rice" +13210450,"PUDDING, RICE FLOUR, W/ NUTS (INDIAN DESSERT)","Pudding, rice flour, with nuts (Indian dessert)" +13210500,"PUDDING, TAPIOCA,MADE FROM HOME RECIPE, MADE W/ MILK","Pudding, tapioca, made from home recipe, made with milk" +13210520,"PUDDING, TAPIOCA,MADE FROM DRY MIX,MADE W/ MILK","Pudding, tapioca, made from dry mix, made with milk" +13210530,"PUDDING, TAPIOCA,CHOCOLATE,MADE W/ MILK","Pudding, tapioca, chocolate, made with milk" +13210610,"PUDDING, COCONUT","Pudding, coconut" +13210710,"PUDDING, INDIAN (MILK, MOLASSES, CORNMEAL-BASED)","Pudding, Indian (milk, molasses and cornmeal-based pudding)" +13210750,"PUDDING, PUMPKIN","Pudding, pumpkin" +13210810,"P.R. PUMPKIN PUDDING (FLAN DE CALABAZA)","Puerto Rican pumpkin pudding (Flan de calabaza)" +13210820,"FRESH CORN CUSTARD, PUERTO RICAN STYLE","Fresh corn custard, Puerto Rican style (Mazamorra, Mundo Nuevo)" +13220110,"PUDDING,NOT CHOCOLATE,PREPARED FROM DRY MIX,MILK ADDED","Pudding, flavors other than chocolate, prepared from dry mix, milk added" +13220120,"PUDDING,CHOCOLATE,PREPARED FROM DRY MIX,MILK ADDED","Pudding, chocolate, prepared from dry mix, milk added" +13220210,"PUDDING,NOT CHOC,FROM DRY,LOW CAL,ARTIFICIAL SWEET,W/MILK","Pudding, flavors other than chocolate, prepared from dry mix, low calorie, containing artificial sweetener, milk added" +13220220,"PUDDING,CHOC,FROM DRY,LOW CAL,ARTIFICIAL SWEET,MILK ADDED","Pudding, chocolate, prepared from dry mix, low calorie, containing artificial sweetener, milk added" +13220230,"PUDDING, RTE, CHOCOLATE, RED FAT","Pudding, ready-to-eat, chocolate, reduced fat" +13220235,"PUDDING, RTE, CHOCOLATE, FAT FREE","Pudding, ready-to-eat, chocolate, fat free" +13220240,"PUDDING, RTE, FLAVORS OTHER THAN CHOCOLATE, RED FAT","Pudding, ready-to-eat, flavors other than chocolate, reduced fat" +13220245,"PUDDING, RTE, FLAVORS OTHER THAN CHOCOLATE, FAT FREE","Pudding, ready-to-eat, flavors other than chocolate, fat free" +13230110,"PUDDING, RTE, FLAVORS OTHER THAN CHOCOLATE","Pudding, ready-to-eat, flavors other than chocolate" +13230120,"PUDDING, RTE, LOW CAL, W/ARTIFICIAL SWTNR, NOT CHOC","Pudding, ready-to-eat, low calorie, containing artificial sweetener, flavors other than chocolate" +13230130,"PUDDING, RTE, CHOCOLATE","Pudding, ready-to-eat, chocolate" +13230140,"PUDDING,RTE, LO CAL/ W ART SWTNER, CHOC","Pudding, ready-to-eat, low calorie, containing artificial sweetener, chocolate" +13230200,"PUDDING, RTE, CHOC & NON-CHOC FLAVORS COMBINED","Pudding, ready-to-eat, chocolate and non-chocolate flavors combined" +13230500,"PUDDING, READY-TO-EAT, TAPIOCA","Pudding, ready-to-eat, tapioca" +13230510,"PUDDING, READY-TO-EAT, TAPIOCA, FAT FREE","Pudding, ready-to-eat, tapioca, fat free" +13241000,"PUDDING, W/ FRUIT & VANILLA WAFERS","Pudding, with fruit and vanilla wafers" +13250000,"MOUSSE, CHOCOLATE","Mousse, chocolate" +13250100,"MOUSSE, NOT CHOCOLATE","Mousse, not chocolate" +13250200,"MOUSSE,CHOCOLATE,LOW FAT,REDUCED CAL,DRY MIX","Mousse, chocolate, lowfat, reduced calorie, prepared from dry mix, water added" +13252100,"COCONUT CUSTARD, P.R. (FLAN DE COCO)","Coconut custard, Puerto Rican style (Flan de coco)" +13252200,"MILK DESSERT OR MILK CANDY, P.R. (DULCE DE LECHE)","Milk dessert or milk candy, Puerto Rican style (Dulce de leche)" +13252500,"BARFI/BURFI,INDIAN DESSERT,FROM MILK/CREAM/RICOTTA","Barfi or Burfi, Indian dessert, made from milk and/or cream and/or Ricotta cheese" +13252600,"TIRAMISU","Tiramisu" +13310000,"CUSTARD PUDDING, NOT CHOC, BABY, NS AS TO STR OR JR","Custard pudding, flavor other than chocolate, baby food, NS as to strained or junior" +13311000,"CUSTARD PUDDING, BABY, NOT CHOCOLATE, STRAINED","Custard pudding, baby food, flavor other than chocolate, strained" +13312000,"CUSTARD PUDDING, BABY, NOT CHOCOLATE, JUNIOR","Custard pudding, baby food, flavor other than chocolate, junior" +13411000,"WHITE SAUCE, MILK SAUCE","White sauce, milk sauce" +13412000,"MILK GRAVY, QUICK GRAVY","Milk gravy, quick gravy" +14010000,"CHEESE, NFS","Cheese, NFS" +14101010,"CHEESE, BLUE OR ROQUEFORT","Cheese, Blue or Roquefort" +14102010,"CHEESE, BRICK","Cheese, Brick" +14103010,"CHEESE, CAMEMBERT","Cheese, Camembert" +14103020,"CHEESE, BRIE","Cheese, Brie" +14104100,"CHEESE, CHEDDAR","Cheese, Cheddar" +14104110,"CHEESE, CHEDDAR, REDUCED FAT","Cheese, Cheddar, reduced fat" +14104115,"CHEESE, CHEDDAR, NONFAT OR FAT FREE","Cheese, Cheddar, nonfat or fat free" +14104200,"CHEESE, COLBY","Cheese, Colby" +14104250,"CHEESE, COLBY JACK","Cheese, Colby Jack" +14104400,"CHEESE, FETA (INCLUDE GOAT CHEESE)","Cheese, Feta" +14104600,"CHEESE, FONTINA","Cheese, Fontina" +14104700,"CHEESE, GOAT","Cheese, goat" +14105010,"CHEESE, GOUDA OR EDAM","Cheese, Gouda or Edam" +14105200,"CHEESE, GRUYERE","Cheese, Gruyere" +14106010,"CHEESE, LIMBURGER","Cheese, Limburger" +14106200,"CHEESE, MONTEREY","Cheese, Monterey" +14106500,"CHEESE, MONTEREY, REDUCED FAT","Cheese, Monterey, reduced fat" +14107010,"CHEESE, MOZZARELLA, NFS (INCLUDE PIZZA CHEESE)","Cheese, Mozzarella, NFS" +14107020,"CHEESE, MOZZARELLA, WHOLE MILK","Cheese, Mozzarella, whole milk" +14107030,"CHEESE, MOZZARELLA, PART SKIM (INCL ""LOWFAT"")","Cheese, Mozzarella, part skim" +14107040,"CHEESE, MOZZARELLA, REDUCED SODIUM","Cheese, Mozzarella, reduced sodium" +14107060,"CHEESE, MOZZARELLA, NONFAT OR FAT FREE","Cheese, Mozzarella, nonfat or fat free" +14107200,"CHEESE, MUENSTER","Cheese, Muenster" +14107250,"CHEESE, MUENSTER, REDUCED FAT","Cheese, Muenster, reduced fat" +14108010,"CHEESE, PARMESAN, DRY, GRATED (INCLUDE ROMANO)","Cheese, Parmesan, dry grated" +14108015,"CHEESE, PARMESAN, DRY GRATED, REDUCED FAT","Cheese, Parmesan, dry grated, reduced fat" +14108020,"CHEESE, PARMESAN, HARD (INCLUDE ROMANO)","Cheese, Parmesan, hard" +14108060,"CHEESE, PARMESAN, DRY GRATED, FAT FREE","Cheese, Parmesan, dry grated, fat free" +14108200,"CHEESE, PORT DU SALUT","Cheese, Port du Salut" +14108400,"CHEESE, PROVOLONE","Cheese, Provolone" +14108420,"CHEESE, PROVOLONE, REDUCED FAT","Cheese, provolone, reduced fat" +14109010,"CHEESE, SWISS","Cheese, Swiss" +14109020,"CHEESE, SWISS, REDUCED SODIUM","Cheese, Swiss, reduced sodium" +14109030,"CHEESE, SWISS, REDUCED FAT","Cheese, Swiss, reduced fat" +14109040,"CHEESE, SWISS, NONFAT OR FAT FREE","Cheese, Swiss, nonfat or fat free" +14110010,"CHEESE, CHEDDAR, REDUCED SODIUM","Cheese, Cheddar, reduced sodium" +14120010,"CHEESE, MEXICAN BLEND","Cheese, Mexican blend" +14120020,"CHEESE, MEXICAN BLEND, REDUCED FAT","Cheese, Mexican blend, reduced fat" +14131000,"QUESO ANEJO (AGED MEXICAN CHEESE)","Queso Anejo (aged Mexican cheese)" +14131500,"QUESO ASADERO (INCL OAXACAN-STYLE STRING CHEESE)","Queso Asadero" +14132000,"QUESO CHIHUAHUA (INCL MENNONITE CHEESE)","Queso Chihuahua" +14133000,"QUESO FRESCO (HISPANIC-STYLE FARMER CHEESE)","Queso Fresco" +14134000,"QUESO COTIJA","Queso cotija" +14200100,"CHEESE, COTTAGE, NFS","Cheese, cottage, NFS" +14201010,"CHEESE, COTTAGE, CREAMED","Cheese, cottage, creamed, large or small curd" +14201200,"COTTAGE CHEESE, FARMER'S","Cottage cheese, farmer's" +14201500,"CHEESE, RICOTTA","Cheese, Ricotta" +14202010,"CHEESE, COTTAGE, W/ FRUIT","Cheese, cottage, with fruit" +14202020,"CHEESE, COTTAGE, W/ VEGETABLES","Cheese, cottage, with vegetables" +14203010,"CHEESE, COTTAGE, DRY CURD","Cheese, cottage, dry curd" +14203020,"CHEESE, COTTAGE, SALTED, DRY CURD","Cheese, cottage, salted, dry curd" +14203510,"P.R. WHITE CHEESE (QUESO DEL PAIS, BLANCO)","Puerto Rican white cheese (queso del pais, blanco)" +14204010,"CHEESE, COTTAGE, LOWFAT","Cheese, cottage, lowfat (1-2% fat)" +14204020,"CHEESE, COTTAGE, LOWFAT, W/ FRUIT","Cheese, cottage, lowfat, with fruit" +14204030,"CHEESE, COTTAGE, LOWFAT, W/ VEGETABLES","Cheese, cottage, lowfat, with vegetables" +14206010,"CHEESE, COTTAGE, LOWFAT, LOW SODIUM","Cheese, cottage, lowfat, low sodium" +14207010,"CHEESE, COTTAGE, LOWFAT, LACTOSE REDUCED","Cheese, cottage, lowfat, lactose reduced" +14301010,"CHEESE, CREAM","Cheese, cream" +14303010,"CHEESE, CREAM, LIGHT/LITE (FORMERLY CALLED CR CHEESE LOWFAT)","Cheese, cream, light or lite (formerly called Cream Cheese Lowfat)" +14410100,"CHEESE, AMERICAN AND SWISS BLENDS","Cheese, American and Swiss blends" +14410110,"CHEESE, AMERICAN","Cheese, American" +14410120,"CHEESE, AMERICAN, REDUCED FAT","Cheese, American, reduced fat" +14410130,"CHEESE, AMERICAN, NONFAT OR FAT FREE","Cheese, American, nonfat or fat free" +14410210,"CHEESE, AMERICAN, REDUCED SODIUM","Cheese, American, reduced sodium" +14410330,"CHEESE SPREAD, AMERICAN OR CHEDDAR CHEESE BASE, REDUCED FAT","Cheese spread, American or Cheddar cheese base, reduced fat" +14410380,"CHEESE, PROCESSED CREAM CHEESE PRODUCT, NONFAT","Cheese, processed cream cheese product, nonfat or fat free" +14410500,"CHEESE, PROCESSED, CHEESE FOOD","Cheese, processed cheese food" +14410600,"CHEESE, PROCESSED, W/VEGETABLES(INCL PEPPER CHEESE)","Cheese, processed, with vegetables" +14410620,"CHEESE, WITH WINE","Cheese, with wine" +14420100,"CHEESE SPREAD, AMERICAN OR CHEDDAR CHEESE BASE","Cheese spread, American or Cheddar cheese base" +14420160,"CHEESE SPREAD, SWISS CHEESE BASE","Cheese spread, Swiss cheese base" +14420200,"CHEESE SPRD, CREAM CHEESE, REG","Cheese spread, cream cheese, regular" +14420210,"CHEESE SPREAD, CREAM CHEESE, LIGHT OR LITE","Cheese spread, cream cheese, light or lite" +14420300,"CHEESE SPREAD, PRESSURIZED CAN","Cheese spread, pressurized can" +14502000,"IMITATION CHEESE","Imitation cheese" +14610200,"COTTAGE CHEESE, W/ GELATIN DESSERT","Cheese, cottage cheese, with gelatin dessert" +14610210,"COTTAGE CHEESE, W/ GELATIN DESSERT & FRUIT","Cheese, cottage cheese, with gelatin dessert and fruit" +14610250,"COTTAGE CHEESE W/ GELATIN DESSERT & VEGETABLES","Cheese, cottage cheese, with gelatin dessert and vegetables" +14610520,"CHEESE W/ NUTS (INCL CHEESE BALL)","Cheese with nuts" +14620100,"DIP, CREAM CHEESE BASE","Dip, cream cheese base" +14620120,"SHRIMP DIP, CREAM CHEESE BASE (INCL CLAM DIP)","Shrimp dip, cream cheese base" +14620150,"DIP, CHEESE W/ CHILI PEPPER (CHILI CON QUESO)","Dip, cheese with chili pepper (chili con queso)" +14620200,"DIP, CHEESE BASE OTHER THAN CREAM CHEESE","Dip, cheese base other than cream cheese" +14620300,"TOPPING FROM CHEESE PIZZA","Topping from cheese pizza" +14620310,"TOPPING FROM VEGETABLE PIZZA","Topping from vegetable pizza" +14620320,"TOPPING FROM MEAT PIZZA","Topping from meat pizza" +14620330,"TOPPING FROM MEAT AND VEGETABLE PIZZA","Topping from meat and vegetable pizza" +14630100,"CHEESE FONDUE","Cheese fondue" +14630200,"CHEESE SOUFFLE","Cheese souffle" +14630300,"WELSH RAREBIT","Welsh rarebit" +14640000,"CHEESE SANDWICH","Cheese sandwich" +14640100,"CHEESE SANDWICH, GRILLED","Cheese sandwich, grilled" +14640200,"CHEESE SANDWICH, HOAGIE","Cheese sandwich, hoagie" +14650100,"CHEESE SAUCE","Cheese sauce" +14650150,"CHEESE SAUCE MADE W/ LOWFAT CHEESE","Cheese sauce made with lowfat cheese" +14650160,"ALFREDO SAUCE","Alfredo sauce" +14660200,"CHEESE, NUGGETS, FRIED (INCL BANQUET BRAND)","Cheese, nuggets or pieces, breaded, baked, or fried" +14670000,"MOZZARELLA CHEESE, TOMATO, BASIL, W/ OIL, VINEGAR","Mozzarella cheese, tomato, and basil, with oil and vinegar dressing" +14710100,"CHEDDAR CHEESE SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Cheddar cheese soup, home recipe, canned or ready-to-serve" +14710200,"BEER CHEESE SOUP, MADE WITH MILK","Beer cheese soup, made with milk" +2e+07,"MEAT, NFS","Meat, NFS" +20000070,"MEAT, BABY, NS AS TO TYPE, NS AS TO STR OR JR","Meat, baby food, NS as to type, NS as to strained or junior" +20000090,"MEAT STICKS, BABY, NS AS TO TYPE OF MEAT","Meat sticks, baby food, NS as to type of meat" +20000200,"GROUND MEAT,NFS","Ground meat, NFS" +21000100,"BEEF, NS AS TO CUT, COOKED, NS AS TO FAT","Beef, NS as to cut, cooked, NS as to fat eaten" +21000110,"BEEF, NS AS TO CUT, COOKED, LEAN & FAT","Beef, NS as to cut, cooked, lean and fat eaten" +21000120,"BEEF, NS AS TO CUT, COOKED, LEAN ONLY","Beef, NS as to cut, cooked, lean only eaten" +21001000,"STEAK, NS AS TO TYPE OF MEAT, COOKED, NS AS TO FAT","Steak, NS as to type of meat, cooked, NS as to fat eaten" +21001010,"STEAK, NS AS TO TYPE OF MEAT, COOKED, LEAN & FAT","Steak, NS as to type of meat, cooked, lean and fat eaten" +21001020,"STEAK, NS AS TO TYPE OF MEAT, COOKED, LEAN ONLY","Steak, NS as to type of meat, cooked, lean only eaten" +21002000,"BEEF, PICKLED","Beef, pickled" +21003000,"BEEF, NS AS TO CUT, FRIED, NS AS TO FAT EATEN","Beef, NS as to cut, fried, NS to fat eaten" +21101000,"BEEF STEAK, NS AS TO COOKING METHOD, NS AS TO FAT","Beef steak, NS as to cooking method, NS as to fat eaten" +21101010,"BEEF STEAK, NS AS TO COOKING METHOD, LEAN & FAT","Beef steak, NS as to cooking method, lean and fat eaten" +21101020,"BEEF STEAK, NS AS TO COOKING METHOD, LEAN ONLY","Beef steak, NS as to cooking method, lean only eaten" +21101110,"BEEF STEAK, BROILED OR BAKED, NS AS TO FAT","Beef steak, broiled or baked, NS as to fat eaten" +21101120,"BEEF STEAK, BROILED OR BAKED, LEAN & FAT","Beef steak, broiled or baked, lean and fat eaten" +21101130,"BEEF STEAK, BROILED OR BAKED, LEAN ONLY","Beef steak, broiled or baked, lean only eaten" +21102110,"BEEF STEAK, FRIED, NS AS TO FAT","Beef steak, fried, NS as to fat eaten" +21102120,"BEEF STEAK, FRIED, LEAN & FAT","Beef steak, fried, lean and fat eaten" +21102130,"BEEF STEAK, FRIED, LEAN ONLY","Beef steak, fried, lean only eaten" +21103110,"BEEF STEAK,BREADED/FLOURED,BAKED/FRIED,NS AS TO FAT","Beef steak, breaded or floured, baked or fried, NS as to fat eaten" +21103120,"BEEF STEAK, BREADED/FLOURED,BAKED/FRIED, LEAN & FAT","Beef steak, breaded or floured, baked or fried, lean and fat eaten" +21103130,"BEEF STEAK, BREADED/FLOURED, BAKED/FRIED, LEAN ONLY","Beef steak, breaded or floured, baked or fried, lean only eaten" +21104110,"BEEF STEAK, BATTERED, FRIED, NS AS TO FAT","Beef steak, battered, fried, NS as to fat eaten" +21104120,"BEEF STEAK, BATTERED, FRIED, LEAN & FAT","Beef steak, battered, fried, lean and fat eaten" +21104130,"BEEF STEAK, BATTERED, FRIED, LEAN ONLY","Beef steak, battered, fried, lean only eaten" +21105110,"BEEF STEAK, BRAISED, NS AS TO FAT","Beef steak, braised, NS as to fat eaten" +21105120,"BEEF STEAK, BRAISED, LEAN & FAT","Beef steak, braised, lean and fat eaten" +21105130,"BEEF STEAK, BRAISED, LEAN ONLY","Beef steak, braised, lean only eaten" +21301000,"BEEF, OXTAILS, COOKED","Beef, oxtails, cooked" +21302000,"BEEF, NECK BONES, COOKED","Beef, neck bones, cooked" +21304000,"BEEF, SHORTRIBS, COOKED, NS AS TO FAT","Beef, shortribs, cooked, NS as to fat eaten" +21304110,"BEEF, SHORTRIBS, COOKED, LEAN & FAT","Beef, shortribs, cooked, lean and fat eaten" +21304120,"BEEF, SHORTRIBS, COOKED, LEAN ONLY","Beef, shortribs, cooked, lean only eaten" +21304200,"BEEF, SHORTRIBS, BBQ, W/ SAUCE, NS AS TO FAT","Beef, shortribs, barbecued, with sauce, NS as to fat eaten" +21304210,"BEEF, SHORTRIBS, BBQ, W/ SAUCE, LEAN & FAT","Beef, shortribs, barbecued, with sauce, lean and fat eaten" +21304220,"BEEF, SHORTRIBS, BBQ, W/ SAUCE, LEAN ONLY","Beef, shortribs, barbecued, with sauce, lean only eaten" +21305000,"BEEF, COW HEAD, COOKED","Beef, cow head, cooked" +21401000,"BEEF, ROAST, ROASTED, NS AS TO FAT","Beef, roast, roasted, NS as to fat eaten" +21401110,"BEEF, ROAST, ROASTED, LEAN & FAT","Beef, roast, roasted, lean and fat eaten" +21401120,"BEEF, ROAST, ROASTED, LEAN ONLY","Beef, roast, roasted, lean only eaten" +21401400,"BEEF, ROAST, CANNED","Beef, roast, canned" +21407000,"BEEF, POT ROAST, BRAISED OR BOILED, NS AS TO FAT","Beef, pot roast, braised or boiled, NS as to fat eaten" +21407110,"BEEF, POT ROAST, BRAISED OR BOILED, LEAN & FAT","Beef, pot roast, braised or boiled, lean and fat eaten" +21407120,"BEEF, POT ROAST, BRAISED OR BOILED, LEAN ONLY","Beef, pot roast, braised or boiled, lean only eaten" +21410000,"BEEF, STEW MEAT, COOKED, NS AS TO FAT","Beef, stew meat, cooked, NS as to fat eaten" +21410110,"BEEF, STEW MEAT, COOKED, LEAN & FAT","Beef, stew meat, cooked, lean and fat eaten" +21410120,"BEEF, STEW MEAT, COOKED, LEAN ONLY","Beef, stew meat, cooked, lean only eaten" +21416000,"CORNED BEEF, COOKED, NS AS TO FAT","Corned beef, cooked, NS as to fat eaten" +21416110,"CORNED BEEF, COOKED, LEAN & FAT","Corned beef, cooked, lean and fat eaten" +21416120,"CORNED BEEF, COOKED, LEAN ONLY","Corned beef, cooked, lean only eaten" +21416150,"CORNED BEEF, CANNED, READY TO EAT","Corned beef, canned, ready-to-eat" +21417100,"BEEF BRISKET, COOKED, NS AS TO FAT","Beef brisket, cooked, NS as to fat eaten" +21417110,"BEEF BRISKET, COOKED, LEAN & FAT","Beef brisket, cooked, lean and fat eaten" +21417120,"BEEF BRISKET, COOKED, LEAN ONLY","Beef brisket, cooked, lean only eaten" +21420100,"BEEF, SANDWICH STEAK (FLAKED,FORMED, THINLY SLICED)","Beef, sandwich steak (flaked, formed, thinly sliced)" +21500000,"GROUND BEEF, RAW","Ground beef, raw" +21500100,"GROUND BEEF OR PATTY, NS AS TO %LEAN","Ground beef or patty, cooked, NS as to percent lean (formerly NS as to regular, lean, or extra lean)" +21500200,"GROUND BEEF OR PATTY, BREADED, COOKED","Ground beef or patty, breaded, cooked" +21500300,"GROUND BEEF PATTY, COOKED (FOR FAST FOOD SANDWICHES)","Ground beef patty, cooked (for fast food sandwiches)" +21501000,"GROUND BEEF, LESS THAN 80% LEAN, COOKED","Ground beef, less than 80% lean, cooked (formerly regular)" +21501200,"GROUND BEEF, 80% - 84% LEAN, COOKED","Ground beef, 80% - 84% lean, cooked (formerly lean)" +21501300,"GROUND BEEF, 85% - 89% LEAN, COOKED","Ground beef, 85% - 89% lean, cooked (formerly extra lean)" +21501350,"GROUND BEEF, 90% - 94% LEAN, COOKED","Ground beef, 90% - 94% lean, cooked" +21501360,"GROUND BEEF, 95% OR MORE LEAN, COOKED","Ground beef, 95% or more lean, cooked" +21540100,"GROUND BEEF W/ TEXTURED VEGETABLE PROTEIN, COOKED","Ground beef with textured vegetable protein, cooked" +21601000,"BEEF, BACON, COOKED","Beef, bacon, cooked" +21601500,"BEEF BACON, FORMED, LEAN MEAT ADDED (INCL SIZZLEAN)","Beef, bacon, formed, lean meat added, cooked" +21602000,"BEEF, DRIED, CHIPPED, UNCOOKED","Beef, dried, chipped, uncooked" +21602010,"BEEF, DRIED, CHIPPED, COOKED IN FAT","Beef, dried, chipped, cooked in fat" +21602100,"BEEF JERKY","Beef jerky" +21603000,"BEEF, PASTRAMI (BEEF, SMOKED, SPICED)","Beef, pastrami (beef, smoked, spiced)" +21701000,"BEEF, BABY, NS AS TO STRAINED OR JUNIOR","Beef, baby food, NS as to strained or junior" +21701010,"BEEF, BABY, STRAINED","Beef, baby food, strained" +21701020,"BEEF, BABY, JUNIOR","Beef, baby food, junior" +22000100,"PORK, NS AS TO CUT, COOKED, NS AS TO FAT EATEN","Pork, NS as to cut, cooked, NS as to fat eaten" +22000110,"PORK, NS AS TO CUT, COOKED, LEAN & FAT EATEN","Pork, NS as to cut, cooked, lean and fat eaten" +22000120,"PORK, NS AS TO CUT, COOKED, LEAN ONLY EATEN","Pork, NS as to cut, cooked, lean only eaten" +22000200,"PORK, NS AS TO CUT, FRIED, NS AS TO FAT EATEN","Pork, NS as to cut, fried, NS as to fat eaten" +22000210,"PORK, NS AS TO CUT, FRIED, LEAN & FAT EATEN","Pork, NS as to cut, fried, lean and fat eaten" +22000220,"PORK, NS AS TO CUT, FRIED, LEAN ONLY EATEN","Pork, NS as to cut, fried, lean only eaten" +22000300,"PORK, NS AS TO CUT, BREADED, FRIED, NS AS TO FAT","Pork, NS as to cut, breaded or floured, fried, NS as to fat eaten" +22000310,"PORK, NS AS TO CUT, BREADED, FRIED, FAT EATEN","Pork, NS as to cut, breaded or floured, fried, lean and fat eaten" +22000320,"PORK, NS AS TO CUT, BREADED, FRIED, LEAN ONLY","Pork, NS as to cut, breaded or floured, fried, lean only eaten" +22001000,"PORK, PICKLED, NS AS TO CUT","Pork, pickled, NS as to cut" +22002000,"PORK, GROUND OR PATTY, COOKED","Pork, ground or patty, cooked" +22002100,"PORK, GROUND, GROUND OR PATTY, BREADED, COOKED","Pork, ground or patty, breaded, cooked" +22002800,"PORK JERKY","Pork jerky" +22101000,"PORK CHOP, NS AS TO COOKING METHOD, NS AS TO FAT","Pork chop, NS as to cooking method, NS as to fat eaten" +22101010,"PORK CHOP, NS AS TO COOKING METHOD, LEAN & FAT","Pork chop, NS as to cooking method, lean and fat eaten" +22101020,"PORK CHOP, NS AS TO COOKING METHOD, LEAN ONLY","Pork chop, NS as to cooking method, lean only eaten" +22101100,"PORK CHOP, BROILED OR BAKED, NS AS TO FAT","Pork chop, broiled or baked, NS as to fat eaten" +22101110,"PORK CHOP, BROILED OR BAKED, LEAN & FAT","Pork chop, broiled or baked, lean and fat eaten" +22101120,"PORK CHOP, BROILED OR BAKED, LEAN ONLY","Pork chop, broiled or baked, lean only eaten" +22101130,"PORK CHOP, BREADED, BROILED OR BAKED, NS AS TO FAT","Pork chop, breaded or floured, broiled or baked, NS as to fat eaten" +22101140,"PORK CHOP, BREADED, BROILED OR BAKED, LEAN & FAT","Pork chop, breaded or floured, broiled or baked, lean and fat eaten" +22101150,"PORK CHOP, BREADED, BROILED OR BAKED, LEAN ONLY","Pork chop, breaded or floured, broiled or baked, lean only eaten" +22101200,"PORK CHOP, FRIED, NS AS TO FAT","Pork chop, fried, NS as to fat eaten" +22101210,"PORK CHOP, FRIED, LEAN & FAT","Pork chop, fried, lean and fat eaten" +22101220,"PORK CHOP, FRIED, LEAN ONLY","Pork chop, fried, lean only eaten" +22101300,"PORK CHOP, BREADED, FRIED, NS AS TO FAT","Pork chop, breaded or floured, fried, NS as to fat eaten" +22101310,"PORK CHOP, BREADED, FRIED, LEAN & FAT","Pork chop, breaded or floured, fried, lean and fat eaten" +22101320,"PORK CHOP, BREADED, FRIED, LEAN ONLY","Pork chop, breaded or floured, fried, lean only eaten" +22101400,"PORK CHOP, BATTERED, FRIED, NS AS TO FAT","Pork chop, battered, fried, NS as to fat eaten" +22101410,"PORK CHOP, BATTERED, FRIED, LEAN & FAT","Pork chop, battered, fried, lean and fat eaten" +22101420,"PORK CHOP, BATTERED, FRIED, LEAN ONLY","Pork chop, battered, fried, lean only eaten" +22101500,"PORK CHOP, STEWED, NS AS TO FAT EATEN","Pork chop, stewed, NS as to fat eaten" +22101510,"PORK CHOP, STEWED, LEAN & FAT EATEN","Pork chop, stewed, lean and fat eaten" +22101520,"PORK CHOP, STEWED, LEAN ONLY EATEN","Pork chop, stewed, lean only eaten" +22107000,"PORK CHOP, SMOKED OR CURED, COOKED, NS AS TO FAT","Pork chop, smoked or cured, cooked, NS as to fat eaten" +22107010,"PORK CHOP, SMOKED OR CURED, COOKED, LEAN & FAT","Pork chop, smoked or cured, cooked, lean and fat eaten" +22107020,"PORK CHOP, SMOKED OR CURED, COOKED, LEAN ONLY","Pork chop, smoked or cured, cooked, lean only eaten" +22201000,"PORK STEAK, NS AS TO COOKING METHOD, NS AS TO FAT","Pork steak or cutlet, NS as to cooking method, NS as to fat eaten" +22201010,"PORK STEAK, NS AS TO COOKING METHOD, LEAN & FAT","Pork steak or cutlet, NS as to cooking method, lean and fat eaten" +22201020,"PORK STEAK, NS AS TO COOKING METHOD, LEAN ONLY","Pork steak or cutlet, NS as to cooking method, lean only eaten" +22201050,"PORK STEAK OR CUTLET, BATTERED, FRIED, NS AS TO FAT","Pork steak or cutlet, battered, fried, NS as to fat eaten" +22201060,"PORK STEAK OR CUTLET, BATTERED, FRIED, LEAN & FAT","Pork steak or cutlet, battered, fried, lean and fat eaten" +22201070,"PORK STEAK OR CUTLET, BATTERED, FRIED, LEAN ONLY","Pork steak or cutlet, battered, fried, lean only eaten" +22201100,"PORK STEAK OR CUTLET, BROILED OR BAKD, NS AS TO FAT","Pork steak or cutlet, broiled or baked, NS as to fat eaten" +22201110,"PORK STEAK OR CUTLET, BROILED OR BAKED, LEAN & FAT","Pork steak or cutlet, broiled or baked, lean and fat eaten" +22201120,"PORK STEAK OR CUTLET, BROILED OR BAKED, LEAN ONLY","Pork steak or cutlet, broiled or baked, lean only eaten" +22201200,"PORK STEAK OR CUTLET, FRIED, NS AS TO FAT","Pork steak or cutlet, fried, NS as to fat eaten" +22201210,"PORK STEAK OR CUTLET, FRIED, LEAN & FAT","Pork steak or cutlet, fried, lean and fat eaten" +22201220,"PORK STEAK OR CUTLET, FRIED, LEAN ONLY","Pork steak or cutlet, fried, lean only eaten" +22201300,"PORK CUTLET, BREADED, BROILED/BAKED, NS AS TO FAT","Pork steak or cutlet, breaded or floured, broiled or baked, NS as to fat eaten" +22201310,"PORK CUTLET, BREADED, BROILED/BAKED, LEAN & FAT","Pork steak or cutlet, breaded or floured, broiled or baked, lean and fat eaten" +22201320,"PORK CUTLET, BREADED, BROILED/BAKED, LEAN ONLY","Pork steak or cutlet, breaded or floured, broiled or baked, lean only eaten" +22201400,"PORK STEAK OR CUTLET, BREADED, FRIED, NS AS TO FAT","Pork steak or cutlet, breaded or floured, fried, NS as to fat eaten" +22201410,"PORK STEAK OR CUTLET, BREADED, FRIED, LEAN & FAT","Pork steak or cutlet, breaded or floured, fried, lean and fat eaten" +22201420,"PORK STEAK OR CUTLET, BREADED, FRIED, LEAN ONLY","Pork steak or cutlet, breaded or floured, fried, lean only eaten" +22210300,"PORK, TENDERLOIN, COOKED, NS AS TO METHOD","Pork, tenderloin, cooked, NS as to cooking method" +22210310,"PORK, TENDERLOIN, BREADED, FRIED","Pork, tenderloin, breaded, fried" +22210350,"PORK, TENDERLOIN, BRAISED","Pork, tenderloin, braised" +22210400,"PORK, TENDERLOIN, BAKED","Pork, tenderloin, baked" +22210450,"PORK, TENDERLOIN, BATTERED, FRIED","Pork, tenderloin, battered, fried" +22300120,"HAM, FRIED, NS AS TO FAT","Ham, fried, NS as to fat eaten" +22300130,"HAM, FRIED, LEAN & FAT","Ham, fried, lean and fat eaten" +22300140,"HAM, FRIED, LEAN ONLY","Ham, fried, lean only eaten" +22300150,"HAM, BREADED, FRIED, NS AS TO FAT","Ham, breaded or floured, fried, NS as to fat eaten" +22300160,"HAM, BREADED, FRIED, LEAN & FAT","Ham, breaded or floured, fried, lean and fat eaten" +22300170,"HAM, BREADED, FRIED, LEAN ONLY","Ham, breaded or floured, fried, lean only eaten" +22301000,"HAM, FRESH, COOKED, NS AS TO FAT","Ham, fresh, cooked, NS as to fat eaten" +22301110,"HAM, FRESH, COOKED, LEAN & FAT","Ham, fresh, cooked, lean and fat eaten" +22301120,"HAM, FRESH, COOKED, LEAN ONLY","Ham, fresh, cooked, lean only eaten" +22311000,"HAM, SMOKED OR CURED, COOKED, NS AS TO FAT","Ham, smoked or cured, cooked, NS as to fat eaten" +22311010,"HAM, SMOKED OR CURED, COOKED, LEAN & FAT","Ham, smoked or cured, cooked, lean and fat eaten" +22311020,"HAM, SMOKED OR CURED, COOKED, LEAN ONLY","Ham, smoked or cured, cooked, lean only eaten" +22311200,"HAM, SMOKED OR CURED, LOW NA, NS AS TO FAT","Ham, smoked or cured, low sodium, cooked, NS as to fat eaten" +22311210,"HAM, SMOKED OR CURED, LOW NA, LEAN & FAT","Ham, smoked or cured, low sodium, cooked, lean and fat eaten" +22311220,"HAM, SMOKED OR CURED, LOW NA, LEAN ONLY","Ham, smoked or cured, low sodium, cooked, lean only eaten" +22311450,"HAM, PROSCIUTTO","Ham, prosciutto" +22311500,"HAM, SMOKED OR CURED, CANNED, NS AS TO FAT EATEN","Ham, smoked or cured, canned, NS as to fat eaten" +22311510,"HAM, SMOKED OR CURED, CANNED, LEAN & FAT EATEN","Ham, smoked or cured, canned, lean and fat eaten" +22311520,"HAM, SMOKED OR CURED, CANNED, LEAN ONLY EATEN","Ham, smoked or cured, canned, lean only eaten" +22321110,"HAM, SMOKED OR CURED, GROUND PATTY","Ham, smoked or cured, ground patty" +22400100,"PORK ROAST, NS AS TO CUT, NS AS TO FAT","Pork roast, NS as to cut, cooked, NS as to fat eaten" +22400110,"PORK ROAST, NS AS TO CUT, COOKED, LEAN & FAT","Pork roast, NS as to cut, cooked, lean and fat eaten" +22400120,"PORK ROAST, NS AS TO CUT, COOKED, LEAN ONLY","Pork roast, NS as to cut, cooked, lean only eaten" +22401000,"PORK ROAST, LOIN, COOKED, NS AS TO FAT","Pork roast, loin, cooked, NS as to fat eaten" +22401010,"PORK ROAST, LOIN, COOKED, LEAN & FAT","Pork roast, loin, cooked, lean and fat eaten" +22401020,"PORK ROAST, LOIN, COOKED, LEAN ONLY","Pork roast, loin, cooked, lean only eaten" +22402510,"FRIED PORK CHUNKS, P.R. (CARNE DE CERDO FRITA)","Fried pork chunks, Puerto Rican style (Carne de cerdo frita, masitas fritas)" +22411000,"PORK ROAST, SHOULDER, COOKED, NS AS TO FAT","Pork roast, shoulder, cooked, NS as to fat eaten" +22411010,"PORK ROAST, SHOULDER, COOKED, LEAN & FAT","Pork roast, shoulder, cooked, lean and fat eaten" +22411020,"PORK ROAST, SHOULDER, COOKED, LEAN ONLY","Pork roast, shoulder, cooked, lean only eaten" +22421000,"PORK ROAST, SMOKED OR CURED, COOKED, NS AS TO FAT","Pork roast, smoked or cured, cooked, NS as to fat eaten" +22421010,"PORK ROAST, SMOKED OR CURED, COOKED, LEAN & FAT","Pork roast, smoked or cured, cooked, lean and fat eaten" +22421020,"PORK ROAST, SMOKED OR CURED, COOKED, LEAN ONLY","Pork roast, smoked or cured, cooked, lean only eaten" +22431000,"PORK ROLL, CURED, FRIED","Pork roll, cured, fried" +22501010,"BACON, CANADIAN, COOKED","Canadian bacon, cooked" +22600100,"BACON, NS AS TO TYPE OF MEAT, COOKED","Bacon, NS as to type of meat, cooked" +22600200,"PORK BACON, NS AS TO FRESH/SMOKED/CURED, COOKED","Pork bacon, NS as to fresh, smoked or cured, cooked" +22601000,"PORK BACON, SMOKED OR CURED, COOKED","Pork bacon, smoked or cured, cooked" +22601040,"BACON OR SIDE PORK, FRESH, COOKED","Bacon or side pork, fresh, cooked" +22602010,"PORK BACON, SMOKED OR CURED, LOWER SODIUM","Pork bacon, smoked or cured, lower sodium" +22605010,"BACON, FORMED, LEAN MEAT ADDED, COOKED","Pork bacon, formed, lean meat added, cooked" +22621000,"SALT PORK, COOKED","Salt pork, cooked" +22621100,"FAT BACK, COOKED (INCLUDE HOG JOWL)","Fat back, cooked" +22701000,"PORK, SPARERIBS, COOKED, NS AS TO FAT EATEN","Pork, spareribs, cooked, NS as to fat eaten" +22701010,"PORK, SPARERIBS, COOKED, LEAN & FAT","Pork, spareribs, cooked, lean and fat eaten" +22701020,"PORK, SPARERIBS, COOKED, LEAN ONLY","Pork, spareribs, cooked, lean only eaten" +22701030,"PORK, SPARERIBS, BBQ, W/ SAUCE, NS FAT EATEN","Pork, spareribs, barbecued, with sauce, NS as to fat eaten" +22701040,"PORK, SPARERIBS, BBQ, W/ SAUCE, LEAN & FAT EATEN","Pork, spareribs, barbecued, with sauce, lean and fat eaten" +22701050,"PORK, SPARERIBS, BBQ, W/ SAUCE, LEAN ONLY EATEN","Pork, spareribs, barbecued, with sauce, lean only eaten" +22704010,"PORK, CRACKLINGS, COOKED","Pork, cracklings, cooked" +22705010,"PORK, EARS, TAIL, HEAD, SNOUT, MISC PARTS, COOKED","Pork ears, tail, head, snout, miscellaneous parts, cooked" +22706010,"PORK, NECK BONES, COOKED","Pork, neck bones, cooked" +22707010,"PORK, PIG'S FEET, COOKED","Pork, pig's feet, cooked" +22707020,"PORK, PIG'S FEET, PICKLED","Pork, pig's feet, pickled" +22708010,"PORK, PIG'S HOCKS, COOKED","Pork, pig's hocks, cooked" +22709010,"PORK SKIN, RINDS, DEEP-FRIED","Pork skin, rinds, deep-fried" +22709110,"PORK SKIN, BOILED","Pork skin, boiled" +22810010,"HAM, BABY, STRAINED","Ham, baby food, strained" +22820000,"MEAT STICK, BABY FOOD","Meat stick, baby food" +23000100,"LAMB, NS AS TO CUT, COOKED","Lamb, NS as to cut, cooked" +23101000,"LAMB CHOP, COOKED, NS AS TO CUT & FAT","Lamb chop, NS as to cut, cooked, NS as to fat eaten" +23101010,"LAMB CHOP, NS AS TO CUT, COOKED, LEAN & FAT","Lamb chop, NS as to cut, cooked, lean and fat eaten" +23101020,"LAMB CHOP, NS AS TO CUT, COOKED, LEAN ONLY","Lamb chop, NS as to cut, cooked, lean only eaten" +23104000,"LAMB, LOIN CHOP, COOKED, NS AS TO FAT","Lamb, loin chop, cooked, NS as to fat eaten" +23104010,"LAMB, LOIN CHOP, COOKED, LEAN & FAT","Lamb, loin chop, cooked, lean and fat eaten" +23104020,"LAMB, LOIN CHOP, COOKED, LEAN ONLY","Lamb, loin chop, cooked, lean only eaten" +23107000,"LAMB, SHOULDER CHOP, COOKED, NS AS TO FAT","Lamb, shoulder chop, cooked, NS as to fat eaten" +23107010,"LAMB, SHOULDER CHOP, COOKED, LEAN & FAT","Lamb, shoulder chop, cooked, lean and fat eaten" +23107020,"LAMB, SHOULDER CHOP, COOKED, LEAN ONLY","Lamb, shoulder chop, cooked, lean only eaten" +23110000,"LAMB, RIBS, COOKED, LEAN ONLY","Lamb, ribs, cooked, lean only eaten" +23110010,"LAMB, RIBS, COOKED, NS AS TO FAT","Lamb, ribs, cooked, NS as to fat eaten" +23110050,"LAMB, RIBS, COOKED, LEAN & FAT","Lamb, ribs, cooked, lean and fat eaten" +23111010,"LAMB HOCKS, COOKED","Lamb hocks, cooked" +23120100,"LAMB, ROAST, COOKED, NS AS TO FAT EATEN","Lamb, roast, cooked, NS as to fat eaten" +23120110,"LAMB, ROAST, COOKED, LEAN & FAT EATEN","Lamb, roast, cooked, lean and fat eaten" +23120120,"LAMB, ROAST, COOKED, LEAN ONLY EATEN","Lamb, roast, cooked, lean only eaten" +23132000,"LAMB, GROUND OR PATTY, COOKED","Lamb, ground or patty, cooked" +23150100,"GOAT, BOILED","Goat, boiled" +23150200,"GOAT, FRIED","Goat, fried" +23150250,"GOAT, BAKED","Goat, baked" +23150270,"GOAT HEAD, COOKED","Goat head, cooked" +23150300,"GOAT RIBS, COOKED","Goat ribs, cooked" +23200100,"VEAL, COOKED, NS AS TO CUT & FAT","Veal, NS as to cut, cooked, NS as to fat eaten" +23200110,"VEAL, NS AS TO CUT, COOKED, LEAN & FAT","Veal, NS as to cut, cooked, lean and fat eaten" +23200120,"VEAL, NS AS TO CUT, COOKED, LEAN ONLY","Veal, NS as to cut, cooked, lean only eaten" +23201010,"VEAL CHOP, NS AS TO COOKING METHOD, NS AS TO FAT","Veal chop, NS as to cooking method, NS as to fat eaten" +23201020,"VEAL CHOP, NS AS TO COOKING METHOD, LEAN & FAT","Veal chop, NS as to cooking method, lean and fat eaten" +23201030,"VEAL CHOP, NS AS TO COOKING METHOD, LEAN ONLY","Veal chop, NS as to cooking method, lean only eaten" +23203010,"VEAL CHOP, FRIED, NS AS TO FAT","Veal chop, fried, NS as to fat eaten" +23203020,"VEAL CHOP, FRIED, LEAN & FAT","Veal chop, fried, lean and fat eaten" +23203030,"VEAL CHOP, FRIED, LEAN ONLY","Veal chop, fried, lean only eaten" +23203100,"VEAL CHOP, BROILED, NS AS TO FAT","Veal chop, broiled, NS as to fat eaten" +23203110,"VEAL CHOP, BROILED, LEAN & FAT","Veal chop, broiled, lean and fat eaten" +23203120,"VEAL CHOP, BROILED, LEAN ONLY","Veal chop, broiled, lean only eaten" +23204010,"VEAL CUTLET, NS AS TO COOKING METHOD, NS AS TO FAT","Veal cutlet or steak, NS as to cooking method, NS as to fat eaten" +23204020,"VEAL CUTLET, NS AS TO COOKING METHOD, LEAN & FAT","Veal cutlet or steak, NS as to cooking method, lean and fat eaten" +23204030,"VEAL CUTLET, NS AS TO COOKING METHOD, LEAN ONLY","Veal cutlet or steak, NS as to cooking method, lean only eaten" +23204200,"VEAL CUTLET OR STEAK, BROILED, NS AS TO FAT","Veal cutlet or steak, broiled, NS as to fat eaten" +23204210,"VEAL CUTLET OR STEAK, BROILED, LEAN & FAT","Veal cutlet or steak, broiled, lean and fat eaten" +23204220,"VEAL CUTLET OR STEAK, BROILED, LEAN ONLY","Veal cutlet or steak, broiled, lean only eaten" +23205010,"VEAL CUTLET OR STEAK, FRIED, NS AS TO FAT","Veal cutlet or steak, fried, NS as to fat eaten" +23205020,"VEAL CUTLET OR STEAK, FRIED, LEAN & FAT","Veal cutlet or steak, fried, lean and fat eaten" +23205030,"VEAL CUTLET OR STEAK, FRIED, LEAN ONLY","Veal cutlet or steak, fried, lean only eaten" +23210010,"VEAL, ROASTED, NS AS TO FAT","Veal, roasted, NS as to fat eaten" +23210020,"VEAL, ROASTED, LEAN & FAT","Veal, roasted, lean and fat eaten" +23210030,"VEAL, ROASTED, LEAN ONLY","Veal, roasted, lean only eaten" +23220010,"VEAL, GROUND OR PATTY, COOKED","Veal, ground or patty, cooked" +23220020,"MOCK CHICKEN LEGS, COOKED","Mock chicken legs, cooked" +23220030,"VEAL PATTY, BREADED, COOKED","Veal patty, breaded, cooked" +23310000,"RABBIT, NS AS TO DOMESTIC OR WILD, COOKED","Rabbit, NS as to domestic or wild, cooked" +23311100,"RABBIT, DOMESTIC, NS AS TO COOKING METHOD","Rabbit, domestic, NS as to cooking method" +23311120,"RABBIT, NS AS TO DOMESTIC OR WILD, BREADED, FRIED","Rabbit, NS as to domestic or wild, breaded, fried" +23311200,"RABBIT, WILD, COOKED","Rabbit, wild, cooked" +23321000,"VENISON/DEER, NFS","Venison/deer, NFS" +23321050,"VENISON/DEER, CURED","Venison/deer, cured" +23321100,"VENISON/DEER, ROASTED (INCLUDE ROAST ANTELOPE)","Venison/deer, roasted" +23321200,"VENISON/DEER STEAK, COOKED, NS AS TO METHOD","Venison/deer steak, cooked, NS as to cooking method" +23321250,"VENISON/DEER STEAK, BREADED OR FLOURED, COOKED","Venison/deer steak, breaded or floured, cooked, NS as to cooking method" +23321900,"VENISON/DEER JERKY","Venison/deer jerky" +23322100,"DEER BOLOGNA","Deer bologna" +23322300,"DEER CHOP, COOKED (INCLUDE VENISON CHOP)","Deer chop, cooked" +23322350,"VENISON/DEER RIBS, COOKED","Venison/deer ribs, cooked" +23322400,"VENISON/DEER, STEWED","Venison/deer, stewed" +23323100,"MOOSE, COOKED","Moose, cooked" +23323500,"BEAR, COOKED","Bear, cooked" +23324100,"CARIBOU, COOKED","Caribou, cooked" +23326100,"BISON, COOKED","Bison, cooked" +23331100,"GROUND HOG, COOKED","Ground hog, cooked" +23332100,"OPOSSUM, COOKED","Opossum, cooked" +23333100,"SQUIRREL, COOKED","Squirrel, cooked" +23334100,"BEAVER, COOKED","Beaver, cooked" +23335100,"RACCOON, COOKED","Raccoon, cooked" +23340100,"ARMADILLO, COOKED","Armadillo, cooked" +23345100,"WILD PIG, SMOKED","Wild pig, smoked" +23350100,"OSTRICH, COOKED","Ostrich, cooked" +23410010,"LAMB, BABY, STRAINED","Lamb, baby food, strained" +23420010,"VEAL, BABY, STRAINED","Veal, baby food, strained" +24100000,"CHICKEN, NS AS TO PART, NS METHOD, SKIN","Chicken, NS as to part and cooking method, NS as to skin eaten" +24100010,"CHICKEN, NS AS TO PART, NS METHOD, W/ SKIN","Chicken, NS as to part and cooking method, skin eaten" +24100020,"CHICKEN, NS AS TO PART, NS METHOD, W/O SKIN","Chicken, NS as to part and cooking method, skin not eaten" +24102000,"CHICKEN, NS PART, ROASTED/BROILED/BAKED, NS SKIN","Chicken, NS as to part, roasted, broiled, or baked, NS as to skin eaten" +24102010,"CHICKEN, NS PART, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, NS as to part, roasted, broiled, or baked, skin eaten" +24102020,"CHICKEN, NS PART, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, NS as to part, roasted, broiled, or baked, skin not eaten" +24103000,"CHICKEN, STEWED, NS PART, NS SKIN","Chicken, NS as to part, stewed, NS as to skin eaten" +24103010,"CHICKEN, STEWED, NS PART, W/ SKIN","Chicken, NS as to part, stewed, skin eaten" +24103020,"CHICKEN, STEWED, NS PART, W/O SKIN","Chicken, NS as to part, stewed, skin not eaten" +24104000,"CHICKEN, FRIED, NO COATING, NS PART, NS SKIN","Chicken, NS as to part, fried, no coating, NS as to skin eaten" +24104010,"CHICKEN, FRIED, NO COATING, NS PART, W/ SKIN","Chicken, NS as to part, fried, no coating, skin eaten" +24104020,"CHICKEN, FRIED, NO COATING, NS PART, W/O SKIN","Chicken, NS as to part, fried, no coating, skin not eaten" +24107000,"CHICKEN, COATED, BKD/FRD, PPD W/ SKIN, NS SKIN EATEN","Chicken, NS as to part, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24107010,"CHICKEN, COATED, BKD/FRD, PPD W/ SKIN, SKIN EATEN","Chicken, NS as to part, coated, baked or fried, prepared with skin, skin/coating eaten" +24107020,"CHICKEN, COATED, BKD/FRD, PPD W/ SKIN, SKIN NOT EATEN","Chicken, NS as to part, coated, baked or fried, prepared with skin, skin/coating not eaten" +24107040,"CHICKEN, NS PART,COATED,BKD/FRD,PREP SKINLESS,NS COAT EATEN","Chicken, NS as to part, coated, baked or fried, prepared skinless, NS as to coating eaten" +24107050,"CHICKEN, NS PART,COATED,BKD/FRD,PREP SKINLESS,COATING EATEN","Chicken, NS as to part, coated, baked or fried, prepared skinless, coating eaten" +24107060,"CHICKEN, NS PART,COATED,BKD/FRD,PREP SKINLESS,COAT NOT EATEN","Chicken, NS as to part, coated, baked or fried, prepared skinless, coating not eaten" +24120100,"CHICKEN, BREAST, NFS","Chicken, breast, NS as to cooking method, NS as to skin eaten" +24120110,"CHICKEN, BREAST, NS AS TO COOKING METHOD, W/SKIN","Chicken, breast, NS as to cooking method, skin eaten" +24120120,"CHICKEN, BREAST, NS AS TO COOKING METHOD, W/O SKIN","Chicken, breast, NS as to cooking method, skin not eaten" +24122100,"CHICKEN, BREAST, ROASTED/BROILED/BAKED, NS SKIN","Chicken, breast, roasted, broiled, or baked, NS as to skin eaten" +24122110,"CHICKEN, BREAST, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, breast, roasted, broiled, or baked, skin eaten" +24122120,"CHICKEN, BREAST, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, breast, roasted, broiled, or baked, skin not eaten" +24123100,"CHICKEN, BREAST, STEWED, NS AS TO SKIN","Chicken, breast, stewed, NS as to skin eaten" +24123110,"CHICKEN, BREAST, STEWED, W/ SKIN","Chicken, breast, stewed, skin eaten" +24123120,"CHICKEN, BREAST, STEWED, W/O SKIN","Chicken, breast, stewed, skin not eaten" +24124100,"CHICKEN, BREAST, FRIED, NO COATING, NS AS TO SKIN","Chicken, breast, fried, no coating, NS as to skin eaten" +24124110,"CHICKEN, BREAST, FRIED, NO COATING, W/ SKIN","Chicken, breast, fried, no coating, skin eaten" +24124120,"CHICKEN, BREAST, FRIED, NO COATING, W/O SKIN","Chicken, breast, fried, no coating, skin not eaten" +24127100,"CHICKEN, BREAST,COATED,BKD/FRD,PPD W/ SKIN,NS SKIN EATEN","Chicken, breast, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24127110,"CHICKEN, BREAST,COATED,BKD/FRD,PPD W/ SKIN, SKIN EATEN","Chicken, breast, coated, baked or fried, prepared with skin, skin/coating eaten" +24127120,"CHICKEN, BREAST,COATED,BKD/FRD,PPD W/ SKIN, SKIN NOT EATEN","Chicken, breast, coated, baked or fried, prepared with skin, skin/coating not eaten" +24127125,"CHIC, BREAST, FF, COATED/BAKED/FRIED, PREP SKIN,NS SKIN EATE","Chicken, breast, from fast food, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24127130,"CHIC, BREAST, FF, COATED, BAKED/FRIED, PREP SKIN,SKIN EATEN","Chicken, breast, from fast food, coated, baked or fried, prepared with skin, skin/coating eaten" +24127135,"CHICK,BREAST,FF,COATED, BAKED/ FRIED,PREP SKIN,NO SKIN EATEN","Chicken, breast, from fast food, coated, baked or fried, prepared with skin, skin/coating not eaten" +24127140,"CHICKEN,BREAST,COATED,BKD/FRD,PPD SKINLESS,NS COAT EATEN","Chicken, breast, coated, baked or fried, prepared skinless, NS as to coating eaten" +24127150,"CHICKEN,BREAST,COATED,BKD/FRD,PPD SKINLESS,COAT EATEN","Chicken, breast, coated, baked or fried, prepared skinless, coating eaten" +24127160,"CHICKEN,BREAST,COATED,BKD/FRD,PPD SKINLESS,COAT NOT EATEN","Chicken, breast, coated, baked or fried, prepared skinless, coating not eaten" +24130200,"CHICKEN, LEG, NFS","Chicken, leg (drumstick and thigh), NS as to cooking method, NS as to skin eaten" +24130210,"CHICKEN, LEG, NS AS TO COOKING METHOD, W/ SKIN","Chicken, leg (drumstick and thigh), NS as to cooking method, skin eaten" +24130220,"CHICKEN, LEG, NS AS TO COOKING METHOD, W/O SKIN","Chicken, leg (drumstick and thigh), NS as to cooking method, skin not eaten" +24132200,"CHICKEN, LEG, ROASTED/BROILED/BAKED, NS SKIN","Chicken, leg (drumstick and thigh), roasted, broiled, or baked, NS as to skin eaten" +24132210,"CHICKEN, LEG, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, leg (drumstick and thigh), roasted, broiled, or baked, skin eaten" +24132220,"CHICKEN, LEG, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, leg (drumstick and thigh), roasted, broiled, or baked, skin not eaten" +24133200,"CHICKEN, LEG, STEWED, NS AS TO SKIN","Chicken, leg (drumstick and thigh), stewed, NS as to skin eaten" +24133210,"CHICKEN, LEG, STEWED, W/ SKIN","Chicken, leg (drumstick and thigh), stewed, skin eaten" +24133220,"CHICKEN, LEG, STEWED, W/O SKIN","Chicken, leg (drumstick and thigh), stewed, skin not eaten" +24134200,"CHICKEN, LEG, FRIED, NO COATING, NS AS TO SKIN","Chicken, leg (drumstick and thigh), fried, no coating, NS as to skin eaten" +24134210,"CHICKEN, LEG, FRIED, NO COATING, W/ SKIN","Chicken, leg (drumstick and thigh), fried, no coating, skin eaten" +24134220,"CHICKEN, LEG, FRIED, NO COATING, W/O SKIN","Chicken, leg (drumstick and thigh), fried, no coating, skin not eaten" +24137200,"CHICKEN,LEG,COATED,BKD/FRD,PPD W/SKIN,NS SKIN EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24137210,"CHICKEN, LEG,COATED,BKD/FRD,PPD W/ SKIN, SKIN EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared with skin, skin/coating eaten" +24137220,"CHICKEN, LEG,COATED,BKD/FRD,PPD W/ SKIN, SKIN NOT EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared with skin, skin/coating not eaten" +24137240,"CHICKEN,LEG,COATED,BKD/FRD,PPD SKINLESS,NS COAT EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared skinless, NS as to coating eaten" +24137250,"CHICKEN,LEG,COATED,BKD/FRD,PPD SKINLESS,COAT EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared skinless, coating eaten" +24137260,"CHICKEN,LEG,COATED,BKD/FRD,PPD SKINLESS,COAT NOT EATEN","Chicken, leg (drumstick and thigh), coated, baked or fried, prepared skinless, coating not eaten" +24140200,"CHICKEN, DRUMSTICK, NFS","Chicken, drumstick, NS as to cooking method, NS as to skin eaten" +24140210,"CHICKEN, DRUMSTICK, NS AS TO COOKING METHOD,W/ SKIN","Chicken, drumstick, NS as to cooking method, skin eaten" +24140220,"CHICKEN, DRUMSTICK, NS COOKING METHOD, W/O SKIN","Chicken, drumstick, NS as to cooking method, skin not eaten" +24142200,"CHICKEN, DRUMSTICK, ROASTED/BROILED/BAKED, NS SKIN","Chicken, drumstick, roasted, broiled, or baked, NS as to skin eaten" +24142210,"CHICKEN, DRUMSTICK, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, drumstick, roasted, broiled, or baked, skin eaten" +24142220,"CHICKEN, DRUMSTICK, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, drumstick, roasted, broiled, or baked, skin not eaten" +24143200,"CHICKEN, DRUMSTICK, STEWED, NS AS TO SKIN","Chicken, drumstick, stewed, NS as to skin eaten" +24143210,"CHICKEN, DRUMSTICK, STEWED, W/ SKIN","Chicken, drumstick, stewed, skin eaten" +24143220,"CHICKEN, DRUMSTICK, STEWED, W/O SKIN","Chicken, drumstick, stewed, skin not eaten" +24144200,"CHICKEN, DRUMSTICK, FRIED, NO COATING,NS AS TO SKIN","Chicken, drumstick, fried, no coating, NS as to skin eaten" +24144210,"CHICKEN, DRUMSTICK, FRIED, NO COATING, W/ SKIN","Chicken, drumstick, fried, no coating, skin eaten" +24144220,"CHICKEN, DRUMSTICK, FRIED, NO COATING, W/O SKIN","Chicken, drumstick, fried, no coating, skin not eaten" +24147200,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD W/SKIN,NS SKIN EAT","Chicken, drumstick, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24147210,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD W/SKIN, SKIN EAT","Chicken, drumstick, coated, baked or fried, prepared with skin, skin/coating eaten" +24147220,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD W/SKIN, SKIN NOT EAT","Chicken, drumstick, coated, baked or fried, prepared with skin, skin/coating not eaten" +24147225,"CHICK,DRUMSTICK,FF,COATED,BAKED/FRIED,PREP SKIN,NS SKIN EAT","Chicken, drumstick, from fast food, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24147230,"CHIC, DRUMSTICK,FF,COATED, BAKED/FRIED,PREP SKIN,SKIN EATEN","Chicken, drumstick, from fast food, coated, baked or fried, prepared with skin, skin/coating eaten" +24147235,"CHICK,DRUMSTICK,FF,COATED,BAKED/FRIED,PREP SKIN,SKIN NOT EAT","Chicken, drumstick, from fast food, coated, baked or fried, prepared with skin, skin/coating not eaten" +24147240,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD SKINLESS,NS COAT EAT","Chicken, drumstick, coated, baked or fried, prepared skinless, NS as to coating eaten" +24147250,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD SKINLESS, COAT EAT","Chicken, drumstick, coated, baked or fried, prepared skinless, coating eaten" +24147260,"CHICKEN,DRUMSTICK,COATED,BKD/FRD,PPD SKINLESS, COAT NOT EAT","Chicken, drumstick, coated, baked or fried, prepared skinless, coating not eaten" +24150200,"CHICKEN, THIGH, NFS","Chicken, thigh, NS as to cooking method, NS as to skin eaten" +24150210,"CHICKEN, THIGH, NS AS TO COOKING METHOD, W/ SKIN","Chicken, thigh, NS as to cooking method, skin eaten" +24150220,"CHICKEN, THIGH, NS AS TO COOKING METHOD, W/O SKIN","Chicken, thigh, NS as to cooking method, skin not eaten" +24152200,"CHICKEN, THIGH, ROASTED/BROILED/BAKED, NS SKIN","Chicken, thigh, roasted, broiled, or baked, NS as to skin eaten" +24152210,"CHICKEN, THIGH, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, thigh, roasted, broiled, or baked, skin eaten" +24152220,"CHICKEN, THIGH, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, thigh, roasted, broiled, or baked, skin not eaten" +24153200,"CHICKEN, THIGH, STEWED, NS AS TO SKIN","Chicken, thigh, stewed, NS as to skin eaten" +24153210,"CHICKEN, THIGH, STEWED, W/ SKIN","Chicken, thigh, stewed, skin eaten" +24153220,"CHICKEN, THIGH, STEWED, W/O SKIN","Chicken, thigh, stewed, skin not eaten" +24154200,"CHICKEN, THIGH, FRIED, NO COATING, NS AS TO SKIN","Chicken, thigh, fried, no coating, NS as to skin eaten" +24154210,"CHICKEN, THIGH, FRIED, NO COATING, W/ SKIN","Chicken, thigh, fried, no coating, skin eaten" +24154220,"CHICKEN, THIGH, FRIED, NO COATING, W/O SKIN","Chicken, thigh, fried, no coating, skin not eaten" +24157200,"CHICKEN,THIGH,COATED,BKD/FRD,PPD W/SKIN,NS SKIN EATEN","Chicken, thigh, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24157210,"CHICKEN,THIGH,COATED,BKD/FRD,PPD W/SKIN, SKIN EATEN","Chicken, thigh, coated, baked or fried, prepared with skin, skin/coating eaten" +24157220,"CHICKEN,THIGH,COATED,BKD/FRD,PPD W/SKIN, SKIN NOT EATEN","Chicken, thigh, coated, baked or fried, prepared with skin, skin/coating not eaten" +24157225,"CHIC, THIGH, FF, COATED, BAKED/ FRIED, PREP SKIN,NS SKIN EAT","Chicken, thigh, from fast food, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24157230,"CHICK, THIGH, FF, COATED, BAKED OR FRIED, PREP SKIN,SKIN EAT","Chicken, thigh, from fast food, coated, baked or fried, prepared with skin, skin/coating eaten" +24157235,"CHICK,THIGH,FF,COATED,BAKED/BROILED,PREP SKIN,SKIN NOT EATEN","Chicken, thigh, from fast food, coated, baked or broiled, prepared with skin, skin/coating not eaten" +24157240,"CHICKEN,THIGH,COATED,BKD/FRD,PPD SKINLESS,NS COAT EATEN","Chicken, thigh, coated, baked or fried, prepared skinless, NS as to coating eaten" +24157250,"CHICKEN,THIGH,COATED,BKD/FRD,PPD SKINLESS, COAT EATEN","Chicken, thigh, coated, baked or fried, prepared skinless, coating eaten" +24157260,"CHICKEN,THIGH,COATED,BKD/FRD,PPD SKINLESS, COAT NOT EATEN","Chicken, thigh, coated, baked or fried, prepared skinless, coating not eaten" +24160100,"CHICKEN, WING, NFS","Chicken, wing, NS as to cooking method, NS as to skin eaten" +24160110,"CHICKEN, WING, NS AS TO COOKING METHOD, W/ SKIN","Chicken, wing, NS as to cooking method, skin eaten" +24160120,"CHICKEN, WING, NS AS TO COOKING METHOD, W/O SKIN","Chicken, wing, NS as to cooking method, skin not eaten" +24162100,"CHICKEN, WING, ROASTED/BROILED/BAKED, NS SKIN","Chicken, wing, roasted, broiled, or baked, NS as to skin eaten" +24162110,"CHICKEN, WING, ROASTED/BROILED/BAKED, W/ SKIN","Chicken, wing, roasted, broiled, or baked, skin eaten" +24162120,"CHICKEN, WING, ROASTED/BROILED/BAKED, W/O SKIN","Chicken, wing, roasted, broiled, or baked, skin not eaten" +24163100,"CHICKEN, WING, STEWED, NS AS TO SKIN","Chicken, wing, stewed, NS as to skin eaten" +24163110,"CHICKEN, WING, STEWED, W/ SKIN","Chicken, wing, stewed, skin eaten" +24163120,"CHICKEN, WING, STEWED, W/O SKIN","Chicken, wing, stewed, skin not eaten" +24164100,"CHICKEN, WING, FRIED, NO COATING, NS AS TO SKIN","Chicken, wing, fried, no coating, NS as to skin eaten" +24164110,"CHICKEN, WING, FRIED, NO COATING, W/ SKIN","Chicken, wing, fried, no coating, skin eaten" +24164120,"CHICKEN, WING, FRIED, NO COATING, W/O SKIN","Chicken, wing, fried, no coating, skin not eaten" +24167100,"CHICKEN,WING,COATED,BKD/FRD,PPD W/SKIN,NS SKIN EATEN","Chicken, wing, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24167110,"CHICKEN,WING,COATED,BKD/FRD,PPD W/SKIN, SKIN EATEN","Chicken, wing, coated, baked or fried, prepared with skin, skin/coating eaten" +24167120,"CHICKEN,WING,COATED,BKD/FRD,PPD W/SKIN, SKIN NOT EATEN","Chicken, wing, coated, baked or fried, prepared with skin, skin/coating not eaten" +24167125,"CHIC, WING, FF, COATED, BAKED/FRIED, PREP SKIN,NS SKIN EATEN","Chicken, wing, from fast food, coated, baked or fried, prepared with skin, NS as to skin/coating eaten" +24167130,"CHIC, WING, FF, COATED, BAKED/FRIED, PREP SKIN, SKIN EATEN","Chicken, wing, from fast food, coated, baked or fried, prepared with skin, skin/coating eaten" +24167135,"CHIC, WING, FF, COATED,BAKED/FRIED, PREP SKIN, SKIN NO EATEN","Chicken, wing, from fast food, coated, baked or fried, prepared with skin, skin/coating not eaten" +24170200,"CHICKEN, BACK","Chicken, back" +24180200,"CHICKEN, NECK OR RIBS, NFS","Chicken, neck or ribs" +24198340,"CHICKEN TAIL","Chicken, tail" +24198440,"CHICKEN SKIN","Chicken skin" +24198500,"CHICKEN FEET","Chicken feet" +24198570,"CHICKEN, CANNED, MEAT ONLY, LIGHT & DARK MEAT","Chicken, canned, meat only" +24198670,"CHICKEN ROLL, ROASTED, LIGHT & DARK MEAT","Chicken, chicken roll, roasted" +24198690,"CHICKEN PATTY, FILLET, OR TENDERS, BREADED, COOKED, FAST FD","Chicken patty, fillet, or tenders, breaded, cooked, from fast food / restaurant" +24198700,"CHICKEN PATTY/FILLET/TENDERS, BREADED, COOKED","Chicken patty, fillet, or tenders, breaded, cooked" +24198710,"CHICKEN PATTY W/ CHEESE, BREADED, COOKED","Chicken patty with cheese, breaded, cooked" +24198720,"CHICKEN, GROUND","Chicken, ground" +24198730,"CHICKEN NUGGETS, FROM FAST FOOD / RESTAURANT","Chicken nuggets, from fast food / restaurant" +24198740,"CHICKEN NUGGETS","Chicken nuggets" +24198840,"FRIED CHICKEN CHUNKS, P. R. (CHICHARRONES DE POLLO)","Fried chicken chunks, Puerto Rican style (Chicharrones de pollo)" +24201000,"TURKEY, NFS","Turkey, NFS" +24201010,"TURKEY, LIGHT MEAT, COOKED, NS AS TO SKIN","Turkey, light meat, cooked, NS as to skin eaten" +24201020,"TURKEY, LIGHT MEAT, COOKED, W/O SKIN","Turkey, light meat, cooked, skin not eaten" +24201030,"TURKEY, LIGHT MEAT, COOKED, W/ SKIN","Turkey, light meat, cooked, skin eaten" +24201050,"TURKEY, LIGHT, BREADED, BAKED/FRIED, NS AS TO SKIN","Turkey, light meat, breaded, baked or fried, NS as to skin eaten" +24201060,"TURKEY, LIGHT MEAT, BREADED, BAKED/FRIED, W/O SKIN","Turkey, light meat, breaded, baked or fried, skin not eaten" +24201070,"TURKEY, LIGHT MEAT, BREADED, BAKED/FRIED, W/ SKIN","Turkey, light meat, breaded, baked or fried, skin eaten" +24201110,"TURKEY, LIGHT MEAT, ROASTED, NS AS TO SKIN","Turkey, light meat, roasted, NS as to skin eaten" +24201120,"TURKEY, LIGHT MEAT, ROASTED, W/O SKIN","Turkey, light meat, roasted, skin not eaten" +24201130,"TURKEY, LIGHT MEAT, ROASTED, W/ SKIN","Turkey, light meat, roasted, skin eaten" +24201210,"TURKEY, DARK MEAT, ROASTED, NS AS TO SKIN","Turkey, dark meat, roasted, NS as to skin eaten" +24201220,"TURKEY, DARK MEAT, ROASTED, W/O SKIN","Turkey, dark meat, roasted, skin not eaten" +24201230,"TURKEY, DARK MEAT, ROASTED, W/ SKIN","Turkey, dark meat, roasted, skin eaten" +24201310,"TURKEY, LIGHT & DARK MEAT, ROASTED, NS AS TO SKIN","Turkey, light and dark meat, roasted, NS as to skin eaten" +24201320,"TURKEY, LIGHT & DARK MEAT, ROASTED, W/O SKIN","Turkey, light and dark meat, roasted, skin not eaten" +24201330,"TURKEY, LIGHT & DARK MEAT, ROASTED, W/ SKIN","Turkey, light and dark meat, roasted, skin eaten" +24201350,"TURKEY, LT/DK MEAT, BATTERED, FRIED, NS AS TO SKIN","Turkey, light or dark meat, battered, fried, NS as to skin eaten" +24201360,"TURKEY, LIGHT/DARK MEAT, BATTERED, FRIED, W/O SKIN","Turkey, light or dark meat, battered, fried, skin not eaten" +24201370,"TURKEY, LIGHT/DARK MEAT, BATTERED, FRIED, W/ SKIN","Turkey, light or dark meat, battered, fried, skin eaten" +24201400,"TURKEY, LIGHT/DARK MEAT, STEWED, NS AS TO SKIN","Turkey, light or dark meat, stewed, NS as to skin eaten" +24201410,"TURKEY, LIGHT/DARK MEAT, STEWED, W/O SKIN","Turkey, light or dark meat, stewed, skin not eaten" +24201420,"TURKEY, LIGHT/DARK MEAT, STEWED, W/ SKIN","Turkey light or dark meat, stewed, skin eaten" +24201500,"TURKEY, SMOKED, NS AS TO SKIN","Turkey, light or dark meat, smoked, cooked, NS as to skin eaten" +24201510,"TURKEY, SMOKED, SKIN EATEN","Turkey, light or dark meat, smoked, cooked, skin eaten" +24201520,"TURKEY, SMOKED, SKIN NOT EATEN","Turkey, light or dark meat, smoked, cooked, skin not eaten" +24202000,"TURKEY, DRUMSTICK, COOKED, NS AS TO SKIN","Turkey, drumstick, cooked, NS as to skin eaten" +24202010,"TURKEY, DRUMSTICK, COOKED, W/O SKIN","Turkey, drumstick, cooked, skin not eaten" +24202020,"TURKEY, DRUMSTICK, COOKED, W/ SKIN","Turkey, drumstick, cooked, skin eaten" +24202050,"TURKEY, DRUMSTICK, ROASTED, NS AS TO SKIN","Turkey, drumstick, roasted, NS as to skin eaten" +24202060,"TURKEY, DRUMSTICK, ROASTED, W/O SKIN","Turkey, drumstick, roasted, skin not eaten" +24202070,"TURKEY, DRUMSTICK, ROASTED, W/ SKIN","Turkey, drumstick, roasted, skin eaten" +24202120,"TURKEY, DRUMSTICK, SMOKED, SKIN EATEN","Turkey, drumstick, smoked, cooked, skin eaten" +24202450,"TURKEY, THIGH, COOKED, NS AS TO SKIN","Turkey, thigh, cooked, NS as to skin eaten" +24202460,"TURKEY, THIGH, COOKED, W/ SKIN","Turkey, thigh, cooked, skin eaten" +24202500,"TURKEY, THIGH, COOKED, W/O SKIN","Turkey, thigh, cooked, skin not eaten" +24202600,"TURKEY, NECK, COOKED","Turkey, neck, cooked" +24203000,"TURKEY, WING, COOKED, NS AS TO SKIN","Turkey, wing, cooked, NS as to skin eaten" +24203010,"TURKEY, WING, COOKED, W/O SKIN","Turkey, wing, cooked, skin not eaten" +24203020,"TURKEY, WING, COOKED, W/ SKIN","Turkey, wing, cooked, skin eaten" +24203120,"TURKEY, WING, SMOKED, COOKED, SKIN EATEN","Turkey, wing, smoked, cooked, skin eaten" +24204000,"TURKEY, ROLLED ROAST, LIGHT OR DARK MEAT, COOKED","Turkey, rolled roast, light or dark meat, cooked" +24205000,"TURKEY, TAIL, COOKED","Turkey, tail, cooked" +24205100,"TURKEY, BACK, COOKED","Turkey, back, cooked" +24206000,"TURKEY, CANNED","Turkey, canned" +24207000,"TURKEY, GROUND","Turkey, ground" +24208000,"TURKEY NUGGETS","Turkey, nuggets" +24208500,"TURKEY BACON, COOKED","Turkey bacon, cooked" +24300100,"DUCK, COOKED, NS AS TO SKIN","Duck, cooked, NS as to skin eaten" +24300110,"DUCK, COOKED, W/ SKIN","Duck, cooked, skin eaten" +24300120,"DUCK, COOKED, W/O SKIN","Duck, cooked, skin not eaten" +24301000,"DUCK, ROASTED, NS AS TO SKIN","Duck, roasted, NS as to skin eaten" +24301010,"DUCK, ROASTED, W/ SKIN","Duck, roasted, skin eaten" +24301020,"DUCK, ROASTED, W/O SKIN","Duck, roasted, skin not eaten" +24301210,"DUCK, BATTERED, FRIED","Duck, battered, fried" +24302010,"DUCK, PRESSED, CHINESE","Duck, pressed, Chinese" +24311010,"GOOSE, WILD, ROASTED","Goose, wild, roasted" +24400000,"CORNISH GAME HEN, COOKED, NS AS TO SKIN","Cornish game hen, cooked, NS as to skin eaten" +24400010,"CORNISH GAME HEN, COOKED, W/ SKIN","Cornish game hen, cooked, skin eaten" +24400020,"CORNISH GAME HEN, COOKED, W/O SKIN","Cornish game hen, cooked, skin not eaten" +24401000,"CORNISH GAME HEN, ROASTED, NS AS TO SKIN","Cornish game hen, roasted, NS as to skin eaten" +24401010,"CORNISH GAME HEN, ROASTED, W/ SKIN","Cornish game hen, roasted, skin eaten" +24401020,"CORNISH GAME HEN, ROASTED, W/O SKIN","Cornish game hen, roasted, skin not eaten" +24402100,"DOVE, COOKED, NS AS TO COOKING METHOD","Dove, cooked, NS as to cooking method" +24402110,"DOVE, FRIED","Dove, fried" +24403100,"QUAIL, COOKED","Quail, cooked" +24404100,"PHEASANT, COOKED","Pheasant, cooked" +24701000,"CHICKEN, BABY, NS AS TO STRAINED OR JUNIOR","Chicken, baby food, NS as to strained or junior" +24701010,"CHICKEN, BABY, STRAINED","Chicken, baby food, strained" +24701020,"CHICKEN, BABY, JUNIOR","Chicken, baby food, junior" +24703000,"TURKEY, BABY, NS AS TO STRAINED OR JUNIOR","Turkey, baby food, NS as to strained or junior" +24703010,"TURKEY, BABY, STRAINED","Turkey, baby food, strained" +24703020,"TURKEY, BABY, JUNIOR","Turkey, baby food, junior" +24705010,"CHICKEN STICK, BABY FOOD","Chicken stick, baby food" +24706010,"TURKEY STICK, BABY FOOD","Turkey stick, baby food" +25110120,"BEEF LIVER, BRAISED","Beef liver, braised" +25110140,"BEEF LIVER, FRIED","Beef liver, fried" +25110420,"CHICKEN LIVER, BRAISED","Chicken liver, braised" +25110450,"CHICKEN LIVER, FRIED","Chicken liver, fried" +25112200,"LIVER PASTE OR PATE, CHICKEN (INCLUDE PATE, NFS)","Liver paste or pate, chicken" +25120000,"HEART, COOKED","Heart, cooked" +25130000,"KIDNEY, COOKED","Kidney, cooked" +25140110,"SWEETBREADS, COOKED","Sweetbreads, cooked" +25150000,"BRAINS, COOKED","Brains, cooked" +25160000,"TONGUE, COOKED","Tongue, cooked" +25160110,"TONGUE, SMOKED,CURED OR PICKLED, COOKED","Tongue, smoked, cured, or pickled, cooked" +25160130,"TONGUE POT ROAST, P.R. (LENGUA AL CALDERO)","Tongue pot roast, Puerto Rican style (Lengua al caldero)" +25170110,"TRIPE, COOKED","Tripe, cooked" +25170210,"CHITTERLINGS, COOKED","Chitterlings, cooked" +25170310,"HOG MAWS (STOMACH) COOKED","Hog maws (stomach), cooked" +25170420,"GIZZARD, COOKED","Gizzard, cooked" +25210110,"FRANKFURTER, WIENER OR HOT DOG, NFS","Frankfurter, wiener, or hot dog, NFS" +25210150,"FRANKFURTER OR HOT DOG, CHEESE-FILLED","Frankfurter or hot dog, cheese-filled" +25210210,"FRANKFURTER OR HOT DOG, BEEF","Frankfurter or hot dog, beef" +25210220,"FRANKFURTER OR HOT DOG, BEEF & PORK","Frankfurter or hot dog, beef and pork" +25210240,"FRANFURTER/HOT DOG, BEEF & PORK, LIGHT","Frankfurter or hot dog, beef and pork, reduced fat or light" +25210250,"FRANKFURTER OR HOT DOG, MEAT & POULTRY, FAT FREE","Frankfurter or hot dog, meat and poultry, fat free" +25210280,"FRANKFURTER OR HOT DOG, MEAT & POULTRY","Frankfurter or hot dog, meat and poultry" +25210290,"FRANKFURTER OR HOT DOG, MEAT & POULTRY, LIGHT","Frankfurter or hot dog, meat and poultry, reduced fat or light" +25210310,"FRANKFURTER OR HOT DOG, CHICKEN","Frankfurter or hot dog, chicken" +25210410,"FRANKFURTER OR HOT DOG, TURKEY","Frankfurter or hot dog, turkey" +25210620,"FRANKFURTER OR HOT DOG, BEEF, REDUCED FAT OR LIGHT","Frankfurter or hot dog, beef, reduced fat or light" +25210750,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, NFS","Frankfurter or hot dog, reduced fat or light, NFS" +25220010,"COLD CUT, NFS","Cold cut, NFS" +25220105,"BEEF SAUSAGE","Beef sausage" +25220106,"BEEF SAUSAGE, REDUCED FAT","Beef sausage, reduced fat" +25220150,"BEEF SAUSAGE WITH CHEESE","Beef sausage with cheese" +25220210,"BLOOD SAUSAGE","Blood sausage" +25220350,"BRATWURST","Bratwurst" +25220360,"BRATWURST W/ CHEESE","Bratwurst, with cheese" +25220390,"BOLOGNA, BEEF, LOW FAT","Bologna, beef, lowfat" +25220400,"BOLOGNA, PORK AND BEEF","Bologna, pork and beef" +25220410,"BOLOGNA, NFS","Bologna, NFS" +25220420,"BOLOGNA, LEBANON","Bologna, Lebanon" +25220430,"BOLOGNA, BEEF","Bologna, beef" +25220440,"BOLOGNA, TURKEY","Bologna, turkey" +25220450,"BOLOGNA RING, SMOKED","Bologna ring, smoked" +25220460,"BOLOGNA, PORK","Bologna, pork" +25220470,"BOLOGNA, BEEF, LOWER SODIUM","Bologna, beef, lower sodium" +25220480,"BOLOGNA, CHICKEN, BEEF, & PORK","Bologna, chicken, beef, and pork" +25220490,"BOLOGNA, W/ CHEESE","Bologna, with cheese" +25220500,"BOLOGNA, BEEF & PORK, LOWFAT","Bologna, beef and pork, lowfat" +25220510,"CAPICOLA","Capicola" +25220650,"TURKEY OR CHICKEN AND BEEF SAUSAGE","Turkey or chicken and beef sausage" +25220710,"CHORIZO","Chorizo" +25220910,"HEAD CHEESE","Head cheese" +25221110,"KNOCKWURST","Knockwurst" +25221210,"MORTADELLA","Mortadella" +25221250,"PEPPERONI","Pepperoni" +25221310,"POLISH SAUSAGE","Polish sausage" +25221350,"ITALIAN SAUSAGE","Italian sausage" +25221400,"SAUSAGE (NOT COLD CUT), NFS","Sausage (not cold cut), NFS" +25221405,"PORK SAUSAGE","Pork sausage" +25221406,"PORK SAUSAGE, REDUCED FAT","Pork sausage, reduced fat" +25221450,"PORK SAUSAGE RICE LINKS","Pork sausage rice links" +25221460,"PORK & BEEF SAUSAGE","Pork and beef sausage" +25221500,"SALAMI, NFS","Salami, NFS" +25221510,"SALAMI, SOFT, COOKED","Salami, soft, cooked" +25221520,"SALAMI, DRY OR HARD","Salami, dry or hard" +25221530,"SALAMI, BEEF","Salami, beef" +25221610,"SCRAPPLE, COOKED","Scrapple, cooked" +25221710,"SOUSE","Souse" +25221810,"THURINGER (INCLUDE SUMMER SAUSAGE)","Thuringer" +25221830,"TURKEY OR CHICKEN SAUSAGE","Turkey or chicken sausage" +25221860,"TURKEY OR CHICKEN SAUSAGE, REDUCED FAT","Turkey or chicken sausage, reduced fat" +25221870,"TURKEY AND PORK SAUSAGE","Turkey or chicken and pork sausage" +25221880,"TURKEY OR CHICKEN, PORK, AND BEEF SAUSAGE, REDUCED FAT","Turkey or chicken, pork, and beef sausage, reduced fat" +25221910,"VIENNA SAUSAGE, CANNED","Vienna sausage, canned" +25221950,"PICKLED SAUSAGE","Pickled sausage" +25230110,"LUNCHEON MEAT, NFS","Luncheon meat, NFS" +25230210,"HAM, SLICED, PREPACKAGED OR DELI, LUNCHEON MEAT","Ham, sliced, prepackaged or deli, luncheon meat" +25230220,"HAM, SLICED, LOW SALT, PREPACKAGED/DELI, LUNCH MEAT","Ham, sliced, low salt, prepackaged or deli, luncheon meat" +25230230,"HAM, SLICED, EXTRA LEAN, PREPACKAGED/DELI","Ham, sliced, extra lean, prepackaged or deli, luncheon meat" +25230235,"HAM, SLICED, EXTRA LEAN, LOWER SODIUM, PREPACKAGED OR DELI","Ham, sliced, extra lean, lower sodium, prepackaged or deli, luncheon meat" +25230310,"CHICKEN/TURKEY LOAF, PREPACK/DELI, LUNCHEON MEAT","Chicken or turkey loaf, prepackaged or deli, luncheon meat" +25230410,"HAM LOAF, LUNCHEON MEAT","Ham loaf, luncheon meat" +25230430,"HAM & CHEESE LOAF","Ham and cheese loaf" +25230450,"HONEY LOAF","Honey loaf" +25230510,"HAM,LUNCH MEAT,CHOP,MINCED,PRESSD,MINCED,NOT CANNED","Ham, luncheon meat, chopped, minced, pressed, spiced, not canned" +25230520,"HAM, LUNCHEON MEAT, CHOPPED, SPICED,LOWFAT, NOT CAN","Ham, luncheon meat, chopped, minced, pressed, spiced, lowfat, not canned" +25230530,"HAM/PORK , LUNCHEON MEAT, CHOPPED, CAN (INCL SPAM)","Ham and pork, luncheon meat, chopped, minced, pressed, spiced, canned" +25230540,"HAM, PORK & CHICKEN, LUNCHEON MEAT, CHOPPED, CANNED","Ham, pork and chicken, luncheon meat, chopped, minced, pressed, spiced, canned" +25230550,"HAM, PORK & CHICKEN, LUNCHEON MEAT, CHOPPED, CAN, RED SODIUM","Ham, pork, and chicken, luncheon meat, chopped, minced, pressed, spiced, canned, reduced sodium" +25230560,"LIVERWURST","Liverwurst" +25230610,"LUNCHEON LOAF (OLIVE, PICKLE OR PIMIENTO)","Luncheon loaf (olive, pickle, or pimiento)" +25230710,"SANDWICH LOAF, LUNCHEON MEAT","Sandwich loaf, luncheon meat" +25230790,"TURKEY HAM, SLICED, XTRA LEAN, PKG'D, DELI","Turkey ham, sliced, extra lean, prepackaged or deli, luncheon meat" +25230800,"TURKEY HAM","Turkey ham" +25230810,"VEAL LOAF","Veal loaf" +25230820,"TURKEY PASTRAMI","Turkey pastrami" +25230840,"TURKEY SALAMI","Turkey salami" +25230900,"TURKEY OR CHICKEN BREAST, PKG'D/DELI, LUNCHEON MEAT","Turkey or chicken breast, prepackaged or deli, luncheon meat" +25230905,"TURKEY/CHICKEN BREAST, LOW SALT, PREPACK/DELI, LUNCHEON MEAT","Turkey or chicken breast, low salt, prepackaged or deli, luncheon meat" +25231110,"BEEF, SLICED, PREPACKAGED/DELI, LUNCHEON MEAT","Beef, sliced, prepackaged or deli, luncheon meat" +25231150,"CORNED BEEF, PRESSED","Corned beef, pressed" +25240000,"MEAT SPREAD OR POTTED MEAT, NFS","Meat spread or potted meat, NFS" +25240110,"CHICKEN SALAD SPREAD","Chicken salad spread" +25240210,"HAM, DEVILED OR POTTED","Ham, deviled or potted" +25240220,"HAM SALAD SPREAD","Ham salad spread" +25240310,"ROAST BEEF SPREAD","Roast beef spread" +25240320,"CORNED BEEF SPREAD","Corned beef spread" +26100100,"FISH, NS AS TO TYPE, RAW","Fish, NS as to type, raw" +26100110,"FISH, COOKED, NS AS TO TYPE & COOKING METHOD","Fish, NS as to type, cooked, NS as to cooking method" +26100120,"FISH, NS AS TO TYPE, BAKED OR BROILED, MADE WITH OIL","Fish, NS as to type, baked or broiled, made with oil" +26100121,"FISH, NS AS TO TYPE, BAKED OR BROILED, MADE WITH BUTTER","Fish, NS as to type, baked or broiled, made with butter" +26100122,"FISH, NS AS TO TYPE, BAKED OR BROILED, MADE WITH MARGARINE","Fish, NS as to type, baked or broiled, made with margarine" +26100123,"FISH, NS AS TO TYPE, BAKED OR BROILED, MADE WITHOUT FAT","Fish, NS as to type, baked or broiled, made without fat" +26100124,"FISH, NS AS TO TYPE, BAKED OR BROILED, MADE W/COOKING SPRAY","Fish, NS as to type, baked or broiled, made with cooking spray" +26100130,"FISH, NS AS TO TYPE, COATED, BAKED, MADE WITH OIL","Fish, NS as to type, coated, baked or broiled, made with oil" +26100131,"FISH, NS AS TO TYPE, COATED, BAKED OR BROILED,W/ BUTTER","Fish, NS as to type, coated, baked or broiled, made with butter" +26100132,"FISH, NS AS TO TYPE, COATED, BAKED OR BROILED, W/MARGARINE","Fish, NS as to type, coated, baked or broiled, made with margarine" +26100133,"FISH, NS AS TO TYPE, COATED, BAKED OR BROILED, W/OUT FAT","Fish, NS as to type, coated, baked or broiled, made without fat" +26100134,"FISH, NS AS TO TYPE, COATED, BAKED/ BROILED, W/COOKING SPRAY","Fish, NS as to type, coated, baked or broiled, made with cooking spray" +26100140,"FISH, NS AS TO TYPE, COATED, FRIED, MADE WITH OIL","Fish, NS as to type, coated, fried, made with oil" +26100141,"FISH, NS AS TO TYPE, COATED, FRIED, MADE WITH BUTTER","Fish, NS as to type, coated, fried, made with butter" +26100142,"FISH, NS AS TO TYPE, COATED, FRIED, MADE WITH MARGARINE","Fish, NS as to type, coated, fried, made with margarine" +26100143,"FISH, NS AS TO TYPE, COATED, FRIED, MADE WITHOUT FAT","Fish, NS as to type, coated, fried, made without fat" +26100144,"FISH, NS AS TO TYPE, COATED, MADE WITH COOKING SPRAY","Fish, NS as to type, coated, fried, made with cooking spray" +26100160,"FISH, NS AS TO TYPE, STEAMED","Fish, NS as to type, steamed" +26100170,"FISH, NS AS TO TYPE, DRIED","Fish, NS as to type, dried" +26100180,"FISH, NS AS TO TYPE, CANNED","Fish, NS as to type, canned" +26100190,"FISH, NS AS TO TYPE, SMOKED","Fish, NS as to type, smoked" +26100200,"FISH, NS AS TO TYPE, FROM FAST FOOD","Fish, NS as to type, from fast food" +26100260,"FISH STICK, PATTY OR NUGGET FROM FAST FOOD","Fish stick, patty or nugget from fast food" +26100270,"FISH STICK, PATTY OR NUGGET FROM RESTAURANT, HOME, OR OTHER","Fish stick, patty or nugget from restaurant, home, or other place" +26101110,"ANCHOVY, COOKED, NS AS TO COOKING METHOD","Anchovy, cooked, NS as to cooking method" +26101180,"ANCHOVY, CANNED","Anchovy, canned" +26103110,"BARRACUDA, COOKED, NS AS TO COOKING METHOD","Barracuda, cooked, NS as to cooking method" +26103120,"BARRACUDA, BAKED OR BROILED, FAT ADDED IN COOKING","Barracuda, baked or broiled, fat added in cooking" +26103121,"BARRACUDA, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Barracuda, baked or broiled, fat not added in cooking" +26103130,"BARRACUDA, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Barracuda, coated, baked or broiled, fat added in cooking" +26103131,"BARRACUDA, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKIN","Barracuda, coated, baked or broiled, fat not added in cooking" +26103140,"BARRACUDA, COATED, FRIED","Barracuda, coated, fried" +26103160,"BARRACUDA, STEAMED OR POACHED","Barracuda, steamed or poached" +26105110,"CARP, COOKED, NS AS TO COOKING METHOD","Carp, cooked, NS as to cooking method" +26105120,"CARP, BAKED OR BROILED, FAT ADDED IN COOKING","Carp, baked or broiled, fat added in cooking" +26105121,"CARP, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Carp, baked or broiled, fat not added in cooking" +26105130,"CARP, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Carp, coated, baked or broiled, fat added in cooking" +26105131,"CARP, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Carp, coated, baked or broiled, fat not added in cooking" +26105140,"CARP, COATED, FRIED","Carp, coated, fried" +26105160,"CARP, STEAMED OR POACHED","Carp, steamed or poached" +26105190,"CARP, SMOKED","Carp, smoked" +26107110,"CATFISH, COOKED, NS AS TO COOKING METHOD","Catfish, cooked, NS as to cooking method" +26107120,"CATFISH, BAKED OR BROILED, MADE WITH OIL","Catfish, baked or broiled, made with oil" +26107121,"CATFISH, BAKED OR BROILED, MADE WITH BUTTER","Catfish, baked or broiled, made with butter" +26107122,"CATFISH, BAKED OR BROILED, MADE WITH MARGARINE","Catfish, baked or broiled, made with margarine" +26107123,"CATFISH, BAKED OR BROILED, MADE WITHOUT FAT","Catfish, baked or broiled, made without fat" +26107124,"CATFISH, BAKED OR BROILED, MADE WITH COOKING SPRAY","Catfish, baked or broiled, made with cooking spray" +26107130,"CATFISH, COATED, BAKED OR BROILED, MADE WITH OIL","Catfish, coated, baked or broiled, made with oil" +26107131,"CATFISH, COATED, BAKED OR BROILED, MADE WITH BUTTER","Catfish, coated, baked or broiled, made with butter" +26107132,"CATFISH, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Catfish, coated, baked or broiled, made with margarine" +26107133,"CATFISH, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Catfish, coated, baked or broiled, made without fat" +26107134,"CATFISH, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Catfish, coated, baked or broiled, made with cooking spray" +26107140,"CATFISH, COATED, FRIED, MADE WITH OIL","Catfish, coated, fried, made with oil" +26107141,"CATFISH, COATED, FRIED, MADE WITH BUTTER","Catfish, coated, fried, made with butter" +26107142,"CATFISH, COATED, FRIED, MADE WITH MARGARINE","Catfish, coated, fried, made with margarine" +26107143,"CATFISH, COATED, FRIED, MADE WITHOUT FAT","Catfish, coated, fried, made without fat" +26107144,"CATFISH, COATED, FRIED, MADE WITH COOKING SPRAY","Catfish, coated, fried, made with cooking spray" +26107160,"CATFISH, STEAMED OR POACHED","Catfish, steamed or poached" +26109110,"COD, COOKED, NS AS TO COOKING METHOD","Cod, cooked, NS as to cooking method" +26109120,"COD, BAKED OR BROILED, MADE WITH OIL","Cod, baked or broiled, made with oil" +26109121,"COD, BAKED OR BROILED, MADE WITH BUTTER","Cod, baked or broiled, made with butter" +26109122,"COD, BAKED OR BROILED, MADE WITH MARGARINE","Cod, baked or broiled, made with margarine" +26109123,"COD, BAKED OR BROILED, MADE WITHOUT FAT","Cod, baked or broiled, made without fat" +26109124,"COD, BAKED OR BROILED, MADE WITH COOKING SPRAY","Cod, baked or broiled, made with cooking spray" +26109130,"COD, COATED, BAKED OR BROILED, MADE WITH OIL","Cod, coated, baked or broiled, made with oil" +26109131,"COD, COATED, BAKED OR BROILED, MADE WITH BUTTER","Cod, coated, baked or broiled, made with butter" +26109132,"COD, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Cod, coated, baked or broiled, made with margarine" +26109133,"COD, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Cod, coated, baked or broiled, made without fat" +26109134,"COD, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Cod, coated, baked or broiled, made with cooking spray" +26109140,"COD, COATED, FRIED, MADE WITH OIL","Cod, coated, fried, made with oil" +26109141,"COD, COATED, FRIED, MADE WITH BUTTER","Cod, coated, fried, made with butter" +26109142,"COD, COATED, FRIED, MADE WITH MARGARINE","Cod, coated, fried, made with margarine" +26109143,"COD, COATED, FRIED, MADE WITHOUT FAT","Cod, coated, fried, made without fat" +26109144,"COD, COATED, FRIED, MADE WITH COOKING SPRAY","Cod, coated, fried, made with cooking spray" +26109160,"COD, STEAMED OR POACHED","Cod, steamed or poached" +26109170,"COD, DRIED, SALTED","Cod, dried, salted" +26109180,"COD, DRIED, SALTED, SALT REMOVED IN WATER","Cod, dried, salted, salt removed in water" +26109190,"COD, SMOKED","Cod, smoked" +26111110,"CROAKER, COOKED, NS AS TO COOKING METHOD","Croaker, cooked, NS as to cooking method" +26111120,"CROAKER, BAKED OR BROILED, FAT ADDED IN COOKING","Croaker, baked or broiled, fat added in cooking" +26111121,"CROAKER, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Croaker, baked or broiled, fat not added in cooking" +26111130,"CROAKER, COATED, BAKED, FAT ADDED IN COOKING","Croaker, coated, baked or broiled, fat added in cooking" +26111131,"CROAKER, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Croaker, coated, baked or broiled, fat not added in cooking" +26111140,"CROAKER, COATED, FRIED","Croaker, coated, fried" +26111160,"CROAKER, STEAMED OR POACHED","Croaker, steamed or poached" +26113110,"EEL, COOKED, NS AS TO COOKING METHOD","Eel, cooked, NS as to cooking method" +26113160,"EEL, STEAMED OR POACHED","Eel, steamed or poached" +26113190,"EEL, SMOKED","Eel, smoked" +26115000,"FLOUNDER, RAW","Flounder, raw" +26115110,"FLOUNDER, COOKED, NS AS TO COOKING METHOD","Flounder, cooked, NS as to cooking method" +26115120,"FLOUNDER, BAKED OR BROILED, MADE WTIH OIL","Flounder, baked or broiled, made with oil" +26115121,"FLOUNDER, BAKED OR BROILED, MADE WITH BUTTER","Flounder, baked or broiled, made with butter" +26115122,"FLOUNDER, BAKED OR BROILED, MADE WITH MARGARINE","Flounder, baked or broiled, made with margarine" +26115123,"FLOUNDER, BAKED OR BROILED, MADE WITHOUT FAT","Flounder, baked or broiled, made without fat" +26115124,"FLOUNDER, BAKED OR BROILED, MADE WITH COOKING SPRAY","Flounder, baked or broiled, made with cooking spray" +26115130,"FLOUNDER, COATED, BAKED OR BROILED, MADE WITH OIL","Flounder, coated, baked or broiled, made with oil" +26115131,"FLOUNDER, COATED, BAKED OR BROILED, MADE WITH BUTTER","Flounder, coated, baked or broiled, made with butter" +26115132,"FLOUNDER, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Flounder, coated, baked or broiled, made with margarine" +26115133,"FLOUNDER, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Flounder, coated, baked or broiled, made without fat" +26115134,"FLOUNDER, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Flounder, coated, baked or broiled, made with cooking spray" +26115140,"FLOUNDER, COATED, FRIED, MADE WITH OIL","Flounder, coated, fried, made with oil" +26115141,"FLOUNDER, COATED, FRIED, MADE WITH BUTTER","Flounder, coated, fried, made with butter" +26115142,"FLOUNDER, COATED, FRIED, MADE WITH MARGARINE","Flounder, coated, fried, made with margarine" +26115143,"FLOUNDER, COATED, FRIED, MADE WITHOUT FAT","Flounder, coated, fried, made without fat" +26115144,"FLOUNDER, COATED, FRIED, MADE WITH COOKING SPRAY","Flounder, coated, fried, made with cooking spray" +26115160,"FLOUNDER, STEAMED OR POACHED","Flounder, steamed or poached" +26115190,"FLOUNDER, SMOKED","Flounder, smoked" +26117110,"HADDOCK, COOKED, NS AS TO COOKING METHOD","Haddock, cooked, NS as to cooking method" +26117120,"HADDOCK, BAKED OR BROILED, FAT ADDED IN COOKING","Haddock, baked or broiled, fat added in cooking" +26117121,"HADDOCK, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Haddock, baked or broiled, fat not added in cooking" +26117130,"HADDOCK, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Haddock, coated, baked or broiled, fat added in cooking" +26117131,"HADDOCK, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Haddock, coated, baked or broiled, fat not added in cooking" +26117140,"HADDOCK, COATED, FRIED","Haddock, coated, fried" +26117160,"HADDOCK, STEAMED OR POACHED","Haddock, steamed or poached" +26117190,"HADDOCK, SMOKED","Haddock, smoked" +26118000,"HALIBUT, RAW","Halibut, raw" +26118010,"HALIBUT, COOKED, NS AS TO COOKING METHOD","Halibut, cooked, NS as to cooking method" +26118020,"HALIBUT, BAKED OR BROILED, MADE WITH OIL","Halibut, baked or broiled, made with oil" +26118021,"HALIBUT, BAKED OR BROILED, MADE WITH BUTTER","Halibut, baked or broiled, made with butter" +26118022,"HALIBUT, BAKED OR BROILED, MADE WITH MARGARINE","Halibut, baked or broiled, made with margarine" +26118023,"HALIBUT, BAKED OR BROILED, MADE WITHOUT FAT","Halibut, baked or broiled, made without fat" +26118024,"HALIBUT, BAKED OR BROILED, MADE WITH COOKING SPRAY","Halibut, baked or broiled, made with cooking spray" +26118030,"HALIBUT, COATED, BAKED OR BROILED, MADE WITH OIL","Halibut, coated, baked or broiled, made with oil" +26118031,"HALIBUT, COATED, BAKED OR BROILED, MADE WITH BUTTER","Halibut, coated, baked or broiled, made with butter" +26118032,"HALIBUT, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Halibut, coated, baked or broiled, made with margarine" +26118033,"HALIBUT, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Halibut, coated, baked or broiled, made without fat" +26118034,"HALIBUT, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Halibut, coated, baked or broiled, made with cooking spray" +26118040,"HALIBUT, COATED, FRIED, MADE WITH OIL","Halibut, coated, fried, made with oil" +26118041,"HALIBUT, COATED, FRIED, MADE WITH BUTTER","Halibut, coated, fried, made with butter" +26118042,"HALIBUT, COATED, FRIED, MADE WITH MARGARINE","Halibut, coated, fried, made with margarine" +26118043,"HALIBUT, COATED, FRIED, MADE WITHOUT FAT","Halibut, coated, fried, made without fat" +26118044,"HALIBUT, COATED, FRIED, MADE WITH COOKING SPRAY","Halibut, coated, fried, made with cooking spray" +26118050,"HALIBUT, STEAMED OR POACHED","Halibut, steamed or poached" +26118060,"HALIBUT, SMOKED","Halibut, smoked" +26119100,"HERRING, RAW","Herring, raw" +26119110,"HERRING, COOKED, NS AS TO COOKING METHOD","Herring, cooked, NS as to cooking method" +26119120,"HERRING, BAKED OR BROILED, FAT ADDED IN COOKING","Herring, baked or broiled, fat added in cooking" +26119121,"HERRING, BAKED OR BROILED, FAT NOT USED IN PREPARATION","Herring, baked or broiled, fat not added in cooking" +26119130,"HERRING, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Herring, coated, baked or broiled, fat added in cooking" +26119131,"HERRING, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Herring, coated, baked or broiled, fat not added in cooking" +26119140,"HERRING, COATED, FRIED","Herring, coated, fried" +26119160,"HERRING, PICKLED, IN CREAM SAUCE","Herring, pickled, in cream sauce" +26119170,"HERRING, DRIED, SALTED","Herring, dried, salted" +26119180,"HERRING, PICKLED","Herring, pickled" +26119190,"HERRING, SMOKED, KIPPERED","Herring, smoked, kippered" +26121100,"MACKEREL, RAW","Mackerel, raw" +26121110,"MACKEREL, COOKED, NS AS TO COOKING METHOD","Mackerel, cooked, NS as to cooking method" +26121120,"MACKEREL, BAKED OR BROILED, FAT ADDED IN COOKING","Mackerel, baked or broiled, fat added in cooking" +26121121,"MACKEREL, BAKED OR BROILED, FAT NOT USED IN PREPARATION","Mackerel, baked or broiled, fat not added in cooking" +26121131,"MACKEREL, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Mackerel, coated, baked or broiled, fat added in cooking" +26121132,"MACKEREL, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Mackerel, coated, baked or broiled, fat not added in cooking" +26121140,"MACKEREL, COATED, FRIED","Mackerel, coated, fried" +26121160,"MACKEREL, PICKLED","Mackerel, pickled" +26121180,"MACKEREL, CANNED","Mackerel, canned" +26121190,"MACKEREL, SMOKED","Mackerel, smoked" +26123100,"MULLET, RAW","Mullet, raw" +26123110,"MULLET, COOKED, NS AS TO COOKING METHOD","Mullet, cooked, NS as to cooking method" +26123120,"MULLET, BAKED OR BROILED, FAT USED IN PREPARATION","Mullet, baked or broiled, fat added in cooking" +26123121,"MULLET, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Mullet, baked or broiled, fat not added in cooking" +26123130,"MULLET, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Mullet, coated, baked or broiled, fat added in cooking" +26123131,"MULLET, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Mullet, coated, baked or broiled, fat not added in cooking" +26123140,"MULLET, COATED, FRIED","Mullet, coated, fried" +26123160,"MULLET, STEAMED OR POACHED","Mullet, steamed or poached" +26125100,"OCEAN PERCH, RAW","Ocean perch, raw" +26125110,"OCEAN PERCH, COOKED, NS AS TO COOKING METHOD","Ocean perch, cooked, NS as to cooking method" +26125120,"OCEAN PERCH, BAKED OR BROILED, FAT USED IN PREPARATION","Ocean perch, baked or broiled, fat added in cooking" +26125121,"OCEAN PERCH, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Ocean perch, baked or broiled, fat not added in cooking" +26125130,"OCEAN PERCH, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Ocean perch, coated, baked or broiled, fat added in cooking" +26125131,"OCEAN PERCH, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOK","Ocean perch, coated, baked or broiled, fat not added in cooking" +26125140,"OCEAN PERCH, COATED, FRIED","Ocean perch, coated, fried" +26125160,"OCEAN PERCH, STEAMED OR POACHED","Ocean perch, steamed or poached" +26127110,"PERCH, COOKED, NS AS TO COOKING METHOD","Perch, cooked, NS as to cooking method" +26127120,"PERCH, BAKED OR BROILED, MADE WITH OIL","Perch, baked or broiled, made with oil" +26127121,"PERCH, BAKED OR BROILED, MADE WITH BUTTER","Perch, baked or broiled, made with butter" +26127122,"PERCH, BAKED OR BROILED, MADE WITH MARGARINE","Perch, baked or broiled, made with margarine" +26127123,"PERCH, BAKED OR BROILED, MADE WITHOUT FAT","Perch, baked or broiled, made without fat" +26127124,"PERCH, BAKED OR BROILED, MADE WITH COOKING SPRAY","Perch, baked or broiled, made with cooking spray" +26127130,"PERCH, COATED, BAKED OR BROILED, MADE WITH OIL","Perch, coated, baked or broiled, made with oil" +26127131,"PERCH, COATED, BAKED OR BROILED, MADE WITH BUTTER","Perch, coated, baked or broiled, made with butter" +26127132,"PERCH, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Perch, coated, baked or broiled, made with margarine" +26127133,"PERCH, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Perch, coated, baked or broiled, made without fat" +26127134,"PERCH, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Perch, coated, baked or broiled, made with cooking spray" +26127140,"PERCH, COATED, FRIED","Perch, coated, fried, made with oil" +26127141,"PERCH, COATED, FRIED, MADE WITH BUTTER","Perch, coated, fried, made with butter" +26127142,"PERCH, COATED, FRIED, MADE WITH MARGARINE","Perch, coated, fried, made with margarine" +26127143,"PERCH, COATED, FRIED, MADE WITHOUT FAT","Perch, coated, fried, made without fat" +26127144,"PERCH, COATED, FRIED, MADE WITH COOKING SPRAY","Perch, coated, fried, made with cooking spray" +26127160,"PERCH, STEAMED OR POACHED","Perch, steamed or poached" +26129110,"PIKE, COOKED, NS AS TO COOKING METHOD","Pike, cooked, NS as to cooking method" +26129120,"PIKE, BAKED OR BROILED, FAT ADDED IN COOKING","Pike, baked or broiled, fat added in cooking" +26129121,"PIKE, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Pike, baked or broiled, fat not added in cooking" +26129130,"PIKE, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Pike, coated, baked or broiled, fat added in cooking" +26129131,"PIKE, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Pike, coated, baked or broiled, fat not added in cooking" +26129140,"PIKE, COATED, FRIED","Pike, coated, fried" +26129160,"PIKE, STEAMED OR POACHED","Pike, steamed or poached" +26131100,"POMPANO, RAW","Pompano, raw" +26131110,"POMPANO, COOKED, NS AS TO COOKING METHOD","Pompano, cooked, NS as to cooking method" +26131120,"POMPANO, BAKED OR BROILED, FAT ADDED IN COOKING","Pompano, baked or broiled, fat added in cooking" +26131121,"POMPANO, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Pompano, baked or broiled, fat not added in cooking" +26131130,"POMPANO, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Pompano, coated, baked or broiled, fat added in cooking" +26131131,"POMPANO, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Pompano, coated, baked or broiled, fat not added in cooking" +26131140,"POMPANO, COATED, FRIED","Pompano, coated, fried" +26131160,"POMPANO, STEAMED OR POACHED","Pompano, steamed or poached" +26131190,"POMPANO, SMOKED","Pompano, smoked" +26133100,"PORGY, RAW","Porgy, raw" +26133110,"PORGY, COOKED, NS AS TO COOKING METHOD","Porgy, cooked, NS as to cooking method" +26133120,"PORGY, BAKED OR BROILED, FAT ADDED IN COOKING","Porgy, baked or broiled, fat added in cooking" +26133121,"PORGY, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Porgy, baked or broiled, fat not added in cooking" +26133130,"PORGY, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Porgy, coated, baked or broiled, fat added in cooking" +26133131,"PORGY, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Porgy, coated, baked or broiled, fat not added in cooking" +26133140,"PORGY, COATED, FRIED","Porgy, coated, fried" +26133160,"PORGY, STEAMED OR POACHED","Porgy, steamed or poached" +26135110,"RAY, COOKED, NS AS TO COOKING METHOD","Ray, cooked, NS as to cooking method" +26135120,"RAY, BAKED OR BROILED, FAT ADDED IN COOKING","Ray, baked or broiled, fat added in cooking" +26135121,"RAY, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Ray, baked or broiled, fat not added in cooking" +26135130,"RAY, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Ray, coated, baked or broiled, fat added in cooking" +26135131,"RAY, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Ray, coated, baked or broiled, fat not added in cooking" +26135140,"RAY, COATED, FRIED","Ray, coated, fried" +26135160,"RAY, STEAMED OR POACHED","Ray, steamed or poached" +26137100,"SALMON, RAW","Salmon, raw" +26137110,"SALMON, COOKED, NS AS TO COOKING METHOD","Salmon, cooked, NS as to cooking method" +26137120,"SALMON, BAKED OR BROILED, MADE WITH OIL","Salmon, baked or broiled, made with oil" +26137121,"SALMON, BAKED OR BROILED, MADE WITH BUTTER","Salmon, baked or broiled, made with butter" +26137122,"SALMON, BAKED OR BROILED, MADE WITH MARGARINE","Salmon, baked or broiled, made with margarine" +26137123,"SALMON, BAKED OR BROILED, MADE WITHOUT FAT","Salmon, baked or broiled, made without fat" +26137124,"SALMON, BAKED OR BROILED, MADE WITH COOKING SPRAY","Salmon, baked or broiled, made with cooking spray" +26137130,"SALMON, COATED, BAKED OR BROILED, MADE WITH OIL","Salmon, coated, baked or broiled, made with oil" +26137131,"SALMON, COATED, BAKED OR BROILED, MADE WITH BUTTER","Salmon, coated, baked or broiled, made with butter" +26137132,"SALMON, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Salmon, coated, baked or broiled, made with margarine" +26137133,"SALMON, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Salmon, coated, baked or broiled, made without fat" +26137134,"SALMON, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Salmon, coated, baked or broiled, made with cooking spray" +26137140,"SALMON, COATED, FRIED, MADE WITH OIL","Salmon, coated, fried, made with oil" +26137141,"SALMON, COATED, FRIED, MADE WITH BUTTER","Salmon, coated, fried, made with butter" +26137142,"SALMON, COATED, FRIED, MADE WITH MARGARINE","Salmon, coated, fried, made with margarine" +26137143,"SALMON, COATED, FRIED, MADE WITHOUT FAT","Salmon, coated, fried, made without fat" +26137144,"SALMON, COATED, FRIED, MADE WITH COOKING SPRAY","Salmon, coated, fried, made with cooking spray" +26137160,"SALMON, STEAMED OR POACHED","Salmon, steamed or poached" +26137170,"SALMON, DRIED","Salmon, dried" +26137180,"SALMON, CANNED","Salmon, canned" +26137190,"SALMON, SMOKED (INCLUDE LOX)","Salmon, smoked" +26139110,"SARDINES, COOKED","Sardines, cooked" +26139170,"SARDINE, DRIED","Sardines, dried" +26139180,"SARDINES, CANNED IN OIL","Sardines, canned in oil" +26139190,"SARDINES, SKINLESS, BONELESS, PACKED IN WATER","Sardines, skinless, boneless, packed in water" +26141110,"SEA BASS, COOKED, NS AS TO COOKING METHOD","Sea bass, cooked, NS as to cooking method" +26141120,"SEA BASS, BAKED OR BROILED, FAT ADDED IN COOKING","Sea bass, baked or broiled, fat added in cooking" +26141121,"SEA BASS, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Sea bass, baked or broiled, fat not added in cooking" +26141130,"SEA BASS, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Sea bass, coated, baked or broiled, fat added in cooking" +26141131,"SEA BASS, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Sea bass, coated, baked or broiled, fat not added in cooking" +26141140,"SEA BASS, COATED, FRIED","Sea bass, coated, fried" +26141160,"SEA BASS, STEAMED OR POACHED","Sea bass, steamed or poached" +26141180,"SEA BASS, PICKLED (MERO EN ESCABECHE)","Sea bass, pickled (Mero en escabeche)" +26143110,"SHARK, COOKED, NS AS TO COOKING METHOD","Shark, cooked, NS as to cooking method" +26143120,"SHARK, BAKED OR BROILED, FAT ADDED IN COOKING","Shark, baked or broiled, fat added in cooking" +26143121,"SHARK, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Shark, baked or broiled, fat not added in cooking" +26143130,"SHARK, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Shark, coated, baked or broiled, fat added in cooking" +26143131,"SHARK, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Shark, coated, baked or broiled, fat not added in cooking" +26143140,"SHARK, COATED, FRIED","Shark, coated, fried" +26143160,"SHARK, STEAMED OR POACHED","Shark, steamed or poached" +26147110,"STURGEON, COOKED, NS AS TO COOKING METHOD","Sturgeon, cooked, NS as to cooking method" +26147120,"STURGEON, BAKED OR BROILED, FAT ADDED IN COOKING","Sturgeon, baked or broiled, fat added in cooking" +26147130,"STURGEON, STEAMED","Sturgeon, steamed" +26147140,"STURGEON, COATED, FRIED","Sturgeon, coated, fried" +26147190,"STURGEON, SMOKED","Sturgeon, smoked" +26149110,"SWORDFISH, COOKED, NS AS TO COOKING METHOD","Swordfish, cooked, NS as to cooking method" +26149120,"SWORDFISH, BAKED OR BROILED, FAT ADDED IN COOKING","Swordfish, baked or broiled, fat added in cooking" +26149121,"SWORDFISH, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Swordfish, baked or broiled, fat not added in cooking" +26149130,"SWORDFISH, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Swordfish, coated, baked or broiled, fat added in cooking" +26149131,"SWORDFISH, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKIN","Swordfish, coated, baked or broiled, fat not added in cooking" +26149140,"SWORDFISH, COATED, FRIED","Swordfish, coated, fried" +26149160,"SWORDFISH, STEAMED OR POACHED","Swordfish, steamed or poached" +26151110,"TROUT, COOKED, NS AS TO COOKING METHOD","Trout, cooked, NS as to cooking method" +26151120,"TROUT, BAKED OR BROILED, MADE WITH OIL","Trout, baked or broiled, made with oil" +26151121,"TROUT, BAKED OR BROILED, MADE WITH BUTTER","Trout, baked or broiled, made with butter" +26151122,"TROUT, BAKED OR BROILED, MADE WITH MARGARINE","Trout, baked or broiled, made with margarine" +26151123,"TROUT, BAKED OR BROILED, MADE WITHOUT FAT","Trout, baked or broiled, made without fat" +26151124,"TROUT, BAKED OR BROILED, MADE WITH COOKING SPRAY","Trout, baked or broiled, made with cooking spray" +26151130,"TROUT, COATED, BAKED OR BROILED, MADE WITH OIL","Trout, coated, baked or broiled, made with oil" +26151131,"TROUT, COATED, BAKED OR BROILED, MADE WITH BUTTER","Trout, coated, baked or broiled, made with butter" +26151132,"TROUT, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Trout, coated, baked or broiled, made with margarine" +26151133,"TROUT, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Trout, coated, baked or broiled, made without fat" +26151134,"TROUT, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Trout, coated, baked or broiled, made with cooking spray" +26151140,"TROUT, COATED, FRIED, MADE WITH OIL","Trout, coated, fried, made with oil" +26151141,"TROUT, COATED, FRIED, MADE WITH BUTTER","Trout, coated, fried, made with butter" +26151142,"TROUT, COATED, FRIED, MADE WITH MARGARINE","Trout, coated, fried, made with margarine" +26151143,"TROUT, COATED, FRIED, MADE WITHOUT FAT","Trout, coated, fried, made without fat" +26151144,"TROUT, COATED, FRIED, MADE WITH COOKING SPRAY","Trout, coated, fried, made with cooking spray" +26151160,"TROUT, STEAMED OR POACHED","Trout, steamed or poached" +26151190,"TROUT, SMOKED","Trout, smoked" +26153100,"TUNA, FRESH, RAW","Tuna, fresh, raw" +26153110,"TUNA, FRESH, COOKED, NS AS TO COOKING METHOD","Tuna, fresh, cooked, NS as to cooking method" +26153120,"TUNA, FRESH, BAKED OR BROILED, FAT ADDED IN COOKING","Tuna, fresh, baked or broiled, fat added in cooking" +26153122,"TUNA, FRESH, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Tuna, fresh, baked or broiled, fat not added in cooking" +26153130,"TUNA, FRESH, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Tuna, fresh, coated, baked or broiled, fat added in cooking" +26153131,"TUNA, FRESH, COATED, BAKED OR BROILED, FAT NOT ADDED","Tuna, fresh, coated, baked or broiled, fat not added" +26153140,"TUNA, FRESH, COATED, FRIED","Tuna, fresh, coated, fried" +26153160,"TUNA, FRESH, STEAMED OR POACHED","Tuna, fresh, steamed or poached" +26153170,"TUNA, FRESH, DRIED","Tuna, fresh, dried" +26153190,"TUNA, FRESH, SMOKED","Tuna, fresh, smoked" +26155110,"TUNA, CANNED, NS AS TO OIL OR WATER PACK","Tuna, canned, NS as to oil or water pack" +26155180,"TUNA, CANNED, OIL PACK","Tuna, canned, oil pack" +26155190,"TUNA, CANNED, WATER PACK","Tuna, canned, water pack" +26157110,"WHITING, COOKED, NS AS TO COOKING METHOD","Whiting, cooked, NS as to cooking method" +26157120,"WHITING, BAKED OR BROILED, MADE WITH OIL","Whiting, baked or broiled, made with oil" +26157121,"WHITING, BAKED OR BROILED, MADE WITH BUTTER","Whiting, baked or broiled, made with butter" +26157122,"WHITING, BAKED OR BROILED, MADE WITH MARGARINE","Whiting, baked or broiled, made with margarine" +26157123,"WHITING, BAKED OR BROILED, MADE WITHOUT FAT","Whiting, baked or broiled, made without fat" +26157124,"WHITING, BAKED OR BROILED, MADE WITH COOKING SPRAY","Whiting, baked or broiled, made with cooking spray" +26157130,"WHITING, COATED, BAKED OR BROILED, MADE WITH OIL","Whiting, coated, baked or broiled, made with oil" +26157131,"WHITING, COATED, BAKED OR BROILED, MADE WITH BUTTER","Whiting, coated, baked or broiled, made with butter" +26157132,"WHITING, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Whiting, coated, baked or broiled, made with margarine" +26157133,"WHITING, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Whiting, coated, baked or broiled, made without fat" +26157134,"WHITING, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Whiting, coated, baked or broiled, made with cooking spray" +26157140,"WHITING, COATED, FRIED, MADE WITH OIL","Whiting, coated, fried, made with oil" +26157141,"WHITING, COATED, FRIED, MADE WITH BUTTER","Whiting, coated, fried, made with butter" +26157142,"WHITING, COATED, FRIED, MADE WITH MARGARINE","Whiting, coated, fried, made with margarine" +26157143,"WHITING, COATED, FRIED, MADE WITHOUT FAT","Whiting, coated, fried, made without fat" +26157144,"WHITING, COATED, FRIED, MADE WITH COOKING SPRAY","Whiting, coated, fried, made with cooking spray" +26157160,"WHITING, STEAMED OR POACHED","Whiting, steamed or poached" +26158000,"TILAPIA, COOKED, NS AS TO COOKING METHOD","Tilapia, cooked, NS as to cooking method" +26158010,"TILAPIA, BAKED OR BROILED, MADE WITH OIL","Tilapia, baked or broiled, made with oil" +26158011,"TILAPIA, BAKED OR BROILED, MADE WITH BUTTER","Tilapia, baked or broiled, made with butter" +26158012,"TILAPIA, BAKED OR BROILED, MADE WITH MARGARINE","Tilapia, baked or broiled, made with margarine" +26158013,"TILAPIA, BAKED OR BROILED, MADE WITHOUT FAT","Tilapia, baked or broiled, made without fat" +26158014,"TILAPIA, BAKED OR BROILED, MADE WITH COOKING SPRAY","Tilapia, baked or broiled, made with cooking spray" +26158020,"TILAPIA, COATED, BAKED OR BROILED, MADE WITH OIL","Tilapia, coated, baked or broiled, made with oil" +26158021,"TILAPIA, COATED, BAKED OR BROILED, MADE WITH BUTTER","Tilapia, coated, baked or broiled, made with butter" +26158022,"TILAPIA, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Tilapia, coated, baked or broiled, made with margarine" +26158023,"TILAPIA, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Tilapia, coated, baked or broiled, made without fat" +26158024,"TILAPIA, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Tilapia, coated, baked or broiled, made with cooking spray" +26158030,"TILAPIA, COATED, FRIED, MADE WITH OIL","Tilapia, coated, fried, made with oil" +26158031,"TILAPIA, COATED, FRIED, MADE WITH BUTTER","Tilapia, coated, fried, made with butter" +26158032,"TILAPIA, COATED, FRIED, MADE WITH MARGARINE","Tilapia, coated, fried, made with margarine" +26158033,"TILAPIA, COATED, FRIED, MADE WITHOUT FAT","Tilapia, coated, fried, made without fat" +26158034,"TILAPIA, COATED, FRIED, MADE WITH COOKING SPRAY","Tilapia, coated, fried, made with cooking spray" +26158050,"TILAPIA, STEAMED OR POACHED","Tilapia, steamed or poached" +26203110,"FROG LEGS, NS AS TO COOKING METHOD","Frog legs, NS as to cooking method" +26203160,"FROG LEGS, STEAMED","Frog legs, steamed" +26205110,"OCTOPUS, COOKED, NS AS TO COOKING METHOD","Octopus, cooked, NS as to cooking method" +26205160,"OCTOPUS, STEAMED","Octopus, steamed" +26205170,"OCTOPUS, DRIED","Octopus, dried" +26205180,"OCTOPUS, DRIED, BOILED","Octopus, dried, boiled" +26205190,"OCTOPUS, SMOKED","Octopus, smoked" +26207110,"ROE, SHAD, COOKED (INCL COD ROE)","Roe, shad, cooked" +26209100,"ROE, HERRING","Roe, herring" +26211100,"ROE, STURGEON (INCLUDE CAVIAR)","Roe, sturgeon" +26213100,"SQUID, RAW","Squid, raw" +26213120,"SQUID, BAKED, BROILED, FAT ADDED IN COOKING","Squid, baked or broiled, fat added in cooking" +26213121,"SQUID, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Squid, baked or broiled, fat not added in cooking" +26213130,"SQUID, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Squid, coated, baked or broiled, fat added in cooking" +26213131,"SQUID, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Squid, coated, baked or broiled, fat not added in cooking" +26213140,"SQUID, COATED, FRIED","Squid, coated, fried" +26213160,"SQUID, STEAMED OR BOILED","Squid, steamed or boiled" +26213170,"SQUID, DRIED","Squid, dried" +26213180,"SQUID, PICKLED","Squid, pickled" +26213190,"SQUID, CANNED","Squid, canned" +26215120,"TURTLE, COOKED, NS AS TO METHOD","Turtle (terrapin), cooked, NS as to cooking method" +26301110,"ABALONE, COOKED, NS AS TO COOKING METHOD","Abalone, cooked, NS as to cooking method" +26301140,"ABALONE, FLOURED OR BREADED, FRIED","Abalone, floured or breaded, fried" +26301160,"ABALONE, STEAMED OR POACHED","Abalone, steamed or poached" +26303100,"CLAMS, RAW","Clams, raw" +26303110,"CLAMS, COOKED, NS AS TO COOKING METHOD","Clams, cooked, NS as to cooking method" +26303120,"CLAMS, BAKED OR BROILED, FAT ADDED IN COOKING","Clams, baked or broiled, fat added in cooking" +26303121,"CLAMS, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Clams, baked or broiled, fat not added in cooking" +26303130,"CLAMS, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Clams, coated, baked or broiled, fat added in cooking" +26303131,"CLAMS ,BAKED OR BROILED, FAT NOT ADDED IN COOKING","Clams, coated, baked or broiled, fat not added in cooking" +26303140,"CLAMS,COATED, FRIED","Clams, coated, fried" +26303160,"CLAMS, STEAMED OR BOILED","Clams, steamed or boiled" +26303180,"CLAMS, CANNED","Clams, canned" +26303190,"CLAMS, SMOKED, IN OIL","Clams, smoked, in oil" +26305110,"CRAB, COOKED, NS AS TO COOKING METHOD","Crab, cooked, NS as to cooking method" +26305120,"CRAB, BAKED OR BROILED, FAT ADDED IN COOKING","Crab, baked or broiled, fat added in cooking" +26305121,"CRAB, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Crab, baked or broiled, fat not added in cooking" +26305130,"CRAB, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Crab, coated, baked or broiled, fat added in cooking" +26305131,"CRAB, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Crab, coated, baked or broiled, fat not added in cooking" +26305160,"CRAB, HARD SHELL, STEAMED","Crab, hard shell, steamed" +26305180,"CRAB, CANNED","Crab, canned" +26307140,"CRAB, SOFT SHELL, COATED, FRIED","Crab, soft shell, coated, fried" +26309140,"CRAYFISH, COATED, FRIED","Crayfish, coated, fried" +26309160,"CRAYFISH, BOILED OR STEAMED","Crayfish, boiled or steamed" +26311110,"LOBSTER, COOKED, NS AS TO METHOD","Lobster, cooked, NS as to cooking method" +26311120,"LOBSTER, BAKED OR BROILED, FAT ADDED IN COOKING","Lobster, baked or broiled, fat added in cooking" +26311121,"LOBSTER, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Lobster, baked or broiled, fat not added in cooking" +26311140,"LOBSTER, COATED, FRIED","Lobster, coated, fried" +26311160,"LOBSTER, STEAMED OR BOILED","Lobster, steamed or boiled" +26311170,"LOBSTER, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Lobster, coated, baked or broiled, fat added in cooking" +26311171,"LOBSTER, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Lobster, coated, baked or broiled, fat not added in cooking" +26311180,"LOBSTER, CANNED","Lobster, canned" +26313100,"MUSSELS, RAW","Mussels, raw" +26313110,"MUSSELS, COOKED, NS AS TO COOKING METHOD","Mussels, cooked, NS as to cooking method" +26313160,"MUSSELS, STEAMED","Mussels, steamed or poached" +26315100,"OYSTERS, RAW","Oysters, raw" +26315110,"OYSTERS, COOKED, NS AS TO COOKING METHOD","Oysters, cooked, NS as to cooking method" +26315120,"OYSTERS, BAKED OR BROILED, FAT ADDED IN COOKING","Oysters, baked or broiled, fat added in cooking" +26315121,"OYSTERS, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Oysters, baked or broiled, fat not added in cooking" +26315130,"OYSTERS, STEAMED","Oysters, steamed" +26315140,"OYSTERS, COATED, FRIED","Oysters, coated, fried" +26315160,"OYSTERS, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Oysters, coated, baked or broiled, fat added in cooking" +26315161,"OYSTERS, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Oysters, coated, baked or broiled, fat not added in cooking" +26315180,"OYSTERS, CANNED","Oysters, canned" +26315190,"OYSTERS, SMOKED","Oysters, smoked" +26317110,"SCALLOPS, COOKED, NS AS TO COOKING METHOD","Scallops, cooked, NS as to cooking method" +26317120,"SCALLOPS, BAKED OR BROILED, FAT ADDED IN COOKING","Scallops, baked or broiled, fat added in cooking" +26317121,"SCALLOPS, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Scallops, baked or broiled, fat not added in cooking" +26317130,"SCALLOPS, STEAMED OR BOILED","Scallops, steamed or boiled" +26317140,"SCALLOPS, COATED, FRIED","Scallops, coated, fried" +26317160,"SCALLOPS, COATED, BAKED OR BROILED, FAT ADDED IN COOKING","Scallops, coated, baked or broiled, fat added in cooking" +26317161,"SCALLOPS, COATED, BAKED OR BROILED, FAT NOT ADDED IN COOKING","Scallops, coated, baked or broiled, fat not added in cooking" +26319110,"SHRIMP, COOKED, NS AS TO COOKING METHOD","Shrimp, cooked, NS as to cooking method" +26319120,"SHRIMP, BAKED OR BROILED, MADE WITH OIL","Shrimp, baked or broiled, made with oil" +26319121,"SHRIMP, BAKED OR BROILED, MADE WITH BUTTER","Shrimp, baked or broiled, made with butter" +26319122,"SHRIMP, BAKED OR BROILED, MADE WITH MARGARINE","Shrimp, baked or broiled, made with margarine" +26319123,"SHRIMP, BAKED OR BROILED, MADE WITHOUT FAT","Shrimp, baked or broiled, made without fat" +26319124,"SHRIMP, BAKED OR BROILED, MADE WITH COOKING SPRAY","Shrimp, baked or broiled, made with cooking spray" +26319130,"SHRIMP, STEAMED OR BOILED","Shrimp, steamed or boiled" +26319140,"SHRIMP, COATED, FRIED, MADE WITH OIL","Shrimp, coated, fried, made with oil" +26319141,"SHRIMP, COATED, FRIED, MADE WITH BUTTER","Shrimp, coated, fried, made with butter" +26319142,"SHRIMP, COATED, FRIED, MADE WITH MARGARINE","Shrimp, coated, fried, made with margarine" +26319143,"SHRIMP, COATED, FRIED, MADE WITHOUT FAT","Shrimp, coated, fried, made without fat" +26319144,"SHRIMP, COATED, FRIED, MADE WITH COOKING SPRAY","Shrimp, coated, fried, made with cooking spray" +26319145,"SHRIMP, COATED, FRIED, FROM FAST FOOD / RESTAURANT","Shrimp, coated, fried, from fast food / restaurant" +26319160,"SHIRMP, COATED, BAKED OR BROILED, MADE WITH OIL","Shrimp, coated, baked or broiled, made with oil" +26319161,"SHRIMP, COATED, BAKED OR BROILED, MADE WITH BUTTER","Shrimp, coated, baked or broiled, made with butter" +26319162,"SHRIMP, COATED, BAKED OR BROILED, MADE WITH MARGARINE","Shrimp, coated, baked or broiled, made with margarine" +26319163,"SHRIMP, COATED, BAKED OR BROILED, MADE WITHOUT FAT","Shrimp, coated, baked or broiled, made without fat" +26319164,"SHRIMP, COATED, BAKED OR BROILED, MADE WITH COOKING SPRAY","Shrimp, coated, baked or broiled, made with cooking spray" +26319170,"SHRIMP, DRIED","Shrimp, dried" +26319180,"SHRIMP, CANNED","Shrimp, canned" +26321110,"SNAILS, COOKED, NS AS TO METHOD","Snails, cooked, NS as to cooking method" +27111000,"BEEF W/ TOMATO-BASED SAUCE (MIXTURE)","Beef with tomato-based sauce (mixture)" +27111050,"SPAGHETTI SAUCE W/ BEEF/MEAT, HOMEMADE-STYLE","Spaghetti sauce with beef or meat other than lamb or mutton, homemade-style" +27111100,"BEEF GOULASH","Beef goulash" +27111200,"BEEF BURGUNDY (BEEF BOURGUIGNONNE)","Beef burgundy (beef bourguignonne)" +27111300,"MEXICAN BEEF STEW, NO POTATOES, TOMATO SAUCE","Mexican style beef stew, no potatoes, tomato-based sauce (mixture) (Carne guisada sin papas)" +27111310,"MEXICAN BEEF STEW, NO POTATOES, W/ CHILI PEPPERS, TOMATO SCE","Mexican style beef stew, no potatoes, with chili peppers, tomato-based sauce (mixture) (Carne guisada con chile)" +27111400,"CHILI CON CARNE, NS AS TO BEANS","Chili con carne, NS as to beans" +27111410,"CHILI CON CARNE W/ BEANS","Chili con carne with beans" +27111420,"CHILI CON CARNE W/O BEANS","Chili con carne without beans" +27111430,"CHILI CON CARNE, NS AS TO BEANS, W/ CHEESE","Chili con carne, NS as to beans, with cheese" +27111440,"CHILI CON CARNE W/ BEANS & CHEESE","Chili con carne with beans and cheese" +27111500,"BEEF SLOPPY JOE (NO BUN)","Beef sloppy joe (no bun)" +27112000,"BEEF W/ GRAVY (MIXTURE) (INCLUDE COUNTRY STYLE)","Beef with gravy (mixture)" +27112010,"SALISBURY STEAK W/ GRAVY (MIXTURE)","Salisbury steak with gravy (mixture)" +27113000,"BEEF W/ CREAM OR WHITE SAUCE (MIXTURE)","Beef with cream or white sauce (mixture)" +27113100,"BEEF STROGANOFF","Beef stroganoff" +27113200,"CREAMED CHIPPED OR DRIED BEEF","Creamed chipped or dried beef" +27113300,"SWEDISH MEATBALLS W/ CREAM OR WHITE SAUCE (MIXTURE)","Swedish meatballs with cream or white sauce (mixture)" +27114000,"BEEF W/ (MUSHROOM) SOUP (MIXTURE)","Beef with (mushroom) soup (mixture)" +27115000,"BEEF W/ SOY-BASED SAUCE (MIXTURE)","Beef with soy-based sauce (mixture)" +27115100,"STEAK TERIYAKI W/ SAUCE (MIXTURE)","Steak teriyaki with sauce (mixture)" +27116100,"BEEF CURRY","Beef curry" +27116200,"BEEF W/ BARBECUE SAUCE (MIXTURE)","Beef with barbecue sauce (mixture)" +27116300,"BEEF W/ SWEET & SOUR SAUCE (MIXTURE)","Beef with sweet and sour sauce (mixture)" +27116350,"STEWED, SEASONED GROUND BEEF, MEXICAN","Stewed, seasoned, ground beef, Mexican style (Picadillo de carne de rez)" +27116400,"STEAK TARTARE (RAW GROUND BEEF & EGG)","Steak tartare (raw ground beef and egg)" +27118110,"MEATBALLS, P. R. (ALBONDIGAS GUISADAS)","Meatballs, Puerto Rican style (Albondigas guisadas)" +27118120,"STEWED,SEASONED GROUND BEEF,PUERTO RICAN STYLE","Stewed seasoned ground beef, Puerto Rican style (Picadillo guisado, picadillo de carne)" +27118130,"STEWED DRIED BEEF, P.R. (TASAJO GUISADO)","Stewed dried beef, Puerto Rican style (Tasajo guisado, carne cecina guisada)" +27118140,"STUFFED POT ROAST, P.R.,NFS(ASSUME GRAVY,STUFFING)","Stuffed pot roast, Puerto Rican style, NFS (assume with gravy and stuffing)" +27118180,"BEEF STEW, P.R., MEAT W/ GRAVY (POTATO SEPARATE)","Puerto Rican style beef stew, meat with gravy (potatoes reported separately)" +27120020,"HAM/PORK W/ GRAVY (MIXTURE)","Ham or pork with gravy (mixture)" +27120030,"HAM/PORK W/ BARBECUE SAUCE","Ham or pork with barbecue sauce (mixture)" +27120060,"SWEET & SOUR PORK","Sweet and sour pork" +27120080,"HAM STROGANOFF (INCL HAM W/ CREAM OR WHITE SAUCE)","Ham stroganoff" +27120090,"HAM/PORK W/ (MUSHROOM) SOUP-BASE SAUCE (MIXTURE)","Ham or pork with (mushroom) soup (mixture)" +27120100,"HAM/PORK W/ TOMATO-BASED SAUCE (MIXTURE)","Ham or pork with tomato-based sauce (mixture)" +27120110,"SAUSAGE W/ TOMATO-BASED SAUCE (MIXTURE)","Sausage with tomato-based sauce (mixture)" +27120120,"SAUSAGE GRAVY","Sausage gravy" +27120130,"MEXICAN STYLE PORK STEW,NO POT,TOM-BASE SCE(MIXTUR","Mexican style pork stew, no potatoes, tomato-based sauce (mixture) (cerdo guisado sin papas)" +27120150,"PORK OR HAM W/ SOY-BASED SAUCE (MIXTURE)","Pork or ham with soy-based sauce (mixture)" +27120160,"PORK CURRY","Pork curry" +27120210,"FRANKFURTER /HOT DOG,W/CHILI,NO BUN (INCL CHILI DOG,NO BUN)","Frankfurter or hot dog, with chili, no bun" +27120250,"FRANKFURTERS/HOT DOGS W/ TOM-BASED SCE (MIXTURE)","Frankfurters or hot dogs with tomato-based sauce (mixture)" +27121000,"PORK W/ CHILE & TOM (MIXTURE) (PUERCO CON CHILE)","Pork with chili and tomatoes (mixture) (Puerco con chile)" +27121010,"STEWED PORK, P.R.","Stewed pork, Puerto Rican style" +27121410,"CHILI CON CARNE W/ BEANS, MADE W/ PORK","Chili con carne with beans, made with pork" +27130010,"LAMB W/ GRAVY (MIXTURE)","Lamb or mutton with gravy (mixture)" +27130040,"SPAGHETTI SAUCE W/ LAMB, HOMEMADE-STYLE","Spaghetti sauce with lamb or mutton, homemade-style" +27130050,"LAMB GOULASH","Lamb or mutton goulash" +27130100,"LAMB OR MUTTON CURRY","Lamb or mutton curry" +27133010,"STEWED GOAT, P.R. (CABRITO EN FRICASE)","Stewed goat, Puerto Rican style (Cabrito en fricase, chilindron de chivo)" +27135010,"VEAL W/ GRAVY (MIXTURE)","Veal with gravy (mixture)" +27135020,"VEAL SCALLOPINI","Veal scallopini" +27135030,"VEAL W/ CREAM SAUCE (INCLUDE VEAL PAPRIKASH)","Veal with cream sauce (mixture)" +27135040,"VEAL W/ BUTTER SAUCE","Veal with butter sauce (mixture)" +27135050,"VEAL MARSALA","Veal Marsala" +27135110,"VEAL PARMIGIANA","Veal parmigiana" +27135150,"VEAL CORDON BLEU","Veal cordon bleu" +27136050,"VENISON/DEER W/ TOMATO-BASED SAUCE (MIXTURE)","Venison/deer with tomato-based sauce (mixture)" +27136080,"VENISON/DEER W/ GRAVY","Venison/deer with gravy (mixture)" +27136100,"CHILI CON CARNE W/ VENISON/DEER & BEANS","Chili con carne with venison/deer and beans" +27141000,"CHICKEN CACCIATORE (INCLUDE CHICKEN W/TOMATO SAUCE)","Chicken or turkey cacciatore" +27141030,"SPAGHETTI SAUCE W/ POULTRY, HOMEMADE","Spaghetti sauce with poultry, home-made style" +27141050,"STEWED CHICKEN W/ TOMATO SAUCE, MEXICAN STYLE","Stewed chicken with tomato-based sauce, Mexican style (mixture) (Pollo guisado con tomate)" +27141500,"CHILI CON CARNE W/ CHICKEN & BEANS","Chili con carne with chicken or turkey and beans" +27142000,"CHICKEN W/ GRAVY (MIXTURE)","Chicken with gravy (mixture)" +27142100,"CHICKEN FRICASSEE","Chicken or turkey fricassee" +27142200,"TURKEY W/ GRAVY (MIXTURE)","Turkey with gravy (mixture)" +27143000,"CHICKEN OR TURKEY W/ CREAM SAUCE (MIXTURE)","Chicken or turkey with cream sauce (mixture)" +27144000,"CHICKEN W/ (MUSHROOM) SOUP-BASED SAUCE (MIXTURE)","Chicken or turkey with (mushroom) soup (mixture)" +27145000,"CHICKEN TERIYAKI","Chicken or turkey teriyaki (chicken or turkey with soy-based sauce)" +27146000,"CHICKEN OR TURKEY W/ BBQ SAUCE, SKIN EATEN","Chicken or turkey with barbecue sauce, skin eaten" +27146010,"CHICKEN OR TURKEY W/ BBQ SAUCE, SKIN NOT EATEN","Chicken or turkey with barbecue sauce, skin not eaten" +27146050,"CHICKEN WING W/ HOT PEPPER SCE (INCL BUFFALO WING)","Chicken wing with hot pepper sauce" +27146100,"SWEET & SOUR CHICKEN","Sweet and sour chicken or turkey" +27146110,"SWEET AND SOUR CHICKEN OR TURKEY, WITHOUT VEGETABLES","Sweet and sour chicken or turkey, without vegetables" +27146150,"CHICKEN CURRY","Chicken curry" +27146160,"CHICKEN WITH MOLE SAUCE","Chicken with mole sauce" +27146200,"CHICKEN W/ CHEESE SAUCE (MIXTURE)","Chicken or turkey with cheese sauce (mixture)" +27146250,"CHICKEN CORDON BLEU","Chicken or turkey cordon bleu" +27146300,"CHICKEN PARMIGIANA","Chicken or turkey parmigiana" +27146350,"ORANGE CHICKEN","Orange chicken" +27146360,"SESAME CHICKEN","Sesame chicken" +27146400,"CHICKEN KIEV","Chicken kiev" +27148010,"STUFFED CHICKEN, DRUMSTICK OR BREAST, P.R.","Stuffed chicken, drumstick or breast, Puerto Rican style (Muslo de pollo o pechuga rellena)" +27150010,"FISH W/ CREAM OR WHITE SAUCE, NOT TUNA OR LOBSTER","Fish with cream or white sauce, not tuna or lobster (mixture)" +27150020,"CRAB, DEVILED","Crab, deviled" +27150030,"CRAB IMPERIAL (INCLUDE STUFFED CRAB)","Crab imperial" +27150050,"FISH TIMBALE OR MOUSSE","Fish timbale or mousse" +27150060,"LOBSTER NEWBURG (INCLUDE LOBSTER THERMIDOR)","Lobster newburg" +27150070,"LOBSTER W/ BUTTER SAUCE (INCLUDE LOBSTER NORFOLK)","Lobster with butter sauce (mixture)" +27150100,"SHRIMP CURRY","Shrimp curry" +27150110,"SHRIMP COCKTAIL (SHRIMP W/ COCKTAIL SAUCE)","Shrimp cocktail (shrimp with cocktail sauce)" +27150120,"TUNA W/ CREAM OR WHITE SAUCE (MIXTURE)","Tuna with cream or white sauce (mixture)" +27150130,"SEAFOOD NEWBURG (INCLUDE CRABMEAT THERMIDOR)","Seafood newburg" +27150140,"CLAM SAUCE, WHITE","Clam sauce, white" +27150160,"SHRIMP W/ LOBSTER SAUCE (MIXTURE)","Shrimp with lobster sauce (mixture)" +27150170,"SWEET & SOUR SHRIMP","Sweet and sour shrimp" +27150190,"LOBSTER SAUCE (BROTH-BASED)","Lobster sauce (broth-based)" +27150200,"OYSTER SCE (WHITE SCE-BASED)","Oyster sauce (white sauce-based)" +27150210,"FISH SAUCE (BAGOONG)","Fish sauce (bagoong)" +27150230,"SHRIMP SCAMPI","Shrimp scampi" +27150250,"FISH MOOCHIM (KOREAN STYLE), DRIED FISH W/ SOY SCE","Fish moochim (Korean style), dried fish with soy sauce" +27150310,"FISH W/ TOMATO-BASED SAUCE (MIXTURE)","Fish with tomato-based sauce (mixture)" +27150320,"FISH CURRY","Fish curry" +27150330,"MUSSELS W/ TOMATO-BASED SAUCE (MIXTURE)","Mussels with tomato-based sauce (mixture)" +27150350,"SARDINES W/ TOMATO-BASED SAUCE (MIXTURE)","Sardines with tomato-based sauce (mixture)" +27150370,"SARDINES W/ MUSTARD SAUCE (MIXTURE)","Sardines with mustard sauce (mixture)" +27150410,"SHRIMP TERIYAKI","Shrimp teriyaki (shrimp with soy-based sauce) (mixture)" +27150510,"SCALLOPS W/ CHEESE SAUCE (MIXTURE)","Scallops with cheese sauce (mixture)" +27151030,"MARINATED FISH (CEVICHE)","Marinated fish (Ceviche)" +27151040,"CRABS IN TOMATO-BASED SAUCE, PUERTO RICAN STYLE","Crabs in tomato-based sauce, Puerto Rican style (mixture) (Salmorejo de jueyes)" +27151050,"SHRIMP IN GARLIC SAUCE, P.R. (CAMARONES AL AJILLO)","Shrimp in garlic sauce, Puerto Rican style (mixture) (Camarones al ajillo)" +27151070,"STEWED CODFISH, PUERTO RICAN STYLE, NO POTATOES","Stewed codfish, Puerto Rican style, no potatoes (potatoes reported separately)" +27160010,"MEAT W/ BARBECUE SAUCE, NS AS TO TYPE OF MEAT","Meat with barbecue sauce, NS as to type of meat (mixture)" +27160100,"MEATBALLS, NS AS TO TYPE OF MEAT, W/ SAUCE","Meatballs, NS as to type of meat, with sauce (mixture)" +27161010,"MEAT LOAF, P.R. (ALBONDIGON)","Puerto Rican style meat loaf (Albondigon)" +27162010,"MEAT W/ TOMATO-BASED SAUCE","Meat with tomato-based sauce (mixture)" +27162050,"SPAGHETTI SAUCE W/ COMBINATION OF MEATS, HOMEMADE","Spaghetti sauce with combination of meats, homemade-style" +27162060,"SPAGHETTI SAUCE W/ MEAT & VEGETABLES, HOMEMADE-STYLE","Spaghetti sauce with meat and vegetables, homemade-style" +27162500,"STEWED SEASONED GROUND BEEF & PORK, MEXICAN","Stewed, seasoned, ground beef and pork, Mexican style (Picadillo de carne de rez y puerco)" +27163010,"MEAT W/ GRAVY, NS AS TO TYPE OF MEAT (MIXTURE)","Meat with gravy, NS as to type of meat (mixture)" +27211000,"BEEF & POTATOES, NO SAUCE (MIXTURE)","Beef and potatoes, no sauce (mixture)" +27211100,"BEEF STEW W/ POTATOES, TOMATO-BASED SAUCE","Beef stew with potatoes, tomato-based sauce (mixture)" +27211110,"MEXICAN BEEF STEW W/POT,TOM SCE (CARNE GUISADA CON)","Mexican style beef stew with potatoes, tomato-based sauce (mixture) (Carne guisada con papas)" +27211150,"BEEF GOULASH W/ POTATOES (INCL BEEF GOULASH, NFS)","Beef goulash with potatoes" +27211190,"BEEF & POTATOES W/ CREAM, WHITE, MUSHROOM SOUP SCE (MIXTURE)","Beef and potatoes with cream sauce, white sauce or mushroom soup-based sauce (mixture)" +27211200,"BEEF STEW W/ POTATOES, GRAVY","Beef stew with potatoes, gravy" +27211300,"BEEF (ROAST) HASH","Beef (roast) hash" +27211400,"CORNED BEEF HASH","Corned beef hash" +27211500,"BEEF & POTATOES W/ CHEESE SAUCE (MIXTURE)","Beef and potatoes with cheese sauce (mixture)" +27211550,"STEWED SEASONED GROUND BEEF W/ POTATOES, MEXICAN","Stewed, seasoned, ground beef with potatoes, Mexican style (Picadillo de carne de rez con papas)" +27212000,"BEEF & NOODLES, NO SAUCE","Beef and noodles, no sauce (mixture)" +27212050,"BEEF & MACARONI WITH CHEESE SAUCE (MIXTURE)","Beef and macaroni with cheese sauce (mixture)" +27212100,"BEEF & NOODLES W/ TOMATO-BASED SAUCE (MIXTURE)","Beef and noodles with tomato-based sauce (mixture)" +27212120,"CHILI CON CARNE W/ BEANS & MACARONI","Chili con carne with beans and macaroni" +27212150,"BEEF GOULASH W/ NOODLES","Beef goulash with noodles" +27212200,"BEEF & NOODLES W/ GRAVY (MIXTURE)","Beef and noodles with gravy (mixture)" +27212300,"BEEF & NOODLES W/ CREAM OR WHITE SAUCE (MIXTURE)","Beef and noodles with cream or white sauce (mixture)" +27212350,"BEEF STROGANOFF W/ NOODLES","Beef stroganoff with noodles" +27212400,"BEEF & NOODLES W/ (MUSHROOM) SOUP (MIXTURE)","Beef and noodles with (mushroom) soup (mixture)" +27212500,"BEEF AND NOODLES WITH SOY-BASED SAUCE (MIXTURE)","Beef and noodles with soy-based sauce (mixture)" +27213000,"BEEF & RICE, NO SAUCE (MIXTURE)","Beef and rice, no sauce (mixture)" +27213010,"BIRYANI WITH MEAT","Biryani with meat" +27213100,"BEEF & RICE W/ TOMATO-BASED SAUCE (MIXTURE)","Beef and rice with tomato-based sauce (mixture)" +27213120,"PORCUPINE BALLS W/ TOMATO-BASED SAUCE (MIXTURE)","Porcupine balls with tomato-based sauce (mixture)" +27213150,"CHILI CON CARNE W/ BEANS & RICE","Chili con carne with beans and rice" +27213200,"BEEF & RICE W/ GRAVY (MIXTURE)","Beef and rice with gravy (mixture)" +27213300,"BEEF & RICE W/ CREAM SAUCE (MIXTURE)","Beef and rice with cream sauce (mixture)" +27213400,"BEEF & RICE W/ (MUSHROOM) SOUP (MIXTURE)","Beef and rice with (mushroom) soup (mixture)" +27213420,"PORCUPINE BALLS W/ (MUSHROOM) SOUP (MIXTURE)","Porcupine balls with (mushroom) soup (mixture)" +27213500,"BEEF & RICE W/ SOY-BASED SAUCE (MIXTURE)","Beef and rice with soy-based sauce (mixture)" +27213600,"BEEF AND RICE WITH CHEESE SAUCE (MIXTURE)","Beef and rice with cheese sauce (mixture)" +27214100,"MEAT LOAF MADE W/ BEEF","Meat loaf made with beef" +27214110,"MEAT LOAF W/ BEEF, W/ TOMATO SAUCE","Meat loaf made with beef, with tomato-based sauce" +27214300,"BEEF WELLINGTON","Beef wellington" +27214500,"CORNED BEEF PATTY","Corned beef patty" +27214600,"CREAMED DRIED BEEF ON TOAST","Creamed dried beef on toast" +27218110,"STUFFED POT ROAST (LARDED MEAT) W/ POTATOES, P.R.","Puerto Rican style stuffed pot roast (larded meat) with potatoes (Carne mechada con papas boliche)" +27218210,"BEEF STEW, P.R. W/ POTATOES (CARNE GUISADA CON PAPAS)","Puerto Rican style beef stew with potatoes (Carne guisada con papas)" +27218310,"STEWED CORNED BEEF, P.R. (""CORNED BEEF"" GUISADO)","Stewed corned beef, Puerto Rican style (""Corned beef"" guisado)" +27220010,"MEAT LOAF MADE W/ HAM (NOT LUNCHEON MEAT)","Meat loaf made with ham (not luncheon meat)" +27220020,"HAM & NOODLES W/ CREAM OR WHITE SAUCE (MIXTURE)","Ham and noodles with cream or white sauce (mixture)" +27220030,"HAM & RICE W/ (MUSHROOM) SOUP (MIXTURE)","Ham and rice with (mushroom) soup (mixture)" +27220050,"HAM OR PORK W/ STUFFING","Ham or pork with stuffing (mixture)" +27220080,"HAM CROQUETTE","Ham croquette" +27220110,"PORK & RICE W/ TOMATO-BASED SAUCE (MIXTURE)","Pork and rice with tomato-based sauce (mixture)" +27220120,"SAUSAGE & RICE W/ TOMATO-BASED SAUCE (MIXTURE)","Sausage and rice with tomato-based sauce (mixture)" +27220150,"SAUSAGE & RICE W/ (MUSHROOM) SOUP (MIXTURE)","Sausage and rice with (mushroom) soup (mixture)" +27220170,"SAUSAGE & RICE W/ CHEESE SAUCE (MIXTURE)","Sausage and rice with cheese sauce (mixture)" +27220190,"SAUSAGE & NOODLES W/ CREAM OR WHITE SAUCE (MIXTURE)","Sausage and noodles with cream or white sauce (mixture)" +27220210,"HAM & NOODLES, NO SAUCE (MIXTURE)","Ham and noodles, no sauce (mixture)" +27220310,"HAM & RICE, NO SAUCE (MIXTURE)","Ham or pork and rice, no sauce (mixture)" +27220510,"HAM/PORK & POTATOES W/ GRAVY (MIXTURE)","Ham or pork and potatoes with gravy (mixture)" +27220520,"PORK & POTATOES W/ CHEESE SAUCE","Ham or pork and potatoes with cheese sauce (mixture)" +27221100,"STEWED PIG'S FEET, P.R. (PATITAS DE CERDO GUISADAS)","Stewed pig's feet, Puerto Rican style (Patitas de cerdo guisadas)" +27221110,"STUFFED PORK ROAST, P.R.","Stuffed pork roast, Puerto Rican style" +27221150,"MEXICAN STYLE PORK STEW W/POT,TOM-BASE SCE(MIXTURE)","Mexican style pork stew, with potatoes, tomato-based sauce (mixture) (cerdo guisado con papas)" +27230010,"LAMB LOAF","Lamb or mutton loaf" +27231000,"LAMB OR MUTTON & POTATOES W/ GRAVY (MIXTURE)","Lamb or mutton and potatoes with gravy (mixture)" +27232000,"LAMB & POTATOES W/ TOMATO-BASED SAUCE (MIXTURE)","Lamb or mutton and potatoes with tomato-based sauce (mixture)" +27233000,"LAMB OR MUTTON & NOODLES W/ GRAVY (MIXTURE)","Lamb or mutton and noodles with gravy (mixture)" +27235000,"MEAT LOAF MADE WITH VENISON/DEER","Meat loaf made with venison/deer" +27235750,"VEAL & NOODLES W/ CREAM/WHITE SCE (MIXTURE)","Veal and noodles with cream or white sauce (mixture)" +27236000,"VENISON/DEER & NOODLE MIXTURE W/ CREAM/WHITE SAUCE","Venison/deer and noodles with cream or white sauce (mixture)" +27241000,"CHICKEN OR TURKEY HASH","Chicken or turkey hash" +27241010,"CHICKEN OR TURKEY & POTATOES W/ GRAVY (MIXTURE)","Chicken or turkey and potatoes with gravy (mixture)" +27242000,"CHICKEN OR TURKEY & NOODLES, NO SAUCE (MIXTURE)","Chicken or turkey and noodles, no sauce (mixture)" +27242200,"CHICKEN OR TURKEY & NOODLES W/ GRAVY (MIXTURE)","Chicken or turkey and noodles with gravy (mixture)" +27242250,"CHICKEN OR TURKEY & NOODLES W/ (MUSHROOM) SOUP","Chicken or turkey and noodles with (mushroom) soup (mixture)" +27242300,"CHICKEN OR TURKEY & NOODLES W/ CREAM OR WHITE SAUCE","Chicken or turkey and noodles with cream or white sauce (mixture)" +27242310,"CHICKEN & NOODLES W/ CHEESE SAUCE","Chicken or turkey and noodles with cheese sauce (mixture)" +27242350,"CHICKEN OR TURKEY TETRAZZINI","Chicken or turkey tetrazzini" +27242400,"CHICKEN & NOODLES, TOMATO-BASED SAUCE (MIXTURE)","Chicken or turkey and noodles, tomato-based sauce (mixture)" +27242500,"CHICKEN OR TURKEY AND NOODLES WITH SOY-BASED SAUCE (MIXTURE)","Chicken or turkey and noodles with soy-based sauce (mixture)" +27243000,"CHICKEN & RICE, NO SAUCE (MIXTURE)","Chicken or turkey and rice, no sauce (mixture)" +27243100,"BIRYANI WITH CHICKEN","Biryani with chicken" +27243300,"CHICKEN & RICE W/ CREAM SAUCE (MIXTURE)","Chicken or turkey and rice with cream sauce (mixture)" +27243400,"CHICKEN & RICE W/ (MUSHROOM) SOUP-BASED SAUCE","Chicken or turkey and rice with (mushroom) soup (mixture)" +27243500,"CHICKEN & RICE W/ TOMATO-BASED SAUCE (MIXTURE)","Chicken or turkey and rice with tomato-based sauce (mixture)" +27243600,"CHICKEN & RICE W/ SOY-BASED SAUCE (MIXTURE)","Chicken or turkey and rice with soy-based sauce (mixture)" +27243700,"CHICKEN IN CHEESE SCE W/ SPANISH RICE","Chicken in cheese sauce with Spanish rice" +27246100,"CHICKEN W/ DUMPLINGS (MIXTURE)","Chicken or turkey with dumplings (mixture)" +27246200,"CHICKEN W/ STUFFING (MIXTURE)","Chicken or turkey with stuffing (mixture)" +27246300,"CHICKEN OR TURKEY CAKE, PATTY OR CROQUETTE","Chicken or turkey cake, patty, or croquette" +27246400,"CHICKEN SOUFFLE","Chicken or turkey souffle" +27246500,"MEAT LOAF MADE W/ CHICKEN OR TURKEY","Meat loaf made with chicken or turkey" +27246505,"MEAT LOAF W/ CHICKEN OR TURKEY, W/ TOMATO SAUCE","Meat loaf made with chicken or turkey, with tomato-based sauce" +27250020,"CLAMS, STUFFED","Clams, stuffed" +27250030,"CODFISH BALL OR CAKE","Codfish ball or cake" +27250040,"CRAB CAKE","Crab cake" +27250050,"FISH CAKE OR PATTY, NS AS TO FISH","Fish cake or patty, NS as to fish" +27250060,"GEFILTE FISH","Gefilte fish" +27250070,"SALMON CAKE OR PATTY (INCLUDE SALMON CROQUETTE)","Salmon cake or patty" +27250080,"SALMON LOAF","Salmon loaf" +27250110,"SCALLOPS & NOODLES W/ CHEESE SAUCE (MIXTURE)","Scallops and noodles with cheese sauce (mixture)" +27250120,"SHRIMP AND NOODLES, NO SAUCE (MIXTURE)","Shrimp and noodles, no sauce (mixture)" +27250122,"SHRIMP AND NOODLES WITH GRAVY (MIXTURE)","Shrimp and noodles with gravy (mixture)" +27250124,"SHRIMP AND NOODLES WITH (MUSHROOM) SOUP (MIXTURE)","Shrimp and noodles with (mushroom) soup (mixture)" +27250126,"SHRIMP AND NOODLES WITH CREAM OR WHITE SAUCE (MIXTURE)","Shrimp and noodles with cream or white sauce (mixture)" +27250128,"SHRIMP AND NOODLES WITH SOY-BASED SAUCE (MIXTURE)","Shrimp and noodles with soy-based sauce (mixture)" +27250130,"SHRIMP & NOODLES W/ CHEESE SAUCE","Shrimp and noodles with cheese sauce (mixture)" +27250132,"SHRIMP AND NOODLES WITH TOMATO SAUCE (MIXTURE)","Shrimp and noodles with tomato sauce (mixture)" +27250150,"TUNA LOAF","Tuna loaf" +27250160,"TUNA CAKE OR PATTY","Tuna cake or patty" +27250210,"CLAM CAKE OR PATTY (INCLUDE DEVILED)","Clam cake or patty" +27250220,"OYSTER FRITTER","Oyster fritter" +27250250,"FLOUNDER W/CRAB STUFFING","Flounder with crab stuffing" +27250260,"LOBSTER W/ BREAD STUFFING,BAKED","Lobster with bread stuffing, baked" +27250270,"CLAMS, CASINO","Clams Casino" +27250300,"MACKEREL CAKE OR PATTY","Mackerel cake or patty" +27250310,"HADDOCK CAKE OR PATTY","Haddock cake or patty" +27250400,"SHRIMP CAKE OR PATTY (INCL SHRIMP BURGER OR STICK)","Shrimp cake or patty" +27250410,"SHRIMP W/ CRAB STUFFING","Shrimp with crab stuffing" +27250450,"SHRIMP TOAST, FRIED","Shrimp toast, fried" +27250520,"SEAFOOD, RESTRUCTURED (INCL IMITATION CRABMEAT)","Seafood restructured" +27250550,"SEAFOOD SOUFFLE","Seafood souffle" +27250610,"TUNA NOODLE CASSEROLE W/ CREAM OR WHITE SAUCE","Tuna noodle casserole with cream or white sauce" +27250630,"TUNA NOODLE CASSEROLE W/ (MUSHROOM) SOUP","Tuna noodle casserole with (mushroom) soup" +27250710,"TUNA & RICE W/ (MUSHROOM) SOUP (MIXTURE)","Tuna and rice with (mushroom) soup (mixture)" +27250810,"FISH & RICE W/ TOMATO-BASED SAUCE","Fish and rice with tomato-based sauce" +27250820,"FISH & RICE W/ CREAM SAUCE","Fish and rice with cream sauce" +27250830,"FISH & RICE W/ (MUSHROOM) SOUP","Fish and rice with (mushroom) soup" +27250900,"FISH & NOODLES W/ (MUSHROOM) SOUP (MIXTURE)","Fish and noodles with (mushroom) soup" +27250950,"SHELLFISH & NOODLES, TOMATO-BASED SAUCE","Shellfish mixture and noodles, tomato-based sauce (mixture)" +27251010,"STEWED SALMON, P.R. (SALMON GUISADO)","Stewed salmon, Puerto Rican style (Salmon guisado)" +27260010,"MEATLOAF, NS AS TO TYPE OF MEAT","Meat loaf, NS as to type of meat" +27260050,"MEATBALLS, W/ BREADING, W/ GRAVY","Meatballs, with breading, NS as to type of meat, with gravy" +27260080,"MEAT LOAF MADE W/ BEEF & PORK","Meat loaf made with beef and pork" +27260090,"MEAT LOAF W/ BEEF, VEAL & PORK","Meat loaf made with beef, veal and pork" +27260100,"MEAT LOAF W/ BEEF & PORK, W/ TOMATO SAUCE","Meat loaf made with beef and pork, with tomato-based sauce" +27260110,"HASH, NS AS TO TYPE OF MEAT","Hash, NS as to type of meat" +27260500,"VIENNA SAUSAGES STEWED W/ POTATOES, P.R.","Vienna sausages stewed with potatoes, Puerto Rican style (Salchichas guisadas)" +27260510,"LIVER DUMPLING","Liver dumpling" +27261000,"BREADED BRAINS, P.R. (SESOS REBOSADOS)","Breaded brains, Puerto Rican style (Sesos rebosados)" +27261500,"STEWED SEASONED GROUND BEEF&PORK,W/POT, MEXICAN","Stewed, seasoned, ground beef and pork, with potatoes, Mexican style (Picadillo de carne de rez y puerco con papas)" +27311110,"BEEF, POTATOES, & VEG (W/ CAR/DK GREEN), NO SAUCE","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27311120,"BEEF, POTATOES, & VEG (NO CAR/DK GREEN), NO SAUCE","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27311210,"CORNED BEEF, POT & VEG(W/ CAR/DK GREEN), NO SAUCE","Corned beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27311220,"CORNED BEEF, POTATO & VEG (NO CAR/DK GRN), NO SAUCE","Corned beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27311310,"BEEF STEW W/ POT & VEG(W/ CAR/DK GRN), TOMATO SAUCE","Beef stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27311320,"BEEF STEW W/ POT & VEG (NO CAR/DK GREEN), TOM SAUCE","Beef stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce" +27311410,"BEEF STEW W/ POT & VEG (W/ CAR, DK GREEN), GRAVY","Beef stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy" +27311420,"BEEF STEW W/ POT & VEG (NO CAR, DK GREEN), GRAVY","Beef stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy" +27311510,"SHEPHERD'S PIE W/ BEEF","Shepherd's pie with beef" +27311600,"BEEF, POT, & VEG (INCL CAR/DK GRN), GRAVY","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27311605,"BEEF, POT, & VEG (NO CAR/DK GREEN), GRAVY","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27311610,"BEEF, POT & VEG (INCL CAR/DK GRN), CR/SOUP-BASED SAUCE","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27311620,"BEEF, POT & VEG (NO CAR/DK GRN), CR/SOUP-BASED SAUCE","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27311625,"BEEF, POT, & VEG (INCL CAR/DK GRN), TOMATO-BASED SAUCE","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27311630,"BEEF, POT, & VEG (NO CAR/DK GREEN), TOMATO-BASED SAUCE","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27311635,"BEEF, POT, & VEG (INCL CAR/DK GRN), CHEESE SAUCE","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), cheese sauce (mixture)" +27311640,"BEEF, POT, & VEG (NO CAR/DK GREEN), CHEESE SAUCE","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27311645,"BEEF, POT, & VEG (INCL CAR/DK GRN), SOY-BASED SAUCE","Beef, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), soy-based sauce (mixture)" +27311650,"BEEF, POT, & VEG (NO CAR/DK GREEN), SOY-BASED SAUCE","Beef, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), soy-based sauce (mixture)" +27313010,"BEEF, NOODLES & VEG (W/ CARROTS/DK GREEN), NO SAUCE","Beef, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27313020,"BEEF, NOODLES & VEG (NO CARROTS/DK GREEN), NO SAUCE","Beef, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27313110,"BEEF CHOW MEIN OR CHOP SUEY W/ NOODLES","Beef chow mein or chop suey with noodles" +27313150,"BEEF, NOODLES & VEG (W/ CAR/DK GREEN), SOY SAUCE","Beef, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), soy-based sauce (mixture)" +27313160,"BEEF, NOODLES & VEG (NO CAR/DK GREEN), SOY SAUCE","Beef, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), soy-based sauce (mixture)" +27313210,"BEEF, NOODLES & VEG (W/ CAR/DK GREEN), TOMATO SAUCE","Beef, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27313220,"BEEF, NOODLES & VEG (NO CAR/DK GREEN), TOMATO SAUCE","Beef, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27313310,"BEEF, NOODLES, VEG(INCL CARROTS/DK GREEN), SOUP","Beef, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), (mushroom) soup (mixture)" +27313320,"BEEF, NOODLES, VEG (NO CARROTS/DK GREEN), SOUP","Beef, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), (mushroom) soup (mixture)" +27313410,"BEEF, NOODLES, & VEG (INCL CAR/DK GRN), GRAVY","Beef, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27313420,"BEEF, NOODLES, & VEG (NO CAR/DK GRN), GRAVY","Beef, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27315010,"BEEF, RICE & VEG (W/ CARROTS/DK GREEN), NO SAUCE","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27315020,"BEEF, RICE & VEG (NO CARROTS/DK GREEN), NO SAUCE","Beef, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27315210,"BEEF, RICE & VEG (W/ CAR/DK GREEN), TOMATO SAUCE","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27315220,"BEEF, RICE & VEG (NO CAR/DK GREEN), TOMATO SAUCE","Beef, rice, and vegetables (excluding carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27315250,"STUFFED CABBAGE ROLLS W/ BEEF AND RICE","Stuffed cabbage rolls with beef and rice" +27315270,"STUFFED GRAPE LEAVES W/ BEEF & RICE","Stuffed grape leaves with beef and rice" +27315310,"BEEF, RICE & VEGETABLES (W/ CARROTS/DK GREEN), SOUP","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), (mushroom) soup (mixture)" +27315320,"BEEF, RICE & VEGETABLES (NO CARROTS/DK GREEN), SOUP","Beef, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), (mushroom) soup (mixture)" +27315330,"BEEF, RICE & VEG (INCL CAR/DK GRN), CHEESE SAUCE","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), cheese sauce (mixture)" +27315340,"BEEF, RICE & VEG (NO CAR/DK GRN), CHEESE SAUCE","Beef, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27315410,"BEEF, RICE & VEG (INCL CAR/DK GRN), GRAVY, MIXTURE","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27315420,"BEEF, RICE & VEG (NO CAR/DK GRN), GRAVY, MIXTURE","Beef, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27315510,"BEEF, RICE & VEG (INCL CAR/DK GRN), SOY-BASED SAUCE","Beef, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), soy-based sauce (mixture)" +27315520,"BEEF, RICE & VEG (NO CAR/DK GRN), SOY-BASED SAUCE","Beef, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), soy-based sauce (mixture)" +27317010,"BEEF POT PIE (INCLUDE GREEK MEAT PIE)","Beef pot pie" +27317100,"BEEF, DUMPLINGS & VEG (INCL CAR/DK GRN), GRAVY","Beef, dumplings, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27317110,"BEEF, DUMPLINGS & VEG (NO CAR/DK GRN), GRAVY","Beef, dumplings, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27319010,"STUFFED GREEN PEPPER, P.R. (PIMIENTO RELLENO)","Stuffed green pepper, Puerto Rican style (Pimiento relleno)" +27320020,"HAM POT PIE","Ham pot pie" +27320025,"HAM OR PORK, NOODLES, VEG (NO CAR, BROC, DK GRN)NO SAUCE","Ham or pork, noodles and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27320027,"HAM OR PORK, NOODLES, VEG (INCL CAR, BROC, DARK GREEN)NO SAU","Ham or pork, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27320030,"HAM/PORK, NOODLES & VEG (NO CAR/DK GR), CHEESE SCE","Ham or pork, noodles and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27320040,"PORK, POTATOES & VEG (W/ CAR, DK GREEN), NO SAUCE","Pork, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27320070,"PORK, NOODLES, VEG (INCL CAR/DK GRN), TOMATO SAUCE","Ham or pork, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27320080,"SAUSAGE, NOODLES, VEG (NO CAR/DK GRN), TOMATO SAUCE","Sausage, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce" +27320090,"SAUSAGE, NOODLES, VEG (W/ CAR/DK GRN), TOMATO SAUCE","Sausage, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27320100,"PORK, POTATOES & VEG (W/ CAR, DK GREEN), TOMATO SCE","Pork, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27320110,"PORK, POTATOES & VEG (NO CAR, DK GREEN), TOMATO SCE","Pork, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27320120,"SAUSAGE, POT, & VEG (INCL CAR/BROC/DK GREEN), GRAVY","Sausage, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27320130,"SAUSAGE, POT, & VEG (NO CAR/BROC/DK GREEN), GRAVY","Sausage, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27320140,"PORK, POT, & VEG (INCL CAR/DK GRN), GRAVY, MIXTURE","Pork, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27320150,"PORK, POT, & VEG (NO CAR/DK GRN), GRAVY, MIXTURE","Pork, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27320210,"PORK, POTATOES & VEG (NO CAR, DK GREEN), NO SAUCE","Pork, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27320310,"PORK CHOW MEIN OR CHOP SUEY W/ NOODLES","Pork chow mein or chop suey with noodles" +27320320,"PORK, RICE & VEG (INCL CAR/DK GRN), SOY-BASED SAUCE","Pork, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), soy-based sauce (mixture)" +27320330,"PORK, RICE & VEG (NO CAR/DK GRN), SOY-BASED SAUCE","Pork, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), soy-based sauce (mixture)" +27320340,"PORK, RICE & VEG (INCL CAR/DK GRN), TOMATO SAUCE","Pork, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27320350,"PORK, RICE & VEG (NO CAR/DK GRN), TOMATO SAUCE","Pork, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27320410,"HAM, POTATOES & VEG (NO CARROTS/DK GREEN), NO SAUCE","Ham, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27320450,"HAM, POTATOES & VEG (W/ CARROTS/DK GREEN), NO SAUCE","Ham, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27320500,"SWEET & SOUR PORK W/ RICE","Sweet and sour pork with rice" +27330010,"SHEPHERD'S PIE W/ LAMB","Shepherd's pie with lamb" +27330030,"LAMB STEW W/ POT & VEG (INCL CAR/DK GREEN), GRAVY","Lamb or mutton stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy" +27330050,"LAMB, RICE & VEGETABLES (NO CARROT/DK GREEN), GRAVY","Lamb or mutton, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27330060,"LAMB, RICE & VEG (INCL CAR/DK GRN), TOMATO SAUCE","Lamb or mutton, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27330080,"LAMB, RICE, & VEGETABLES (INCL CAR, DK GRN), GRAVY","Lamb or mutton, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy" +27330110,"LAMB STEW W/ POT & VEG (NO CAR/DK GREEN), GRAVY","Lamb or mutton stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy" +27330170,"STUFFED GRAPE LEAVES W/ LAMB & RICE","Stuffed grape leaves with lamb and rice" +27330210,"LAMB STEW W/ POT & VEG (INCL CAR/DK GRN), TOM SAUCE","Lamb or mutton stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27330220,"LAMB STEW W/ POT & VEG (NO CAR/DK GRN), TOMATO SCE","Lamb or mutton stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce" +27331150,"VEAL FRICASSEE, P.R. (TERNERA EN FRICASE)","Veal fricassee, Puerto Rican style (ternera en fricase)" +27332100,"VEAL STEW W/ POT, VEG (INCL CAR/DK GRN) TOM SAUCE","Veal stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27332110,"VEAL STEW W/ POT, VEG (NO CAR,DK GRN), TOMATO SAUCE","Veal stew with potatoes and vegetables (excluding carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27335100,"RABBIT STEW W/ POTATOES & VEGETABLES","Rabbit stew with potatoes and vegetables" +27335500,"STEWED RABBIT, P.R. (FRICASE DE CONEJO)","Stewed rabbit, Puerto Rican style (Fricase de conejo)" +27336100,"VENISON/DEER STEW W/ POTATO & VEG(W/ CAR/DK GRN),TOM SCE","Venison/deer stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27336150,"VENISON/DEER STEW W/ POTATO & VEG(NO CAR/DK GRN),TOM SCE","Venison/deer stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce" +27336200,"VENISON/DEER, POTATOES & VEG (INCL CAR/DK GRN), GRAVY","Venison/deer, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27336250,"VENISON/DEER, POTATOES & VEG (NO CAR/DK GRN), GRAVY","Venison/deer, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27336300,"VENISON/DEER, NOODLES & VEG (INCL CAR/DK GRN),TOM SAUCE","Venison/deer, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27336310,"VENISON/DEER, NOODLES & VEG (NO CAR/DK GRN), TOM SAUCE","Venison/deer, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27341000,"CHICKEN OR TURKEY, POTATOES, CORN, AND CHEESE, WITH GRAVY","Chicken or turkey, potatoes, corn, and cheese, with gravy" +27341010,"CHICKEN, POT & VEG (INCL CAR/DK GRN), NO SAUCE","Chicken or turkey, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27341020,"CHICKEN, POT & VEG (NO CAR/DK GRN), NO SAUCE","Chicken or turkey, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27341025,"CHICKEN, POT & VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27341030,"CHICKEN, POT & VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27341035,"CHICKEN, POT & VEG (INCL CAR/DK GRN), CREAM/SOUP-BASED SAUCE","Chicken or turkey, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27341040,"CHICKEN, POT & VEG (NO CAR/DK GRN), CREAM/SOUP-BASED SAUCE","Chicken or turkey, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27341045,"CHICKEN, POT & VEG (INCL CAR/DK GRN), CHEESE SAUCE","Chicken or turkey, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), cheese sauce (mixture)" +27341050,"CHICKEN, POT & VEG (NO CAR/DK GRN), CHEESE SAUCE","Chicken or turkey, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27341055,"CHICKEN, POT & VEG (INCL CAR/DK GRN), TOMATO-BASED SAUCE","Chicken or turkey, potatoes, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27341060,"CHICKEN, POT & VEG (NO CAR/DK GRN), TOMATO-BASED SAUCE","Chicken or turkey, potatoes, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27341310,"CHICKEN STEW W/ POT, VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy" +27341320,"CHICKEN STEW W/ POT & VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy" +27341510,"CHICKEN STEW W/ POT & VEG(INCL CAR/DK GRN), TOM SCE","Chicken or turkey stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce" +27341520,"CHICKEN STEW W/ POT & VEG(NO CAR/DK GRN), TOM SAUCE","Chicken or turkey stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato- based sauce" +27343010,"CHICKEN, NOODLES & VEG (INCL CAR/DK GRN), NO SAUCE","Chicken or turkey, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27343020,"CHICKEN, NOODLES & VEG (NO CAR/DK GRN), NO SAUCE","Chicken or turkey, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27343410,"CHICKEN, NOODLES & VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27343420,"CHICKEN, NOODLES & VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27343470,"CHICKEN OR TURKEY, NOODLES, AND VEGETABLES (INCLUDING CARROT","Chicken or turkey, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27343480,"CHIX, NDL, VEG(NO CAR/DK GRN), CR/SOUP-BASED SAUCE","Chicken or turkey, noodles, and vegetables (excluding carrots, broccoli, and/or dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27343510,"CHICKEN, NOODLES, VEG (INCL CAR/DK GRN), TOMATO SCE","Chicken or turkey, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27343520,"CHICKEN, NOODLES, VEG (NO CAR/DK GRN), TOMATO SAUCE","Chicken or turkey, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27343910,"CHICKEN CHOW MEIN/CHOP SUEY W/ NOODLES","Chicken or turkey chow mein or chop suey with noodles" +27343950,"CHICKEN, NOODLES & VEG(INCL CAR/DK GRN), CHEESE SCE","Chicken or turkey, noodles, and vegetables (including carrots, broccoli, and/or dark-green leafy), cheese sauce (mixture)" +27343960,"CHICKEN, NOODLES & VEG(NO CAR/DK GRN), CHEESE SAUCE","Chicken or turkey, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27345010,"CHICKEN, RICE & VEG (INCL CAR/DK GRN), NO SAUCE","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27345020,"CHICKEN, RICE & VEG (NO CAR/DK GRN), NO SAUCE","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), no sauce (mixture)" +27345210,"CHICKEN, RICE & VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27345220,"CHICKEN, RICE & VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27345230,"CHICKEN OR TURKEY, RICE, CORN, AND CHEESE WITH GRAVY","Chicken or turkey, rice, corn, and cheese, with gravy" +27345310,"CHICKEN, RICE & VEG (INCL CAR/DK GRN), SOY SAUCE","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), soy-based sauce (mixture)" +27345320,"CHICKEN, RICE & VEG (NO CAR/DK GRN), SOY SAUCE","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), soy-based sauce (mixture)" +27345410,"CHIX, RICE, & VEG(INCL CAR/DK GRN), CR/SOUP-BASED SAU","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27345420,"CHIX, RICE, AND VEG(NO CAR/DK GRN), CR/SOUP-BASED SAU","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), cream sauce, white sauce, or mushroom soup-based sauce (mixture)" +27345440,"CHICKEN, RICE & VEG (INCL CAR/DK GRN), CHEESE SAUCE","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), cheese sauce (mixture)" +27345450,"CHICKEN, RICE, VEG (NO CAR/DK GRN), CHEESE SAUCE","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27345510,"CHICKEN, RICE & VEG (INCL CAR/DK GRN), TOMATO SAUCE","Chicken or turkey, rice, and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-based sauce (mixture)" +27345520,"CHICKEN, RICE & VEG (NO CAR/DK GRN), TOMATO SAUCE","Chicken or turkey, rice, and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-based sauce (mixture)" +27347100,"CHICKEN OR TURKEY POT PIE","Chicken or turkey pot pie" +27347200,"CHICKEN, STUFFING & VEG (INCL CAR/DK GRN), NO SAUCE","Chicken or turkey, stuffing, and vegetables (including carrots, broccoli, and/or dark-green leafy), no sauce (mixture)" +27347210,"CHICKEN, STUFFING, VEG (NO CAR/DK GRN), NO SAUCE","Chicken or turkey,stuffing, and vegetables (excluding carrots, broccoli, and dark green leafy), no sauce (mixture)" +27347220,"CHICKEN, STUFFING & VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey, stuffing, and vegetables (including carrots, broccoli, and/or dark-green leafy), gravy (mixture)" +27347230,"CHICKEN, STUFFING & VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey, stuffing, and vegetables (excluding carrots, broccoli, and dark-green leafy), gravy (mixture)" +27347240,"CHICKEN, DUMPLINGS, VEG (INCL CAR/DK GRN), GRAVY","Chicken or turkey, dumplings, and vegetables (including carrots, broccoli, and/or dark green leafy), gravy (mixture)" +27347250,"CHICKEN, DUMPLINGS, VEG (NO CAR/DK GRN), GRAVY","Chicken or turkey, dumplings, and vegetables (excluding carrots, broccoli, and dark green leafy), gravy (mixture)" +27348100,"CHICKEN FRICASSEE, P.R. (FRICASE DE POLLO)","Chicken fricassee, Puerto Rican style (Fricase de pollo)" +27350020,"PAELLA WITH SEAFOOD","Paella with seafood" +27350030,"SEAFOOD STEW W/ POT & VEG (NO CAR/DK GREEN),TOM SCE","Seafood stew with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy), tomato-base sauce" +27350050,"SHRIMP CHOW MEIN OR CHOP SUEY W/ NOODLES","Shrimp chow mein or chop suey with noodles" +27350060,"SHRIMP CREOLE W/ RICE (INCLUDE SHRIMP JAMBALAYA)","Shrimp creole, with rice" +27350070,"TUNA POT PIE","Tuna pot pie" +27350080,"TUNA NOODLE CASSEROLE W/ VEG, CREAM OR WHITE SAUCE","Tuna noodle casserole with vegetables, cream or white sauce" +27350090,"FISH, NOODLES, VEG (INCL CAR/DK GRN), CHEESE SAUCE","Fish, noodles, and vegetables (including carrots, broccoli, and/or dark green leafy), cheese sauce (mixture)" +27350100,"FISH, NOODLES, VEG (NO CAR/DK GRN), CHEESE SAUCE","Fish, noodles, and vegetables (excluding carrots, broccoli, and dark-green leafy), cheese sauce (mixture)" +27350110,"BOUILLABAISSE","Bouillabaisse" +27350200,"OYSTER PIE (INCLUDE OYSTER POT PIE)","Oyster pie" +27350310,"SEAFOOD STEW W/ POT & VEG (W/ CAR/DK GREEN),TOM SCE","Seafood stew with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy), tomato-base sauce" +27350410,"TUNA NOODLE CASSEROLE W/ VEG & (MUSHROOM) SOUP","Tuna noodle casserole with vegetables and (mushroom) soup" +27351010,"CODFISH W/ STARCHY VEG, P.R. (SERENATA DE BACALAO)","Codfish with starchy vegetables, Puerto Rican style (Serenata de bacalao) (mixture)" +27351020,"CODFISH SALAD, P.R. (GAZPACHO DE BACALAO)","Codfish salad, Puerto Rican style (Gazpacho de bacalao)" +27351030,"STEWED CODFISH, P.R. (BACALAO GUISADO)","Stewed codfish, Puerto Rican style (Bacalao guisado)" +27351040,"BISCAYNE CODFISH, P.R. (BACALAO A LA VIZCAINA)","Biscayne codfish, Puerto Rican style (Bacalao a la Vizcaina)" +27351050,"CODFISH SALAD, P.R. (ENSALADA DE BACALAO)","Codfish salad, Puerto Rican style (Ensalada de bacalao)" +27360000,"STEW, NFS","Stew, NFS" +27360010,"GOULASH, NFS","Goulash, NFS" +27360050,"MEAT PIE, NFS","Meat pie, NFS" +27360080,"CHOW MEIN, NS AS TO TYPE OF MEAT, W/ NOODLES","Chow mein or chop suey, NS as to type of meat, with noodles" +27360090,"PAELLA, NFS","Paella, NFS" +27360100,"BRUNSWICK STEW","Brunswick stew" +27360120,"CHOW MEIN/CHOP SUEY,VARIOUS MEATS, W/ NOODLES","Chow mein or chop suey, various types of meat, with noodles" +27361010,"STEWED VARIETY MEATS (MOSTLY LIVER), P.R.(GANDINGA)","Stewed variety meats, Puerto Rican style (mostly liver) (Gandinga)" +27362000,"STEWED TRIPE W/ POTATOES, P.R. (MONDONGO)","Stewed tripe, Puerto Rican style, with potatoes (Mondongo)" +27363000,"GUMBO W/ RICE (NEW ORLEANS TYPE)","Gumbo with rice (New Orleans type with shellfish, pork, and/or poultry, tomatoes, okra, rice)" +27363100,"JAMBALAYA W/ MEAT & RICE","Jambalaya with meat and rice" +27410210,"BEEF & VEG (W/ CAR/DK GREEN, NO POTATO), NO SAUCE","Beef and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), no sauce (mixture)" +27410220,"BEEF & VEG (NO CAR/DK GREEN, NO POTATO), NO SAUCE","Beef and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), no sauce (mixture)" +27410250,"BEEF SHISH KABOB W/ VEGETABLES, EXCLUDING POTATOES","Beef shish kabob with vegetables, excluding potatoes" +27411100,"BEEF & VEG(W/ CAR/DK GREEN, NO POTATO), TOMATO SCE","Beef with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27411120,"SWISS STEAK","Swiss steak" +27411150,"BEEF ROLL,STUFFED W/VEG/MEAT MIXTURE,TOM-BASE SAUCE","Beef rolls, stuffed with vegetables or meat mixture, tomato-based sauce" +27411200,"BEEF W/ VEG (NO CAR/DK GREEN, NO POTATO),TOMATO SCE","Beef with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27414100,"BEEF W/ VEG (INCL CAR/DK GRN, NO POT), SOUP","Beef with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), (mushroom) soup (mixture)" +27414200,"BEEF W/ VEG (NO CAR/DK GRN, NO POT), SOUP","Beef with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), (mushroom) soup (mixture)" +27415100,"BEEF & VEG (W/ CAR/DK GREEN, NO POTATO), SOY SAUCE","Beef and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27415110,"BEEF AND BROCCOLI","Beef and broccoli" +27415120,"BEEF, TOFU & VEG(W/ CAR/DK GRN, NO POTATO),SOY SCE","Beef, tofu, and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27415130,"SZECHUAN BEEF","Szechuan beef" +27415140,"HUNAN BEEF","Hunan beef" +27415150,"BEEF, CHOW MEIN OR CHOP SUEY, NO NOODLES","Beef chow mein or chop suey, no noodles" +27415170,"KUNG PAO BEEF","Kung Pao beef" +27415200,"BEEF & VEG (NO CAR/DK GREEN, NO POTATO), SOY SAUCE","Beef and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27415220,"BEEF, TOFU & VEG(NO CAR/DK GRN, NO POTATO), SOY SCE","Beef, tofu, and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27416100,"BEEF & VEGETABLES, HAWAIIAN STYLE (MIXTURE)","Beef and vegetables, Hawaiian style (mixture)" +27416150,"PEPPER STEAK","Pepper steak" +27416200,"BEEF, GROUND, W/ EGG & ONION (MIXTURE)","Beef, ground, with egg and onion (mixture)" +27416250,"BEEF SALAD","Beef salad" +27416300,"BEEF TACO FILLING: BEEF, CHEESE, TOMATO, TACO SAUCE","Beef taco filling: beef, cheese, tomato, taco sauce" +27416400,"SUKIYAKI (STIR FRIED BEEF & VEGS IN SOY SAUCE)","Sukiyaki (stir fried beef and vegetables in soy sauce)" +27416450,"BEEF & VEG (INCL CAR/DK GRN, NO POTATOES), GRAVY","Beef and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), gravy (mixture)" +27416500,"BEEF & VEG (NO CAR/DK GREEN, NO POT), GRAVY","Beef and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), gravy (mixture)" +27418110,"SEASONED SHREDDED SOUP MEAT","Seasoned shredded soup meat (Ropa vieja, sopa de carne ripiada)" +27418210,"BEEF STEW, P.R. W/ VEGETABLES, NO POTATO (CARNE A LA JUDIA)","Puerto Rican style beef stew with vegetables, excluding potatoes (Carne a la Judia)" +27418310,"CORNED BEEF W/ TOMATO SAUCE & ONION, P.R. STYLE","Corned beef with tomato sauce and onion, Puerto Rican style (mixture)" +27418410,"BEEF STEAK W/ ONIONS, P.R. (BIFTEC ENCEBOLLADO)","Beef steak with onions, Puerto Rican style (mixture) (Biftec encebollado)" +27420010,"CABBAGE W/ HAM HOCKS (MIXTURE)","Cabbage with ham hocks (mixture)" +27420020,"HAM OR PORK SALAD","Ham or pork salad" +27420040,"FRANKFURTERS OR HOT DOGS & SAUERKRAUT (MIXTURE)","Frankfurters or hot dogs and sauerkraut (mixture)" +27420060,"PORK & VEG (W/ CAR/DK GREEN, NO POTATO), NO SAUCE","Pork and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), no sauce (mixture)" +27420080,"GREENS W/ HAM OR PORK (MIXTURE)","Greens with ham or pork (mixture)" +27420100,"PORK, TOFU & VEG (W/ CAR/DK GRN,NO POTATO), SOY SCE","Pork, tofu, and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-base sauce (mixture)" +27420110,"PORK & VEGETABLES, HAWAIIAN STYLE (MIXTURE)","Pork and vegetables, Hawaiian style (mixture)" +27420120,"PORK & WATERCRESS W/ SOY-BASED SAUCE (MIXTURE)","Pork and watercress with soy-based sauce (mixture)" +27420150,"KUNG PAO PORK","Kung Pao pork" +27420160,"MOO SHU (MU SHI) PORK, W/O PANCAKE","Moo Shu (Mu Shi) Pork, without Chinese pancake" +27420170,"PORK AND ONIONS W/ SOY-BASED SAUCE","Pork and onions with soy-based sauce (mixture)" +27420200,"PORK HASH,HAWAIIAN--PORK,VEG(NO CAR/DK GRN),SOY SCE","Pork hash, Hawaiian style-ground pork, vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce" +27420250,"HAM & VEG (W/ CARROT/DK GREEN, NO POTATO), NO SAUCE","Ham and vegetables (including carrots, broccoli, and/or dark- green leafy (no potatoes)), no sauce (mixture)" +27420270,"HAM & VEG (NO CARROT/DK GREEN, NO POTATO), NO SAUCE","Ham and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), no sauce (mixture)" +27420350,"PORK & VEG (NO CAR/DK GREEN, NO POTATO), NO SAUCE","Pork and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), no sauce (mixture)" +27420370,"PORK,TOFU & VEG(NO CAR/DK GREEN,NO POTATO)SOY SAUCE","Pork, tofu, and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27420390,"PORK CHOW MEIN OR CHOP SUEY, NO NOODLES","Pork chow mein or chop suey, no noodles" +27420400,"PORK & VEG (INCL CAR/DK GRN, NO POT), TOMATO SAUCE","Pork and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27420410,"PORK & VEG (NO CAR/DK GRN, NO POT), TOMATO SAUCE","Pork and vegetables (excluding carrots, broccoli, and dark- green leafy (no potatoes)), tomato-based sauce (mixture)" +27420450,"SAUSAGE & VEG (INCL CAR/DK GRN)(NO POT), TOM SAUCE","Sausage and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27420460,"SAUSAGE & VEG (NO CAR/DK GRN/POT), TOMATO SAUCE","Sausage and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27420470,"SAUSAGE & PEPPERS, NO SAUCE","Sausage and peppers, no sauce (mixture)" +27420500,"PORK & VEG (INCL CAR/DK GRN), SOY-BASED SAUCE","Pork and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27420510,"PORK & VEG (NO CAR/DK GRN), SOY-BASED SAUCE","Pork and vegetables (excluding carrots, broccoli, and dark- green leafy (no potatoes)), soy-based sauce (mixture)" +27420520,"PORK SHISH KABOB WITH VEGETABLES, EXCLUDING POTATOES","Pork shish kabob with vegetables, excluding potatoes" +27421010,"STUFFED CHRISTOPHINE, P.R. (CHAYOTE RELLENO)","Stuffed christophine, Puerto Rican style (Chayote relleno)" +27422010,"PORK CHOPS STEWED W/VEG, P.R. (CHULETAS A LA JARD.)","Pork chop stewed with vegetables, Puerto Rican style (mixture) (Chuletas a la jardinera)" +27430400,"LAMB STEW W/ VEG (INCL CAR/DK GRN, NO POT), GRAVY","Lamb or mutton stew with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), gravy" +27430410,"LAMB STEW W/ VEG (NO CAR/DK GRN, NO POT), GRAVY","Lamb or mutton stew with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), gravy" +27430500,"VEAL GOULASH W/VEG(NO CAR/DK GREEN, NO POT),TOM SCE","Veal goulash with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), tomato-base sauce" +27430510,"VEAL GOULASH W/VEG(W/ CAR/DK GREEN, NO POT),TOM SCE","Veal goulash with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-base sauce" +27430580,"VEAL W/ VEG (INCL CAR/DK GRN), NO POT, CREAM SAUCE","Veal with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), cream or white sauce" +27430590,"VEAL W/ VEG (NO CAR/DK GRN), NO POT, CREAM SAUCE","Veal with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), cream or white sauce" +27430610,"LAMB SHISH KABOB W/ VEGETABLES, EXCLUDING POTATOES","Lamb shish kabob with vegetables, excluding potatoes" +27440110,"CHICK/TURK & VEG (W/ CAR/DK GRN, NO POT), NO SAUCE","Chicken or turkey and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), no sauce (mixture)" +27440120,"CHICK/TURK & VEG (NO CAR/DK GRN, NO POT), NO SAUCE","Chicken or turkey and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), no sauce (mixture)" +27440130,"CHICKEN OR TURKEY SHISH KABOB W/VEGETABLES, EXCL POTATOES","Chicken or turkey shish kabob with vegetables, excluding potatoes" +27441120,"CHICKEN CREOLE W/O RICE","Chicken or turkey creole, without rice" +27442110,"CHICKEN/TURKEY & VEG (W/ CAR/DK GREEN,NO POT),GRAVY","Chicken or turkey and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), gravy (mixture)" +27442120,"CHICKEN/TURKEY & VEG(NO CAR/DK GREEN,NO POT), GRAVY","Chicken or turkey and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), gravy (mixture)" +27443110,"CHICKEN A LA KING W/VEG(INCL CAR/DK GRN),WHITE SCE","Chicken or turkey a la king with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), cream, white, or soup-based sauce" +27443120,"CHICKEN A LA KING W/ VEG(NO CAR/DK GRN),WHITE SAUCE","Chicken or turkey a la king with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), cream, white, or soup-based sauce" +27443150,"CHICKEN DIVAN","Chicken or turkey divan" +27445110,"CHICKEN & VEG (INCL CAR/DK GRN, NO POT), SOY SAUCE","Chicken or turkey and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27445120,"CHICKEN & VEG (NO CAR/DK GRN, NO POT), SOY SAUCE","Chicken or turkey and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27445125,"CHICKEN & VEG (INCL CAR/DK GRN, NO POT), TOMATO SAUCE","Chicken or turkey and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27445130,"CHICKEN & VEG (NO CAR/DK GRN, NO POT), TOMATO SAUCE","Chicken or turkey and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27445150,"GENERAL TSO CHICKEN","General Tso chicken" +27445180,"MOO GOO GAI PAN","Moo Goo Gai Pan" +27445220,"KUNG PAO CHICKEN","Kung pao chicken" +27445250,"ALMOND CHICKEN","Almond chicken" +27446100,"CHICKEN CHOW MEIN/CHOP SUEY, NO NOODLES","Chicken or turkey chow mein or chop suey, no noodles" +27446200,"CHICKEN OR TURKEY SALAD, W/ MAYO","Chicken or turkey salad, made with mayonnaise" +27446205,"CHICKEN/TURKEY SALAD WITH NUTS AND/OR FRUITS","Chicken or turkey salad with nuts and/or fruits" +27446220,"CHICKEN SALAD W/ EGG","Chicken or turkey salad with egg" +27446225,"CHICKEN OR TURKEY SALAD, W/ LT MAYO","Chicken or turkey salad, made with light mayonnaise" +27446230,"CHICKEN OR TURKEY SALAD, W/ MAYO-TYPE DRSG","Chicken or turkey salad, made with mayonnaise-type salad dressing" +27446235,"CHICKEN OR TURKEY SALAD, MADE W/ LT MAYO-TYPE DRSG","Chicken or turkey salad, made with light mayonnaise-type salad dressing" +27446240,"CHICKEN OR TURKEY SALAD, W/CREAMY DRSG","Chicken or turkey salad, made with creamy dressing" +27446245,"CHICKEN OR TURKEY SALAD, W/ LIT CREAMY DRSG","Chicken or turkey salad, made with light creamy dressing" +27446250,"CHICKEN OR TURKEY SALAD, MADE W/ ITALIAN DRESSING","Chicken or turkey salad, made with Italian dressing" +27446255,"CHICKEN OR TURKEY SALAD, MADE W/ LT ITALIAN DRSG","Chicken or turkey salad, made with light Italian dressing" +27446260,"CHICKEN OR TURKEY SALAD, MADE W/ FAT FREE DRSG","Chicken or turkey salad, made with any type of fat free dressing" +27446300,"CHICKEN GARDEN SALAD W/ TOMATO/CARROT, NO DRESSING","Chicken or turkey garden salad (chicken and/or turkey, tomato and/or carrots, other vegetables), no dressing" +27446310,"CHICKEN GARDEN SALAD W/VEG, NO CAR/TOM, NO DRESSING","Chicken or turkey garden salad (chicken and/or turkey, other vegetables excluding tomato and carrots), no dressing" +27446315,"CHICKEN GARDEN SALAD W/ BACON,CHEESE,TOMATO/CARROT,NO DRSG","Chicken or turkey garden salad with bacon and cheese (chicken and/or turkey, bacon, cheese, lettuce and/or greens, tomato and/or carrots, other vegetables), no dressing" +27446320,"CHICKN(BRD,FRD)GARDEN SALAD W/ BACON,CHEESE,TOM/CAR,NO DRSG","Chicken or turkey (breaded, fried) garden salad with bacon and cheese (chicken and/or turkey, bacon, cheese, lettuce and/or greens, tomato and/or carrots, other vegetables), no dressing" +27446330,"CHICKN GARDEN SALAD W/ CHEESE,TOM/CAR,NO DRSG","Chicken or turkey garden salad with cheese (chicken and/or turkey, cheese, lettuce and/or greens, tomato and/or carrots, other vegetables), no dressing" +27446332,"CHICKN(BRD,FRD)GARDEN SALAD W/ CHEESE,TOM/CAR,NO DRSG","Chicken or turkey (breaded, fried) garden salad with cheese (chicken and/or turkey, cheese, lettuce and/or greens, tomato and/or carrots, other vegetables), no dressing" +27446350,"ASIAN CHICKEN/TURKEY GARDEN SALAD, NO DRESSING","Asian chicken or turkey garden salad (chicken and/or turkey, lettuce, fruit, nuts), no dressing" +27446355,"ASIAN CHICKEN GARDEN SALAD W/CRISPY NOODLES , NO DRESSING","Asian chicken or turkey garden salad with crispy noodles (chicken and/or turkey, lettuce, fruit, nuts, crispy noodles), no dressing" +27446360,"CHICKEN/TURKEY CAESAR GARDEN SALAD, NO DRESSING","Chicken or turkey caesar garden salad (chicken and/or turkey, lettuce, tomato, cheese), no dressing" +27446362,"CHICKEN/TURKEY (BREADED, FRIED) CAESAR GARDEN SALAD, NO DRSG","Chicken or turkey (breaded, fried) caesar garden salad (chicken and/or turkey, lettuce, tomatoes, cheese), no dressing" +27446400,"CHICKEN & VEG (INCL CAR/DK GRN)(NO POT), CHEESE SCE","Chicken or turkey and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), cheese sauce (mixture)" +27446410,"CHICKEN & VEG (NO CAR/DK GRN)(NO POT), CHEESE SAUCE","Chicken or turkey and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), cheese sauce (mixture)" +27448020,"CHICKEN FRICASSEE W/SAUCE,NO POT,PUERTO RICAN STYLE","Chicken or turkey fricassee, with sauce, no potatoes, Puerto Rican style (potatoes reported separately)" +27448030,"CHICKEN FRICASSEE, NO SCE OR POT,PUERTO RICAN STYLE","Chicken or turkey fricassee, no sauce, no potatoes, Puerto Rican style (sauce and potatoes reported separately)" +27450010,"CRAB SALAD","Crab salad" +27450020,"LOBSTER SALAD","Lobster salad" +27450030,"SALMON SALAD","Salmon salad" +27450040,"SHRIMP CHOW MEIN OR CHOP SUEY, NO NOODLES","Shrimp chow mein or chop suey, no noodles" +27450060,"TUNA SALAD, W/MAYO","Tuna salad, made with mayonnaise" +27450061,"TUNA SALAD, W/LT MAYO","Tuna salad, made with light mayonnaise" +27450062,"TUNA SALAD, W/ MAYO-TYPE DRESSING","Tuna salad, made with mayonnaise-type salad dressing" +27450063,"TUNA SALAD, W/ LT MAYO-TYPE DRSG","Tuna salad, made with light mayonnaise-type salad dressing" +27450064,"TUNA SALAD, W/ CREAMY DRSG","Tuna salad, made with creamy dressing" +27450065,"TUNA SALAD, W/ LT CREAMY DRSG","Tuna salad, made with light creamy dressing" +27450066,"TUNA SALAD, W/ ITALIAN DRSG","Tuna salad, made with Italian dressing" +27450067,"TUNA SALAD, W/ LT ITALIAN DRSG","Tuna salad, made with light Italian dressing" +27450068,"TUNA SALAD, W/ ANY TYPE OF FAT FREE DRSG","Tuna salad, made with any type of fat free dressing" +27450070,"SHRIMP SALAD","Shrimp salad" +27450080,"SEAFOOD SALAD","Seafood salad" +27450090,"TUNA SALAD W/ CHEESE","Tuna salad with cheese" +27450100,"TUNA SALAD W/ EGG","Tuna salad with egg" +27450110,"SHRIMP GARDEN SALAD W/ TOMATO/CARROT, NO DRESSING","Shrimp garden salad (shrimp, lettuce, eggs, tomato and/or carrots, other vegetables), no dressing" +27450120,"SHRIMP GARDEN SALAD (NO TOMATO/CARROT, NO DRESSING)","Shrimp garden salad (shrimp, lettuce, eggs, vegetables excluding tomato and carrots), no dressing" +27450130,"CRAB SALAD MADE W/ IMITATION CRAB","Crab salad made with imitation crab" +27450150,"FISH, TOFU, & VEGETABLES, TEMPURA, HAWAIIAN","Fish, tofu, and vegetables, tempura, Hawaiian style (mixture)" +27450180,"SEAFOOD GARDEN SALAD W/ VEG(NO TOM/CAR), NO DRESSING","Seafood garden salad with seafood, lettuce, vegetables excluding tomato and carrots, no dressing" +27450190,"SEAFOOD GARDEN SALAD W/ TOM/CAR, NO DRESSING","Seafood garden salad with seafood, lettuce, tomato and/or carrots, other vegetables, no dressing" +27450200,"SEAFOOD GARDEN SALAD W/ EGG, VEG, (NO CAR/TOM) NO DRESSING","Seafood garden salad with seafood, lettuce, eggs, vegetables excluding tomato and carrots, no dressing" +27450210,"SEAFOOD GARDEN SALAD W/EGG, TOM/CAR, NO DRESSING","Seafood garden salad with seafood, lettuce, eggs, tomato and/or carrots, other vegetables, no dressing" +27450250,"OYSTERS ROCKEFELLER","Oysters Rockefeller" +27450310,"LOMI SALMON","Lomi salmon" +27450400,"SHRIMP & VEG (W/ CAR/DK GREEN, NO POT), NO SAUCE","Shrimp and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), no sauce (mixture)" +27450405,"SHRIMP & VEG (NO CARROT/DK GREEN, NO POT), NO SAUCE","Shrimp and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), no sauce (mixture)" +27450410,"SHRIMP & VEG (W/ CAR/DK GREEN, NO POT), SOY SAUCE","Shrimp and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27450420,"SHRIMP & VEG (NO CARROT/DK GREEN, NO POT),SOY SAUCE","Shrimp and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27450430,"SHRIMP SHISH KABOB WITH VEGETABLES, EXCLUDING POTATOES","Shrimp shish kabob with vegetables, excluding potatoes" +27450450,"SHRIMP CREOLE, NO RICE","Shrimp creole, no rice" +27450470,"KUNG PAO SHRIMP","Kung Pao shrimp" +27450510,"TUNA CASSEROLE W/ VEG & SOUP, NO NOODLES","Tuna casserole with vegetables and (mushroom) soup, no noodles" +27450600,"SHELLFISH MIXTURE & VEG (INCL CAR/DK GRN), SOY SCE","Shellfish mixture and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce" +27450610,"SHELLFISH MIXTURE & VEG (NO CAR/DK GRN), SOY SAUCE","Shellfish mixture and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce" +27450650,"SHELLFISH & VEG(INCL CAR/DK GRN)(NO POT),SOUP SAUCE","Shellfish mixture and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), (mushroom) soup (mixture)" +27450660,"SHELLFISH & VEG(NO CAR/DK GRN/POT),SOUP-BASED SAUCE","Shellfish mixture and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), (mushroom) soup (mixture)" +27450700,"FISH & VEG (INCL CAR/DK GRN, NO POT), TOMATO SAUCE","Fish and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), tomato-based sauce (mixture)" +27450710,"FISH & VEG (NO CAR/DK GRN, NO POT), TOMATO SAUCE","Fish and vegetables (excluding carrots, broccoli, and dark- green leafy (no potatoes)), tomato-based sauce (mixture)" +27450740,"FISH & VEGETABLES (W/ CAR/DK GRN), SOY-BASED SAUCE","Fish and vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27450750,"FISH & VEGETABLES (NO CAR/DK GRN), SOY-BASED SAUCE","Fish and vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes)), soy-based sauce (mixture)" +27450760,"FISH SHISH KABOB WITH VEGETABLES, EXCLUDING POTATOES","Fish shish kabob with vegetables, excluding potatoes" +27451010,"FRIED FISH W/ SAUCE, P.R. (PESCADO FRITO CON MOJO)","Fried fish with sauce, Puerto Rican style (Pescado frito con mojo)" +27451030,"LOBSTER W/ SAUCE, P.R. (LANGOSTA A LA CRIOLLA)","Lobster with sauce, Puerto Rican style (Langosta a la criolla)" +27451060,"OCTOPUS SALAD, P.R. (ENSALADA DE PULPO)","Octopus salad, Puerto Rican style (Ensalada de pulpo)" +27451070,"CODFISH SALAD, P.R. (SERENATA)","Codfish salad, Puerto Rican style (Serenata)" +27460010,"CHOW MEIN, NS AS TO TYPE OF MEAT, NO NOODLES","Chow mein or chop suey, NS as to type of meat, no noodles" +27460100,"LAU LAU(PORK & FISH WRAPPED IN TARO/SPINACH LEAVES)","Lau lau (pork and fish wrapped in taro or spinach leaves)" +27460490,"JULIENNE SALAD (MEAT, CHEESE, EGG, VEG) NO DRESSING","Julienne salad (meat, cheese, eggs, vegetables), no dressing" +27460510,"ANTIPASTO W/ HAM, FISH, CHEESE, VEGETABLES","Antipasto with ham, fish, cheese, vegetables" +27460710,"LIVERS, CHICKEN, CHOPPED, W/ EGGS & ONION (MIXTURE)","Livers, chicken, chopped, with eggs and onion (mixture)" +27460750,"LIVER, BEEF OR CALVES, & ONIONS","Liver, beef or calves, and onions" +27461010,"STEWED SEASONED GROUND BEEF, P.R.","Stewed seasoned ground beef, Puerto Rican style (Picadillo para relleno)" +27462000,"STEWED CHITTERLINGS, P.R. (CUAJO GUISADO)","Stewed chitterlings, Puerto Rican style (cuajo guisado)" +27463000,"STEWED GIZZARDS, P.R. (MOLLEJITAS GUISADAS)","Stewed gizzards, Puerto Rican style (Mollejitas guisadas)" +27464000,"GUMBO, NO RICE (NEW ORLEANS TYPE W/MEAT, TOM, OKRA)","Gumbo, no rice (New Orleans type with shellfish, pork, and/or poultry, tomatoes, okra)" +27500050,"SANDWICH, NFS","Sandwich, NFS" +27500100,"MEAT SANDWICH, NFS","Meat sandwich, NFS" +27500200,"WRAP SANDWICH, W/ MEAT, POULTRY OR FISH, VEGETABLES & CHEESE","Wrap sandwich, filled with meat, poultry, or fish, vegetables, and cheese" +27500300,"WRAP SANDWICH, W/ MEAT, POULTRY OR FISH & VEGETABLES","Wrap sandwich, filled with meat, poultry, or fish, and vegetables" +27510000,"BEEF SANDWICH, NFS","Beef sandwich, NFS" +27510110,"BEEF BARBECUE SANDWICH OR SLOPPY JOE, ON BUN","Beef barbecue sandwich or Sloppy Joe, on bun" +27510130,"BEEF BARBECUE SUBMARINE SANDWICH, ON BUN","Beef barbecue submarine sandwich, on bun" +27510210,"CHEESEBURGER, PLAIN, ON BUN","Cheeseburger, plain, on bun" +27510220,"CHEESEBURGER, W/ MAYO, ON BUN","Cheeseburger, with mayonnaise or salad dressing, on bun" +27510230,"CHEESEBURGER, W/ MAYO & TOMATO/CATSUP, ON BUN","Cheeseburger, with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510240,"CHEESEBURGER, 1/4 LB MEAT, PLAIN, ON BUN","Cheeseburger, 1/4 lb meat, plain, on bun" +27510250,"CHEESEBURGER, 1/4 LB MEAT, W/ MAYO, ON BUN","Cheeseburger, 1/4 lb meat, with mayonnaise or salad dressing, on bun" +27510260,"CHEESEBURGER, 1/4 LB, W/ MUSHROOM SAUCE, ON BUN","Cheeseburger, 1/4 lb meat, with mushrooms in sauce, on bun" +27510265,"DOUBLE CHEESEBURGER, PLAIN, ON MINIATURE BUN","Double cheeseburger, (2 patties, 1 oz each), plain, on miniature bun" +27510270,"DOUBLE CHEESEBURGER, PLAIN, ON BUN","Double cheeseburger (2 patties), plain, on bun" +27510280,"DOUBLE CHEESEBURGER, W/ MAYO, ON BUN","Double cheeseburger (2 patties), with mayonnaise or salad dressing, on bun" +27510290,"DOUBLE CHEESEBURGER, PLAIN, ON DOUBLE-DECKER BUN","Double cheeseburger (2 patties), plain, on double-decker bun" +27510300,"DOUBLE CHEESEBURGER, W/MAYO, ON DOUBLE-DECKER BUN","Double cheeseburger (2 patties), with mayonnaise or salad dressing, on double-decker bun" +27510310,"CHEESEBURGER W/ TOMATO & OR CATSUP, ON BUN","Cheeseburger with tomato and/or catsup, on bun" +27510311,"CHEESEBURGER, 1 OZ MEAT, PLAIN, ON MINI BUN","Cheeseburger, 1 oz meat, plain, on miniature bun" +27510320,"CHEESEBURGER, 1/4 LB MEAT,W/ TOMATO/CATSUP, BUN","Cheeseburger, 1/4 lb meat, with tomato and/or catsup, on bun" +27510330,"DOUBLE CHEESEBURGER W/TOMATO & OR CATSUP, ON BUN","Double cheeseburger (2 patties), with tomato and/or catsup, on bun" +27510340,"DOUBLE CHEESEBURGER, W/ MAYO & TOMATO, ON BUN","Double cheeseburger (2 patties), with mayonnaise or salad dressing and tomatoes and/or catsup, on bun" +27510350,"CHEESEBURGER, 1/4 LB MEAT, W/ MAYO & TOMATO/CATSUP, ON BUN","Cheeseburger, 1/4 lb meat, with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510355,"CHEESEBURGER, 1/3 LB MEAT, W/MAYO, TOMATO, ON BUN","Cheeseburger, 1/3 lb meat, with mayonnaise or salad dressing, tomato and/or catsup on bun" +27510359,"CHEESEBURGER, 1/3 LB MEAT, W/MAYO, MUSHROOMS,ON BUN","Cheeseburger, 1/3 lb meat, with mayonnaise or salad dressing, and mushrooms, on bun" +27510360,"BACON CHEESEBURGER, W/MAYO/SALAD DRSG, TOMATO/CATSUP,ON BUN","Bacon cheeseburger, with mayonnaise or salad dressing, tomato and/or catsup, on bun" +27510370,"DOUBLE CHEESEBURGER W/ MAYONNAISE, ON BUN","Double cheeseburger (2 patties, 1/4 lb meat each), with mayonnaise or salad dressing, on bun" +27510375,"DOUBLE CHEESEBURGER(2 PATTIES,1/4 LB EA) W/TOMATO/CATSUP/BUN","Double cheeseburger (2 patties, 1/4 lb meat each), with tomato and/or catsup, on bun" +27510380,"TRIPLE CHEESEBURGER W/ MAYO, TOMATO, ON BUN","Triple cheeseburger (3 patties, 1/4 lb meat each), with mayonnaise or salad dressing and tomatoes and/or catsup, on bun" +27510385,"DOUBLE BACON CHEESEBURGER (2 PATTIES), W/ TOMATO/CATSUP","Double bacon cheeseburger (2 patties), with tomato and/or catsup, on bun" +27510390,"DOUBLE BACON CHEESEBURGER, ON BUN","Double bacon cheeseburger (2 patties, 1/4 lb meat each), on bun" +27510400,"BACON CHEESEBURGER, 1/4 LB MEAT, W/ TOMATO, ON BUN","Bacon cheeseburger, 1/4 lb meat, with tomato and/or catsup, on bun" +27510410,"CHILIBURGER, ON BUN (INCLUDE HAMBURGER W/ CHILI)","Chiliburger, on bun" +27510420,"TACO BURGER, ON BUN (INCL CHILIBURGER W/ CHEESE)","Taco burger, on bun" +27510425,"DOUBLE BACON CHEESEBURGER (2 PATTIES,1/4 LB EA), W/ MAYO/BUN","Double bacon cheeseburger (2 patties, 1/4 lb meat each), with mayonnaise or salad dressing, on bun" +27510430,"DOUBLE BACON CHEESEBURGER, W/MAYO/DRSG,TOMATO/CATSUP,ON BUN","Double bacon cheeseburger (2 patties, 1/4 lb meat each), with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510435,"DOUBLE BACON CHEESEBURGER (2 PATTIES,1/3 LB EA) W/ MAYO/ BUN","Double bacon cheeseburger (2 patties,1/3 lb meat each), with mayonnaise or salad dressing, on bun" +27510440,"BACON CHEESEBURGER, 1/4 LB, W/MAYO/DRSG,TOMATO/CATSUP,ON BUN","Bacon cheeseburger, 1/4 lb meat, with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510445,"BACON CHEESEBURGER, 1/3 LB MEAT, W/TOMATO +/OR CATSUP,","Bacon cheeseburger, 1/3 lb meat, with tomato and/or catsup, on bun" +27510450,"CHEESEBURGER, 1/4 LB MEAT, W/ HAM, ON BUN","Cheeseburger, 1/4 lb meat, with ham, on bun" +27510480,"CHEESEBURGER, W/ ONIONS, ON RYE BUN","Cheeseburger (hamburger with cheese sauce), 1/4 lb meat, with grilled onions, on rye bun" +27510500,"HAMBURGER, PLAIN, ON BUN","Hamburger, plain, on bun" +27510510,"HAMBURGER, W/ TOMATO & OR CATSUP, ON BUN","Hamburger, with tomato and/or catsup, on bun" +27510520,"HAMBURGER, W/ MAYO & TOMATO/CATSUP, ON BUN","Hamburger, with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510530,"HAMBURGER, 1/4 LB MEAT, PLAIN, ON BUN","Hamburger, 1/4 lb meat, plain, on bun" +27510540,"DOUBLE HAMBURGER W/TOMATO & OR CATSUP, ON BUN","Double hamburger (2 patties), with tomato and/or catsup, on bun" +27510550,"DOUBLE HAMBURGER W/ MAYO & TOMATO, DBL-DECKER BUN","Double hamburger (2 patties), with mayonnaise or salad dressing and tomatoes, on double-decker bun" +27510560,"HAMBURGER, 1/4 LB MEAT W/ MAYO & TOMATO/CATSUP, ON BUN","Hamburger, 1/4 lb meat, with mayonnaise or salad dressing, and tomato and/or catsup, on bun" +27510570,"HAMBURGER, 2.5 OZ MEAT, W/ MAYO & TOMATO, ON BUN","Hamburger, 2-1/2 oz meat, with mayonnaise or salad dressing and tomatoes, on bun" +27510590,"HAMBURGER, W/ MAYO, ON BUN","Hamburger, with mayonnaise or salad dressing, on bun" +27510600,"HAMBURGER, 1 OZ MEAT,PLAIN, ON MINIATURE BUN","Hamburger, 1 oz meat, plain, on miniature bun" +27510610,"HAMBURGER, 1 OZ MEAT, TOMATO, ON MINIATURE BUN","Hamburger, 1 oz meat, with tomato and/or catsup, on miniature bun" +27510620,"HAMBURGER, 1/4 LB MEAT, W/ TOMATO & OR CATSUP, BUN","Hamburger, 1/4 lb meat, with tomato and/or catsup, on bun" +27510630,"HAMBURGER, 1/4 LB MEAT, W/ MAYO, ON BUN","Hamburger, 1/4 lb meat, with mayonnaise or salad dressing, on bun" +27510650,"DOUBLE HAMBURGER, PLAIN, ON BUN","Double hamburger (2 patties), plain, on bun" +27510660,"DOUBLE HAMBURGER, W/ MAYO, ON BUN","Double hamburger (2 patties), with mayonnaise or salad dressing, on bun" +27510670,"DOUBLE HAMBURGER, W/ MAYO & TOMATO, ON BUN","Double hamburger (2 patties), with mayonnaise or salad dressing and tomatoes, on bun" +27510680,"DOUBLE HAMBURGER (1/2 LB MEAT), W/ TOM/CATSUP, BUN","Double hamburger (2 patties, 1/4 lb meat each), with tomato and/or catsup, on bun" +27510690,"DOUBLE HAMBURGER,1/2 LB MEAT,W/MAYO&TOM/CATSUP,BUN","Double hamburger (2 patties, 1/4 lb meat each), with mayonnaise or salad dressing and tomatoes and/or catsup, on double-decker bun" +27510700,"MEATBALL & SPAG SAU SUB SAND","Meatball and spaghetti sauce submarine sandwich" +27510710,"PIZZABURGER (HAMBURGER, CHEESE, SAUCE), ON 1/2 BUN","Pizzaburger (hamburger, cheese, sauce) on 1/2 bun" +27510720,"PIZZABURGER (HAMBURGER, CHEESE, SAUCE), WHOLE BUN","Pizzaburger (hamburger, cheese, sauce) on whole bun" +27510910,"CORNED BEEF SANDWICH","Corned beef sandwich" +27510950,"REUBEN(CORN BEEF W/ SAUERKRAUT & CHEESE) W/ SPREAD","Reuben sandwich (corned beef sandwich with sauerkraut and cheese), with spread" +27511010,"PASTRAMI SANDWICH","Pastrami sandwich" +27513010,"ROAST BEEF SANDWICH","Roast beef sandwich" +27513020,"ROAST BEEF SANDWICH, W/ GRAVY","Roast beef sandwich, with gravy" +27513040,"ROAST BEEF SUB SAND, W/ LETT, TOM, SPRD","Roast beef submarine sandwich, with lettuce, tomato and spread" +27513041,"ROAST BEEF SUB SAND, W/ CHEESE, LETTUCE, TOMATO, SPRD","Roast beef submarine sandwich, with cheese, lettuce, tomato and spread" +27513050,"ROAST BEEF SANDWICH W/ CHEESE","Roast beef sandwich with cheese" +27513060,"ROAST BEEF SANDWICH W/ BACON & CHEESE SAUCE","Roast beef sandwich with bacon and cheese sauce" +27513070,"ROAST BEEF SUBMARINE SANDWICH, ON ROLL, AU JUS","Roast beef submarine sandwich, on roll, au jus" +27515000,"STEAK SUBMARINE SANDWICH WITH LETTUCE AND TOMATO","Steak submarine sandwich with lettuce and tomato" +27515010,"STEAK SANDWICH, PLAIN, ON ROLL","Steak sandwich, plain, on roll" +27515020,"STEAK , CHEESE SUB SAND, W/ LETT, TOM","Steak and cheese submarine sandwich, with lettuce and tomato" +27515030,"STEAK & CHEESE SANDWICH, PLAIN, ON ROLL","Steak and cheese sandwich, plain, on roll" +27515040,"STEAK & CHEESE SUBMARINE SANDWICH, PLAIN, ON ROLL","Steak and cheese submarine sandwich, plain, on roll" +27515050,"FAJITA-STYLE BEEF SAND W/ CHEESE,PITA BRD,W/LET+TOM","Fajita-style beef sandwich with cheese, on pita bread, with lettuce and tomato" +27515070,"STEAK & CHEESE SUB, FRIED PEP & ONIONS, ON ROLL","Steak and cheese submarine sandwich, with fried peppers and onions, on roll" +27515080,"STEAK SANDWICH, PLAIN, ON BISCUIT","Steak sandwich, plain, on biscuit" +27516010,"GYRO SANDWICH W/ TOMATO & SPREAD","Gyro sandwich (pita bread, beef, lamb, onion, condiments), with tomato and spread" +27517000,"WRAP SANDWICH FILLED WITH BEEF PATTY, CHEESE, LETTUCE,SPREAD","Wrap sandwich filled with beef patty, cheese and spread and/or sauce" +27517010,"WRAP SANDWICH FILLED WITH BEEF PATTY, CHEESE, TOMATO, SPREAD","Wrap sandwich filled with beef patty, cheese, tomato and/or catsup, and spread and/or sauce" +27518000,"WRAP SAND W/BEEF PATTY,BAC, CHS, TOM,SPREAD","Wrap sandwich filled with beef patty, bacon, cheese, tomato and/or catsup, and spread and/or sauce" +27520110,"BACON SANDWICH W/ SPREAD","Bacon sandwich, with spread" +27520120,"BACON & CHEESE SANDWICH, W/ SPREAD","Bacon and cheese sandwich, with spread" +27520130,"BACON, CHICK, & TOM CLUB SANDWICH W/ LETTUCE+SPREAD","Bacon, chicken, and tomato club sandwich, with lettuce and spread" +27520135,"BACON, CHICKN & TOMATO CLUB SANDWICH W/CHEESE, LETTUCE &SPRD","Bacon, chicken, and tomato club sandwich, with cheese, lettuce and spread" +27520140,"BACON & EGG SANDWICH","Bacon and egg sandwich" +27520150,"BACON, LETTUCE, & TOMATO SANDWICH W/ SPREAD","Bacon, lettuce, and tomato sandwich with spread" +27520160,"BACON,CHICK,&TOMATO CLUB SANDWICH,MULTIGR W/ SPREAD","Bacon, chicken, and tomato club sandwich, on multigrain roll with lettuce and spread" +27520165,"BACON, CHICK FILLET (BRD, FRIED),& TOM CLUB W/LETTUCE & SPRD","Bacon, chicken fillet (breaded, fried), and tomato club with lettuce and spread" +27520166,"BACON, CHICK FILLET (BRD,FRIED),&TOM CLUB W/CHS,LETTUCE&SPRD","Bacon, chicken fillet (breaded, fried), and tomato club sandwich with cheese, lettuce and spread" +27520170,"BACON ON BISCUIT","Bacon on biscuit" +27520250,"HAM ON BISCUIT","Ham on biscuit" +27520300,"HAM SANDWICH W/ SPREAD","Ham sandwich, with spread" +27520310,"HAM SANDWICH W/ LETTUCE & SPREAD","Ham sandwich with lettuce and spread" +27520320,"HAM & CHEESE SANDWICH, W/ LETTUCE & SPREAD","Ham and cheese sandwich, with lettuce and spread" +27520330,"HAM & EGG SANDWICH","Ham and egg sandwich" +27520340,"HAM SALAD SANDWICH","Ham salad sandwich" +27520350,"HAM & CHEESE SANDWICH W/ SPREAD, GRILLED","Ham and cheese sandwich, with spread, grilled" +27520360,"HAM & CHEESE SANDWICH ON BUN W/ LETTUCE & SPREAD","Ham and cheese sandwich, on bun, with lettuce and spread" +27520370,"HOT HAM & CHEESE SANDWICH, ON BUN","Hot ham and cheese sandwich, on bun" +27520380,"HAM & CHEESE ON ENGLISH MUFFIN","Ham and cheese on English muffin" +27520390,"HAM & CHEESE SUB, W/ LETTUCE, TOMATO & SPREAD","Ham and cheese submarine sandwich, with lettuce, tomato and spread" +27520410,"CUBAN SAND, P.R STYLE(SANDWICH CUBANA), W/ SPREAD","Cuban sandwich, (Sandwich cubano), with spread" +27520420,"MIDNIGHT SAND,P.R. STYLE (MEDIA NOCHE), W/ SPREAD","Midnight sandwich, (Media noche), with spread" +27520500,"PORK SANDWICH, ON WHITE ROLL, W/ ONIONS, PICKLES & BBQ SAUCE","Pork sandwich, on white roll, with onions, dill pickles and barbecue sauce" +27520510,"PORK BARBECUE SANDWICH OR SLOPPY JOE, ON BUN","Pork barbecue sandwich or Sloppy Joe, on bun" +27520520,"PORK SANDWICH","Pork sandwich" +27520530,"PORK SANDWICH W/ GRAVY","Pork sandwich, with gravy" +27520540,"HAM & TOMATO CLUB SAND, W/ SPREAD","Ham and tomato club sandwich, with lettuce and spread" +27540110,"CHICKEN SANDWICH, W/ SPREAD","Chicken sandwich, with spread" +27540111,"CHICKEN SANDWICH, W/ CHEESE & SPREAD","Chicken sandwich, with cheese and spread" +27540120,"CHICKEN SALAD OR CHICKEN SPREAD SANDWICH","Chicken salad or chicken spread sandwich" +27540130,"CHICKEN BARBECUE SANDWICH","Chicken barbecue sandwich" +27540140,"CHICKEN FILLET (BREADED, FRIED) SANDWICH","Chicken fillet (breaded, fried) sandwich" +27540145,"CHICKEN FILLET (BREADED, FRIED) SANDWICH ON BISCUIT","Chicken fillet (breaded, fried) sandwich on biscuit" +27540150,"CHICKEN FILLET(BR FRIED) SAND W/ LET, TOM & SPREAD","Chicken fillet (breaded, fried) sandwich with lettuce, tomato and spread" +27540151,"CHICKEN FILLET(BRD, FRIED) SAND W/ CHEESE, LETT, TOM & SPRD","Chicken fillet (breaded, fried) sandwich with cheese, lettuce, tomato and spread" +27540170,"CHICKEN PATTY SANDWICH, MINI, W/ SPREAD","Chicken patty sandwich, miniature, with spread" +27540180,"CHICKEN PATTY SANDWICH ON BISCUIT","Chicken patty sandwich or biscuit" +27540190,"CHICKEN PATTY SANDWICH W/ LETTUCE & SPREAD","Chicken patty sandwich, with lettuce and spread" +27540200,"FAJITA-STYLE CHICKEN SANDWICH W/ CHEESE, LETTUC,TOM","Fajita-style chicken sandwich with cheese, on pita bread, with lettuce and tomato" +27540210,"WRAP SNDWCH W/CHICK STRIPS(BREADED,FRIED),CHS,LETTUCE & SPRD","Wrap sandwich filled with chicken strips (breaded, fried), cheese, lettuce, and spread" +27540230,"CHICKEN PATTY SAND W/ CHEES,WHEAT BUN,LET,TOM, SPRE","Chicken patty sandwich with cheese, on wheat bun, with lettuce, tomato and spread" +27540235,"CHICKEN FILLET, BROILED, SANDWICH WITH LETTUCE, TOMATO, AND","Chicken fillet, broiled, sandwich with lettuce, tomato, and spread" +27540240,"CHICKEN FILLET,(BROIL) SAND W/ LET, TOM, & SPREAD","Chicken fillet, (broiled), sandwich, on whole wheat roll, with lettuce, tomato and spread" +27540250,"CHICK FILLET,BROIL,SANDWICH,W/CHEESE,WW ROLL","Chicken fillet, broiled, sandwich with cheese, on whole wheat roll, with lettuce, tomato and non-mayonnaise type spread" +27540260,"CHICK FILLET, BROILED,SANDWICH,ON OAT BRAN BUN(LTS)","Chicken fillet, broiled, sandwich, on oat bran bun, with lettuce, tomato, spread" +27540270,"CHICKEN FILLET,SANDWICH,W/LETT,TOM,&NON-MAYO SPREAD","Chicken fillet, broiled, sandwich, with lettuce, tomato, and non-mayonnaise type spread" +27540280,"CHICKEN FILLET,BROILED,SANDWICH,W/CHEESE,ON BUN","Chicken fillet, broiled, sandwich with cheese, on bun, with lettuce, tomato and spread" +27540290,"CHICKEN SUB SANDWICH, W/ LETTUCE, TOMATO & SPREAD","Chicken submarine sandwich, with lettuce, tomato, and spread" +27540291,"CHICKEN SUB SANDWICH, W/ CHEESE, LETTUCE, TOMATO & SPREAD","Chicken submarine sandwich, with cheese, lettuce, tomato, and spread" +27540300,"WRAP SNDWCH W/CHICK STRIPS (BROILED),CHS,LETTUCE & SPRD","Wrap sandwich filled with chicken strips (broiled), cheese, lettuce, and spread" +27540310,"TURKEY SANDWICH W/ SPREAD","Turkey sandwich, with spread" +27540320,"TURKEY SALAD SANDWICH","Turkey salad or turkey spread sandwich" +27540330,"TURKEY SANDWICH W/ GRAVY","Turkey sandwich, with gravy" +27540350,"TURKEY SUB SAND, W/ CHEESE, LETT, TOM, SPRD","Turkey submarine sandwich, with cheese, lettuce, tomato and spread" +27541000,"TURKEY, HAM & ROAST BEEF CLUB SANDWCH W/LETT,TOM,SPRD","Turkey, ham, and roast beef club sandwich, with lettuce, tomato and spread" +27541001,"TURKEY, HAM & ROAST BEEF CLUB SANDWCH W/CHEESE,LETT,TOM,SPRD","Turkey, ham, and roast beef club sandwich with cheese, lettuce, tomato, and spread" +27550000,"FISH SANDWICH, ON BUN, W/ SPREAD","Fish sandwich, on bun, with spread" +27550100,"FISH SANDWICH, ON BUN, W/ CHEESE AND SPREAD","Fish sandwich, on bun, with cheese and spread" +27550110,"CRAB CAKE SANDWICH, ON BUN","Crab cake sandwich, on bun" +27550510,"SARDINE SANDWICH, W/ LETTUCE & SPREAD","Sardine sandwich, with lettuce and spread" +27550710,"TUNA SALAD SANDWICH W/ LETTUCE","Tuna salad sandwich, with lettuce" +27550720,"TUNA SALAD SANDWICH","Tuna salad sandwich" +27550730,"TUNA MELT SANDWICH","Tuna melt sandwich" +27550750,"TUNA SALSUB SAND, W/ LETT & TOMATO","Tuna salad submarine sandwich, with lettuce and tomato" +27550751,"TUNA SALAD SUB SANDWCH, W/ CHEESE, LETTUCE & TOMATO","Tuna salad submarine sandwich, with cheese, lettuce and tomato" +27560000,"LUNCHEON MEAT SANDWICH, NFS, W/ SPREAD","Luncheon meat sandwich, NFS, with spread" +27560110,"BOLOGNA SANDWICH, W/ SPREAD","Bologna sandwich, with spread" +27560120,"BOLOGNA & CHEESE SANDWICH W/ SPREAD","Bologna and cheese sandwich, with spread" +27560300,"CORN DOG (FRANKFURTER/HOT DOG W/ CORNBREAD COATING)","Corn dog (frankfurter or hot dog with cornbread coating)" +27560350,"PIG IN A BLANKET (FRANKFURTER OR HOT DOG WRAPPED IN DOUGH)","Pig in a blanket (frankfurter or hot dog wrapped in dough)" +27560410,"PUERTO RICAN SANDWICH, P.R. (SANDWICH CRIOLLO)","Puerto Rican sandwich (Sandwich criollo)" +27560500,"PEPPERONI, SALAMI SUBM SANDWICH, WITH LETTUCE, TOM, SPREAD","Pepperoni and salami submarine sandwich, with lettuce, tomato, and spread" +27560510,"SALAMI SANDWICH W/ SPREAD","Salami sandwich, with spread" +27560650,"SAUSAGE ON BISCUIT(INCL JIMMY DEAN SAUSAGE BISCUIT)","Sausage on biscuit" +27560660,"SAUSAGE GRIDDLE CAKE SANDWICH","Sausage griddle cake sandwich" +27560670,"SAUSAGE & CHEESE ON ENGLISH MUFFIN","Sausage and cheese on English muffin" +27560705,"SAUSAGE BALLS (MADE W/ BISCUIT MIX & CHEESE)","Sausage balls (made with biscuit mix and cheese)" +27560710,"SAUSAGE SANDWICH","Sausage sandwich" +27560720,"SAUSAGE & SPAGH SAUCE SANDWICH","Sausage and spaghetti sauce sandwich" +27560910,"COLD CUT SUB SANDWICH, W/ CHEESE, LETTUCE, TOMATO, SPRD","Cold cut submarine sandwich, with cheese, lettuce, tomato, and spread" +27563010,"MEAT SPREAD OR POTTED MEAT SANDWICH","Meat spread or potted meat sandwich" +27564000,"FRANKFURTER OR HOT DOG, NFS, PLAIN, ON BUN","Frankfurter or hot dog sandwich, NFS, plain, on bun" +27564010,"FRANKFURTER OR HOT DOG, NFS, PLAIN, ON WHITE BREAD","Frankfurter or hot dog sandwich, NFS, plain, on white bread" +27564020,"FRANKFURTER OR HOT DOG, NFS, PLAIN, ON WHEAT BREAD","Frankfurter or hot dog sandwich, NFS, plain, on wheat bread" +27564030,"FRANKFURTER/HOT DOG, NFS, PLAIN, WHL WHT BREAD, NS TO 100%","Frankfurter or hot dog sandwich, NFS, plain, on whole wheat bread, NS as to 100%" +27564040,"FRANKFURTER OR HOT DOG, NFS, PLAIN, ON WHOLE GRAIN WHITE BRE","Frankfurter or hot dog sandwich, NFS, plain, on whole grain white bread" +27564050,"FRANKFURTER OR HOT DOG, NFS, PLAIN, ON MULTIGRAIN BREAD","Frankfurter or hot dog sandwich, NFS, plain, on multigrain bread" +27564060,"FRANKFURTER OR HOT DOG, BEEF, PLAIN, ON BUN","Frankfurter or hot dog sandwich, beef, plain,on bun" +27564070,"FRANKFURTER OR HOT DOG, PLAIN, WHITE BREAD","Frankfurter or hot dog sandwich, beef, plain, on white bread" +27564080,"FRANKFURTER OR HOT DOG, PLAIN, WHEAT BREAD","Frankfurter or hot dog sandwich, beef, plain, on wheat bread" +27564090,"FRANKFURTER/ HOT DOG, BEEF,PLAIN, WHOLE WHEAT BREAD, NS 100%","Frankfurter or hot dog sandwich, beef, plain, on whole wheat bread, NS as to 100%" +27564100,"FRANKFURTER OR HOT DOG, PLAIN, ON WHOLE GRAIN WHITE","Frankfurter or hot dog sandwich, beef, plain, on whole grain white bread" +27564110,"FRANKFURTER OR HOT DOG, BEEF, PLAIN, ON MULTIGRAIN BREAD","Frankfurter or hot dog sandwich, beef, plain, on multigrain bread" +27564120,"FRANKFURTER OR HOT DOG, BEEF/PORK, PLAIN, ON BUN","Frankfurter or hot dog sandwich, beef and pork, plain, on bun" +27564130,"FRANKFURTER OR HOT DOG, BEEF & PORK, PLAIN, ON WHITE BREAD","Frankfurter or hot dog sandwich, beef and pork, plain, on white bread" +27564140,"FRANKFURTER OR HOT DOG, BEEF/PORK, PLAIN, ON WHEAT BREAD","Frankfurter or hot dog sandwich, beef and pork, plain, on wheat bread" +27564150,"FRANKFURTER/HOT DOG, BEEF&PORK,PLAIN,ON WHL WHT, NS TO 100%","Frankfurter or hot dog sandwich, beef and pork, plain, on whole wheat bread, NS as to 100%" +27564160,"FRANKFURTER OR HOT DOG, BEEF/PORK, PLAIN, WHOLE GRAIN WHITE","Frankfurter or hot dog sandwich, beef and pork, plain, on whole grain white bread" +27564170,"FRANKFURTER OR HOT DOG, BEEF/PORK, PLAIN, MULTIGRAIN BREAD","Frankfurter or hot dog sandwich, beef and pork, plain, on multigrain bread" +27564180,"FRANKFURTER OR HOT DOG, MEAT/POULTRY, PLAIN, ON BUN","Frankfurter or hot dog sandwich, meat and poultry, plain, on bun" +27564190,"FRANKFURTER OR HOT DOG, MEAT AND POULTRY, PLAIN, ON WHITE BR","Frankfurter or hot dog sandwich, meat and poultry, plain, on white bread" +27564200,"FRANKFURTER OR HOT DOG, MEAT AND POULTRY, PLAIN, ON WHEAT BR","Frankfurter or hot dog sandwich, meat and poultry, plain, on wheat bread" +27564210,"FRANKFURTER/HOT DOG, MEAT&POULTRY,PLAIN,WHL WHT,NS TO 100%","Frankfurter or hot dog sandwich, meat and poultry, plain, on whole wheat bread, NS as to 100%" +27564220,"FRANKFURTER OR HOT DOG, MEAT AND POULTRY, PLAIN, ON WHOLE GR","Frankfurter or hot dog sandwich, meat and poultry, plain, on whole grain white bread" +27564230,"FRANKFURTER OR HOT DOG, MEAT AND POULTRY, PLAIN, ON MULTIGRA","Frankfurter or hot dog sandwich, meat and poultry, plain, on multigrain bread" +27564240,"FRANKFURTER OR HOT DOG, CHICKEN AND/OR TURKEY, PLAIN, ON BUN","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on bun" +27564250,"FRANKFURTER OR HOT DOG, CHICKEN / TURKEY, PLAIN, ON WHITE BR","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on white bread" +27564260,"FRANKFURTER OR HOT DOG, CHICKEN AND/OR TURKEY, PLAIN, ON WHE","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on wheat bread" +27564270,"FRANKFURTER/HOT DOG, CHICK/TURKEY,PLAIN,WHL WHT,NS TO 100%","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on whole wheat bread, NS as to 100%" +27564280,"FRANKFURTER OR HOT DOG, CHICKEN AND/OR TURKEY, PLAIN, ON WHO","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on whole grain white bread" +27564290,"FRANKFURTER OR HOT DOG, CHICKEN AND/OR TURKEY, PLAIN, ON MUL","Frankfurter or hot dog sandwich, chicken and/or turkey, plain, on multigrain bread" +27564300,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, PLAIN, ON BUN","Frankfurter or hot dog sandwich, reduced fat or light, plain, on bun" +27564310,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, PLAIN, ON WHIT","Frankfurter or hot dog sandwich, reduced fat or light, plain, on white bread" +27564320,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, PLAIN, ON WHEA","Frankfurter or hot dog sandwich, reduced fat or light, plain, on wheat bread" +27564330,"FRANKFURTER/HOT DOG, RED FAT/LIGHT,PLAIN,WHL WHT,NS TO 100%","Frankfurter or hot dog sandwich, reduced fat or light, plain, on whole wheat bread, NS as to 100%" +27564340,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, PLAIN, ON WHOL","Frankfurter or hot dog sandwich, reduced fat or light, plain, on whole grain white bread" +27564350,"FRANKFURTER OR HOT DOG, REDUCED FAT OR LIGHT, PLAIN, ON MULT","Frankfurter or hot dog sandwich, reduced fat or light, plain, on multigrain bread" +27564360,"FRANKFURTER OR HOT DOG, FAT FREE, PLAIN, ON BUN","Frankfurter or hot dog sandwich, fat free, plain, on bun" +27564370,"FRANKFURTER OR HOT DOG, FAT FREE, PLAIN, ON WHITE BREAD","Frankfurter or hot dog sandwich, fat free, plain, on white bread" +27564380,"FRANKFURTER OR HOT DOG, FAT FREE, PLAIN, ON WHEAT BREAD","Frankfurter or hot dog sandwich, fat free, plain, on wheat bread" +27564390,"FRANKFURTER/HOT DOG, FAT FREE, PLAIN, WHL WHT, NS TO 100%","Frankfurter or hot dog sandwich, fat free, plain, on whole wheat bread, NS as to 100%" +27564400,"FRANKFURTER OR HOT DOG, FAT FREE, PLAIN, ON WHOLE GRAIN WHIT","Frankfurter or hot dog sandwich, fat free, plain, on whole grain white bread" +27564410,"FRANKFURTER OR HOT DOG, FAT FREE, PLAIN, ON MULTIGRAIN BREAD","Frankfurter or hot dog sandwich, fat free, plain, on multigrain bread" +27564420,"FRANKFURTER OR HOT DOG, MEATLESS, PLAIN, ON BUN","Frankfurter or hot dog sandwich, meatless, plain, on bun" +27564430,"FRANKFURTER OR HOT DOG, MEATLESS, PLAIN, ON BREAD","Frankfurter or hot dog sandwich, meatless, plain, on bread" +27564440,"FRANKFURTER OR HOT DOG, WITH CHILI, ON BUN","Frankfurter or hot dog sandwich, with chili, on bun" +27564450,"FRANKFURTER OR HOT DOG, WITH CHILI, ON WHITE BREAD","Frankfurter or hot dog sandwich, with chili, on white bread" +27564460,"FRANKFURTER OR HOT DOG, WITH CHILI, ON WHEAT BREAD","Frankfurter or hot dog sandwich, with chili, on wheat bread" +27564470,"FRANKFURTER/HOT DOG, W/CHILI, ON WHL WHT BREAD, NS TO 100%","Frankfurter or hot dog sandwich, with chili, on whole wheat bread, NS as to 100%" +27564480,"FRANKFURTER OR HOT DOG, WITH CHILI, ON WHOLE GRAIN WHITE BRE","Frankfurter or hot dog sandwich, with chili, on whole grain white bread" +27564490,"FRANKFURTER OR HOT DOG, WITH CHILI, ON MULTI-GRAIN BREAD","Frankfurter or hot dog sandwich, with chili, on multi-grain bread" +27564500,"FRANKFURTER OR HOT DOG, W/ VEGETARIAN CHILI, ON BUN","Frankfurter or hot dog sandwich, with vegetarian chili, on bun" +27564510,"FRANKFURTER OR HOT DOG, W/ VEGETARIAN CHILI, ON WHITE BREAD","Frankfurter or hot dog sandwich, with vegetarian chili, on white bread" +27564520,"FRANKFURTER OR HOT DOG, W/ VEGETARIAN CHILI, ON WHEAT BREAD","Frankfurter or hot dog sandwich, with vegetarian chili, on wheat bread" +27564530,"FRANKFURTER/HOT DOG, W/MEATLESS CHILI, ON WHL WHT,NS TO 100%","Frankfurter or hot dog sandwich, with meatless chili, on whole wheat bread, NS as to 100%" +27564540,"FRANKFURTER OR HOT DOG, W/ VEGETARIAN CHILI, ON WHOLE GRAIN","Frankfurter or hot dog sandwich, with vegetarian chili, on whole grain white bread" +27564550,"FRANKFURTER OR HOT DOG, W/ VEGETARIAN CHILI, ON MULTIGRAIN B","Frankfurter or hot dog sandwich, with vegetarian chili, on multigrain bread" +27564560,"FRANKFURTER OR HOT DOG, MEATLESS, ON BUN, WITH CHILI","Frankfurter or hot dog sandwich, meatless, on bun, with vegetarian chili" +27564570,"FRANKFURTER OR HOT DOG, MEATLESS, ON BREAD, WITH CHILI","Frankfurter or hot dog sandwich, meatless, on bread, with vegetarian chili" +27570310,"HORS D'OEUVRES, W/ SPREAD","Hors d'oeuvres, with spread" +27601000,"BEEF STEW, BABY FOOD, TODDLER","Beef stew, baby food, toddler" +27610100,"BEEF & EGG NOODLES, BABY, NS AS TO STR OR JR","Beef and egg noodles, baby food, NS as to strained or junior" +27610110,"BEEF & EGG NOODLES, BABY, STRAINED","Beef and egg noodles, baby food, strained" +27610120,"BEEF & EGG NOODLES, BABY, JUNIOR","Beef and egg noodles, baby food, junior" +27610710,"BEEF W/ VEGETABLES, BABY, STRAINED","Beef with vegetables, baby food, strained" +27610730,"BEEF W/ VEGETABLES, BABY FOOD, TODDLER","Beef with vegetables, baby food, toddler" +27640050,"CHICKEN & RICE DINNER, BABY, STRAINED","Chicken and rice dinner, baby food, strained" +27640100,"CHICKEN NOODLE DINNER, BABY, NS AS TO STR OR JR","Chicken noodle dinner, baby food, NS as to strained or junior" +27640110,"CHICKEN NOODLE DINNER, BABY, STRAINED","Chicken noodle dinner, baby food, strained" +27640120,"CHICKEN NOODLE DINNER, BABY, JUNIOR","Chicken noodle dinner, baby food, junior" +27640810,"CHICKEN, NOODLES & VEGETABLES, BABY, TODDLER","Chicken, noodles, and vegetables, baby food, toddler" +27641000,"CHICKEN STEW, BABY FOOD, TODDLER","Chicken stew, baby food, toddler" +27642100,"TURKEY, RICE & VEGETABLES, BABY, NS AS TO STR OR JR","Turkey, rice and vegetables, baby food, NS as to strained or junior" +27642110,"TURKEY, RICE & VEGETABLES, BABY, STRAINED","Turkey, rice and vegetables, baby food, strained" +27642120,"TURKEY, RICE & VEGETABLES, BABY, JUNIOR","Turkey, rice and vegetables, baby food, junior" +27642130,"TURKEY, RICE, & VEGETABLES, BABY, TODDLER","Turkey, rice, and vegetables, baby food, toddler" +27644110,"CHICKEN SOUP, BABY","Chicken soup, baby food" +28101000,"FROZEN DINNER, NFS","Frozen dinner, NFS" +28110000,"BEEF DINNER, NFS (FROZEN)","Beef dinner, NFS (frozen meal)" +28110120,"BEEF W/ POTATOES (FROZEN MEAL, LARGE MEAT PORTION)","Beef with potatoes (frozen meal, large meat portion)" +28110150,"BEEF W/ VEGETABLE (DIET FROZEN MEAL)","Beef with vegetable (diet frozen meal)" +28110220,"SIRLOIN, CHOPPED, W/ GRAVY, POT, VEG (FROZEN MEAL)","Sirloin, chopped, with gravy, mashed potatoes, vegetable (frozen meal)" +28110250,"SIRLOIN TIPS W/ GRAVY, POTATOES, VEG (FROZEN MEAL)","Sirloin tips with gravy, potatoes, vegetable (frozen meal)" +28110270,"SIRLOIN BEEF W/ GRAVY, POTATOES, VEG (FROZ MEAL)","Sirloin beef with gravy, potatoes, vegetable (frozen meal)" +28110300,"SALISBURY STEAK DINNER, NFS (FROZEN)","Salisbury steak dinner, NFS (frozen meal)" +28110310,"SALISBURY STEAK W/ GRAVY, POTATOES, VEG (FROZ MEAL)","Salisbury steak with gravy, potatoes, vegetable (frozen meal)" +28110330,"SALISBURY STEAK, GRAVY, POT, VEG, DESSERT(FRZ MEAL)","Salisbury steak with gravy, whipped potatoes, vegetable, dessert (frozen meal)" +28110340,"SALISBURY STK, GRAVY,POT,VEG,SOUP,DESSERT(FRZ MEAL)","Salisbury steak with gravy, potatoes, vegetable, soup or macaroni and cheese, dessert (frozen meal)" +28110350,"SALISBURY STEAK, POT,VEG,DESSERT(FROZ MEAL,LG MEAT)","Salisbury steak with gravy, potatoes, vegetable, dessert (frozen meal, large meat portion)" +28110370,"SALISBURY STEAK, GRAVY, MAC&CHEESE, VEG (FROZ MEAL)","Salisbury steak with gravy, macaroni and cheese, vegetable (frozen meal)" +28110380,"SALISBURY STEAK W/GRAV,MACARONI & CHEESE (FRZ MEAL)","Salisbury steak with gravy, macaroni and cheese (frozen meal)" +28110390,"SALISBURY STEAK, POT, VEG, DESSERT (DIET FZN MEAL)","Salisbury steak, potatoes, vegetable, dessert (diet frozen meal)" +28110510,"BEEF, SLICED, W/ GRAVY, POTATOES, VEG (FROZEN MEAL)","Beef, sliced, with gravy, potatoes, vegetable (frozen meal)" +28110620,"SHORTRIBS W/ BBQ SAUCE, POTATOES & VEG (FROZ MEAL)","Beef short ribs, boneless, with barbecue sauce, potatoes, vegetable (frozen meal)" +28110640,"MEATBALLS, SWEDISH, IN SAUCE W/ NOODLES (FROZ MEAL)","Meatballs, Swedish, in sauce, with noodles (frozen meal)" +28110660,"MEATBALLS,SWEDISH,W/GRAVY & NOODLES (DIET FRZ MEAL)","Meatballs, Swedish, in gravy, with noodles (diet frozen meal)" +28113110,"SALISBURY STEAK W/ TOM SAUCE, VEG (DIET FROZ MEAL)","Salisbury steak, baked, with tomato sauce, vegetable (diet frozen meal)" +28113140,"BEEF W/ SPAETZLE OR RICE, VEGETABLE (FROZEN MEAL)","Beef with spaetzle or rice, vegetable (frozen meal)" +28130000,"VEAL DINNER, NFS (FROZEN)","Veal dinner, NFS (frozen meal)" +28133110,"VEAL, BREADED, W/ SPAGHETTI, TOM SAUCE (FROZ MEAL)","Veal, breaded, with spaghetti, in tomato sauce (frozen meal)" +28133340,"VEAL PARMIGIANA, VEG, FETTUCCINE,DESSERT(FROZ MEAL)","Veal parmigiana with vegetable, fettuccine alfredo, dessert (frozen meal)" +28140100,"CHICKEN DINNER, NFS (FROZEN)","Chicken dinner, NFS (frozen meal)" +28140150,"CHICKEN DIVAN (FROZEN MEAL)","Chicken divan (frozen meal)" +28140250,"CHICKEN,GRAVY,DRESS,RICE,VEG,DESSRT(Z MEAL,LG MEAT)","Chicken, boneless, with gravy, dressing, rice, vegetable, dessert (frozen meal, large meat portion)" +28140320,"CHICKEN & NOODLES W/ VEG, DESSERT (FROZEN MEAL)","Chicken and noodles with vegetable, dessert (frozen meal)" +28140710,"CHICKEN, FRIED, W/ POTATOES, VEGETABLE (FROZ MEAL)","Chicken, fried, with potatoes, vegetable (frozen meal)" +28140720,"CHICKEN PATTY, POTATOES, VEGETABLE (FROZEN MEAL)","Chicken patty, or nuggets, boneless, breaded, potatoes, vegetable (frozen meal)" +28140730,"CHICKEN PATTY, TOM SCE, FETTUCCINE, VEG (FROZ MEAL)","Chicken patty, breaded, with tomato sauce and cheese, fettuccine alfredo, vegetable (frozen meal)" +28140740,"CHICKEN PATTY/NUGGET,PASTA,FRUIT,DESSERT(FROZ MEAL)","Chicken patty, or nuggets, boneless, breaded, with pasta and tomato sauce, fruit, dessert (frozen meal)" +28140810,"CHICKEN, FRIED, W/ POT, VEG, DESSERT (FROZEN MEAL)","Chicken, fried, with potatoes, vegetable, dessert (frozen meal)" +28141010,"CHICKEN, FRIED, POT,VEG, DESSERT(FROZ MEAL,LG MEAT)","Chicken, fried, with potatoes, vegetable, dessert (frozen meal, large meat portion)" +28141050,"CHICKEN PATTY PARMIGIANA, W/ VEG (DIET FROZ MEAL)","Chicken patty parmigiana, breaded, with vegetable (diet frozen meal)" +28141201,"TERIYAKI CHICKEN W/ RICE & VEGETABLE (DIET FROZ MEAL)","Teriyaki chicken with rice and vegetable (diet frozen meal)" +28141250,"CHICKEN W/ RICE-VEGETABLE MIXTURE (DIET FROZ MEAL)","Chicken with rice-vegetable mixture (diet frozen meal)" +28141300,"CHICKEN W/RICE & VEG, REDUCED FAT&SODIUM(DIET FROZ)","Chicken with rice and vegetable, reduced fat and sodium (diet frozen meal)" +28141600,"CHICKEN A LA KING W/ RICE (FROZEN MEAL)","Chicken a la king with rice (frozen meal)" +28141610,"CHICKEN & VEGETABLES IN CREAM SCE (DIET FROZ MEAL)","Chicken and vegetables in cream or white sauce (diet frozen meal)" +28141650,"CHICKEN & VEGETABLES AU GRATIN (DIET FROZEN MEAL)","Chicken and vegetables au gratin with rice-vegetable mixture (diet frozen entree)" +28143020,"CHICKEN AND VEGETABLE W/ RICE, ASIAN (DIET FROZEN MEAL)","Chicken and vegetable entree with rice, Asian (diet frozen meal)" +28143040,"CHICKEN CHOW MEIN W/ RICE (DIET FROZEN MEAL)","Chicken chow mein with rice (diet frozen meal)" +28143050,"CHICK CHOWMEIN W/RICE,REDUCED FAT&SODIUM(DIET FROZ)","Chicken chow mein with rice, reduced fat and sodium (diet frozen meal)" +28143080,"CHICKEN W/NOODLES & CHEESE SAUCE (DIET FROZEN MEAL)","Chicken with noodles and cheese sauce (diet frozen meal)" +28143110,"CHICKEN CACCIATORE W/ NOODLES (DIET FROZEN MEAL)","Chicken cacciatore with noodles (diet frozen meal)" +28143130,"CHICKEN & VEG ENTREE W/ NOODLES (FROZEN MEAL)","Chicken and vegetable entree with noodles (frozen meal)" +28143150,"CHICK & VEG ENTREE W/ NOODLES, (DIET FROZEN MEAL)","Chicken and vegetable entree with noodles (diet frozen meal)" +28143170,"CHICKEN IN CREAM SAUCE W/ NOODLES & VEG (FROZ MEAL)","Chicken in cream sauce with noodles and vegetable (frozen meal)" +28143180,"CHICKEN,BUTTER SCE,W/POT & VEG (FRZ, DIET MEAL)","Chicken in butter sauce with potatoes and vegetable (diet frozen meal)" +28143190,"CHICKEN, MUSHROOM SAUCE, WILD RICE, VEG (FROZ MEAL)","Chicken in mushroom sauce, white and wild rice, vegetable (frozen meal)" +28143200,"CHICKEN IN SOY-BASED SAUCE,RICE&VEG (FROZEN MEAL)","Chicken in soy-based sauce, rice and vegetables (frozen meal)" +28143210,"CHICKEN IN ORANGE SAUCE W/ RICE (DIET FROZEN MEAL)","Chicken in orange sauce with almond rice (diet frozen meal)" +28143220,"CHICKEN IN BBQ SCE,W/RICE,VEG&DES,RED FAT&SODIUM,FRZ,DIET","Chicken in barbecue sauce, with rice, vegetable and dessert, reduced fat and sodium (diet frozen meal)" +28144100,"CHICKEN & VEG W/ NOODLES & CREAM SCE (FROZEN MEAL)","Chicken and vegetable entree with noodles and cream sauce (frozen meal)" +28145000,"TURKEY DINNER, NFS (FROZEN)","Turkey dinner, NFS (frozen meal)" +28145100,"TURKEY W/DRESSING, GRAVY,VEG, FRUIT (DIET FRZ MEAL)","Turkey with dressing, gravy, vegetable and fruit (diet frozen meal)" +28145110,"TURKEY W/ VEGETABLE, STUFFING (DIET FROZEN MEAL)","Turkey with vegetable, stuffing (diet frozen meal)" +28145210,"TURKEY W/ GRAVY, DRESSING, POT, VEG (FROZEN MEAL)","Turkey with gravy, dressing, potatoes, vegetable (frozen meal)" +28145610,"TURKEY, DRESSING,POT,VEG,DESSERT(FROZ MEAL,LG MEAT)","Turkey with gravy, dressing, potatoes, vegetable, dessert (frozen meal, large meat portion)" +28145710,"TURKEY TETRAZZINI (FROZEN MEAL)","Turkey tetrazzini (frozen meal)" +28150000,"FISH DINNER, NFS (FROZEN)","Fish dinner, NFS (frozen meal)" +28150210,"HADDOCK W/ CHOPPED SPINACH (DIET FROZEN MEAL)","Haddock with chopped spinach (diet frozen meal)" +28150220,"FLOUNDER W/ CHOPPED BROCCOLI (DIET FROZEN MEAL)","Flounder with chopped broccoli (diet frozen meal)" +28150510,"FISH IN LEMON SAUCE W/ STARCH ITEM, VEG (FROZ MEAL)","Fish in lemon-butter sauce with starch item, vegetable (frozen meal)" +28150650,"FISH,BREADED/FISH STICKS,W/PASTA,VEG,DES (FRZ MEAL)","Fish, breaded, or fish sticks, with pasta, vegetable and dessert (frozen meal)" +28153010,"SHRIMP & CLAMS IN TOMATO SCE, W/ NOODLES(FROZ MEAL)","Shrimp and clams in tomato-based sauce, with noodles (frozen meal)" +28154010,"SHRIMP & VEG IN SAUCE W/ NOODLES (DIET FROZEN MEAL)","Shrimp and vegetables in sauce with noodles (diet frozen meal)" +28160300,"MEAT LOAF DINNER, NFS (FROZEN)","Meat loaf dinner, NFS (frozen meal)" +28160310,"MEATLOAF W/ POTATO, VEG (FROZ MEAL)","Meat loaf with potatoes, vegetable (frozen meal)" +28160650,"STUFFED GREEN PEPPER (FROZEN MEAL)","Stuffed green pepper (frozen meal)" +28160710,"STUFFED CABBAGE, W/ MEAT & TOM SCE (DIET FROZ MEAL)","Stuffed cabbage, with meat and tomato sauce (diet frozen meal)" +28310110,"BEEF BROTH, BOUILLON OR CONSOMME (INCL BROTH, NFS)","Beef, broth, bouillon, or consomme" +28310120,"BEEF BROTH OR BOUILLON, CANNED, LOW SODIUM","Beef, broth, bouillon, or consomme, canned, low sodium" +28310150,"OXTAIL SOUP","Oxtail soup" +28310160,"BEEF BROTH, W/ TOMATO, HOME RECIPE","Beef broth, with tomato, home recipe" +28310170,"BEEF BROTH, W/O TOMATO, HOME RECIPE","Beef broth, without tomato, home recipe" +28310230,"MEATBALL SOUP, MEXICAN STYLE, HOME RECIPE (SOPA DE ALBONDIGA","Meatball soup, Mexican style, home recipe (Sopa de Albondigas)" +28310320,"BEEF NOODLE SOUP, P.R. (SOPA DE CARNE Y FIDEOS)","Beef noodle soup, Puerto Rican style (Sopa de carne y fideos)" +28310330,"MEAT AND RICE NOODLE SOUP, ASIAN STYLE (VIETNAMESE PHO BO)","Meat and rice noodle soup, Asian style (Vietnamese Pho Bo)" +28310420,"BEEF & RICE SOUP, P.R.","Beef and rice soup, Puerto Rican style" +28311010,"PEPPERPOT (TRIPE) SOUP","Pepperpot (tripe) soup" +28311020,"MENUDO SOUP, HOME RECIPE","Menudo soup, home recipe" +28311030,"MENUDO, CANNED","Menudo soup, canned, prepared with water or ready-to-serve" +28315050,"BEEF VEGETABLE SOUP W/ POTATO, PASTA OR RICE, CHUNKY STYLE","Beef vegetable soup with potato, pasta, or rice, chunky style, canned, or ready-to-serve" +28315140,"BEEF VEGETABLE SOUP, MEXICAN STYLE, HOME RECIPE, (SOPA / CAL","Beef vegetable soup, Mexican style, home recipe, (Sopa / Caldo de Res)" +28315150,"MEAT AND CORN HOMINY SOUP, MEXICAN STYLE, HOME RECIPE (POZOL","Meat and corn hominy soup, Mexican style, home recipe (Pozole)" +28315160,"ITALIAN WEDDING SOUP","Italian Wedding Soup" +28317010,"BEEF STROGANOFF SOUP, CHUNKY STYLE, HOME RECIPE, CANNED OR R","Beef stroganoff soup, chunky style, home recipe, canned or ready-to-serve" +28320130,"HAM, RICE, & POTATO SOUP, P.R.","Ham, rice, and potato soup, Puerto Rican style" +28320140,"HAM, NOODLE & VEGETABLE SOUP, P.R.","Ham, noodle, and vegetable soup, Puerto Rican style" +28320160,"PORK VEGETABLE SOUP W/ POTATO, PASTA, OR RICE, CHUNKY","Pork vegetable soup with potato, pasta, or rice, stew type, chunky style" +28320300,"PORK W/VEG (NO CAR, BROC AND/OR DK GRN)SOUP, ASIAN STYLE","Pork with vegetable (excluding carrots, broccoli and/or dark-green leafy) soup, Asian Style" +28321130,"BACON SOUP, CREAM OF, PREPARED W/ WATER","Bacon soup, cream of, prepared with water" +28330110,"SCOTCH BROTH (LAMB, VEGETABLES, BARLEY)","Scotch broth (lamb, vegetables, and barley)" +28331110,"LAMB, PASTA & VEGETABLE SOUP, P.R.","Lamb, pasta, and vegetable soup, Puerto Rican style" +28340110,"CHICKEN OR TURKEY BROTH, BOUILLON, OR CONSOMME","Chicken or turkey broth, bouillon, or consomme" +28340120,"CHICKEN OR TURKEY BROTH, WITHOUT TOMATO, HOME RECIPE","Chicken or turkey broth, without tomato, home recipe" +28340130,"CHICKEN OR TURKEY BROTH, WITH TOMATO, HOME RECIPE","Chicken or turkey broth, with tomato, home recipe" +28340150,"MEXICAN STYLE CHICKEN BROTH SOUP STOCK","Mexican style chicken broth soup stock" +28340180,"CHICKEN OR TURKEY BROTH, LESS/REDUCED SODIUM, CANNED OR RTS","Chicken or turkey broth, less or reduced sodium, canned or ready-to-serve" +28340210,"CHICKEN RICE SOUP, P.R. (SOPA DE POLLO CON ARROZ)","Chicken rice soup, Puerto Rican style (Sopa de pollo con arroz)" +28340220,"CHICKEN SOUP W/ NOODLES & POTATOES, P.R.","Chicken soup with noodles and potatoes, Puerto Rican style" +28340310,"CHICKEN OR TURKEY GUMBO SOUP","Chicken or turkey gumbo soup, home recipe, canned or ready-to-serve" +28340510,"CHICKEN OR TURKEY NOODLE SOUP, CHUNKY STYLE, CANNED OR RTS","Chicken or turkey noodle soup, chunky style, canned or ready-to-serve" +28340550,"SWEET & SOUR SOUP","Sweet and sour soup" +28340580,"CHICKEN OR TURKEY SOUP WITH VEGETABLES, ASIAN STYLE","Chicken or turkey soup with vegetables (broccoli, carrots, celery, potatoes and onions), Asian style" +28340590,"CHICKEN OR TURKEY CORN SOUP WITH NOODLES, HOME RECIPE","Chicken or turkey corn soup with noodles, home recipe" +28340600,"CHICK/TURK+VEG SOUP, CANNED","Chicken or turkey vegetable soup, canned, prepared with water or ready-to-serve" +28340610,"CHICKEN VEGETABLE SOUP, STEW TYPE (INCL CHUNKY)","Chicken or turkey vegetable soup, stew type" +28340630,"CHICKEN OR TURKEY VEGETABLE SOUP WITH RICE, STEW TYPE, CHUNK","Chicken or turkey vegetable soup with rice, stew type, chunky style" +28340640,"CHICKEN OR TURKEY VEGETABLE SOUP WITH NOODLES, STEW TYPE, CH","Chicken or turkey vegetable soup with noodles, stew type, chunky style, canned or ready-to-serve" +28340660,"CHICKEN OR TURKEY VEGETABLE SOUP, HOME RECIPE","Chicken or turkey vegetable soup, home recipe" +28340670,"CHICKEN OR TURKEY VEGETABLE SOUP WITH RICE, MEXICAN STYLE, H","Chicken or turkey vegetable soup with rice, Mexican style, home recipe (Sopa / Caldo de Pollo)" +28340680,"CHICKEN OR TURKEY AND CORN HOMINY SOUP, MEXICAN STYLE, HOME","Chicken or turkey and corn hominy soup, Mexican style, home recipe (Pozole)" +28340690,"CHICKEN OR TURKEY VEGETABLE SOUP WITH POTATO AND CHEESE, CHU","Chicken or turkey vegetable soup with potato and cheese, chunky style, canned or ready-to-serve" +28340700,"BIRD'S NEST SOUP (CHICKEN, HAM, NOODLES)","Bird's nest soup (chicken, ham, and noodles)" +28340750,"HOT & SOUR SOUP (INCLUDE HOT & SPICY CHINESE SOUP)","Hot and sour soup" +28340800,"CHICKEN OR TURKEY SOUP WITH VEGETABLES AND FRUIT, ASIAN STYL","Chicken or turkey soup with vegetables and fruit, Asian Style" +28345010,"CHICKEN/TURKEY SOUP, CM OF, CAN, RED SOD, NS W/ MILK/WATER","Chicken or turkey soup, cream of, canned, reduced sodium, NS as to made with milk or water" +28345020,"CHICKEN/TURKEY SOUP, CM OF, CAN, RED SOD, W/ MILK","Chicken or turkey soup, cream of, canned, reduced sodium, made with milk" +28345030,"CHICKEN/TURKEY SOUP, CM OF, CAN, RED SOD, W/ WATER","Chicken or turkey soup, cream of, canned, reduced sodium, made with water" +28345110,"CHICKEN SOUP, CREAM OF, NS AS TO MILK OR WATER","Chicken or turkey soup, cream of, NS as to prepared with milk or water" +28345120,"CHICKEN/TURKEY SOUP,CREAM OF, W/ MILK","Chicken or turkey soup, cream of, prepared with milk" +28345130,"CHICKEN SOUP, CREAM OF, PREPARED W/ WATER","Chicken or turkey soup, cream of, prepared with water" +28345160,"CHICKEN OR TURKEY MUSHROOM SOUP, CREAM OF, PREPARED WITH MIL","Chicken or turkey mushroom soup, cream of, prepared with milk" +28345170,"DUCK SOUP","Duck soup" +28350040,"FISH STOCK, HOME RECIPE","Fish stock, home recipe" +28350050,"FISH CHOWDER (INCL FISHERMAN'S SOUP, SEAFOOD CHOWD)","Fish chowder" +28350110,"CRAB SOUP, NS AS TO TOMATO-BASE OR CREAM","Crab soup, NS as to tomato-base or cream style" +28350120,"CRAB SOUP, TOMATO BASE","Crab soup, tomato-base" +28350210,"CLAM CHOWDER, NS AS TO MANHATTAN OR NEW ENGLAND","Clam chowder, NS as to Manhattan or New England style" +28350220,"CLAM CHOWDER, MANHATTAN (INCLUDE CHUNKY)","Clam chowder, Manhattan" +28350310,"TURTLE & VEGETABLE SOUP (INCLUDE SNAPPER SOUP)","Turtle and vegetable soup" +28351110,"FISH AND VEGETABLE SOUP, NO POTATOES (SOPA DE PESCADO Y MARI","Fish and vegetable soup, no potatoes (Sopa de pescado y mariscos)" +28351120,"FISH SOUP, WITH POTATOES (SOPA DE PESCADO Y MARISCOS)","Fish soup, with potatoes (Sopa de Pescado y Mariscos)" +28351160,"CODFISH, RICE & VEGETABLE SOUP, P.R.","Codfish, rice, and vegetable soup, Puerto Rican style" +28351170,"CODFISH SOUP W/ NOODLES, P.R.","Codfish soup with noodles, Puerto Rican style" +28355110,"CLAM CHOWDER, NEW ENG, NS AS TO MILK OR WATER ADDED","Clam chowder, New England, NS as to prepared with water or milk" +28355120,"CLAM CHOWDER, NEW ENGLAND, W/ MILK","Clam chowder, New England, prepared with milk" +28355130,"CLAM CHOWDER, NEW ENGLAND, W/ WATER","Clam chowder, New England, prepared with water" +28355140,"CLAM CHOWDER, NEW ENGLAND, REDUCED SODIUM, CANNED OR READY-T","Clam chowder, New England, reduced sodium, canned or ready-to-serve" +28355210,"CRAB SOUP, CREAM OF, W/ MILK","Crab soup, cream of, prepared with milk" +28355250,"LOBSTER BISQUE","Lobster bisque" +28355260,"LOBSTER GUMBO","Lobster gumbo" +28355310,"OYSTER STEW","Oyster stew" +28355350,"SALMON SOUP, CREAM STYLE","Salmon soup, cream style" +28355410,"SHRIMP SOUP, CREAM OF, NS AS TO MILK/WATER ADDED","Shrimp soup, cream of, NS as to prepared with milk or water" +28355420,"SHRIMP SOUP, CREAM OF, W/ MILK","Shrimp soup, cream of, prepared with milk" +28355430,"SHRIMP SOUP, CREAM OF, W/ WATER","Shrimp soup, cream of, prepared with water" +28355440,"SHRIMP GUMBO","Shrimp gumbo" +28355450,"SEAFOOD SOUP W/ POTATOES & VEGETABLES (INCL DK GREEN LEAF)","Seafood soup with potatoes and vegetables (including carrots, broccoli, and/or dark-green leafy)" +28355460,"SEAFOOD SOUP W/ POTATOES & VEGETABLES (EXCL DK GREEN LEAF)","Seafood soup with potatoes and vegetables (excluding carrots, broccoli, and dark-green leafy)" +28355470,"SEAFOOD SOUP W/ VEGETABLES (INCL DK GREEN LEAFY)","Seafood soup with vegetables (including carrots, broccoli, and/or dark-green leafy (no potatoes))" +28355480,"SEAFOOD SOUP W/ VEGETABLES (EXCL DK GREEN LEAFY)","Seafood soup with vegetables (excluding carrots, broccoli, and dark-green leafy (no potatoes))" +28360100,"MEAT BROTH, P.R. STYLE","Meat broth, Puerto Rican style" +28360210,"SPANISH VEGETABLE SOUP, P.R. (CALDO GALLEGO)","Spanish vegetable soup, Puerto Rican style (Caldo gallego)" +28500000,"GRAVY, POULTRY","Gravy, poultry" +28500010,"GRAVY, MEAT/POULTRY, W/ WINE","Gravy, meat or poultry, with wine" +28500020,"GRAVY, MEAT, W/ FRUIT (INCLUDE FRENCH SAUCE)","Gravy, meat, with fruit" +28500030,"GRAVY, POULTRY, LOW SODIUM","Gravy, poultry, low sodium" +28500040,"GRAVY, BEEF/MEAT (INCL GRAVY,NFS;BROWN GRAVY;SWISS STEAK GRV","Gravy, beef or meat" +28500050,"GRAVY, GIBLET(INCL ANY POULTRY GRAVY W/PCS OF MEAT)","Gravy, giblet" +28500060,"GRAVY, BEEF OR MEAT, LOW SODIUM","Gravy, beef or meat, low sodium" +28500070,"GRAVY, BEEF OR MEAT, HOME RECIPE","Gravy, beef or meat, home recipe" +28500080,"GRAVY, POULTRY, HOME RECIPE","Gravy, poultry, home recipe" +28500100,"GRAVY, MUSHROOM","Gravy, mushroom" +28500150,"GRAVY, REDEYE","Gravy, redeye" +28501010,"GRAVY, BEEF/MEAT, FAT FREE","Gravy, beef or meat, fat free" +28501110,"GRAVY, POULTRY, FAT FREE","Gravy, poultry, fat free" +28510010,"GRAVY/SAUCE, POULTRY FROM CHICKEN FRICASSEE, P.R.","Gravy or sauce, poultry-based from Puerto Rican-style chicken fricasse" +28510020,"GRAVY, MEAT-BASED, FROM PUERTO RICAN POT ROAST","Gravy, meat-based, from Puerto-Rican style stuffed pot roast" +28510030,"GRAVY, MEAT-BASED, FROM PUERTO RICAN BEEF STEW","Gravy, meat-based, from Puerto-Rican style beef stew" +28520000,"GRAVY/SAUCE,CHINESE(SOY SCE,STOCK/BOUILL,CRNSTRCH)","Gravy or sauce, Chinese (soy sauce, stock or bouillon, cornstarch)" +28520100,"OYSTER-FLAVORED SAUCE","Oyster-flavored sauce" +28522000,"MOLE POBLANA (SAUCE)","Mole poblano (sauce)" +28522050,"MOLE VERDE (SAUCE)","Mole verde (sauce)" +31101010,"EGGS, WHOLE, RAW","Egg, whole, raw" +31102000,"EGGS, WHOLE, COOKED, NS AS TO METHOD","Egg, whole, cooked, NS as to cooking method" +31103010,"EGG, WHOLE, BOILED OR POACHED","Egg, whole, boiled or poached" +31105010,"EGG, WHOLE, FRIED WITHOUT FAT","Egg, whole, fried without fat" +31105020,"EGG, WHOLE, FRIED WITH MARGARINE","Egg, whole, fried with margarine" +31105030,"EGG, WHOLE, FRIED WITH OIL","Egg, whole, fried with oil" +31105040,"EGG, WHOLE, FRIED WITH BUTTER","Egg, whole, fried with butter" +31105060,"EGG, WHOLE, FRIED WITH ANIMAL FAT OR MEAT DRIPPINGS","Egg, whole, fried with animal fat or meat drippings" +31105080,"EGG, WHOLE, FRIED WITH COOKING SPRAY","Egg, whole, fried with cooking spray" +31105090,"EGG, WHOLE, FRIED, FROM FAST FOOD / RESTAURANT","Egg, whole, fried, from fast food / restaurant" +31106000,"EGGS, WHOLE, BAKED, NS AS TO ADDED FAT","Egg, whole, baked, NS as to fat added in cooking" +31106010,"EGGS, WHOLE, BAKED, NO FAT ADDED","Egg, whole, baked, fat not added in cooking" +31106020,"EGGS, WHOLE, BAKED, FAT ADDED","Egg, whole, baked, fat added in cooking" +31107000,"EGGS, WHOLE, PICKLED","Egg, whole, pickled" +31108010,"EGGS, WHITE ONLY, RAW","Egg, white only, raw" +31110010,"EGG YOLK, ONLY, RAW","Egg, yolk only, raw" +31111000,"EGG, YOLK ONLY, COOKED, NS AS TO FAT ADDED IN COOKING","Egg, yolk only, cooked, NS as to fat added in cooking" +31111010,"EGG, YOLK ONLY, COOKED, NO FAT ADDED","Egg, yolk only, cooked, fat not added in cooking" +31111020,"EGG, YOLK ONLY, COOKED, FAT ADDED IN COOKING","Egg, yolk only, cooked, fat added in cooking" +31201000,"DUCK EGG, COOKED","Duck egg, cooked" +31202000,"GOOSE EGG, COOKED","Goose egg, cooked" +31203000,"QUAIL EGG, CANNED","Quail egg, canned" +32101000,"EGGS, CREAMED","Egg, creamed" +32101500,"EGGS, BENEDICT","Egg, Benedict" +32101530,"EGG CURRY","Egg curry" +32102000,"EGGS, DEVILED","Egg, deviled" +32103000,"EGG SALAD, W/ MAYO","Egg salad, made with mayonnaise" +32103015,"EGG SALAD, W/ LT MAYO","Egg salad, made with light mayonnaise" +32103020,"EGG SALAD, W/ MAYO-TYPE DRSG","Egg salad, made with mayonnaise-type salad dressing" +32103025,"EGG SALAD, W/ LIGHT MAYO-TYPE DRSG","Egg salad, made with light mayonnaise-type salad dressing" +32103030,"EGG SALAD, W/ CREAMY DRSG","Egg salad, made with creamy dressing" +32103035,"EGG SALAD,W/ LT CREAMY DRSG","Egg salad, made with light creamy dressing" +32103040,"EGG SALAD, W/ ITALIAN DRSG","Egg salad, made with Italian dressing" +32103045,"EGG SALAD, W/ LT ITALIAN DRSG","Egg salad, made with light Italian dressing" +32103050,"EGG SALAD, W/ ANY TYPE OF FAT FREE DRSG","Egg Salad, made with any type of fat free dressing" +32105180,"HUEVOS RANCHEROS","Huevos rancheros" +32105190,"EGG CASSEROLE W/ BREAD, CHEESE, MILK & MEAT","Egg casserole with bread, cheese, milk and meat" +32105200,"EGG FOO YUNG, NFS","Egg foo yung (young), NFS" +32105210,"CHICKEN EGG FOO YUNG","Chicken egg foo yung (young)" +32105220,"PORK EGG FOO YUNG","Pork egg foo yung (young)" +32105230,"SHRIMP EGG FOO YUNG","Shrimp egg foo yung (young)" +32105240,"BEEF EGG FOO YUNG","Beef egg foo yung (young)" +32105310,"RIPE PLANTAIN OMELET, P.R. (TORTILLA DE AMARILLO)","Ripe plantain omelet, Puerto Rican style (Tortilla de amarillo)" +32105330,"SCRAMBLED EGGS W/ JERKED BEEF, P.R.","Scrambled eggs with jerked beef, Puerto Rican style (Revoltillo de tasajo)" +32110100,"EGGS, A LA MALAGUENA, P.R.(HUEVOS A LA MALAGUENA)","Eggs a la Malaguena, Puerto Rican style (Huevos a la Malaguena)" +32110150,"SHRIMP-EGG PATTY (TORTA DE CAMERON SECO)","Shrimp-egg patty (Torta de Cameron seco)" +32120100,"EGG DESSERT, CUSTARD-LIKE, W/ WATER & SUGAR, P.R.","Egg dessert, custard-like, made with water and sugar, Puerto Rican style (Tocino del cielo; Heaven's delight)" +32120200,"ZABAGLIONE","Zabaglione" +32130000,"EGG OMELET OR SCRAMBLED EGG, MADE WITH MARGARINE","Egg omelet or scrambled egg, made with margarine" +32130010,"EGG OMELET OR SCRAMBLED EGG, MADE WITH OIL","Egg omelet or scrambled egg, made with oil" +32130020,"EGG OMELET OR SCRAMBLED EGG, MADE WITH BUTTER","Egg omelet or scrambled egg, made with butter" +32130040,"EGG OMELET OR SCRAMBLED EGG, MADE W/ANIMAL FAT OR MEAT DRIP","Egg omelet or scrambled egg, made with animal fat or meat drippings" +32130060,"EGG OMELET OR SCRAMBLED EGG, MADE WITH COOKING SPRAY","Egg omelet or scrambled egg, made with cooking spray" +32130070,"EGG OMELET OR SCRAMBLED EGG, MADE WITHOUT FAT","Egg omelet or scrambled egg, made without fat" +32130080,"EGG OMELET OR SCRAMBLED EGG, FROM FAST FOOD / RESTAURANT","Egg omelet or scrambled egg, from fast food / restaurant" +32130100,"EGG OMELET OR SCRAMBLED EGG, WITH CHEESE, MADE WITH MARGARIN","Egg omelet or scrambled egg, with cheese, made with margarine" +32130110,"EGG OMELET OR SCRAMBLED EGG, WITH CHEESE, MADE WITH OIL","Egg omelet or scrambled egg, with cheese, made with oil" +32130120,"EGG OMELET OR SCRAMBLED EGG, WITH CHEESE, MADE WITH BUTTER","Egg omelet or scrambled egg, with cheese, made with butter" +32130140,"EGG OMELET OR SCRAMBLED EGG, W/ CHEESE, MADE W/ ANIMAL FAT","Egg omelet or scrambled egg, with cheese, made with animal fat or meat drippings" +32130160,"EGG OMELET OR SCRAMBLED EGG, WITH CHEESE, MADE WITH COOKING","Egg omelet or scrambled egg, with cheese, made with cooking spray" +32130170,"EGG OMELET OR SCRAMBLED EGG, WITH CHEESE, MADE WITHOUT FAT","Egg omelet or scrambled egg, with cheese, made without fat" +32130200,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE WITH MARGARINE","Egg omelet or scrambled egg, with meat, made with margarine" +32130210,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE WITH OIL","Egg omelet or scrambled egg, with meat, made with oil" +32130220,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE WITH BUTTER","Egg omelet or scrambled egg, with meat, made with butter" +32130240,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE WITH ANIMAL FAT","Egg omelet or scrambled egg, with meat, made with animal fat or meat drippings" +32130260,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE W/COOKING SPRAY","Egg omelet or scrambled egg, with meat, made with cooking spray" +32130270,"EGG OMELET OR SCRAMBLED EGG, WITH MEAT, MADE WITHOUT FAT","Egg omelet or scrambled egg, with meat, made without fat" +32130300,"EGG OMELET OR SCRAMBLED EGG, W/CHEESE & MEAT, MADE W/MARGARI","Egg omelet or scrambled egg, with cheese and meat, made with margarine" +32130310,"EGG OMELET OR SCRAMBLED EGG, W/CHEESE & MEAT, MADE W/OIL","Egg omelet or scrambled egg, with cheese and meat, made with oil" +32130320,"EGG OMELET OR SCRAMBLED EGG, W/ CHEESE &MEAT, MADEW/BUTTER","Egg omelet or scrambled egg, with cheese and meat, made with butter" +32130340,"EGG OMELET OR SCR EGG, WITH CHEESE & MEAT, MADE W/ANIMAL FAT","Egg omelet or scrambled egg, with cheese and meat, made with animal fat or meat drippings" +32130360,"EGG OMELET OR SCR EGG, W/CHEESE& MEAT, MADE W/COOKING SPRAY","Egg omelet or scrambled egg, with cheese and meat, made with cooking spray" +32130370,"EGG OMELET OR SCRAMBLED EGG, W/CHEESE & MEAT, MADE WO/FAT","Egg omelet or scrambled egg, with cheese and meat, made without fat" +32130400,"EGG OMELET OR SCRAMBLED EGG, WITH TOMATOES, FAT ADDED IN COO","Egg omelet or scrambled egg, with tomatoes, fat added in cooking" +32130410,"EGG OMELET OR SCRAMBLED EGG, WITH TOMATOES, FAT NOT ADDED IN","Egg omelet or scrambled egg, with tomatoes, fat not added in cooking" +32130420,"EGG OMELET OR SCRAMBLED EGG, WITH TOMATOES, NS AS TO FAT ADD","Egg omelet or scrambled egg, with tomatoes, NS as to fat added in cooking" +32130430,"EGG OMELET OR SCRAMBLED EGG, W/ DARK-GREEN VEGS, FAT ADDED","Egg omelet or scrambled egg, with dark-green vegetables, fat added in cooking" +32130440,"EGG OMELET OR SCRAMBLED EGG, W/DARK-GREEN VEGS, FAT NOT ADDE","Egg omelet or scrambled egg, with dark-green vegetables, fat not added in cooking" +32130450,"EGG OMELET OR SCRAMBLED EGG, W/ DARK-GREEN VEGS,NS AS TO FAT","Egg omelet or scrambled egg, with dark-green vegetables, NS as to fat added in cooking" +32130460,"EGG OMELET OR SCR EGG, W/TOMATOES & DK-GREEN VEGS, FAT ADDED","Egg omelet or scrambled egg, with tomatoes and dark-green vegetables, fat added in cooking" +32130470,"EGG OMELET OR SCR EGG, W/ TOMATOES & DK-GRN VEGS,FAT NOT ADD","Egg omelet or scrambled egg, with tomatoes and dark-green vegetables, fat not added in cooking" +32130480,"EGG OMELET OR SCR EGG, W/ TOMATOES & DK-GRN VEGS, NS FAT","Egg omelet or scrambled egg, with tomatoes and dark-green vegetables, NS as to fat added in cooking" +32130490,"EGG OMELET OR SCR EGG, W/ OTHER VEGS, FAT ADDED","Egg omelet or scrambled egg, with vegetables other than dark green and/or tomatoes, fat added in cooking" +32130500,"EGG OMELET OR SCRAMBLED EGG, WITH OTHER VEGS. FAT NOT ADDED","Egg omelet or scrambled egg, with vegetables other than dark green and/or tomatoes, fat not added in cooking" +32130510,"EGG OMELET OR SCRAMBLED EGG, W/ OTHER VEGS, NS FAT","Egg omelet or scrambled egg, with vegetables other than dark green and/or tomatoes, NS as to fat added in cooking" +32130600,"EGG OMELET OR SCR EGG, W/CHEESE & TOMATOES, FAT ADDED","Egg omelet or scrambled egg, with cheese and tomatoes, fat added in cooking" +32130610,"EGG OMELET OR SCR EGG, W/CHEESE & TOMATOES, FAT NOT ADDED","Egg omelet or scrambled egg, with cheese and tomatoes, fat not added in cooking" +32130620,"EGG OMELET OR SCR EGG, W/CHEESE & TOMATOES, NS FAT ADDED","Egg omelet or scrambled egg, with cheese and tomatoes, NS as to fat added in cooking" +32130630,"EGG OMELET OR SCR EGG, W/ CHEESE&DK-GRN VEGS, FAT ADDED","Egg omelet or scrambled egg, with cheese and dark-green vegetables, fat added in cooking" +32130640,"EGG OMELET OR SCR EGG, W/ CHEESE&DK-GRN VEGS, FAT NOT ADDED","Egg omelet or scrambled egg, with cheese and dark-green vegetables, fat not added in cooking" +32130650,"EGG OMELET OR SCR EGG, W/ CHEESE&DK-GRN VEGS, NS FAT ADDED","Egg omelet or scrambled egg, with cheese and dark-green vegetables, NS as to fat added in cooking" +32130660,"EGG OMELET OR SCR EGG, W/CHEESE, TOM & DK-GRN VEGS,FAT ADDED","Egg omelet or scrambled egg, with cheese, tomatoes, and dark-green vegetables, fat added in cooking" +32130670,"EGG OMELET OR SCR EGG, W/CHEESE, TOM & DK-GRN VEGS,FAT NOT A","Egg omelet or scrambled egg, with cheese, tomatoes, and dark-green vegetables, fat not added in cooking" +32130680,"EGG OMELET OR SCR EGG, W/CHEESE, TOM & DK-GRN VEGS,NS FAT AD","Egg omelet or scrambled egg, with cheese, tomatoes, and dark-green vegetables, NS as to fat added in cooking" +32130690,"EGG OMELET OR SCR EGG, W/CHEESE & OTHER VEGS, FAT ADDED","Egg omelet or scrambled egg, with cheese and vegetables other than dark green and/or tomatoes, fat added in cooking" +32130700,"EGG OMELET OR SCREGG, W/CHEESE & OTHER VEGS, FAT NOT ADDED","Egg omelet or scrambled egg, with cheese and vegetables other than dark green and/or tomatoes, fat not added in cooking" +32130710,"EGG OMELET OR SCREGG, W/CHEESE & OTHER VEGS, NS FAT ADDED","Egg omelet or scrambled egg, with cheese and vegetables other than dark green and/or tomatoes, NS as to fat added in cooking" +32130800,"EGG OMELET OR SCRAMBLED EGG, W/MEAT & TOMATOES, FAT ADDED","Egg omelet or scrambled egg, with meat and tomatoes, fat added in cooking" +32130810,"EGG OMELET OR SCRAMBLED EGG, W/MEAT & TOMATOES, FAT NOT ADDE","Egg omelet or scrambled egg, with meat and tomatoes, fat not added in cooking" +32130820,"EGG OMELET OR SCRAMBLED EGG, W/MEAT & TOMATOES, NS FAT ADDED","Egg omelet or scrambled egg, with meat and tomatoes, NS as to fat added in cooking" +32130830,"EGG OMELET OR SCR EGG, W/MEAT & DK-GRN VEGS, FAT ADDED","Egg omelet or scrambled egg, with meat and dark-green vegetables, fat added in cooking" +32130840,"EGG OMELET OR SCR EGG, W/MEAT & DK-GRN VEGS, FAT NOT ADDED","Egg omelet or scrambled egg, with meat and dark-green vegetables, fat not added in cooking" +32130850,"EGG OMELET OR SCR EGG, W/MEAT & DK-GRN VEGS, NS FAT ADDED","Egg omelet or scrambled egg, with meat and dark-green vegetables, NS as to fat added in cooking" +32130860,"EGG OMELET OR SCR EGG, W/MEAT,TOM & DK-GRN VEGS, FAT ADDED","Egg omelet or scrambled egg, with meat, tomatoes, and dark-green vegetables, fat added in cooking" +32130870,"EGG OMELET OR SCR EGG, W/MEAT,TOM & DK-GRN VEGS, FAT NOT ADD","Egg omelet or scrambled egg, with meat, tomatoes, and dark-green vegetables, fat not added in cooking" +32130880,"EGG OMELET OR SCR EGG, W/MEAT,TOM & DK-GRN VEGS, NS FAT ADDE","Egg omelet or scrambled egg, with meat, tomatoes, and dark-green vegetables, NS as to fat added in cooking" +32130890,"EGG OMELET OR SCR EGG, W/MEAT & OTHER VEGS, FAT ADDED","Egg omelet or scrambled egg, with meat and vegetables other than dark-green and/or tomatoes, fat added in cooking" +32130900,"EGG OMELET OR SCR EGG, W/MEAT & OTHER VEGS, FAT NOT ADDED","Egg omelet or scrambled egg, with meat and vegetables other than dark-green and/or tomatoes, fat not added in cooking" +32130910,"EGG OMELET OR SCR EGG, W/MEAT & OTHER VEGS, NS FAT ADDED","Egg omelet or scrambled egg, with meat and vegetables other than dark-green and/or tomatoes, NS as to fat added in cooking" +32131000,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & TOMATOES, FAT ADDED","Egg omelet or scrambled egg, with cheese, meat, and tomatoes, fat added in cooking" +32131010,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & TOMATOES, FAT NOT A","Egg omelet or scrambled egg, with cheese, meat, and tomatoes, fat not added in cooking" +32131020,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & TOMATOES, NS FAT AD","Egg omelet or scrambled egg, with cheese, meat, and tomatoes, NS as to fat added in cooking" +32131030,"EGG OMELET OR SCR EGG, W/CHEESE, MEAT&DK GRN VEG,FAT ADDED","Egg omelet or scrambled egg, with cheese, meat, and dark-green vegetables, fat added in cooking" +32131040,"EGG OMELET OR SCR EGG, W/CHEESE, MEAT&DK GRN VEG,FAT NOT ADD","Egg omelet or scrambled egg, with cheese, meat, and dark-green vegetables, fat not added in cooking" +32131050,"EGG OMELET OR SCR EGG, W/CHEESE, MEAT&DK GRN VEG,NS FAT ADDE","Egg omelet or scrambled egg, with cheese, meat, and dark-green vegetables, NS as to fat added in cooking" +32131060,"EGG OMELET/SCR EGG,W/CHEESE,MEAT,TOM&DK GRN VEG,FAT ADDED","Egg omelet or scrambled egg, with cheese, meat, tomatoes, and dark-green vegetables, fat added in cooking" +32131070,"EGG OMELET/SCR EGG,W/CHEESE,MEAT,TOM&DK GRN VEG,FAT NOT ADDE","Egg omelet or scrambled egg, with cheese, meat, tomatoes, and dark-green vegetables, fat not added in cooking" +32131080,"EGG OMELET/SCR EGG,W/CHEESE,MEAT,TOM&DK GRN VEG,NS FAT ADDED","Egg omelet or scrambled egg, with cheese, meat, tomatoes, and dark-green vegetables, NS as to fat added in cooking" +32131090,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & OTHER VEG,FAT ADDED","Egg omelet or scrambled egg, with cheese, meat, and vegetables other than dark-green and/or tomatoes, fat added in cooking" +32131100,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & OTHER VEG,FAT NOT A","Egg omelet or scrambled egg, with cheese, meat, and vegetables other than dark-green and/or tomatoes, fat not added in cooking" +32131110,"EGG OMELET OR SCR EGG, W/ CHEESE, MEAT & OTHER VEG,NS FAT AD","Egg omelet or scrambled egg, with cheese, meat, and vegetables other than dark-green and/or tomatoes, NS as to fat added in cooking" +32131200,"EGG OMELET OR SCR EGG, W/POTATOES +/OR ONIONS, FAT ADDED","Egg omelet or scrambled egg, with potatoes and/or onions, fat added in cooking" +32131210,"EGG OMELET OR SCR EGG, W/POTATOES +/OR ONIONS, FAT NOT ADDED","Egg omelet or scrambled egg, with potatoes and/or onions, fat not added in cooking" +32131220,"EGG OMELET OR SCR EGG, W/POTATOES +/OR ONIONS, NS FAT ADDED","Egg omelet or scrambled egg, with potatoes and/or onions, NS as to fat added in cooking" +32201000,"FRIED EGG SANDWICH","Fried egg sandwich" +32202000,"EGG, CHEESE, HAM, & BACON ON BUN","Egg, cheese, ham, and bacon on bun" +32202010,"EGG, CHEESE & HAM ON ENGLISH MUFFIN","Egg, cheese, and ham on English muffin" +32202020,"EGG, CHEESE & HAM ON BISCUIT","Egg, cheese, and ham on biscuit" +32202025,"EGG, CHEESE & HAM ON BAGEL","Egg, cheese and ham on bagel" +32202030,"EGG, CHEESE & SAUSAGE ON ENGLISH MUFFIN","Egg, cheese, and sausage on English muffin" +32202035,"EGG, EXTRA CHEESE (2 SL), & EXTRA SAUSAGE (2 PATTIES) ON BUN","Egg, extra cheese (2 slices), and extra sausage (2 patties) on bun" +32202040,"EGG, CHEESE & BEEF ON ENGLISH MUFFIN","Egg, cheese, and beef on English Muffin" +32202045,"EGG, CHEESE & STEAK ON BAGEL","Egg, cheese, and steak on bagel" +32202050,"EGG, CHEESE & SAUSAGE ON BISCUIT","Egg, cheese, and sausage on biscuit" +32202055,"EGG, CHEESE & SAUSAGE GRIDDLE CAKE SANDWICH","Egg, cheese, and sausage griddle cake sandwich" +32202060,"EGG & SAUSAGE ON BISCUIT","Egg and sausage on biscuit" +32202070,"EGG, CHEESE & BACON ON BISCUIT","Egg, cheese, and bacon on biscuit" +32202075,"EGG, CHEESE & BACON GRIDDLE CAKE SANDWICH","Egg, cheese, and bacon griddle cake sandwich" +32202080,"EGG, CHEESE & BACON ON ENGLISH MUFFIN","Egg, cheese, and bacon on English muffin" +32202085,"EGG, CHEESE & BACON ON BAGEL","Egg, cheese and bacon on bagel" +32202090,"EGG & BACON ON BISCUIT","Egg and bacon on biscuit" +32202110,"EGG & HAM ON BISCUIT","Egg and ham on biscuit" +32202120,"EGG, CHEESE & SAUSAGE ON BAGEL","Egg, cheese and sausage on bagel" +32202130,"EGG & STEAK ON BISCUIT","Egg and steak on biscuit" +32202200,"EGG & CHEESE ON BISCUIT","Egg and cheese on biscuit" +32203010,"EGG SALAD SANDWICH","Egg salad sandwich" +32204010,"SCRAMBLED EGG SANDWICH","Scrambled egg sandwich" +32300100,"EGG DROP SOUP","Egg drop soup" +32301100,"GARLIC EGG SOUP, P.R. (SOPA DE AJO)","Garlic egg soup, Puerto Rican style (Sopa de ajo)" +32400060,"EGG WHITE OMELET, SCRAMBLED, OR FRIED, MADE WITH MARGARINE","Egg white omelet, scrambled, or fried, made with margarine" +32400065,"EGG WHITE OMELET, SCRAMBLED, OR FRIED, MADE WITH OIL","Egg white omelet, scrambled, or fried, made with oil" +32400070,"EGG WHITE OMELET, SCRAMBLED, OR FRIED, MADE WITH BUTTER","Egg white omelet, scrambled, or fried, made with butter" +32400075,"EGG WHITE OMELET, SCRAMBLED, OR FRIED, MADE WITH COOKING SPR","Egg white omelet, scrambled, or fried, made with cooking spray" +32400080,"EGG WHITE OMELET, SCRAMBLED, OR FRIED, MADE WITHOUT FAT","Egg white omelet, scrambled, or fried, made without fat" +32400100,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/CHEESE, FAT ADDED","Egg white, omelet, scrambled, or fried, with cheese, fat added in cooking" +32400110,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ CHEESE, FAT NOT A","Egg white, omelet, scrambled, or fried, with cheese, fat not added in cooking" +32400120,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, WITH CHEESE, NS FAT","Egg white, omelet, scrambled, or fried, with cheese, NS as to fat added in cooking" +32400200,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ MEAT, FAT ADDED","Egg white, omelet, scrambled, or fried, with meat, fat added in cooking" +32400210,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ MEAT, FAT NOT ADD","Egg white, omelet, scrambled, or fried, with meat, fat not added in cooking" +32400220,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, WITH MEAT, NS FAT","Egg white, omelet, scrambled, or fried, with meat, NS as to fat added in cooking" +32400300,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ VEGS, FAT ADDED","Egg white, omelet, scrambled, or fried, with vegetables, fat added in cooking" +32400310,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ VEGS, FAT NOT ADD","Egg white, omelet, scrambled, or fried, with vegetables, fat not added in cooking" +32400320,"EGG WHITE, OMELET, SCRAMBLED, OR FRIED, W/ VEGS, NS FAT","Egg white, omelet, scrambled, or fried, with vegetables, NS as to fat added in cooking" +32400400,"EGG WHITE, OMELET, SCR OR FRIED, W/ CHEESE & MEAT, FAT ADDED","Egg white, omelet, scrambled, or fried, with cheese and meat, fat added in cooking" +32400410,"EGG WHITE, OMELET, SCR OR FRIED, W/ CHEESE & MEAT, FAT NOT A","Egg white, omelet, scrambled, or fried, with cheese and meat, fat not added in cooking" +32400420,"EGG WHITE, OMELET, SCR OR FRIED, W/ CHEESE & MEAT, NS FAT AD","Egg white, omelet, scrambled, or fried, with cheese and meat, NS as to fat added in cooking" +32400500,"EGG WHITE, OMELET, SCR OR FRIED, W/CHEESE & VEG, FAT ADDED","Egg white, omelet, scrambled, or fried, with cheese and vegetables, fat added in cooking" +32400510,"EGG WHITE, OMELET, SCR OR FRIED, W/CHEESE & VEG, FAT NOT ADD","Egg white, omelet, scrambled, or fried, with cheese and vegetables, fat not added in cooking" +32400520,"EGG WHITE, OMELET, SCR OR FRIED, W/CHEESE & VEG, NS FAT ADDE","Egg white, omelet, scrambled, or fried, with cheese and vegetables, NS as to fat added in cooking" +32400600,"EGG WHITE, OMELET, SCR OR FRIED, W/MEAT & VEG, FAT ADDED","Egg white, omelet, scrambled, or fried, with meat and vegetables, fat added in cooking" +32400610,"EGG WHITE, OMELET, SCR OR FRIED, W/MEAT & VEG, FAT NOT ADDED","Egg white, omelet, scrambled, or fried, with meat and vegetables, fat not added in cooking" +32400620,"EGG WHITE, OMELET, SCR OR FRIED, W/MEAT & VEG, NS FAT ADDED","Egg white, omelet, scrambled, or fried, with meat and vegetables, NS as to fat added in cooking" +32400700,"EGG WHITE,OMELET,SCR OR FRIED,W/CHEESE, MEAT&VEG,FAT ADDED","Egg white, omelet, scrambled, or fried, with cheese, meat, and vegetables, fat added in cooking" +32400710,"EGG WHITE,OMELET,SCR OR FRIED,W/CHEESE, MEAT&VEG,FAT NOT ADD","Egg white, omelet, scrambled, or fried, with cheese, meat, and vegetables, fat not added in cooking" +32400720,"EGG WHITE,OMELET,SCR OR FRIED,W/CHEESE, MEAT&VEG,NS FAT ADDE","Egg white, omelet, scrambled, or fried, with cheese, meat, and vegetables, NS as to fat added in cooking" +32401000,"MERINGUES","Meringues" +33001000,"EGG SUB, OMELET, SCR, OR FRIED, MADE W/ MARGARINE","Egg substitute, omelet, scrambled, or fried, made with margarine" +33001010,"EGG SUB, OMELET, SCR, OR FRIED, MADE W/ OIL","Egg substitute, omelet, scrambled, or fried, made with oil" +33001020,"EGG SUB, OMELET, SCR, OR FRIED, MADE W/ BUTTER","Egg substitute, omelet, scrambled, or fried, made with butter" +33001040,"EGG SUB, OMELET, SCR, OR FRIED, MADE W/ COOKING SPRAY","Egg substitute, omelet, scrambled, or fried, made with cooking spray" +33001050,"EGG SUB, OMELET, SCR, OR FRIED, MADE WO/ FAT","Egg substitute, omelet, scrambled, or fried, made without fat" +33001100,"EGG SUBSTITUTE, CHSE FLAV,OMELET,SCRM,FRIED,FAT ADDED","Egg substitute, cheese flavored, omelet, scrambled, or fried, fat added in cooking" +33001110,"EGG SUBSTITUTE, CHSE FLAV,OMELET,SCRM,FRIED,NO FAT","Egg substitute, cheese flavored, omelet, scrambled, or fried, fat not added in cooking" +33001120,"EGG SUBSTITUTE, CHSE FLAV,OMELET,SCRM,FRIED,NS AS TO FAT","Egg substitute, cheese flavored, omelet, scrambled, or fried, NS as to fat added in cooking" +33001200,"EGG SUBSTITUTE, VEG FLAV,OMELET,SCRM,FRIED,FAT ADDED","Egg substitute, vegetable flavored, omelet, scrambled, or fried, fat added in cooking" +33001210,"EGG SUBSTITUTE, VEG FLAV,OMELET,SCRM,FRIED,NO FAT","Egg substitute, vegetable flavored, omelet, scrambled, or fried, fat not added in cooking" +33001220,"EGG SUBSTITUTE, VEG FLAV,OMELET,SCRM,FRIED,NS AS TO FAT","Egg substitute, vegetable flavored, omelet, scrambled, or fried, NS as to fat added in cooking" +33401000,"EGG SUB, OMELET, SCR, OR FRIED, W/ CHEESE, FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese, fat added in cooking" +33401010,"EGG SUB, OMELET, SCR, OR FRIED, W/ CHEESE, FAT NOT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese, fat not added in cooking" +33401020,"EGG SUB, OMELET, SCR, OR FRIED, W/ CHEESE, NS FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese, NS as to fat added in cooking" +33401100,"EGG SUB, OMELET, SCR, OR FRIED, W/ MEAT, FAT ADDED","Egg substitute, omelet, scrambled, or fried, with meat, fat added in cooking" +33401110,"EGG SUB, OMELET, SCR, OR FRIED, W/ MEAT, FAT NOT ADDED","Egg substitute, omelet, scrambled, or fried, with meat, fat not added in cooking" +33401120,"EGG SUB, OMELET, SCR, OR FRIED, W/ MEAT, NS FAT ADDED","Egg substitute, omelet, scrambled, or fried, with meat, NS as to fat added in cooking" +33401200,"EGG SUB, OMELET, SCR OR FRIED, W/VEGS, FAT ADDED IN COOKING","Egg substitute, omelet, scrambled, or fried, with vegetables, fat added in cooking" +33401210,"EGG SUB, OMELET, SCR OR FRIED, W/VEGS, FAT NOT ADDED IN COOK","Egg substitute, omelet, scrambled, or fried, with vegetables, fat not added in cooking" +33401220,"EGG SUB, OMELET, SCR OR FRIED, W/VEGS, NS FAT ADDED IN COOKI","Egg substitute, omelet, scrambled, or fried, with vegetables, NS as to fat added in cooking" +33401300,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE&MEAT, FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and meat, fat added in cooking" +33401310,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE&MEAT, FAT NOT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and meat, fat not added in cooking" +33401320,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE&MEAT, NS FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and meat, NS as to fat added in cooking" +33401400,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE & VEG, FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and vegetables, fat added in cooking" +33401410,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE & VEG, FAT NOT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and vegetables, fat not added in cooking" +33401420,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE & VEG, NS FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese and vegetables, NS as to fat added in cooking" +33401500,"EGG SUB, OMELET, SCR OR FRIED, W/ MEAT & VEG, FAT ADDED","Egg substitute, omelet, scrambled, or fried, with meat and vegetables, fat added in cooking" +33401510,"EGG SUB, OMELET, SCR OR FRIED, W/ MEAT & VEG, FAT NOT ADDED","Egg substitute, omelet, scrambled, or fried, with meat and vegetables, fat not added in cooking" +33401520,"EGG SUB, OMELET, SCR OR FRIED, W/ MEAT & VEG, NS FAT ADDED","Egg substitute, omelet, scrambled, or fried, with meat and vegetables, NS as to fat added in cooking" +33401600,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE,MEAT&VEG,FAT ADDED","Egg substitute, omelet, scrambled, or fried, with cheese, meat, and vegetables, fat added in cooking" +33401610,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE,MEAT&VEG,FAT NOT ADD","Egg substitute, omelet, scrambled, or fried, with cheese, meat, and vegetables, fat not added in cooking" +33401620,"EGG SUB, OMELET, SCR OR FRIED, W/CHEESE,MEAT&VEG,NS FAT ADDE","Egg substitute, omelet, scrambled, or fried, with cheese, meat, and vegetables, NS as to fat added in cooking" +41101000,"BEANS, DRY, COOKED, NS AS TO TYPE, NS ADDED FAT","Beans, dry, cooked, NS as to type and as to fat added in cooking" +41101010,"BEANS, DRY, COOKED, NS AS TO TYPE, ADDED FAT","Beans, dry, cooked, NS as to type, fat added in cooking" +41101020,"BEANS, DRY, COOKED, NS AS TO TYPE, NO FAT ADDED","Beans, dry, cooked, NS as to type, fat not added in cooking" +41101100,"WHITE BEAN, DRY, COOKED, NS AS TO ADDED FAT","White beans, dry, cooked, NS as to fat added in cooking" +41101110,"WHITE BEAN, DRY, COOKED, FAT ADDED","White beans, dry, cooked, fat added in cooking" +41101120,"WHITE BEAN, DRY, COOKED, NO FAT ADDED","White beans, dry, cooked, fat not added in cooking" +41101200,"WHITE BEANS, CANNED, LOW SODIUM, NS AS TO FAT ADDED","White beans, canned, low sodium, NS as to fat added in cooking" +41101210,"WHITE BEANS, CANNED, LOW SODIUM, FAT ADDED IN COOKING","White beans, canned, low sodium, fat added in cooking" +41101220,"WHITE BEANS, CANNED, LOW SODIUM, FAT NOT ADDED IN COOKING","White beans, canned, low sodium, fat not added in cooking" +41102000,"BLACK, BROWN OR BAYO BEAN, DRY, COOKED, FAT NS","Black, brown, or Bayo beans, dry, cooked, NS as to fat added in cooking" +41102010,"BLACK, BROWN OR BAYO BEAN, DRY, COOKED, FAT ADDED","Black, brown, or Bayo beans, dry, cooked, fat added in cooking" +41102020,"BLACK, BROWN OR BAYO BEAN, DRY, COOKED, NO FAT","Black, brown, or Bayo beans, dry, cooked, fat not added in cooking" +41102100,"BLACK, BROWN, OR BAYO BEANS, CANNED, LOW SODIUM, NS FAT","Black, brown, or Bayo beans, canned, low sodium, NS as to fat added in cooking" +41102110,"BLACK, BROWN, OR BAYO BEANS, CANNED, LOW SODIUM, FAT ADDED","Black, brown, or Bayo beans, canned, low sodium, fat added in cooking" +41102120,"BLACK, BROWN, OR BAYO BEANS, CANNED, LOW SODIUM, NO FAT","Black, brown, or Bayo beans, canned, low sodium, fat not added in cooking" +41102200,"FAVA BEANS, COOKED, NS AS TO ADDED FAT","Fava beans, cooked, NS as to fat added in cooking" +41102210,"FAVA BEANS, COOKED, FAT ADDED","Fava beans, cooked, fat added in cooking" +41102220,"FAVA BEANS, COOKED, NO FAT ADDED","Fava beans, cooked, fat not added in cooking" +41103000,"LIMA BEANS, DRY, COOKED, NS AS TO ADDED FAT","Lima beans, dry, cooked, NS as to fat added in cooking" +41103010,"LIMA BEANS, DRY, COOKED, FAT ADDED","Lima beans, dry, cooked, fat added in cooking" +41103020,"LIMA BEANS, DRY, COOKED, NO FAT ADDED","Lima beans, dry, cooked, fat not added in cooking" +41103050,"PINK BEANS, DRY, COOKED, NS AS TO FAT","Pink beans, dry, cooked, NS as to fat added in cooking" +41103060,"PINK BEANS, DRY, COOKED, NO FAT ADDED","Pink beans, dry, cooked, fat not added in cooking" +41103070,"PINK BEANS, DRY, COOKED, FAT ADDED","Pink beans, dry, cooked, fat added in cooking" +41104000,"PINTO, CALICO/RED/MEX BEAN, DRY, COOKED, FAT NS","Pinto, calico, or red Mexican beans, dry, cooked, NS as to fat added in cooking" +41104010,"PINTO, CALICO/RED/MEX BEAN, DRY, COOKED, FAT ADDED","Pinto, calico, or red Mexican beans, dry, cooked, fat added in cooking" +41104020,"PINTO, CALICO/RED/MEX BEAN, DRY, COOKED, NO FAT","Pinto, calico, or red Mexican beans, dry, cooked, fat not added in cooking" +41104100,"PINTO,CALICO, RED MEXICAN BEANS, CANNED, LOW SODIUM, NS FAT","Pinto, calico, or red Mexican beans, canned, low sodium, NS as to fat added in cooking" +41104110,"PINTO,CALICO,RED MEX BEANS, CANNED, LOW SODIUM, FAT ADDED","Pinto, calico, or red Mexican beans, canned, low sodium, fat added in cooking" +41104120,"PINTO,CALICO,RED MEXICAN BEANS, CANNED, LOW SODIUM, NO FAT","Pinto, calico, or red Mexican beans, canned, low sodium, fat not added in cooking" +41106000,"RED KIDNEY BEANS, DRY, COOKED, NS AS TO ADDED FAT","Red kidney beans, dry, cooked, NS as to fat added in cooking" +41106010,"RED KIDNEY BEANS, DRY, COOKED, FAT ADDED","Red kidney beans, dry, cooked, fat added in cooking" +41106020,"RED KIDNEY BEANS, DRY, COOKED, NO FAT ADDED","Red kidney beans, dry, cooked, fat not added in cooking" +41106100,"RED KIDNEY BEANS, CANNED, LOW SODIUM, FAT ADDED IN COOKING","Red kidney beans, canned, low sodium, NS as to fat added in cooking" +41106110,"RED KIDNEY BEANS, CANNED, LOW SODIUM, FAT ADDED IN COOKING","Red kidney beans, canned, low sodium, fat added in cooking" +41106120,"RED KIDNEY BEANS, CANNED, LOW SODIUM, FAT NOT ADDED","Red kidney beans, canned, low sodium, fat not added in cooking" +41107000,"SOYBEANS, COOKED, FAT NOT ADDED","Soybeans, cooked, fat not added in cooking" +41108000,"MUNG BEANS, NO FAT ADDED","Mung beans, fat not added in cooking" +41108010,"MUNG BEANS, FAT ADDED","Mung beans, fat added in cooking" +41108020,"MUNG BEANS, NS AS TO FAT ADDED","Mung beans, NS as to fat added in cooking" +41109000,"MUNGO BEANS, COOKED, NO FAT ADDED","Mungo beans, cooked, fat not added in cooking" +41201010,"BAKED BEANS, NFS","Baked beans, NFS" +41201020,"BAKED BEANS, VEGETARIAN","Baked beans, vegetarian" +41202020,"CHILI BEANS, BARBECUE BEANS, RANCH OR MEXICAN STYLE","Chili beans, barbecue beans, ranch style beans or Mexican- style beans" +41202500,"BEANS AND TOMATOES, NS AS TO FAT ADDED","Beans and tomatoes, NS as to fat added in cooking" +41202505,"BEANS AND TOMATOES, FAT NOT ADDED","Beans and tomatoes, fat not added in cooking" +41202510,"BEANS AND TOMATOES, FAT ADDED","Beans and tomatoes, fat added in cooking" +41203030,"BLACK BEAN SALAD","Black bean salad" +41204020,"BOSTON BAKED BEANS","Boston baked beans" +41205010,"REFRIED BEANS","Refried beans" +41205015,"REFRIED BEANS, FAT NOT ADDED IN COOKING","Refried beans, fat not added in cooking" +41205020,"REFRIED BEANS W/ CHEESE","Refried beans with cheese" +41205030,"REFRIED BEANS W/ MEAT","Refried beans with meat" +41205040,"REFRIED BEANS, CANNED, LOW SODIUM","Refried beans, canned, low sodium" +41205050,"BEAN DIP, W/ REFRIED BEANS","Bean dip, made with refried beans" +41205070,"HUMMUS","Hummus" +41205100,"BLACK BEAN SAUCE","Black bean sauce" +41206030,"BEANS & FRANKS","Beans and franks" +41207030,"BEANS, DRY, COOKED, W/ GROUND BEEF","Beans, dry, cooked with ground beef" +41208030,"PORK & BEANS","Pork and beans" +41208100,"BEANS, DRY, COOKED, W/ PORK","Beans, dry, cooked with pork" +41209000,"FALAFEL","Falafel" +41210000,"BEAN CAKE, JAPANESE STYLE","Bean cake" +41210090,"STEWED BEANS W/ PORK, TOMATOES, & CHILI PEPPERS, MEXICAN","Stewed beans with pork, tomatoes, and chili peppers, Mexican style (Frijoles a la charra)" +41210100,"STEWED RED BEANS, P.R.","Stewed red beans, Puerto Rican style (Habichuelas coloradas guisadas)" +41210110,"STEWED DRY LIMA BEANS, P.R","Stewed dry lima beans, Puerto Rican style" +41210120,"STEWED WHITE BEANS, P.R.","Stewed white beans, Puerto Rican style" +41210150,"STEWED PINK BEANS W/ WHITE POTATOES & HAM, P.R.","Stewed pink beans with white potatoes and ham, Puerto Rican style" +41210160,"STEWED PINK BEANS W/ PIG'S FEET, P.R","Stewed pink beans with pig's feet, Puerto Rican style" +41210170,"STEWED RED BEANS W/ PIG'S FEET, P.R.","Stewed red beans with pig's feet, Puerto Rican style" +41210180,"STEWED WHITE BEANS W/ PIG'S FEET, P.R.","Stewed white beans with pig's feet, Puerto Rican style" +41210190,"STEWED RED BEANS W/ PIGS FEET & POTATO, P.R.","Stewed red beans with pig's feet and potatoes, Puerto Rican style" +41210200,"BLACK BEANS, CUBAN","Black beans, Cuban style (Habichuelas negras guisadas a la Cubana)" +41221010,"BAKED BEANS, LOW SODIUM","Baked beans, low sodium" +41221020,"CHILI WITH BEANS, WITHOUT MEAT","Chili with beans, without meat" +41301000,"COWPEAS, DRY, COOKED, NS AS TO ADDED FAT","Cowpeas, dry, cooked, NS as to fat added in cooking" +41301010,"COWPEAS, DRY, COOKED, FAT ADDED","Cowpeas, dry, cooked, fat added in cooking" +41301020,"COWPEAS, DRY, COOKED, NO FAT ADDED","Cowpeas, dry, cooked, fat not added in cooking" +41302000,"CHICKPEAS, DRY, COOKED, NS AS TO ADDED FAT","Chickpeas, dry, cooked, NS as to fat added in cooking" +41302010,"CHICKPEAS, DRY, COOKED, FAT ADDED","Chickpeas, dry, cooked, fat added in cooking" +41302020,"CHICKPEAS, DRY, COOKED, NO FAT ADDED","Chickpeas, dry, cooked, fat not added in cooking" +41302100,"CHICKPEAS, CANNED, LOW SODIUM, NS AS TO FAT ADDED IN COOKING","Chickpeas, canned, low sodium, NS as to fat added in cooking" +41302110,"CHICKPEAS, CANNED, LOW SODIUM, FAT ADDED IN COOKING","Chickpeas, canned, low sodium, fat added in cooking" +41302120,"CHICKPEAS, CANNED, LOW SODIUM, FAT NOT ADDED IN COOKING","Chickpeas, canned, low sodium, fat not added in cooking" +41303000,"GREEN/YELLOW SPLIT PEAS, DRY, COOKED, NO FAT ADDED","Green or yellow split peas, dry, cooked, fat not added in cooking" +41303010,"GREEN OR YELLOW SPLIT PEAS, DRY, COOKED, FAT ADDED","Green or yellow split peas, dry, cooked, fat added in cooking" +41303020,"SPLIT PEAS, DRY, COOKED, NS AS TO ADDED FAT","Green or yellow split peas, dry, cooked, NS as to fat added in cooking" +41303500,"STEWED GREEN PEAS, PUERTO RICAN STYLE","Stewed green peas, Puerto Rican style" +41303550,"STEWED GREEN PEAS, W/ PIG'S FEET & POTATO, P.R.","Stewed green peas with pig's feet and potatoes, Puerto Rican style" +41304000,"WASABI PEAS","Wasabi peas" +41304030,"PEAS, DRY, COOKED W/ PORK","Peas, dry, cooked with pork" +41304130,"COWPEAS, DRY, COOKED W/ PORK","Cowpeas, dry, cooked with pork" +41304980,"LENTILS, DRY, COOKED, NS AS TO ADDED FAT","Lentils, dry, cooked, NS as to fat added in cooking" +41304990,"LENTILS, DRY, COOKED, FAT ADDED","Lentils, dry, cooked, fat added in cooking" +41305000,"LENTILS, DRY, COOKED, NO FAT ADDED","Lentils, dry, cooked, fat not added in cooking" +41306000,"LOAF, LENTIL","Loaf, lentil" +41310100,"STEWED PIGEON PEAS, P.R.","Stewed pigeon peas, Puerto Rican style (Gandules guisados, Gandur, Gandules)" +41310150,"STEWED CHICKPEAS, P.R.","Stewed chickpeas, Puerto Rican style" +41310160,"STEWED CHICKPEAS, W/ POTATOES, P.R.","Stewed chickpeas, with potatoes, Puerto Rican style" +41310200,"CHICKPEAS STEWED W/ PIG'S FEET, P.R.","Chickpeas stewed with pig's feet, Puerto Rican style (Garbanzos guisados con patitas de cerdo)" +41310210,"CHICKPEAS, W/ SPANISH SAUSAGE, P.R.","Stewed chickpeas with Spanish sausages, Puerto Rican style (Garbanzos guisados con chorizos)" +41310220,"FRIED CHICKPEAS W/ BACON, P.R.","Fried chickpeas with bacon, Puerto Rican style (Garbanzos fritos con tocineta)" +41310310,"STEWED BLACKEYE PEAS OR COWPEAS, P.R.","Stewed blackeye peas or cowpeas, Puerto Rican style" +41311000,"PAPAD(INDIAN APPETIZER),GRILLED OR BROILED","Papad (Indian appetizer), grilled or broiled" +41410010,"SOY NUTS","Soy nuts" +41410015,"SOY CHIPS","Soy chips" +41420010,"SOYBEAN CURD","Soybean curd" +41420050,"SOYBEAN CURD CHEESE","Soybean curd cheese" +41420100,"MISO SAUCE (INCLUDES AE SAUCE)","Miso sauce" +41420110,"MISO (FERMENTED SOYBEAN PASTE)","Miso (fermented soybean paste)" +41420200,"NATTO (FERMENTED SOYBEAN PRODUCT)","Natto (fermented soybean product)" +41420250,"HOISIN SAUCE","Hoisin sauce" +41420300,"SOY SAUCE","Soy sauce" +41420350,"SOY SAUCE, REDUCED SODIUM","Soy sauce, reduced sodium" +41420380,"SOY YOGURT","Soy yogurt" +41420400,"TERIYAKI SAUCE (INCLUDE ORIENTAL BARBECUE SAUCE)","Teriyaki sauce" +41420410,"TERIYAKI SAUCE, REDUCED SODIUM","Teriyaki sauce, reduced sodium" +41420450,"WORCESTERSHIRE SAUCE","Worcestershire sauce" +41421010,"SOYBEAN CURD, DEEP-FRIED","Soybean curd, deep fried" +41421020,"SOYBEAN CURD, BREADED, FRIED","Soybean curd, breaded, fried" +41422010,"SOYBEAN MEAL","Soybean meal" +41425010,"VERMICELLI, MADE FROM SOYBEANS","Vermicelli, made from soybeans" +41440000,"TEXTURED VEGETABLE PROTEIN, DRY","Textured vegetable protein, dry" +41480000,"TOFU FROZEN DESSERT, NOT CHOCOLATE (INCL TOFUTTI)","Tofu, frozen dessert, flavors other than chocolate" +41480010,"TOFU FROZEN DESSERT, CHOCOLATE (INCLUDE TOFUTTI)","Tofu, frozen dessert, chocolate" +41601010,"BEAN SOUP, NFS","Bean soup, NFS" +41601020,"BEAN WITH BACON OR HAM SOUP, CANNED OR READY-TO-SERVE","Bean with bacon or ham soup, canned or ready-to-serve" +41601030,"BLACK BEAN SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Black bean soup, home recipe, canned or ready-to-serve" +41601040,"LIMA BEAN SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Lima bean soup, home recipe, canned or ready-to-serve" +41601070,"SOYBEAN SOUP, MISO BROTH","Soybean soup, miso broth" +41601080,"PINTO BEAN SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Pinto bean soup, home recipe, canned or ready-to-serve" +41601090,"BEAN SOUP, WITH MACARONI, HOME RECIPE, CANNED, OR READY-TO-S","Bean soup, with macaroni, home recipe, canned, or ready-to-serve" +41601100,"PORTUGUESE BEAN SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Portuguese bean soup, home recipe, canned or ready-to-serve" +41601110,"BEAN AND HAM SOUP, CHUNKY STYLE, CANNED OR READY-TO-SERVE","Bean and ham soup, chunky style, canned or ready-to-serve" +41601130,"BEAN SOUP, MIXED BEANS, HOME RECIPE, CANNED OR READY-TO-SERV","Bean soup, mixed beans, home recipe, canned or ready-to-serve" +41601140,"BEAN SOUP, HOME RECIPE","Bean soup, home recipe" +41601160,"BEAN & HAM SOUP, CAN, REDUCED SODIUM, W/ WATER/RTS","Bean and ham soup, canned, reduced sodium, prepared with water or ready-to-serve" +41601180,"BEAN & HAM SOUP, HOME RECIPE","Bean and ham soup, home recipe" +41601200,"LIQUID FROM STEWED KIDNEY BEANS, P.R.","Liquid from stewed kidney beans, Puerto Rican style" +41602010,"PEA AND HAM SOUP, CHUNKY STYLE, CANNED OR READY-TO-SERVE","Pea and ham soup, chunky style, canned or ready-to-serve" +41602020,"GARBANZO BEAN OR CHICKPEA SOUP, HOME RECIPE, CANNED OR READY","Garbanzo bean or chickpea soup, home recipe, canned or ready-to-serve" +41602030,"SPLIT PEA & HAM SOUP","Split pea and ham soup" +41602050,"SPLIT PEA SOUP","Split pea soup" +41602070,"SPLIT PEA SOUP, CAN, REDUCED SODIUM, W/ WATER/RTS","Split pea soup, canned, reduced sodium, prepared with water or ready-to-serve" +41602090,"SPLIT PEA & HAM SOUP, CAN, REDUCED SODIUM, W/ WATER/RTS","Split pea and ham soup, canned, reduced sodium, prepared with water or ready-to-serve" +41603010,"LENTIL SOUP, HOME RECIPE, CANNED, OR READY-TO-SERVE","Lentil soup, home recipe, canned, or ready-to-serve" +41610100,"WHITE BEAN SOUP, P.R.","White bean soup, Puerto Rican style (Sopon de habichuelas blancas)" +41810200,"BACON STRIP, MEATLESS","Bacon strip, meatless" +41810250,"BACON BITS, MEATLESS","Bacon bits, meatless" +41810400,"BREAKFAST LINK,PATTY,/SLICE, MEATLESS","Breakfast link, pattie, or slice, meatless" +41810600,"CHICKEN, MEATLESS NFS","Chicken, meatless, NFS" +41810610,"CHICKEN, MEATLESS, BREADED, FRIED (INCL LOMA LINDA)","Chicken, meatless, breaded, fried" +41811200,"FISH STICK, MEATLESS","Fish stick, meatless" +41811400,"FRANKFURTER OR HOT DOG, MEATLESS","Frankfurter or hot dog, meatless" +41811600,"LUNCHEON SLICE,MEATLESS-BEEF,CHICKEN,SALAM / TURKEY","Luncheon slice, meatless-beef, chicken, salami or turkey" +41811800,"MEATBALL, MEATLESS","Meatball, meatless" +41811850,"SCALLOPS, MEATLESS, BREADED, FRIED","Scallops, meatless, breaded, fried (made with meat substitute)" +41811890,"VEGETARIAN BURGER OR PATTY, MEATLESS, NO BUN","Vegetarian burger or patty, meatless, no bun" +41811950,"SWISS STEAK, W/ GRAVY, MEATLESS","Swiss steak, with gravy, meatless" +41812000,"SANDWICH SPREAD, MEAT SUBSTITUTE TYPE","Sandwich spread, meat substitute type" +41812400,"VEGETARIAN POT PIE","Vegetarian pot pie" +41812450,"VEGETARIAN CHILI (MADE W/ MEAT SUBSTITUTE)","Vegetarian chili (made with meat substitute)" +41812500,"TOFU & VEG (W/ CARROT/DK GRN, NO POTATO) W/ SOY SAUCE","Tofu and vegetables (including carrots, broccoli, and/or dark-green leafy vegetables (no potatoes)), with soy-based sauce (mixture)" +41812510,"TOFU & VEG (NO CARROT/DK GRN, NO POTATO) W/ SOY SAUCE","Tofu and vegetables (excluding carrots, broccoli, and dark-green leafy vegetables (no potatoes)), with soy-based sauce (mixture)" +41812600,"VEGETARIAN FILLET","Vegetarian, fillet" +41812800,"VEGETARIAN STEW","Vegetarian stew" +41812850,"VEGETARIAN STROGANOFF (MADE W/ MEAT SUBSTITUTE)","Vegetarian stroganoff (made with meat substitute)" +41812900,"VEGETARIAN MEAT LOAF OR PATTIES","Vegetarian meat loaf or patties (meat loaf made with meat substitute)" +41813000,"VEGATARIAN BOUILLON, DRY","Vegetarian bouillon, dry" +41901020,"SOYBURGER W/ CHEESE ON BUN","Soyburger, meatless, with cheese on bun" +42100050,"NUTS, NFS","Nuts, nfs" +42100100,"ALMONDS, NFS","Almonds, NFS" +42101000,"ALMONDS, UNROASTED","Almonds, unroasted" +42101100,"ALMONDS, ROASTED","Almonds, roasted" +42101200,"ALMONDS, DRY ROASTED","Almonds, dry roasted (assume salted)" +42101210,"ALMONDS, DRY ROASTED, W/O SALT","Almonds, dry roasted, without salt" +42101350,"ALMONDS, HONEY-ROASTED","Almonds, honey-roasted" +42102000,"BRAZIL NUTS","Brazil nuts" +42104000,"CASHEW NUTS, NFS","Cashew nuts, NFS" +42104100,"CASHEW NUTS, ROASTED","Cashew nuts, roasted (assume salted)" +42104110,"CASHEW NUTS, ROASTED, W/O SALT","Cashew nuts, roasted, without salt" +42104200,"CASHEW NUTS, DRY ROASTED","Cashew nuts, dry roasted" +42104205,"CASHEW NUTS, DRY ROASTED, WITHOUT SALT","Cashew nuts, dry roasted, without salt" +42104500,"CASHEW NUTS, HONEY-ROASTED","Cashew nuts, honey-roasted" +42105000,"CHESTNUTS, ROASTED","Chestnuts, roasted" +42106000,"COCONUT MEAT, FRESH","Coconut meat, fresh" +42106020,"COCONUT MEAT, DRIED, SWEETENED, SHREDDED","Coconut meat, dried, sweetened" +42107000,"FILBERTS, HAZELNUTS","Filberts, hazelnuts" +42109000,"MACADAMIA NUTS, UNROASTED","Macadamia nuts, unroasted" +42109100,"MACADAMIA NUTS, ROASTED","Macadamia nuts, roasted" +42110000,"MIXED NUTS, NFS","Mixed nuts, NFS" +42110100,"MIXED NUTS, ROASTED, W/ PEANUTS","Mixed nuts, roasted, with peanuts" +42110150,"MIXED NUTS, ROASTED, W/O PEANUTS","Mixed nuts, roasted, without peanuts" +42110200,"MIXED NUTS, DRY ROASTED","Mixed nuts, dry roasted" +42110300,"MIXED NUTS, HONEY-ROASTED, WITH PEANUTS","Mixed nuts, honey-roasted, with peanuts" +42111000,"PEANUTS, NFS","Peanuts, NFS" +42111030,"PEANUTS, BOILED","Peanuts, boiled" +42111100,"PEANUTS, ROASTED, SALTED","Peanuts, roasted, salted" +42111110,"PEANUTS, ROASTED, W/O SALT","Peanuts, roasted, without salt" +42111200,"PEANUTS, DRY ROASTED, SALTED","Peanuts, dry roasted, salted" +42111210,"PEANUTS, DRY ROASTED, W/O SALT","Peanuts, dry roasted, without salt" +42111500,"PEANUTS, HONEY ROASTED (INCL BEERNUTS)","Peanuts, honey-roasted" +42112000,"PECANS","Pecans" +42113000,"PINE NUTS (PIGNOLIAS)","Pine nuts (Pignolias)" +42114130,"PISTACHIO NUTS","Pistachio nuts" +42116000,"WALNUTS","Walnuts" +42116100,"WALNUTS, HONEY-ROASTED","Walnuts, honey-roasted" +42200500,"ALMOND BUTTER","Almond butter" +42200600,"ALMOND PASTE (MARZIPAN PASTE)","Almond paste (Marzipan paste)" +42201000,"CASHEW BUTTER","Cashew butter" +42202000,"PEANUT BUTTER","Peanut butter" +42202010,"PEANUT BUTTER, LOW SODIUM","Peanut butter, low sodium" +42202100,"PEANUT BUTTER, REDUCED SODIUM & REDUCED SUGAR","Peanut butter, reduced sodium and reduced sugar" +42202130,"PEANUT BUTTER, REDUCED SUGAR","Peanut butter, reduced sugar" +42202150,"PEANUT BUTTER, REDUCED FAT","Peanut butter, reduced fat" +42202200,"PEANUT BUTTER, VITAMIN & MINERAL FORTIFIED","Peanut butter, vitamin and mineral fortified" +42203000,"PEANUT BUTTER & JELLY","Peanut butter and jelly" +42204050,"PEANUT SAUCE","Peanut sauce" +42204100,"BROWN NUT GRAVY ( MEATLESS)","Brown nut gravy, meatless" +42301010,"PEANUT BUTTER SANDWICH","Peanut butter sandwich" +42302010,"PEANUT BUTTER & JELLY SANDWICH","Peanut butter and jelly sandwich" +42303010,"PEANUT BUTTER & BANANA SANDWICH","Peanut butter and banana sandwich" +42401010,"COCONUT MILK","Coconut milk (liquid expressed from grated coconut meat, water added)" +42402010,"COCONUT CREAM, CANNED, SWEETENED (INCL COCO LOPEZ)","Coconut cream (liquid expressed from grated coconut meat), canned, sweetened" +42403010,"COCONUT WATER (LIQUID FROM COCONUTS)","Coconut water (liquid from coconuts)" +42404010,"COCONUT WATER, CANNED OR BOTTLED","Coconut water, canned or bottled" +42501000,"NUT MIXTURE W/ DRIED FRUIT & SEEDS","Nut mixture with dried fruit and seeds" +42501500,"NUT MIXTURE WITH DRIED FRUIT, SEEDS, AND CHOCOLATE","Nut mixture with dried fruit, seeds, and chocolate" +42502000,"NUT MIXTURE W/ SEEDS","Nut mixture with seeds" +43101000,"PUMPKIN & SQUASH SEEDS, HULLED, UNROASTED","Pumpkin and/or squash seeds, hulled, unroasted" +43101100,"PUMPKIN & SQUASH SEEDS, HULLED, ROASTED, SALTED","Pumpkin and/or squash seeds, hulled, roasted, salted" +43101150,"PUMPKIN & SQUASH SEEDS, HULLED, ROASTED, NO SALT","Pumpkin and/or squash seeds, hulled, roasted, without salt" +43102000,"SUNFLOWER SEEDS, HULLED, UNROASTED, WITHOUT SALT","Sunflower seeds, hulled, unroasted, without salt" +43102100,"SUNFLOWER SEEDS, HULLED, ROASTED, SALTED","Sunflower seeds, hulled, roasted, salted" +43102110,"SUNFLOWER SEEDS, HULLED, ROASTED, W/O SALT","Sunflower seeds, hulled, roasted, without salt" +43102200,"SUNFLOWER SEEDS, HULLED, DRY ROASTED","Sunflower seeds, hulled, dry roasted" +43103000,"SESAME SEEDS (INCLUDE TOASTED)","Sesame seeds" +43103050,"SESAME SEEDS, WHOLE SEEDS","Sesame seeds, whole seed" +43103100,"SESAME SAUCE","Sesame sauce" +43103200,"SESAME PASTE","Sesame paste (sesame butter made from whole seeds)" +43103300,"SESAME BUTTER (TAHINI) FROM KERNELS","Sesame butter (tahini) (made from kernels)" +43104000,"FLAX SEED","Flax seeds" +43107000,"MIXED SEEDS","Mixed seeds" +44101000,"CAROB POWDER OR FLOUR","Carob powder or flour" +44201000,"CAROB CHIPS","Carob chips" +44202000,"CAROB SYRUP","Carob syrup" +50010000,"FLOUR, WHITE (INCLUDE FLOUR, NFS)","Flour, white" +50020000,"FLOUR, WHOLE WHEAT","Flour, whole wheat" +50030000,"BISCUIT MIX, DRY","Biscuit mix, dry" +51000100,"BREAD, NS AS TO MAJOR FLOUR","Bread, NS as to major flour" +51000110,"BREAD, NS AS TO MAJOR FLOUR, TOASTED","Bread, NS as to major flour, toasted" +51000180,"BREAD, HOMEMADE/PURCH AT A BAKERY, NS AS TO FLOUR","Bread, made from home recipe or purchased at a bakery, NS as to major flour" +51000190,"BREAD, HOMEMADE/PURCH AT A BAKERY, TOASTD,NS FLOUR","Bread, made from home recipe or purchased at a bakery, toasted, NS as to major flour" +51000200,"ROLL, NS AS TO MAJOR FLOUR","Roll, NS as to major flour" +51000230,"ROLL, NS AS TO MAJOR FLOUR, TOASTED","Roll, NS as to major flour, toasted" +51000250,"ROLL, HOMEMADE/PURCH AT A BAKERY, NS AS TO FLOUR","Roll, made from home recipe or purchased at a bakery, NS as to major flour" +51000260,"ROLL, HOMEMADE/PURCH AT A BAKERY, TOASTD,NS FLOUR","Roll, made from home recipe or purchased at a bakery, toasted, NS as to major flour" +51000300,"ROLL, HARD, NS AS TO MAJOR FLOUR","Roll, hard, NS as to major flour" +51000400,"ROLL, BRAN, NS AS TO TYPE OF BRAN","Roll, bran, NS as to type of bran" +51101000,"BREAD, WHITE","Bread, white" +51101010,"BREAD, WHITE, TOASTED","Bread, white, toasted" +51101050,"BREAD, WHITE, HOMEMADE OR PURCHASED AT A BAKERY","Bread, white, made from home recipe or purchased at a bakery" +51101060,"BREAD, WHITE, HOMEMADE OR PURCH AT A BAKERY TOASTED","Bread, white, made from home recipe or purchased at a bakery, toasted" +51102010,"BREAD, WHITE W/ WHOLE WHEAT SWIRL","Bread, white with whole wheat swirl" +51102020,"BREAD, WHITE W/ WHOLE WHEAT SWIRL, TOASTED","Bread, white with whole wheat swirl, toasted" +51105010,"BREAD, CUBAN (INCLUDE SPANISH, PORTUGUESE)","Bread, Cuban" +51105040,"BREAD, CUBAN, TOASTED (INCLUDE SPANISH, PORTUGUESE)","Bread, Cuban, toasted" +51106010,"BREAD, NATIVE, WATER, P.R. (PAN CRIOLLO)","Bread, Native, water, Puerto Rican style (Pan Criollo)" +51106020,"BREAD, NATIVE, WATER, P.R., TOASTED (PAN CRIOLLO)","Bread, Native, water, Puerto Rican style, toasted (Pan Criollo)" +51106200,"BREAD, LARD, P.R. (PAN DE MANTECA)","Bread, lard, Puerto Rican style (Pan de manteca)" +51106210,"BREAD, LARD, P.R., TOASTED (PAN DE MANTECA)","Bread, lard, Puerto Rican style, toasted (Pan de manteca)" +51106300,"BREAD, CARESSED, P.R. (PAN SOBAO)","Bread, caressed, Puerto Rican style (Pan sobao)" +51106310,"BREAD, CARESSED, P.R., TOASTED (PAN SOBAO)","Bread, caressed, Puerto Rican style, toasted (Pan sobao)" +51107010,"BREAD, FRENCH OR VIENNA","Bread, French or Vienna" +51107040,"BREAD, FRENCH OR VIENNA, TOASTED","Bread, French or Vienna, toasted" +51108010,"FOCACCIA, ITALIAN FLATBREAD, PLAIN","Focaccia, Italian flatbread, plain" +51108100,"NAAN, INDIAN FLATBREAD","Naan, Indian flatbread" +51109010,"BREAD, ITALIAN, GRECIAN, ARMENIAN","Bread, Italian, Grecian, Armenian" +51109040,"BREAD, ITALIAN, GRECIAN, ARMENIAN, TOASTED","Bread, Italian, Grecian, Armenian, toasted" +51109100,"BREAD, PITA","Bread, pita" +51109110,"BREAD, PITA, TOASTED","Bread, pita, toasted" +51109150,"BREAD, PITA W/ FRUIT","Bread, pita with fruit" +51109200,"BREAD, PITA W/ FRUIT, TOASTED","Bread, pita with fruit, toasted" +51111010,"BREAD, CHEESE (INCLUDE ONION CHEESE)","Bread, cheese" +51111040,"BREAD, CHEESE, TOASTED (INCLUDE ONION CHEESE)","Bread, cheese, toasted" +51113010,"BREAD, CINNAMON","Bread, cinnamon" +51113100,"BREAD, CINNAMON, TOASTED","Bread, cinnamon, toasted" +51115010,"BREAD, CORNMEAL AND MOLASSES","Bread, cornmeal and molasses" +51115020,"BREAD, CORNMEAL AND MOLASSES, TOASTED","Bread, cornmeal and molasses, toasted" +51119010,"BREAD, EGG, CHALLAH","Bread, egg, Challah" +51119040,"BREAD, EGG, CHALLAH, TOASTED","Bread, egg, Challah, toasted" +51121010,"BREAD, GARLIC","Bread, garlic" +51121110,"BREAD, ONION","Bread, onion" +51121120,"BREAD, ONION, TOASTED","Bread, onion, toasted" +51122000,"BREAD, REDUCED CALORIE/HIGH FIBER","Bread, reduced calorie and/or high fiber, white or NFS" +51122010,"BREAD, REDUCED CALORIE/HIGH FIBER, TOASTED","Bread, reduced calorie and/or high fiber, white or NFS, toasted" +51122100,"BREAD, REDUCED CALORIE/ HIGH FIBER, W/ FRUIT/NUTS","Bread, reduced calorie and/or high fiber, white or NFS, with fruit and/or nuts" +51122110,"BREAD, REDUCED CALORIE/HI FIBER, W/FRUIT/NUTS,TOAST","Bread, reduced calorie and/or high fiber, white or NFS, with fruit and/or nuts, toasted" +51122300,"BREAD, WHITE, SPECIAL FORMULA, ADDED FIBER","Bread, white, special formula, added fiber" +51122310,"BREAD,WHITE,SPECIAL FORMULA,ADDED FIBER,TOASTED","Bread, white, special formula, added fiber, toasted" +51123010,"BREAD, HIGH PROTEIN","Bread, high protein" +51123020,"BREAD, HIGH PROTEIN, TOASTED","Bread, high protein, toasted" +51127010,"BREAD, POTATO","Bread, potato" +51127020,"BREAD, POTATO, TOASTED","Bread, potato, toasted" +51129010,"BREAD, RAISIN","Bread, raisin" +51129020,"BREAD, RAISIN, TOASTED","Bread, raisin, toasted" +51130510,"BREAD, WHITE, LOW SODIUM OR NO SALT","Bread, white, low sodium or no salt" +51130520,"BREAD, WHITE, LOW SODIUM/NO SALT, TOASTED","Bread, white, low sodium or no salt, toasted" +51133010,"BREAD, SOUR DOUGH","Bread, sour dough" +51133020,"BREAD, SOUR DOUGH, TOASTED","Bread, sour dough, toasted" +51134000,"BREAD, SWEET POTATO","Bread, sweet potato" +51134010,"BREAD, SWEET POTATO, TOASTED","Bread, sweet potato, toasted" +51135000,"BREAD, VEGETABLE","Bread, vegetable" +51135010,"BREAD, VEGETABLE, TOASTED","Bread, vegetable, toasted" +51136000,"BRUSCHETTA","Bruschetta" +51140100,"BREAD DOUGH, FRIED","Bread, dough, fried" +51150000,"ROLL, WHITE, SOFT","Roll, white, soft" +51150100,"ROLL, WHITE, SOFT, TOASTED","Roll, white, soft, toasted" +51151060,"ROLL, WHITE, SOFT, HOMEMADE/PURCH AT A BAKERY","Roll, white, soft, made from home recipe or purchased at a bakery" +51152000,"ROLL, WHITE, SOFT, REDUCED CALORIE/ HIGH FIBER","Roll, white, soft, reduced calorie and/or high fiber" +51152100,"ROLL, WHITE, REDUCED CALORIE/ HIGH FIBER, TOASTED","Roll, white, soft, reduced calorie and/or high fiber, toasted" +51153000,"ROLL, WHITE, HARD","Roll, white, hard" +51153010,"ROLL, WHITE, HARD, TOASTED","Roll, white, hard, toasted" +51154510,"ROLL, DIET","Roll, diet" +51154550,"ROLL, EGG BREAD","Roll, egg bread" +51154560,"ROLL, EGG BREAD, TOASTED","Roll, egg bread, toasted" +51154600,"ROLL, CHEESE","Roll, cheese" +51155000,"ROLL, FRENCH OR VIENNA","Roll, French or Vienna" +51155010,"ROLL, FRENCH OR VIENNA, TOASTED","Roll, French or Vienna, toasted" +51156500,"ROLL, GARLIC","Roll, garlic" +51157000,"ROLL, HOAGIE, SUBMARINE,","Roll, hoagie, submarine" +51157010,"ROLL, HOAGIE, SUBMARINE, TOASTED","Roll, hoagie, submarine, toasted" +51158100,"ROLL, MEXICAN, BOLILLO","Roll, Mexican, bolillo" +51159000,"ROLL, SOUR DOUGH","Roll, sour dough" +51160000,"ROLL, SWEET, NO FROSTING","Roll, sweet, no frosting" +51160100,"ROLL, SWEET, CINNAMON BUN, NO FROSTING","Roll, sweet, cinnamon bun, no frosting" +51160110,"ROLL, SWEET, CINNAMON BUN, FROSTED","Roll, sweet, cinnamon bun, frosted" +51161000,"ROLL, SWEET, W/ FRUIT, NO FROSTING","Roll, sweet, with fruit, no frosting" +51161020,"ROLL, SWEET, W/ FRUIT, FROSTED","Roll, sweet, with fruit, frosted" +51161030,"ROLL, SWEET, W/ FRUIT, FROSTED, DIET","Roll, sweet, with fruit, frosted, diet" +51161050,"ROLL, SWEET, FROSTED","Roll, sweet, frosted" +51161250,"ROLL, SWEET, NO TOPPING, MEXICAN (PAN DULCE)","Roll, sweet, no topping, Mexican (Pan Dulce)" +51161270,"ROLL, SWEET, SUGAR TOPPING, MEXICAN (PAN DULCE)","Roll, sweet, sugar topping, Mexican (Pan Dulce)" +51161280,"ROLL,SWEET,W/ RAISINS & ICING,MEXICAN (PAN DULCE)","Roll, sweet, with raisins and icing, Mexican (Pan Dulce)" +51165000,"COFFEE CAKE, YEAST TYPE","Coffee cake, yeast type" +51166000,"CROISSANT","Croissant" +51166100,"CROISSANT, CHEESE","Croissant, cheese" +51166200,"CROISSANT, CHOCOLATE","Croissant, chocolate" +51166500,"CROISSANT, FRUIT","Croissant, fruit" +51167000,"BRIOCHE","Brioche" +51168000,"COFFEE BREAD, SPANISH","Bread, Spanish coffee" +51180010,"BAGEL","Bagel" +51180020,"BAGEL, TOASTED","Bagel, toasted" +51180030,"BAGEL, W/ RAISINS","Bagel, with raisins" +51180040,"BAGEL, W/ RAISINS, TOASTED","Bagel, with raisins, toasted" +51180080,"BAGEL W/ FRUIT OTHER THAN RAISINS","Bagel, with fruit other than raisins" +51180090,"BAGEL W/ FRUIT OTHER THAN RAISINS, TOASTED","Bagel, with fruit other than raisins, toasted" +51182010,"BREAD, STUFFING (INCLUDE HOMEMADE; STUFFING, NFS)","Bread stuffing" +51182020,"BREAD STUFFING W/ EGG","Bread stuffing made with egg" +51184000,"BREAD STICK, HARD","Bread sticks, hard" +51184010,"BREAD STICK, SOFT","Bread stick, soft" +51184020,"BREAD STICK, NS AS TO HARD OR SOFT","Bread stick, NS as to hard or soft" +51184030,"BREAD STICK, SOFT, PREP W/ GARLIC & PARMESAN CHEESE","Bread stick, soft, prepared with garlic and parmesan cheese" +51184100,"BREAD STICK, HARD, LOW SODIUM","Bread stick, hard, low sodium" +51185000,"CROUTONS","Croutons" +51186010,"MUFFIN, ENGLISH (INCLUDE SOUR DOUGH)","Muffin, English" +51186020,"MUFFIN, ENGLISH, TOASTED","Muffin, English, toasted" +51186100,"MUFFIN, ENGLISH, W/ RAISINS","Muffin, English, with raisins" +51186120,"MUFFIN, ENGLISH, W/ RAISINS, TOASTED","Muffin, English, with raisins, toasted" +51186130,"MUFFIN, ENGLISH, CHEESE","Muffin, English, cheese" +51186140,"MUFFIN, ENGLISH, CHEESE, TOASTED","Muffin, English, cheese, toasted" +51186160,"MUFFIN, ENGLISH, W/ FRUIT OTHER THAN RAISINS","Muffin, English, with fruit other than raisins" +51186180,"MUFFIN, ENGLISH, W/ FRUIT OTHER THAN RAISINS, TSTD","Muffin, English, with fruit other than raisins, toasted" +51187000,"MELBA TOAST","Melba toast" +51187020,"ANISETTE TOAST","Anisette toast" +51188100,"PANNETONE (ITALIAN-STYLE SWEET BREAD)","Pannetone (Italian-style sweet bread)" +51188500,"ZWIEBACK TOAST (INCL RUSK)","Zwieback toast" +51201010,"BREAD, 100% WHOLE WHEAT","Bread, whole wheat, 100%" +51201020,"BREAD, 100% WHOLE WHEAT, TOASTED","Bread, whole wheat, 100%, toasted" +51201060,"BREAD, 100% WHOLE WHEAT, HOME-MADE","Bread, whole wheat, 100%, made from home recipe or purchased at bakery" +51201070,"BREAD, 100% WHOLE WHEAT, HOME-MADE, TOASTED","Bread, whole wheat, 100%, made from home recipe or purchased at bakery, toasted" +51201150,"BREAD, PITA, 100% WHOLE WHEAT","Bread, pita, whole wheat, 100%" +51201160,"BREAD, PITA, 100% WHOLE WHEAT, TOASTED","Bread, pita, whole wheat, 100%, toasted" +51202000,"MUFFIN, ENGLISH, 100% WHOLE WHEAT","Muffin, English, whole wheat, 100%" +51202020,"MUFFIN, ENGLISH, 100% WHOLE WHEAT, TOASTED","Muffin, English, whole wheat, 100%, toasted" +51202050,"MUFFIN, ENGLISH, 100% WHOLE WHEAT, W/ RAISINS","Muffin, English, whole wheat, 100%, with raisins" +51202060,"MUFFIN, ENGLISH, WHOLE WHEAT, W/ RAISINS, TOASTED","Muffin, English, whole wheat, 100%, with raisins, toasted" +51207010,"BREAD, SPROUTED WHEAT","Bread, sprouted wheat" +51207020,"BREAD, SPROUTED WHEAT, TOASTED","Bread, sprouted wheat, toasted" +51208000,"BAGEL, 100% WHOLE WHEAT","Bagel, whole wheat, 100%" +51208010,"BAGEL, 100% WHOLE WHEAT, TOASTED","Bagel, whole wheat, 100%, toasted" +51208100,"BAGEL, 100% WHOLE WHEAT, W/ RAISINS","Bagel, whole wheat, 100%, with raisins" +51208110,"BAGEL, 100% WHOLE WHEAT, W/ RAISINS, TOASTED","Bagel, whole wheat, 100%, with raisins, toasted" +51220000,"ROLL, 100% WHOLE WHEAT","Roll, whole wheat, 100%" +51220010,"ROLL, 100% WHOLE WHEAT, TOASTED","Roll, whole wheat, 100%, toasted" +51220030,"ROLL, 100% WHOLE WHEAT, HOME RECIPE/BAKERY","Roll, whole wheat, 100%, made from home recipe or purchased at bakery" +51220040,"ROLL, 100% WHOLE WHEAT, HOME RECIPE/BAKERY, TOASTED","Roll, whole wheat, 100%, made from home recipe or purchased at bakery, toasted" +51300050,"BREAD, WHOLE GRAIN WHITE","Bread, whole grain white" +51300060,"BREAD, WHOLE GRAIN WHITE, TOASTED","Bread, whole grain white, toasted" +51300100,"BAGEL, WHOLE GRAIN WHITE","Bagel, whole grain white" +51300110,"BREAD, WHOLE WHEAT, NS AS TO 100%","Bread, whole wheat, NS as to 100%" +51300120,"BREAD, WHOLE WHEAT, NS AS TO 100%, TOASTED","Bread, whole wheat, NS as to 100%, toasted" +51300140,"BREAD, WHOLE WHEAT, NS AS TO 100%, MADE FROM HOME RECIPE OR","Bread, whole wheat, NS as to 100%, made from home recipe or purchased at bakery" +51300150,"BREAD, WHOLE WHEAT, NS 100%, HOME RECIPE/BAKERY, TOASTED","Bread, whole wheat, NS as to 100%, made from home recipe or purchased at bakery, toasted" +51300175,"BREAD, CHAPPATTI OR ROTI (INDIAN BREAD), WHEAT","Bread, chappatti or roti (Indian bread), wheat" +51300180,"BREAD, PURI OR POORI (INDIAN PUFFED BREAD), WHEAT","Bread, puri or poori (Indian puffed bread), wheat" +51300185,"BREAD, PARATHA, (INDIAN FLAT BREAD), WHEAT","Bread, paratha, (Indian flat bread), wheat" +51300210,"BREAD, WHOLE WHEAT, WITH RAISINS","Bread, whole wheat, with raisins" +51300220,"BREAD, WHOLE WHEAT, WITH RAISINS, TOASTED","Bread, whole wheat, with raisins, toasted" +51301010,"BREAD, WHEAT OR CRACKED WHEAT","Bread, wheat or cracked wheat" +51301020,"BREAD, WHEAT OR CRACKED WHEAT, TOASTED","Bread, wheat or cracked wheat, toasted" +51301040,"BREAD, CRACKED WHEAT, HOME RECIPE/BAKERY","Bread, wheat or cracked wheat, made from home recipe or purchased at bakery" +51301050,"BREAD, CRACKED WHEAT, HOME RECIPE/BAKERY, TOASTED","Bread, wheat or cracked wheat, made from home recipe or purchased at bakery, toasted" +51301120,"BREAD, WHEAT OR CRACKED WHEAT, W/ RAISINS","Bread, wheat or cracked wheat, with raisins" +51301130,"BREAD, WHEAT OR CRACKED WHEAT, W/ RAISINS, TOASTED","Bread, wheat or cracked wheat, with raisins, toasted" +51301510,"BREAD, CRACKED WHEAT, REDUCED CALORIE/ HIGH FIBER","Bread, wheat or cracked wheat, reduced calorie and/or high fiber" +51301520,"BREAD, CRACKED WHEAT, RED CALORIE/ HI FIBER, TOAST","Bread, wheat or cracked wheat, reduced calorie and/or high fiber, toasted" +51301540,"BREAD, FRENCH OR VIENNA, WHOLE WHEAT, NS AS TO 100%","Bread, French or Vienna, whole wheat, NS as to 100%" +51301550,"BREAD, FRENCH OR VIENNA, WHOLE WHEAT, NS AS TO 100%, TOASTED","Bread, French or Vienna, whole wheat, NS as to 100%, toasted" +51301600,"BREAD, PITA, WHOLE WHEAT, NS AS TO 100%","Bread, pita, whole wheat, NS as to 100%" +51301610,"BREAD, PITA, WHOLE WHEAT, NS AS TO 100%, TOASTED","Bread, pita, whole wheat, NS as to 100%, toasted" +51301620,"BREAD, PITA, CRACKED WHEAT","Bread, pita, wheat or cracked wheat" +51301630,"BREAD, PITA, CRACKED WHEAT, TOASTED","Bread, pita, wheat or cracked wheat, toasted" +51301700,"BAGEL, WHEAT","Bagel, wheat" +51301710,"BAGEL, WHEAT, TOASTED","Bagel, wheat, toasted" +51301750,"BAGEL, WHOLE WHEAT, NS AS TO 100%","Bagel, whole wheat, NS as to 100%" +51301760,"BAGEL, WHOLE WHEAT, NS AS TO 100%, TOASTED","Bagel, whole wheat, NS as to 100%, toasted" +51301800,"BAGEL, WHEAT, W/ RAISINS","Bagel, wheat, with raisins" +51301810,"BAGEL, WHEAT, W/ RAISINS, TOASTED","Bagel, wheat, with raisins, toasted" +51301820,"BAGEL, WHEAT, W/ FRUITS & NUTS","Bagel, wheat, with fruit and nuts" +51301830,"BAGEL, WHEAT, W/ FRUITS & NUTS, TOASTED","Bagel, wheat, with fruit and nuts, toasted" +51301900,"BAGEL, WHEAT BRAN","Bagel, wheat bran" +51301910,"BAGEL, WHEAT BRAN, TOASTED","Bagel, wheat bran, toasted" +51302500,"MUFFIN, ENGLISH, WHEAT BRAN","Muffin, English, wheat bran" +51302510,"MUFFIN, ENGLISH, WHEAT BRAN, TOASTED","Muffin, English, wheat bran, toasted" +51302520,"MUFFIN, ENGLISH, WHEAT BRAN, W/ RAISINS","Muffin, English, wheat bran, with raisins" +51302530,"MUFFIN, ENGLISH, WHEAT BRAN, W/ RAISINS, TOASTED","Muffin, English, wheat bran, with raisins, toasted" +51303010,"MUFFIN, ENGLISH, WHEAT OR CRACKED WHEAT","Muffin, English, wheat or cracked wheat" +51303020,"MUFFIN, ENGLISH, WHEAT OR CRACKED WHEAT, TOASTED","Muffin, English, wheat or cracked wheat, toasted" +51303030,"MUFFIN, ENGLISH, WHOLE WHEAT, NS AS TO 100%","Muffin, English, whole wheat, NS as to 100%" +51303040,"MUFFIN, ENGLISH, WHOLE WHEAT, NS AS TO 100%, TOASTED","Muffin, English, whole wheat, NS as to 100%, toasted" +51303050,"MUFFIN, ENGLISH, WHEAT OR CRACKED WHEAT W/ RAISINS","Muffin, English, wheat or cracked wheat, with raisins" +51303060,"MUFFIN, ENGLISH, WHEAT W/ RAISINS, TOASTED","Muffin, English, wheat or cracked wheat, with raisins, toasted" +51303070,"MUFFIN, ENGLISH, WHOLE WHEAT, NS AS TO 100%, WITH RAISINS","Muffin, English, whole wheat, NS as to 100%, with raisins" +51303080,"MUFFIN, ENGLISH, WHOLE WHEAT, NS 100%, W/RAISINS, TOASTED","Muffin, English, whole wheat, NS as to 100%, with raisins, toasted" +51306000,"BREAD STICK, HARD, WHOLE WHEAT, NS AS TO 100 %","Bread stick, hard, whole wheat, NS as to 100%" +51320010,"ROLL, WHEAT OR CRACKED WHEAT","Roll, wheat or cracked wheat" +51320020,"ROLL, WHEAT OR CRACKED WHEAT, TOASTED","Roll, wheat or cracked wheat, toasted" +51320040,"ROLL, CRACKED WHEAT, HOME RECIPE/BAKERY","Roll, wheat or cracked wheat, made from home recipe or purchased at bakery" +51320050,"ROLL, CRACKED WHEAT, HOME RECIPE/BAKERY, TOASTED","Roll, wheat or cracked wheat, made from home recipe or purchased at bakery, toasted" +51320500,"ROLL, WHOLE WHEAT, NS AS TO 100%","Roll, whole wheat, NS as to 100%" +51320510,"ROLL, WHOLE WHEAT, NS AS TO 100%, TOASTED","Roll, whole wheat, NS as to 100%, toasted" +51320530,"ROLL, WHOLE WHEAT, NS 100%, MADE FROM HOMEMADE/BAKERY","Roll, whole wheat, NS as to 100%, made from home recipe or purchased at bakery" +51320540,"ROLL, WHOLE WHEAT, NS AS TO 100%, HOMEMADE/BAKERY, TOASTED","Roll, whole wheat, NS as to 100%, made from home recipe or purchased at bakery, toasted" +51401010,"BREAD, RYE","Bread, rye" +51401020,"BREAD, RYE, TOASTED","Bread, rye, toasted" +51401030,"BREAD, MARBLE RYE & PUMPERNICKEL","Bread, marble rye and pumpernickel" +51401040,"BREAD, MARBLE RYE & PUMPERNICKEL, TOASTED","Bread, marble rye and pumpernickel, toasted" +51401060,"BREAD, RYE, REDUCED CALORIE/ HIGH FIBER (INCL LESS)","Bread, rye, reduced calorie and/or high fiber" +51401070,"BREAD, RYE, REDUCED CALORIE/ HIGH FIBER, TOASTED","Bread, rye, reduced calorie and/or high fiber, toasted" +51401200,"MUFFIN, ENGLISH, RYE","Muffin, English, rye" +51401210,"MUFFIN, ENGLISH, RYE, TOASTED","Muffin, English, rye, toasted" +51404010,"BREAD, PUMPERNICKEL","Bread, pumpernickel" +51404020,"BREAD, PUMPERNICKEL, TOASTED","Bread, pumpernickel, toasted" +51404500,"BAGEL, PUMPERNICKEL","Bagel, pumpernickel" +51404510,"BAGEL, PUMPERNICKEL, TOASTED","Bagel, pumpernickel, toasted" +51404550,"MUFFIN, ENGLISH, PUMPERNICKEL","Muffin, English, pumpernickel" +51404560,"MUFFIN, ENGLISH, PUMPERNICKEL, TOASTED","Muffin, English, pumpernickel, toasted" +51407010,"BREAD, BLACK","Bread, black" +51407020,"BREAD, BLACK, TOASTED","Bread, black, toasted" +51420000,"ROLL, RYE","Roll, rye" +51421000,"ROLL, PUMPERNICKEL","Roll, pumpernickel" +51421100,"ROLL, PUMPERNICKEL, TOASTED","Roll, pumpernickel, toasted" +51501010,"BREAD, OATMEAL","Bread, oatmeal" +51501020,"BREAD, OATMEAL, TOASTED","Bread, oatmeal, toasted" +51501040,"BREAD, OAT BRAN","Bread, oat bran" +51501050,"BREAD, OAT BRAN, TOASTED","Bread, oat bran, toasted" +51501060,"BREAD, OAT BRAN, REDUCED CALORIE/ HIGH FIBER","Bread, oat bran, reduced calorie and/or high fiber" +51501070,"BREAD, OAT BRAN REDUCED CALORIE/HI FIBER, TOASTED","Bread, oat bran, reduced calorie and/or high fiber, toasted" +51501080,"BAGEL, OAT BRAN","Bagel, oat bran" +51501090,"BAGEL, OAT BRAN, TOASTED","Bagel, oat bran, toasted" +51502010,"ROLL, OATMEAL","Roll, oatmeal" +51502020,"ROLL, OATMEAL, TOASTED","Roll, oatmeal, toasted" +51502100,"ROLL, OAT BRAN","Roll, oat bran" +51502110,"ROLL, OAT BRAN, TOASTED","Roll, oat bran, toasted" +51503000,"MUFFIN, ENGLISH, OAT BRAN","Muffin, English, oat bran" +51503010,"MUFFIN, ENGLISH, OAT BRAN, TOASTED","Muffin, English, oat bran, toasted" +51503040,"MUFFIN, ENGLISH, OAT BRAN, WITH RAISINS","Muffin, English, oat bran, with raisins" +51503050,"MUFFIN, ENGLISH, OAT BRAN, W/ RAISINS, TOASTED","Muffin, English, oat bran with raisins, toasted" +51601010,"BREAD, MULTIGRAIN, TOASTED","Bread, multigrain, toasted" +51601020,"BREAD, MULTIGRAIN","Bread, multigrain" +51601210,"BREAD, MULTIGRAIN, W/ RAISINS","Bread, multigrain, with raisins" +51601220,"BREAD, MULTIGRAIN, W/ RAISINS, TOASTED","Bread, multigrain, with raisins, toasted" +51602010,"BREAD, MULTIGRAIN, REDUCED CALORIE/ HIGH FIBER","Bread, multigrain, reduced calorie and/or high fiber" +51602020,"BREAD, MULTIGRAIN, REDUCED CALORIE/ HI FIBER, TOAST","Bread, multigrain, reduced calorie and/or high fiber, toasted" +51620000,"ROLL, MULTIGRAIN","Roll, multigrain" +51620010,"ROLL, MULTIGRAIN, TOASTED","Roll, multigrain, toasted" +51630000,"BAGEL, MULTIGRAIN","Bagel, multigrain" +51630010,"BAGEL, MULTIGRAIN, TOASTED","Bagel, multigrain, toasted" +51630100,"BAGEL, MULTIGRAIN, W/ RAISINS","Bagel, multigrain, with raisins" +51630110,"BAGEL, MULTIGRAIN, W/ RAISINS, TOASTED","Bagel, multigrain, with raisins, toasted" +51630200,"MUFFIN, ENGLISH, MULTIGRAIN","Muffin, English, multigrain" +51630210,"MUFFIN, ENGLISH, MULTIGRAIN, TOASTED","Muffin, English, multigrain, toasted" +51801010,"BREAD, BARLEY","Bread, barley" +51801020,"BREAD, BARLEY, TOASTED","Bread, barley, toasted" +51804010,"BREAD, SOY","Bread, soy" +51804020,"BREAD, SOY, TOASTED","Bread, soy, toasted" +51805010,"BREAD, SUNFLOWER MEAL","Bread, sunflower meal" +51805020,"BREAD, SUNFLOWER MEAL, TOASTED","Bread, sunflower meal, toasted" +51806010,"BREAD, RICE","Bread, rice" +51806020,"BREAD, RICE, TOASTED","Bread, rice, toasted" +51807000,"INJERA (AMERICAN-STYLE ETHIOPIAN BREAD)","Injera (American-style Ethiopian bread)" +51808000,"BREAD, LOW GLUTEN","Bread, low gluten" +51808010,"BREAD, LOW GLUTEN, TOASTED","Bread, low gluten, toasted" +52101000,"BISCUIT, BAKING POWDER OR BUTTERMILK TYPE, NFS","Biscuit, baking powder or buttermilk type, NS as to made from mix, refrigerated dough, or home recipe" +52101030,"BISCUIT DOUGH, FRIED","Biscuit dough, fried" +52101040,"CRUMPET","Crumpet" +52101050,"CRUMPET, TOASTED","Crumpet, toasted" +52101100,"BISCUIT, BAKING POWDER OR BUTTERMILK, FROM MIX","Biscuit, baking powder or buttermilk type, made from mix" +52101150,"BISCUIT,BAKING PWR/BUTTER MILK,REFRIG DOUGH,LOWFAT","Biscuit, baking powder or buttermilk type, made from refrigerated dough, lowfat" +52102040,"BISCUIT, BAK POWDER OR BUTTERMILK, FROM REFRG DOUGH","Biscuit, baking powder or buttermilk type, made from refrigerated dough" +52103000,"BISCUIT, BAKING POWDER/BUTTERMILK TYPE, COMMERCIALLY BAKED","Biscuit, baking powder or buttermilk type, commercially baked" +52104010,"BISCUIT, BAKING POWDER OR BUTTERMILK, HOMEMADE","Biscuit, baking powder or buttermilk type, made from home recipe" +52104040,"BISCUIT, WHOLE WHEAT","Biscuit, whole wheat" +52104100,"BISCUIT, CHEESE","Biscuit, cheese" +52104200,"BISCUIT, CINNAMON-RAISIN","Biscuit, cinnamon-raisin" +52105100,"SCONES","Scone" +52105110,"SCONES, WHOLE WHEAT","Scone, whole wheat" +52105200,"SCONE, WITH FRUIT","Scone, with fruit" +52201000,"CORNBREAD, PREPARED FROM MIX","Cornbread, prepared from mix" +52202060,"CORNBREAD, HOMEMADE","Cornbread, made from home recipe" +52204000,"CORNBREAD STUFFING","Cornbread stuffing" +52206010,"CORNBREAD MUFFIN, STICK, ROUND","Cornbread muffin, stick, round" +52206060,"CORNBREAD MUFFIN, STICK, ROUND, HOMEMADE","Cornbread muffin, stick, round, made from home recipe" +52207010,"CORN FLOUR PATTIES OR TARTS, FRIED","Corn flour patty or tart, fried" +52208010,"CORN PONE,BAKED (INCL HOE CAKE)","Corn pone, baked" +52208020,"CORN PONE FRIED","Corn pone, fried" +52208760,"GORDITA/SOPE SHELL, PLAIN, NO FILLING","Gordita/sope shell, plain, no filling" +52209010,"HUSH PUPPY","Hush puppy" +52211010,"JOHNNYCAKE","Johnnycake" +52213010,"SPOONBREAD","Spoonbread" +52215000,"TORTILLA, NFS","Tortilla, NFS" +52215100,"TORTILLA, CORN","Tortilla, corn" +52215200,"TORTILLA, FLOUR (WHEAT)","Tortilla, flour (wheat)" +52215260,"TORTILLA, WHOLE WHEAT","Tortilla, whole wheat" +52215300,"TACO SHELL, CORN","Taco shell, corn" +52215350,"TACO SHELL; FLOUR","Taco shell, flour" +52220110,"CORNMEAL BREAD, DOMINICAN","Cornmeal bread, Dominican style (Arepa Dominicana)" +52301000,"MUFFIN, NFS","Muffin, NFS" +52302010,"MUFFIN, FRUIT","Muffin, fruit" +52302020,"MUFFIN, FRUIT, LOW FAT","Muffin, fruit, low fat" +52302500,"MUFFIN, CHOCOLATE CHIP","Muffin, chocolate chip" +52302600,"MUFFIN, CHOCOLATE","Muffin, chocolate" +52303010,"MUFFIN, WHOLE WHEAT","Muffin, whole wheat" +52303500,"MUFFIN, WHEAT","Muffin, wheat" +52304000,"MUFFIN, WHOLE GRAIN","Muffin, whole grain" +52304010,"MUFFIN, WHEAT BRAN (INCLUDE W/ RAISINS & NUTS)","Muffin, wheat bran" +52304040,"MUFFIN,BRAN,W/ FRUIT, LOWFAT","Muffin, bran with fruit, lowfat" +52304100,"MUFFIN, OATMEAL","Muffin, oatmeal" +52304150,"MUFFIN, OAT BRAN","Muffin, oat bran" +52306010,"MUFFIN, PLAIN","Muffin, plain" +52306300,"MUFFIN, CHEESE","Muffin, cheese" +52306500,"MUFFIN, PUMPKIN, W/ RAISINS","Muffin, pumpkin" +52306550,"MUFFIN, ZUCCHINI","Muffin, zucchini" +52306700,"MUFFIN, CARROT (INCL W/ RAISINS/NUTS)","Muffin, carrot" +52311010,"POPOVER","Popover" +52401000,"BREAD, BOSTON BROWN","Bread, Boston Brown" +52403000,"BREAD, NUT","Bread, nut" +52404060,"BREAD, PUMPKIN (INCLUDE W/ RAISINS)","Bread, pumpkin" +52405010,"BREAD, FRUIT","Bread, fruit" +52407000,"BREAD, ZUCCHINI (INCL SQUASH BREAD; W/ NUTS)","Bread, zucchini" +52408000,"BREAD, IRISH SODA","Bread, Irish soda" +53100050,"CAKE, BATTER, CHOCOLATE, RAW","Cake batter, raw, chocolate" +53100070,"CAKE, BATTER, RAW, NOT CHOCOLATE","Cake batter, raw, not chocolate" +53100100,"CAKE OR CUPCAKE, NS AS TO TYPE","Cake or cupcake, NS as to type" +53101100,"CAKE, ANGEL FOOD, W/O ICING","Cake, angel food, without icing or filling" +53101200,"CAKE, ANGEL FOOD, W/ ICING","Cake, angel food, with icing or filling" +53101250,"CAKE, ANGEL FOOD, W/ FRUIT & ICING/FILLING","Cake, angel food, with fruit and icing or filling" +53102100,"CAKE OR CUPCAKE,APPLESAUCE W/O ICING","Cake or cupcake, applesauce, without icing or filling" +53102200,"CAKE OR CUPCAKE,APPLESAUCE W/ ICING","Cake or cupcake, applesauce, with icing or filling" +53102600,"CAKE OR CUPCAKE,BANANA, W/O ICING","Cake or cupcake, banana, without icing or filling" +53102700,"CAKE OR CUPCAKE,BANANA, W/ ICING","Cake or cupcake, banana, with icing or filling" +53102800,"CAKE OR CUPCAKE,BLACK FOREST (CHOC-CHERRY)","Cake or cupcake, black forest (chocolate-cherry)" +53103000,"CAKE, BOSTON CREAM PIE","Cake, Boston cream pie" +53104100,"CAKE OR CUPCAKE,CARROT, NO ICING","Cake or cupcake, carrot, without icing or filling" +53104260,"CAKE OR CUPCAKE, CARROT, WITH ICING","Cake or cupcake, carrot, with icing or filling" +53104300,"CARROT CAKE, DIET","Cake, carrot, diet" +53104400,"CAKE OR CUPCAKE,COCONUT, W/ ICING","Cake or cupcake, coconut, with icing or filling" +53104500,"CHEESECAKE","Cheesecake" +53104550,"CHEESECAKE, W/ FRUIT","Cheesecake with fruit" +53104600,"CHEESECAKE, CHOCOLATE","Cheesecake, chocolate" +53105270,"CAKE OR CUPCAKE, CHOC, DEVIL'S FOOD OR FUDGE, W/ICING /FILL","Cake or cupcake, chocolate, devil's food or fudge, with icing or filling" +53105275,"CAKE OR CUPCAKE, CHOCOLATE, DEVIL'S FOOD OR FUDGE, W/O ICING","Cake or cupcake, chocolate, devil's food or fudge, without icing or filling" +53105300,"CAKE OR CUPCAKE,GERMAN CHOC, W/ ICING or FILLING","Cake or cupcake, German chocolate, with icing or filling" +53105500,"CAKE, CHOC, W/ ICING, DIET","Cake, chocolate, with icing, diet" +53106500,"CAKE, CREAM, W/O ICING OR TOPPING","Cake, cream, without icing or topping" +53108200,"SNACK CAKE, CHOCOLATE, WITH ICING OR FILLING","Snack cake, chocolate, with icing or filling" +53108220,"SNACK CAKE, CHOC, W/ICING OR FILLING, REDUCED FAT&CALORIE","Snack cake, chocolate, with icing or filling, reduced fat and calories" +53109200,"SNACK CAKE, NOT CHOCOLATE, WITH ICING OR FILLING","Snack cake, not chocolate, with icing or filling" +53109220,"SNACK CAKE, NOT CHOC, W/ ICING OR FILLING, RED FAT&CALS","Snack cake, not chocolate, with icing or filling, reduced fat and calories" +53109300,"CAKE,DOBOS TORTE(NON-CHOC CAKE W/CHOC FILL & ICING)","Cake, Dobos Torte (non-chocolate layer cake with chocolate filling and icing)" +53110000,"CAKE, FRUITCAKE, LIGHT/DARK, HOLIDAY TYPE CAKE","Cake, fruit cake, light or dark, holiday type cake" +53111000,"CAKE OR CUPCAKE, GINGERBREAD","Cake or cupcake, gingerbread" +53112000,"CAKE, ICE CREAM & CAKE ROLL, CHOCOLATE","Cake, ice cream and cake roll, chocolate" +53112100,"CAKE, ICE CREAM & CAKE ROLL, NOT CHOCOLATE","Cake, ice cream and cake roll, not chocolate" +53113000,"CAKE, JELLY ROLL","Cake, jelly roll" +53114000,"CAKE OR CUPCAKE,LEMON, W/O ICING","Cake or cupcake, lemon, without icing or filling" +53114100,"CAKE OR CUPCAKE,LEMON, W/ ICING","Cake or cupcake, lemon, with icing or filling" +53115100,"CAKE OR CUPCAKE, MARBLE, W/O ICING OR FILLING","Cake or cupcake, marble, without icing or filling" +53115200,"CAKE OR CUPCAKE, MARBLE, WITH ICING OR FILLING","Cake or cupcake, marble, with icing or filling" +53115310,"CAKE OR CUPCAKE,NUT, W/O ICING","Cake or cupcake, nut, without icing or filling" +53115320,"CAKE OR CUPCAKE,NUT, W/ ICING","Cake or cupcake, nut, with icing or filling" +53115410,"CAKE OR CUPCAKE, OATMEAL","Cake or cupcake, oatmeal" +53115450,"CAKE OR CUPCAKE, PEANUT BUTTER","Cake or cupcake, peanut butter" +53116000,"CAKE, POUND, W/O ICING","Cake, pound, without icing or filling" +53116020,"CAKE, POUND, W/ ICING","Cake, pound, with icing or filling" +53116270,"CAKE, POUND, CHOCOLATE","Cake, pound, chocolate" +53116350,"CAKE, POUND, P.R. (PONQUE)","Cake, pound, Puerto Rican style (Ponque)" +53116390,"CAKE, POUND, REDUCED FAT, NO CHOLESTEROL","Cake, pound, reduced fat, cholesterol free" +53116500,"CAKE OR CUPCAKE,PUMPKIN, W/O ICING","Cake or cupcake, pumpkin, without icing or filling" +53116510,"CAKE OR CUPCAKE,PUMPKIN,W/ ICING","Cake or cupcake, pumpkin, with icing or filling" +53116550,"CAKE OR CUPCAKE, RAISIN-NUT","Cake or cupcake, raisin-nut" +53116570,"CAKE, RAVANI (MADE W/ FARINA)","Cake, Ravani (made with farina)" +53116600,"CAKE, RICE FLOUR, W/O ICING","Cake, rice flour, without icing or filling" +53116650,"CAKE, QUEZADILLA, EL SALVADORIAN STYLE","Cake, Quezadilla, El Salvadorian style" +53117100,"CAKE OR CUPCAKE,SPICE, W/O ICING","Cake or cupcake, spice, without icing or filling" +53117200,"CAKE OR CUPCAKE,SPICE, W/ ICING","Cake or cupcake, spice, with icing or filling" +53118100,"CAKE, SPONGE, W/O ICING","Cake, sponge, without icing or filling" +53118200,"CAKE, SPONGE, W/ ICING","Cake, sponge, with icing or filling" +53118300,"CAKE, SPONGE, CHOCOLATE","Cake, sponge, chocolate" +53118410,"RUM CAKE, WITHOUT ICING (SOPA BORRACHA)","Rum cake, without icing (Sopa Borracha)" +53118500,"CAKE, TORTE","Cake, torte" +53118550,"CAKE, TRES LECHE","Cake, tres leche" +53119000,"CAKE, UPSIDE DOWN (ALL FRUITS)","Cake, upside down (all fruits)" +53120270,"CAKE OR CUPCAKE, WHITE, WITH ICING OR FILLING","Cake or cupcake, white, with icing or filling" +53120275,"CAKE OR CUPCAKE, WHITE, WITHOUT ICING OR FILLING","Cake or cupcake, white, without icing or filling" +53121270,"CAKE OR CUPCAKE, YELLOW, WITH ICING OR FILLING","Cake or cupcake, yellow, with icing or filling" +53121275,"CAKE OR CUPCAKE, YELLOW, WITHOUT ICING OR FILLING","Cake or cupcake, yellow, without icing or filling" +53122070,"CAKE, SHORTCAKE, BISCUIT, W/ WHIPPED CREAM & FRUIT","Cake, shortcake, biscuit type, with whipped cream and fruit" +53122080,"CAKE, SHORTCAKE, BISCUIT, W/ FRUIT","Cake, shortcake, biscuit type, with fruit" +53123070,"CAKE, SHORTCAKE, SPONGE, W/ WHIPPED CREAM & FRUIT","Cake, shortcake, sponge type, with whipped cream and fruit" +53123080,"CAKE, SHORTCAKE, SPONGE, W/ FRUIT","Cake, shortcake, sponge type, with fruit" +53123500,"CAKE, SHORTCAKE, W/ WHIP TOPPING & FRUIT, DIET","Cake, shortcake, with whipped topping and fruit, diet" +53124110,"CAKE OR CUPCAKE, ZUCCHINI","Cake or cupcake, zucchini" +53200100,"COOKIE, BATTER OR DOUGH, RAW","Cookie, batter or dough, raw" +53201000,"COOKIE, NFS","Cookie, NFS" +53202000,"COOKIE, ALMOND","Cookie, almond" +53203000,"COOKIE, APPLESAUCE","Cookie, applesauce" +53203500,"COOKIE, BISCOTTI","Cookie, biscotti (Italian sugar cookie)" +53204000,"COOKIE, BROWNIE, NS AS TO ICING","Cookie, brownie, NS as to icing" +53204010,"COOKIE, BROWNIE, W/O ICING","Cookie, brownie, without icing" +53204100,"COOKIE, BROWNIE, WITH ICING OR FILLING","Cookie, brownie, with icing or filling" +53204840,"COOKIE, BROWNIE, REDUCED FAT, NS AS TO ICING","Cookie, brownie, reduced fat, NS as to icing" +53204860,"COOKIE, BROWNIE, FAT FREE, NS AS TO ICING","Cookie, brownie, fat free, NS as to icing" +53205250,"COOKIE, BUTTERSCOTCH, BROWNIE","Cookie, butterscotch, brownie" +53205260,"COOKIE, BAR, WITH CHOCOLATE","Cookie, bar, with chocolate" +53206000,"COOKIE, CHOCOLATE CHIP","Cookie, chocolate chip" +53206020,"COOKIE, CHOC CHIP, HOMEMADE OR PURCHASED AT BAKERY","Cookie, chocolate chip, made from home recipe or purchased at a bakery" +53206030,"COOKIE, CHOC CHIP, REDUCED FAT","Cookie, chocolate chip, reduced fat" +53206100,"COOKIE, CHOCOLATE CHIP SANDWICH","Cookie, chocolate chip sandwich" +53206500,"COOKIE, CHOCOLATE, MADE WITH RICE CEREAL","Cookie, chocolate, made with rice cereal" +53206550,"COOKIE, CHOCOLATE, MADE W/ OATMEAL & COCONUT","Cookie, chocolate, made with oatmeal and coconut (no-bake)" +53207000,"COOKIE, CHOCOLATE FUDGE","Cookie, chocolate or fudge" +53207020,"COOKIE, CHOCOLATE OR FUDGE, REDUCED FAT","Cookie, chocolate or fudge, reduced fat" +53207050,"COOKIE, CHOCOLATE, W/ CHOC FILLING/COATING, FAT FREE","Cookie, chocolate, with chocolate filling or coating, fat free" +53208000,"COOKIE, MARSHMALLOW, CHOCOLATE-COVERED","Cookie, marshmallow, chocolate-covered" +53208200,"COOKIE, CHOCOLATE-COVERED, MARSHMALLOW PIE","Cookie, marshmallow pie, chocolate covered" +53209005,"COOKIE, CHOCOLATE, WITH ICING OR COATING","Cookie, chocolate, with icing or coating" +53209010,"COOKIE, SUGAR WAFER, CHOCOLATE-COVERED","Cookie, sugar wafer, chocolate-covered" +53209015,"COOKIE, CHOCOLATE SANDWICH","Cookie, chocolate sandwich" +53209020,"COOKIE, CHOCOLATE SANDWICH, REDUCED FAT","Cookie, chocolate sandwich, reduced fat" +53209100,"COOKIE, CHOCOLATE, SANDWICH, W/ EXTRA FILLING","Cookie, chocolate, sandwich, with extra filling" +53209500,"COOKIE, CHOCOLATE & VANILLA SANDWICH","Cookie, chocolate and vanilla sandwich" +53210000,"COOKIE, CHOCOLATE WAFER","Cookie, chocolate wafer" +53210900,"COOKIE, GRAHAM CRACKER WITH CHOCOLATE AND MARSHMALLOW","Cookie, graham cracker with chocolate and marshmallow" +53211000,"COOKIE, BAR, W/ CHOCOLATE, NUTS, & GRAHAM CRACKERS","Cookie bar, with chocolate, nuts, and graham crackers" +53215500,"COOKIE, COCONUT","Cookie, coconut" +53220000,"COOKIE, FRUIT-FILLED","Cookie, fruit-filled bar" +53220010,"COOKIE, FRUIT-FILLED BAR, FAT FREE","Cookie, fruit-filled bar, fat free" +53220030,"COOKIE, FIG BAR","Cookie, fig bar" +53220040,"COOKIE, FIG BAR, FAT FREE","Cookie, fig bar, fat free" +53222010,"COOKIE, FORTUNE","Cookie, fortune" +53222020,"COOKIE, CONE SHELL, ICE CREAM TYPE,WAFER / CAKE","Cookie, cone shell, ice cream type, wafer or cake" +53223000,"COOKIE, GINGERSNAPS","Cookie, gingersnaps" +53223100,"COOKIE, GRANOLA","Cookie, granola" +53224000,"COOKIE, LADY FINGER","Cookie, ladyfinger" +53224250,"COOKIE, LEMON BAR","Cookie, lemon bar" +53225000,"COOKIE, MACAROON","Cookie, macaroon" +53226000,"COOKIE, MARSHMALLOW, W/ COCONUT","Cookie, marshmallow, with coconut" +53226500,"COOKIE, MARSHMALLOW, W/ RICE CEREAL (NO-BAKE)","Cookie, marshmallow, with rice cereal (no-bake)" +53226550,"COOKIE, MARSHMALLOW, W/ RICE CEREAL & CHOC CHIPS","Cookie, marshmallow, with rice cereal and chocolate chips" +53226600,"COOKIE, MARSHMALLOW & PEANUT BUTTER, W/ OAT CEREAL (NO-BAKE)","Cookie, marshmallow and peanut butter, with oat cereal (no-bake)" +53228000,"COOKIE, MERINGUE","Cookie, meringue" +53230000,"COOKIE, MOLASSES","Cookie, molasses" +53231000,"COOKIE, LEBKUCHEN","Cookie, Lebkuchen" +53231400,"COOKIE, MULTIGRAIN, HIGH FIBER","Cookie, multigrain, high fiber" +53233000,"COOKIE, OATMEAL","Cookie, oatmeal" +53233010,"COOKIE, OATMEAL, W/ RAISINS OR DATES","Cookie, oatmeal, with raisins" +53233040,"COOKIE, OATMEAL, REDUCED FAT, NS AS TO RAISINS","Cookie, oatmeal, reduced fat, NS as to raisins" +53233050,"COOKIE, OATMEAL SANDWICH, W/ CREME FILLING","Cookie, oatmeal sandwich, with creme filling" +53233060,"COOKIE, OATMEAL, W/ CHOCOLATE CHIPS","Cookie, oatmeal, with chocolate chips" +53233080,"COOKIE, OATMEAL SANDWICH, W/ PEANUT BUTTER & JELLY FILLING","Cookie, oatmeal sandwich, with peanut butter and jelly filling" +53233100,"COOKIE,OATMEAL,W/ CHOC & PEANUT BUTTER (NO-BAKE)","Cookie, oatmeal, with chocolate and peanut butter (no-bake)" +53234000,"COOKIE, PEANUT BUTTER (INCLUDE PB WAFER)","Cookie, peanut butter" +53234100,"COOKIE, PEANUT BUTTER, W/ CHOCOLATE (INCL NASSAU)","Cookie, peanut butter, with chocolate" +53234250,"COOKIE, PEANUT BUTTER W/ RICE CEREAl (NO-BAKE)","Cookie, peanut butter with rice cereal (no-bake)" +53235000,"COOKIE, PEANUT BUTTER SANDWICH","Cookie, peanut butter sandwich" +53235500,"COOKIE, W/ PEANUT BUTTER FILLING, CHOCOLATE-COATED","Cookie, with peanut butter filling, chocolate-coated" +53235600,"COOKIE, PFEFFERNUSSE","Cookie, Pfeffernusse" +53236000,"COOKIE, PIZZELLE (ITALIAN STYLE WAFER)","Cookie, pizzelle (Italian style wafer)" +53236100,"COOKIE, PUMPKIN","Cookie, pumpkin" +53237000,"COOKIE, RAISIN","Cookie, raisin" +53237010,"COOKIE, RAISIN SANDWICH, CREAM-FILLED","Cookie, raisin sandwich, cream-filled" +53237500,"COOKIE, RUM BALL (NO-BAKE)","Cookie, rum ball (no-bake)" +53238000,"COOKIE, SANDWICH TYPE, NOT CHOCOLATE OR VANILLA","Cookie, sandwich-type, not chocolate or vanilla" +53239000,"COOKIE, SHORTBREAD","Cookie, shortbread" +53239010,"COOKIE, SHORTBREAD, REDUCED FAT","Cookie, shortbread, reduced fat" +53239050,"COOKIE, SHORTBREAD, WITH ICING OR FILLING","Cookie, shortbread, with icing or filling" +53240000,"COOKIE, ANIMAL","Cookie, animal" +53240010,"COOKIE, ANIMAL, WITH FROSTING OR ICING","Cookie, animal, with frosting or icing" +53241500,"COOKIE, BUTTER OR SUGAR","Cookie, butter or sugar" +53241510,"MARIE BISCUIT","Marie biscuit" +53241600,"COOKIE, BUTTER OR SUGAR, WITH FRUIT AND/OR NUTS","Cookie, butter or sugar, with fruit and/or nuts" +53242000,"COOKIE, SUGAR WAFER","Cookie, sugar wafer" +53242500,"COOKIE, TOFFEE BAR","Cookie, toffee bar" +53243000,"COOKIE, VANILLA SANDWICH","Cookie, vanilla sandwich" +53243010,"COOKIE, VANILLA SANDWICH, EXTRA FILLING","Cookie, vanilla sandwich, extra filling" +53243050,"COOKIE, VANILLA SANDWICH, REDUCED FAT","Cookie, vanilla sandwich, reduced fat" +53244010,"COOKIE, BUTTER/SUGAR, W/ CHOCOLATE ICING / FILLING","Cookie, butter or sugar, with chocolate icing or filling" +53244020,"COOKIE, BUTTER/SUGAR, W/ ICING/FILLING OTHER THAN CHOC","Cookie, butter or sugar, with icing or filling other than chocolate" +53246000,"COOKIE, TEA, JAPANESE","Cookie, tea, Japanese" +53247000,"COOKIE, VANILLA WAFER, NS AS TO TYPE","Cookie, vanilla wafer" +53247050,"COOKIE, VANILLA WAFER, REDUCED FAT","Cookie, vanilla wafer, reduced fat" +53247500,"COOKIE, VANILLA W/ CARAMEL, COCONUT, CHOC COATING","Cookie, vanilla with caramel, coconut, and chocolate coating" +53251100,"COOKIE, RUGELACH","Cookie, rugelach" +53260030,"COOKIE, CHOCOLATE CHIP, SUGAR FREE","Cookie, chocolate chip, sugar free" +53260200,"COOKIE, OATMEAL, SUGAR FREE","Cookie, oatmeal, sugar free" +53260300,"COOKIE, SANDWICH, SUGAR FREE","Cookie, sandwich, sugar free" +53260400,"COOKIE, SUGAR OR PLAIN, SUGAR FREE","Cookie, sugar or plain, sugar free" +53260500,"COOKIE, SUGAR WAFER, SUGAR FREE","Cookie, sugar wafer, sugar free" +53260600,"COOKIE, PEANUT BUTTER, SUGAR FREE","Cookie, peanut butter, sugar free" +53270100,"COOKIE, P.R. (MANTECADITOS POLVORONES)","Cookies, Puerto Rican (Mantecaditos polvorones)" +53300100,"PIE, NFS","Pie, NFS" +53300170,"PIE, INDIVIDUAL SIZE OR TART, NFS","Pie, individual size or tart, NFS" +53300180,"PIE, FRIED, NFS","Pie, fried, NFS" +53301000,"PIE, APPLE, TWO CRUST","Pie, apple, two crust" +53301070,"PIE, APPLE, INDIVIDUAL SIZE OR TART","Pie, apple, individual size or tart" +53301080,"PIE, APPLE, FRIED PIE","Pie, apple, fried pie" +53301500,"PIE, APPLE, ONE CRUST (INCL W/ CRUMB TOPPING)","Pie, apple, one crust" +53301750,"PIE, APPLE, DIET","Pie, apple, diet" +53302000,"PIE, APRICOT, TWO CRUST","Pie, apricot, two crust" +53302070,"PIE, APRICOT, INDIVIDUAL SIZE OR TART","Pie, apricot, individual size or tart" +53302080,"PIE, APRICOT, FRIED","Pie, apricot, fried pie" +53303000,"PIE, BLACKBERRY, TWO CRUST","Pie, blackberry, two crust" +53303070,"PIE, BLACKBERRY, INDIVIDUAL SIZE OR TART","Pie, blackberry, individual size or tart" +53303500,"PIE, BERRY NOT BLACK,BLUE,BOYSEN,RASP....,TWO CRUST","Pie, berry, not blackberry, blueberry, boysenberry, huckleberry, raspberry, or strawberry; two crust" +53303510,"PIE, BERRY, ONE CRUST","Pie, berry, not blackberry, blueberry, boysenberry, huckleberry, raspberry, or strawberry; one crust" +53303570,"PIE, BERRY, INDIVIDUAL SIZE OR TART","Pie, berry, not blackberry, blueberry, boysenberry, huckleberry, raspberry, or strawberry, individual size or tart" +53304000,"PIE, BLUEBERRY, TWO CRUST","Pie, blueberry, two crust" +53304050,"PIE, BLUEBERRY, ONE CRUST","Pie, blueberry, one crust" +53304070,"PIE, BLUEBERRY, INDIVIDUAL SIZE OR TART","Pie, blueberry, individual size or tart" +53305000,"PIE, CHERRY, TWO CRUST","Pie, cherry, two crust" +53305010,"PIE, CHERRY, ONE CRUST","Pie, cherry, one crust" +53305070,"PIE, CHERRY, INDIVIDUAL SIZE OR TART","Pie, cherry, individual size or tart" +53305080,"PIE, CHERRY, FRIED PIE","Pie, cherry, fried pie" +53305700,"PIE, LEMON (NOT CREAM OR MERINGUE)","Pie, lemon (not cream or meringue)" +53305720,"PIE, LEMON (NOT CREAM OR MERINGUE), INDIVIDUAL SIZE","Pie, lemon (not cream or meringue), individual size or tart" +53305750,"PIE, LEMON, FRIED","Pie, lemon, fried pie" +53306000,"PIE, MINCE, TWO CRUST","Pie, mince, two crust" +53306070,"PIE, MINCE, INDIVIDUAL SIZE OR TART","Pie, mince, individual size or tart" +53307000,"PIE, PEACH, TWO CRUST","Pie, peach, two crust" +53307050,"PIE, PEACH, ONE-CRUST","Pie, peach, one crust" +53307070,"PIE, PEACH, INDIVIDUAL SIZE OR TART","Pie, peach, individual size or tart" +53307080,"PIE, PEACH, FRIED","Pie, peach, fried pie" +53307500,"PIE, PEAR, TWO CRUST","Pie, pear, two crust" +53307570,"PIE, PEAR, INDIVIDUAL SIZE OR TART","Pie, pear, individual size or tart" +53308000,"PIE, PINEAPPLE, TWO CRUST","Pie, pineapple, two crust" +53308070,"PIE, PINEAPPLE, INDIVIDUAL SIZE OR TART","Pie, pineapple, individual size or tart" +53308300,"PIE, PLUM, TWO CRUST","Pie, plum, two crust" +53308500,"PIE, PRUNE, ONE CRUST","Pie, prune, one crust" +53309000,"PIE, RAISIN, TWO CRUST","Pie, raisin, two crust" +53309070,"PIE, RAISIN, INDIVIDUAL SIZE OR TART","Pie, raisin, individual size or tart" +53310000,"PIE, RASPBERRY, ONE CRUST","Pie, raspberry, one crust" +53310050,"PIE, RASPBERRY, TWO CRUST","Pie, raspberry, two crust" +53311000,"PIE, RHUBARB, TWO CRUST","Pie, rhubarb, two crust" +53311050,"PIE, RHUBARB, ONE CRUST","Pie, rhubarb, one crust" +53311070,"PIE, RHUBARB, INDIVIDUAL SIZE OR TART","Pie, rhubarb, individual size or tart" +53312000,"PIE, STRAWBERRY, ONE CRUST","Pie, strawberry, one crust" +53313000,"PIE, STRAWBERRY-RHUBARB, TWO CRUST","Pie, strawberry-rhubarb, two crust" +53314000,"PIE, STRAWBERRY, INDIVIDUAL SIZE OR TART","Pie, strawberry, individual size or tart" +53340000,"PIE, APPLE-SOUR CREAM","Pie, apple-sour cream" +53340500,"PIE, CHERRY, W/ CREAM CHEESE & SOUR CREAM","Pie, cherry, made with cream cheese and sour cream" +53341000,"PIE, BANANA CREAM","Pie, banana cream" +53341070,"PIE, BANANA CREAM, INDIVIDUAL SIZE OR TART","Pie, banana cream, individual size or tart" +53341500,"PIE, BUTTERMILK","Pie, buttermilk" +53341750,"PIE, CHESS (INCL LEMON CHESS PIE)","Pie, chess" +53342000,"PIE, CHOCOLATE CREAM","Pie, chocolate cream" +53342070,"PIE, CHOCOLATE CREAM, INDIVIDUAL SIZE OR TART","Pie, chocolate cream, individual size or tart" +53343000,"PIE, COCONUT CREAM","Pie, coconut cream" +53343070,"PIE, COCONUT CREAM, INDIVIDUAL SIZE OR TART","Pie, coconut cream, individual size or tart" +53344000,"PIE, CUSTARD","Pie, custard" +53344070,"PIE, CUSTARD, INDIVIDUAL SIZE OR TART","Pie, custard, individual size or tart" +53344200,"MIXED FRUIT TART FILLED WITH CUSTARD OR CREAM CHEESE","Mixed fruit tart filled with custard or cream cheese" +53344300,"DESSERT PIZZA","Dessert pizza" +53345000,"PIE, LEMON CREAM","Pie, lemon cream" +53345070,"PIE, LEMON CREAM, INDIVIDUAL SIZE OR TART","Pie, lemon cream, individual size or tart" +53346000,"PIE, PEANUT BUTTER CREAM","Pie, peanut butter cream" +53346500,"PIE, PINEAPPLE CREAM","Pie, pineapple cream" +53347000,"PIE, PUMPKIN","Pie, pumpkin" +53347070,"PIE, PUMPKIN, INDIVIDUAL SIZE OR TART","Pie, pumpkin, individual size or tart" +53347100,"PIE, RASPBERRY CREAM","Pie, raspberry cream" +53347500,"PIE, SOUR CREAM, RAISIN","Pie, sour cream, raisin" +53347600,"PIE, SQUASH","Pie, squash" +53348000,"PIE, STRAWBERRY CREAM","Pie, strawberry cream" +53348070,"PIE, STRAWBERRY CREAM, INDIVIDUAL SIZE OR TART","Pie, strawberry cream, individual size or tart" +53360000,"PIE, SWEET POTATO","Pie, sweet potato" +53365000,"PIE, VANILLA CREAM","Pie, vanilla cream" +53366000,"PIE, YOGURT, FROZEN","Pie, yogurt, frozen" +53370000,"PIE, CHIFFON, NOT CHOCOLATE","Pie, chiffon, not chocolate" +53371000,"PIE, CHIFFON, CHOCOLATE","Pie, chiffon, chocolate" +53371100,"PIE, CHIFFON, W/ LIQUEUR","Pie, chiffon, with liqueur" +53373000,"PIE, BLACK BOTTOM","Pie, black bottom" +53381000,"PIE, LEMON MERINGUE","Pie, lemon meringue" +53381070,"PIE, LEMON MERINGUE, INDIVIDUAL SIZE OR TART","Pie, lemon meringue, individual size or tart" +53382000,"PIE, CHOCOLATE-MARSHMALLOW","Pie, chocolate-marshmallow" +53385000,"PIE, PECAN","Pie, pecan" +53385070,"PIE, PECAN, INDIVIDUAL SIZE","Pie, pecan, individual size or tart" +53385500,"PIE, OATMEAL","Pie, oatmeal" +53386000,"PIE, PUDDING, NOT CHOCOLATE","Pie, pudding, flavors other than chocolate" +53386050,"PIE, PUDDING, NOT CHOC, INDIVIDUAL SIZE","Pie, pudding, flavors other than chocolate, individual size or tart" +53386250,"PIE, PUDDING, CHOC, W/ CHOC COATING, INDIVID SIZE","Pie, pudding, chocolate, with chocolate coating, individual size" +53386500,"PIE, PUDDING, NOT CHOC, CHOC-COATED, INDIVID SIZE","Pie, pudding, flavors other than chocolate, with chocolate coating, individual size" +53387000,"PIE, TOLL HOUSE CHOCOLATE CHIP","Pie, Toll house chocolate chip" +53390000,"PIE, SHOO-FLY","Pie, shoo-fly" +53390100,"PIE, TOFU W/ FRUIT","Pie, tofu with fruit" +53391000,"PIE SHELL","Pie shell" +53391100,"PIE SHELL, GRAHAM CRACKER","Pie shell, graham cracker" +53391150,"PIE SHELL, CHOCOLATE WAFER","Pie shell, chocolate wafer" +53391200,"VANILLA WAFER DESSERT BASE","Vanilla wafer dessert base" +53400200,"BLINTZ, CHEESE-FILLED","Blintz, cheese-filled" +53400300,"BLINTZ, FRUIT-FILLED","Blintz, fruit-filled" +53410100,"COBBLER, APPLE (INCLUDE FRUIT COBBLER)","Cobbler, apple" +53410200,"COBBLER, APRICOT","Cobbler, apricot" +53410300,"COBBLER, BERRY","Cobbler, berry" +53410500,"COBBLER, CHERRY","Cobbler, cherry" +53410800,"COBBLER, PEACH","Cobbler, peach" +53410850,"COBBLER, PEAR","Cobbler, pear" +53410860,"COBBLER, PINEAPPLE","Cobbler, pineapple" +53410880,"COBBLER, PLUM","Cobbler, plum" +53410900,"COBBLER, RHUBARB","Cobbler, rhubarb" +53415100,"CRISP, APPLE, APPLE DESSERT","Crisp, apple, apple dessert" +53415120,"FRITTER, APPLE","Fritter, apple" +53415200,"FRITTER, BANANA","Fritter, banana" +53415220,"FRITTER, BERRY","Fritter, berry" +53415300,"CRISP, BLUEBERRY","Crisp, blueberry" +53415400,"CRISP, CHERRY","Crisp, cherry" +53415500,"CRISP, PEACH","Crisp, peach" +53415600,"CRISP, RHUBARB","Crisp, rhubarb" +53420000,"CREAM PUFF/ECLAIR, CUSTARD/CREAM-FILLED, NS ICING","Cream puff, eclair, custard or cream filled, NS as to icing" +53420100,"CREAM PUFF/ECLAIR, CUSTARD/CREAM-FILLED, NOT ICED","Cream puff, eclair, custard or cream filled, not iced" +53420200,"CREAM PUFF/ECLAIR, CUSTARD/CREAM-FILLED, ICED","Cream puff, eclair, custard or cream filled, iced" +53420210,"CREAM PUFF/ECLAIR, CUSTARD/CREAM-FILLED, ICED, REDUCED FAT","Cream puff, eclair, custard or cream filled, iced, reduced fat" +53420250,"CREAM PUFFS, NO FILLING OR ICING","Cream puff, no filling or icing" +53420300,"AIR-FILLED FRITTER, W/O SYRUP, PUERTO RICAN STYLE","Air filled fritter or fried puff, without syrup, Puerto Rican style (Bunuelos de viento)" +53420310,"WHEAT FLOUR FRITTER, W/O SYRUP","Wheat flour fritter, without syrup" +53420400,"SOPAIPILLA W/O SYRUP OR HONEY","Sopaipilla, without syrup or honey" +53420410,"SOPAIPILLA W/ SYRUP OR HONEY","Sopaipilla with syrup or honey" +53430000,"CREPE, DESSERT TYPE, NS AS TO FILLING","Crepe, dessert type, NS as to filling" +53430100,"CREPE, DESSERT TYPE, CHOCOLATE-FILLED","Crepe, dessert type, chocolate-filled" +53430200,"CREPE, DESSERT TYPE, FRUIT-FILLED","Crepe, dessert type, fruit-filled" +53430250,"CREPE SUZETTE","Crepe suzette" +53430300,"CREPE, DESSERT TYPE, ICE CREAM-FILLED","Crepe, dessert type, ice cream-filled" +53430700,"TAMALE, SWEET","Tamale, sweet" +53430750,"TAMALE, SWEET, W/ FRUIT","Tamale, sweet, with fruit" +53440000,"STRUDEL, APPLE (INCLUDE STRUDEL, NFS)","Strudel, apple" +53440300,"STRUDEL, BERRY","Strudel, berry" +53440500,"STRUDEL, CHERRY","Strudel, cherry" +53440600,"STRUDEL, CHEESE","Strudel, cheese" +53440700,"STRUDEL, PEACH","Strudel, peach" +53440750,"STRUDEL, PINEAPPLE","Strudel, pineapple" +53440800,"STRUDEL, CHEESE & FRUIT","Strudel, cheese and fruit" +53441110,"BAKLAVA (INCLUDE KADAYIF)","Baklava" +53441210,"BASBOUSA (SEMOLINA DESSERT DISH)","Basbousa (semolina dessert dish)" +53450000,"TURNOVER OR DUMPLING, APPLE","Turnover or dumpling, apple" +53450300,"TURNOVER OR DUMPLING, BERRY","Turnover or dumpling, berry" +53450500,"TURNOVER OR DUMPLING, CHERRY","Turnover or dumpling, cherry" +53450800,"TURNOVER OR DUMPLING, LEMON","Turnover or dumpling, lemon" +53451000,"TURNOVER OR DUMPLING, PEACH","Turnover or dumpling, peach" +53451500,"TURNOVER, GUAVA","Turnover, guava" +53451750,"TURNOVER, PUMPKIN","Turnover, pumpkin" +53452100,"PASTRY, FRUIT-FILLED","Pastry, fruit-filled" +53452120,"PASTRY, ASIAN, MADE WITH BEAN OR LOTUS SEED PASTE FILLING","Pastry, Asian, made with bean or lotus seed paste filling (baked)" +53452130,"PASTRY, ASIAN, MADE WITH BEAN PASTE AND SALTED EGG YOLK FILL","Pastry, Asian, made with bean paste and salted egg yolk filling (baked)" +53452150,"PASTRY, CHINESE (INCLUDE 9-LAYER PUDDING)","Pastry, Chinese, made with rice flour" +53452170,"PASTRY, COOKIE TYPE, FRIED(INCL POLISH PACZKI)","Pastry, cookie type, fried" +53452200,"PASTRY, ITALIAN, W/ CHEESE (INCLUDE CANNOLI)","Pastry, Italian, with cheese" +53452400,"PASTRY, PUFF","Pastry, puff" +53452420,"PASTRY, PUFF, CUSTARD/CREAM FILLED, ICED/NOT ICED","Pastry, puff, custard or cream filled, iced or not iced" +53452450,"CHEESE PASTRY PUFF","Cheese pastry puffs" +53452500,"PASTRY, MAINLY FLOUR & WATER, FRIED","Pastry, mainly flour and water, fried" +53453150,"EMPANADA, MEXICAN TURNOVER, FRUIT-FILLED","Empanada, Mexican turnover, fruit-filled" +53453170,"EMPANADA, MEXICAN TURNOVER, PUMPKIN","Empanada, Mexican turnover, pumpkin" +53500100,"BREAKFAST PASTRY, NFS","Breakfast pastry, NFS" +53510000,"DANISH PASTRY, PLAIN/SPICE (INCL W/ ICING)","Danish pastry, plain or spice" +53510100,"DANISH PASTRY, W/ FRUIT","Danish pastry, with fruit" +53511000,"DANISH PASTRY, W/ CHEESE","Danish pastry, with cheese" +53520000,"DOUGHNUT, NS AS TO CAKE OR YEAST","Doughnut, NS as to cake or yeast" +53520110,"DOUGHNUT, CAKE TYPE","Doughnut, cake type" +53520120,"DOUGHNUT, CHOCOLATE, CAKE TYPE","Doughnut, chocolate, cake type" +53520140,"DOUGHNUT, CAKE TYPE, CHOCOLATE COVERED","Doughnut, cake type, chocolate covered" +53520150,"DOUGHNUT, CAKE TYPE, CHOCOLATE COVERED, W/ PEANUTS","Doughnut, cake type, chocolate covered, dipped in peanuts" +53520160,"DOUGHNUT, CHOCOLATE, CAKE TYPE, WITH CHOCOLATE ICING","Doughnut, chocolate, cake type, with chocolate icing" +53520200,"CHURROS (INCL MEXICAN CRUELLERS)","Churros" +53520500,"DOUGHNUT, ASIAN","Doughnut, Asian" +53520600,"CRULLER, NFS","Cruller, NFS" +53520700,"FRENCH CRULLER","French cruller" +53521100,"DOUGHNUT, CHOCOLATE, RAISED OR YEAST, WITH CHOCOLATE ICING","Doughnut, chocolate, raised or yeast, with chocolate icing" +53521110,"DOUGHNUT, RAISED / YEAST","Doughnut, raised or yeast" +53521120,"DOUGHNUT, CHOCOLATE, RAISED OR YEAST","Doughnut, chocolate, raised or yeast" +53521130,"DOUGHNUT, RAISED OR YEAST, CHOCOLATE COVERED","Doughnut, raised or yeast, chocolate covered" +53521140,"DOUGHNUT, JELLY","Doughnut, jelly" +53521210,"DOUGHNUT, CUSTARD-FILLED","Doughnut, custard-filled" +53521220,"DOUGHNUT, CHOCOLATE CREAM-FILLED","Doughnut, chocolate cream-filled" +53521230,"DOUGHNUT, CUSTARD-FILLED, WITH ICING","Doughnut, custard-filled, with icing" +53521250,"DOUGHNUT, WHEAT","Doughnut, wheat" +53521300,"DOUGHNUT, WHEAT, CHOCOLATE COVERED","Doughnut, wheat, chocolate covered" +53530000,"BREAKFAST TART","Breakfast tart" +53530010,"BREAKFAST TART, LOWFAT","Breakfast tart, lowfat" +53610100,"COFFEE CAKE, CRUMB OR QUICK-BREAD TYPE","Coffee cake, crumb or quick-bread type" +53610170,"COFFEE CAKE, CRUMB OR QUICK-BREAD TYPE, W/ FRUIT","Coffee cake, crumb or quick-bread type, with fruit" +53610200,"COFFEECAKE, CRUMB OR QUICK-BREAD TYPE, CHEESE FILLD","Coffee cake, crumb or quick-bread type, cheese-filled" +53710400,"FIBER ONE CHEWY BAR","Fiber One Chewy Bar" +53710500,"KELLOGG'S NUTRI-GRAIN CEREAL BAR","Kellogg's Nutri-Grain Cereal Bar" +53710502,"KELLOGG'S NUTRI-GRAIN YOGURT BAR","Kellogg's Nutri-Grain Yogurt Bar" +53710504,"KELLOGG'S NUTRI-GRAIN FRUIT AND NUT BAR","Kellogg's Nutri-Grain Fruit and Nut Bar" +53710600,"MILK 'N CEREAL BAR","Milk 'n Cereal bar" +53710700,"KELLOGG'S SPECIAL K BAR","Kellogg's Special K bar" +53710800,"KASHI GOLEAN CHEWY BARS","Kashi GOLEAN Chewy Bars" +53710802,"KASHI TLC CHEWY GRANOLA BAR","Kashi TLC Chewy Granola Bar" +53710804,"KASHI GOLEAN CRUNCHY BARS","Kashi GOLEAN Crunchy Bars" +53710806,"KASHI TLC CRUNCHY GRANOLA BAR","Kashi TLC Crunchy Granola Bar" +53710900,"NATURE VALLEY CHEWY TRAIL MIX GRANOLA BAR","Nature Valley Chewy Trail Mix Granola Bar" +53710902,"NATURE VALLEY CHEWY GRANOLA BAR WITH YOGURT COATING","Nature Valley Chewy Granola Bar with Yogurt Coating" +53710904,"NATURE VALLEY SWEET AND SALTY GRANOLA BAR","Nature Valley Sweet and Salty Granola Bar" +53710906,"NATURE VALLEY CRUNCHY GRANOLA BAR","Nature Valley Crunchy Granola Bar" +53711000,"QUAKER CHEWY GRANOLA BAR","Quaker Chewy Granola Bar" +53711002,"QUAKER CHEWY 90 CALORIE GRANOLA BAR","Quaker Chewy 90 Calorie Granola Bar" +53711004,"QUAKER CHEWY 25% LESS SUGAR GRANOLA BAR","Quaker Chewy 25% Less Sugar Granola Bar" +53711006,"QUAKER CHEWY DIPPS GRANOLA BAR","Quaker Chewy Dipps Granola Bar" +53711100,"QUAKER GRANOLA BITES","Quaker Granola Bites" +53712000,"SNACK BAR, OATMEAL","Snack bar, oatmeal" +53712100,"GRANOLA BAR, NFS","Granola bar, NFS" +53712200,"GRANOLA BAR, LOWFAT, NFS","Granola bar, lowfat, NFS" +53712210,"GRANOLA BAR, NONFAT","Granola bar, nonfat" +53713000,"GRANOLA BAR, REDUCED SUGAR, NFS","Granola bar, reduced sugar, NFS" +53713100,"GRANOLA BAR, PEANUTS , OATS, SUGAR, WHEAT GERM","Granola bar, peanuts , oats, sugar, wheat germ" +53714200,"GRANOLA BAR, CHOCOLATE-COATED, NFS","Granola bar, chocolate-coated, NFS" +53714210,"GRANOLA BAR, WITH COCONUT, CHOCOLATE-COATED","Granola bar, with coconut, chocolate-coated" +53714220,"GRANOLA BAR WITH NUTS, CHOCOLATE-COATED","Granola bar with nuts, chocolate-coated" +53714230,"GRANOLA BAR, OATS, NUTS, COATED WITH NON-CHOCOLATE COATING","Granola bar, oats, nuts, coated with non-chocolate coating" +53714250,"GRANOLA BAR, COATED WITH NON-CHOCOLATE COATING","Granola bar, coated with non-chocolate coating" +53714300,"GRANOLA BAR, HIGH FIBER, COATED W/ NON-CHOC YOGURT COATING","Granola bar, high fiber, coated with non-chocolate yogurt coating" +53714400,"GRANOLA BAR, WITH RICE CEREAL","Granola bar, with rice cereal" +53714500,"BREAKFAST BAR, NFS","Breakfast bar, NFS" +53714510,"BREAKFAST BAR, DATE, WITH YOGURT COATING","Breakfast bar, date, with yogurt coating" +53714520,"BREAKFAST BAR, CEREAL CRUST WITH FRUIT FILLING, LOWFAT","Breakfast bar, cereal crust with fruit filling, lowfat" +53720100,"BALANCE ORIGINAL BAR","Balance Original Bar" +53720200,"CLIF BAR","Clif Bar" +53720300,"POWERBAR","PowerBar" +53720400,"SLIM FAST ORIGINAL MEAL BAR","Slim Fast Original Meal Bar" +53720500,"SNICKERS MARATHON PROTEIN BAR","Snickers Marathon Protein bar" +53720510,"SNICKERS MARATHON ENERGY BAR","Snickers Marathon Energy bar" +53720600,"SOUTH BEACH LIVING MEAL BAR","South Beach Living Meal Bar" +53720610,"SOUTH BEACH LIVING HIGH PROTEIN BAR","South Beach Living High Protein Bar" +53720700,"TIGER'S MILK BAR","Tiger's Milk bar" +53720800,"ZONE PERFECT CLASSIC CRUNCH NUTRITION BAR","Zone Perfect Classic Crunch nutrition bar" +53729000,"NUTRITION BAR OR MEAL REPLACEMENT BAR, NFS","Nutrition bar or meal replacement bar, NFS" +53801000,"CEREAL BAR WITH FRUIT FILLING, BABY FOOD","Cereal bar with fruit filling, baby food" +53803050,"COOKIE, FRUIT, BABY FOOD","Cookie, fruit, baby food" +53803100,"COOKIE, BABY FOOD","Cookie, baby food" +53803250,"COOKIE, TEETHING, BABY","Cookie, teething, baby" +53803300,"COOKIE, RICE, BABY","Cookie, rice, baby" +54001000,"CRACKER, NS AS TO SWEET/NONSWEET (INCL CRACKER,NFS)","Crackers, NS as to sweet or nonsweet" +54102010,"CRACKERS, GRAHAM","Crackers, graham" +54102020,"CRACKERS, GRAHAM, CHOCOLATE COVERED","Crackers, graham, chocolate covered" +54102050,"CRACKERS, OATMEAL","Crackers, oatmeal" +54102060,"CRACKERS, CUBAN","Crackers, Cuban" +54102070,"CRACKERS, CUCA","Crackers, Cuca" +54102080,"CRACKERS, GRAHAM, W/ RAISINS","Crackers, graham, with raisins" +54102100,"CRACKERS, GRAHAM, LOWFAT","Crackers, graham, lowfat" +54102110,"CRACKERS, GRAHAM, FAT FREE","Crackers, graham, fat free" +54102200,"CRACKERS, GRAHAM, SANDWICH-TYPE, WITH FILLING","Crackers, graham, sandwich-type, with filling" +54201010,"CRACKERS, MATZO, LOW SODIUM","Crackers, matzo, low sodium" +54202010,"CRACKERS, SALTINE, LOW SODIUM","Crackers, saltine, low sodium" +54203010,"CRACKERS, TOAST THINS (RYE/WHEAT/WHITE), LOW SODIUM","Crackers, toast thins (rye, wheat, white flour), low sodium" +54204010,"CRACKER, 100% WHOLE WHEAT,LO SODIUM","Cracker, 100% whole wheat, low sodium" +54205010,"CRACKER, SNACK, LOW SODIUM","Cracker, snack, low sodium" +54205030,"CRACKER, CHEESE, LOW SODIUM","Cracker, cheese, low sodium" +54205100,"CRACKER, SNACK, LOWFAT, LOW SODIUM","Cracker, snack, lowfat, low sodium" +54206010,"PUFFED RICE CAKE W/O SALT","Puffed rice cake without salt" +54207010,"CRISPBREAD, WHEAT, LOW SODIUM","Crispbread, wheat, low sodium" +54210010,"CRACKER, MULTIGRAIN, LOW SODIUM","Cracker, multigrain, low sodium" +54222000,"CRISPBREAD, RYE, LOW SODIUM","Crispbread, rye, low sodium" +54301000,"CRACKER, SNACK","Cracker, snack" +54301100,"CRACKER, SNACK, REDUCED FAT","Cracker, snack, reduced fat" +54301200,"CRACKER, SNACK, FAT FREE","Cracker, snack, fat free" +54304000,"CRACKERS, CHEESE","Cracker, cheese" +54304100,"CRACKER, CHEESE, REDUCED FAT","Cracker, cheese, reduced fat" +54304150,"CRACKER, CHEESE, WHOLE GRAIN","Cracker, cheese, whole grain" +54304500,"CRACKER, HIGH FIBER, NO ADDED FAT","Cracker, high fiber, no added fat" +54305000,"CRISPBREAD, WHEAT, NO ADDED FAT","Crispbread, wheat, no added fat" +54307000,"CRACKERS, MATZO","Crackers, matzo" +54308000,"CRACKERS, MILK","Crackers, milk" +54309000,"CRACKERS, OAT BRAN (INCLUDE NABISCO OAT THINS)","Crackers, oat" +54313000,"CRACKERS, OYSTER","Crackers, oyster" +54318000,"CHIPS, BROWN RICE","Chips, brown rice" +54318500,"RICE CAKE, CRACKER-TYPE","Rice cake, cracker-type" +54319000,"CRACKERS, RICE","Crackers, rice" +54319010,"PUFFED RICE CAKE","Puffed rice cake" +54319020,"POPCORN CAKE (INCL PUFFED CORN & RICE CAKE)","Popcorn cake" +54319200,"PUFFED WHEAT CAKE (INCL QUAKER)","Puffed wheat cake" +54319500,"RICE PAPER","Rice paper" +54322000,"CRISPBREAD, RYE, NO ADDED FAT","Crispbread, rye, no added fat" +54325000,"CRACKERS, SALTINES","Crackers, saltine" +54325010,"CRACKERS, SALTINE, FAT FREE","Crackers, saltine, fat free" +54325050,"CRACKERS, SALTINE, WHOLE WHEAT","Crackers, saltine, whole wheat" +54326000,"CRACKERS, MULTIGRAIN","Crackers, multigrain, made with whole wheat, wheat, oat, and other flours" +54327950,"CRACKERS, CYLINDRICAL, PEANUT BUTTER-FILLED","Crackers, cylindrical, peanut-butter filled" +54328000,"CRACKER, SANDWICH-TYPE, NFS","Crackers, sandwich-type, NFS" +54328100,"CRACKER,SANDWICH-TYPE,PEANUT BUTTER FILLED","Cracker, sandwich-type, peanut butter filled" +54328110,"CRACKER, SANDWICH, PEANUT BUTTER FILLED, RED FAT","Cracker, sandwich-type, peanut butter filled, reduced fat" +54328200,"CRACKER,SANDWICH-TYPE, CHEESE-FILLED","Cracker, sandwich-type, cheese-filled" +54334000,"CRACKERS, TOAST THINS","Crackers, toast thins (rye, pumpernickel, white flour)" +54336000,"CRACKER, WATER BISCUIT","Crackers, water biscuits" +54337000,"CRACKER, 100% WHOLE WHEAT","Cracker, 100% whole wheat" +54337050,"CRACKER, 100% WHOLE WHEAT, REDUCED FAT","Cracker, 100% whole wheat, reduced fat" +54338000,"CRACKERS, WHEAT","Crackers, wheat" +54338100,"CRACKERS, WHEAT, REDUCED FAT","Crackers, wheat, reduced fat" +54339000,"CRACKER CORN (INCL STONED CORN CRACKER)","Crackers, corn" +54350000,"CRACKERS, BABY FOOD","Crackers, baby food" +54350010,"GERBER FINGER FOODS, PUFFS, BABY FOOD","Gerber Finger Foods, Puffs, baby food" +54360000,"CRUNCHY SNACKS, CORN BASED, BABY FOOD","Crunchy snacks, corn based, baby food" +54401010,"SALTY SNACKS, CORN / CORNMEAL BASE, NUT /NUG, TSTD","Salty snacks, corn or cornmeal base, nuts or nuggets, toasted" +54401020,"SALTY SNACKS, CORN OR CORNMEAL, CORN CHIPS, CHEESE","Salty snacks, corn or cornmeal base, corn chips, corn-cheese chips" +54401050,"SALTY SNACKS, CORN OR CORNMEAL, CORN PUFFS, TWISTS","Salty snacks, corn or cornmeal base, corn puffs and twists; corn-cheese puffs and twists" +54401080,"SALTY SNACKS, CORN OR CORNMEAL, TORTILLA CHIPS","Salty snacks, corn or cornmeal base, tortilla chips" +54401090,"SALTY SNACKS, CORN/CORN-CHEESE CHIPS, UNSALTED","Salty snacks, corn or cornmeal base, corn chips, corn-cheese chips, unsalted" +54401100,"SALTY SNACKS,CORN / CORNMEAL BASE,TORTILLA CHIPS LT","Salty snacks, corn or cornmeal base, tortilla chips, light (baked with less oil)" +54401120,"SALTY SNACKS, TORTILLA CHIPS, FAT FREE, W/ OLEAN","Salty snacks, corn or cornmeal base, tortilla chips, fat free, made with Olean" +54401150,"SALTY SNACKS,CORN/CORNMEAL BASE,TORTILLA,LOWFAT,BKD","Salty snacks, corn or cornmeal base, tortilla chips, lowfat, baked without fat" +54401170,"SALTY SNACKS,CORN/CORNMEAL,TORTILLA,LOWFAT,BKD,NO SALT","Salty snacks, corn or cornmeal base, tortilla chips, lowfat, baked without fat, unsalted" +54401200,"SALTY SNACKS, CORN/CORNML BASE,W/OAT BRAN,TORT CHPS","Salty snacks, corn or cornmeal base, with oat bran, tortilla chips" +54401210,"SALTY SNACKS, CORN BASED/CHEESE PUFFS & TWISTS, LOWFAT","Salty snacks, corn based puffs and twists, cheese puffs and twists, lowfat" +54402080,"TORTILLA CHIPS, UNSALTED","Salty snacks, corn or cornmeal base, tortilla chips, unsalted" +54402200,"SALTY SNACK MIXTURE,MOSTLY CORN,W/PRETZELS,W/O NUTS","Salty snack mixture, mostly corn or cornmeal based, with pretzels, without nuts" +54402300,"SALTY SNACKS, WHEAT-BASE, HIGH FIBER","Salty snacks, wheat-based, high fiber" +54402500,"SALTY SNACKS, WHEAT-AND CORN-BASED CHIPS","Salty snacks, wheat- and corn-based chips" +54402600,"SALTY SNACKS, MULTIGRAIN, WHOLE GRAIN, CHIPS","Salty snacks, multigrain, whole grain, chips (made with whole corn, whole wheat, rice flour, and whole oat flour)" +54402610,"SALTY SNACKS, MULTIGRAIN& POT CHIPS(W/RICE FL,POT,CORN FL)","Salty snacks, multigrain and potato chips (made with rice flour, dried potatoes, corn flour, and wheat starch)" +54402700,"PITA CHIPS","Pita chips" +54403000,"POPCORN, POPPED IN OIL, UNBUTTERED","Popcorn, popped in oil, unbuttered" +54403010,"POPCORN, AIR-POPPED (NO BUTTER OR OIL ADDED)","Popcorn, air-popped (no butter or no oil added)" +54403020,"POPCORN, POPPED IN OIL, BUTTERED","Popcorn, popped in oil, buttered" +54403040,"POPCORN, AIR-POPPED, BUTTERED","Popcorn, air-popped, buttered" +54403050,"POPCORN, FLAVORED (CHEESE, BBQ, SOUR CREAM, ONION)","Popcorn, flavored" +54403060,"POPCORN, POPPED IN OIL, LOWFAT, LOW SODIUM","Popcorn, popped in oil, lowfat, low sodium" +54403070,"POPCORN, POPPED IN OIL, LOWFAT","Popcorn, popped in oil, lowfat" +54403090,"POPCORN, POPPED IN OIL, UNSALTED","Popcorn, popped in oil, unsalted" +54403110,"POPCORN, SUGAR SYRUP OR CARAMEL COATED","Popcorn, sugar syrup or caramel-coated" +54403120,"POPCORN, SUGAR SYRUP OR CARAMEL COATED, W/ NUTS","Popcorn, sugar syrup or caramel-coated, with nuts" +54403150,"POPCORN, SUGAR SYRUP/CARAMEL COATED, FAT FREE","Popcorn, sugar syrup or caramel-coated, fat free" +54406010,"SNACKS, ONION-FLAVORED RINGS","Snacks, onion-flavored rings" +54406200,"SHRIMP CHIPS","Shrimp chips (tapioca base)" +54408000,"PRETZELS, NFS","Pretzels, NFS" +54408010,"PRETZELS, HARD","Pretzels, hard" +54408020,"PRETZELS, SOFT","Pretzels, soft" +54408030,"PRETZELS, HARD, UNSALTED","Pretzel, hard, unsalted" +54408040,"PRETZELS, SOFT, UNSALTED","Pretzels, soft, unsalted" +54408050,"PRETZEL, OAT BRAN, HARD","Pretzel, oatbran, hard" +54408070,"PRETZEL, HARD, MULTIGRAIN","Pretzel, hard, multigrain" +54408100,"PRETZEL, BABY FOOD","Pretzel, baby food" +54408200,"PRETZEL, HARD, CHOCOLATE COATED","Pretzel, hard, chocolate-coated" +54408250,"PRETZEL, YOGURT COVERED","Pretzel, yogurt-covered" +54408300,"PRETZELS, CHEESE-FILLED (INCL COMBOS)","Pretzels, cheese-filled" +54412110,"WHEAT STICKS, 100% WHOLE WHEAT","Wheat sticks, 100% whole wheat" +54420010,"MULTIGRAIN MIXTURE, PRETZELS, CEREAL &/ CRACKERS,NUTS","Multigrain mixture, pretzels, cereal and/or crackers, nuts" +54420100,"ORIENTAL PARTY MIX, W/ PEANUTS, SESAME STICKS, ETC","Oriental party mix, with peanuts, sesame sticks, chili rice crackers and fried green peas" +54420200,"MULTIGRAIN MIX, BREAD STICKS, SESAME NUGGETS, PRETZ","Multigrain mixture, bread sticks, sesame nuggets, pretzels, rye chips" +54430010,"YOGURT CHIPS","Yogurt chips" +54440010,"BAGEL CHIP","Bagel chip" +55101000,"PANCAKES, PLAIN (INCLUDE PANCAKES, NFS)","Pancakes, plain" +55101010,"PANCAKES, REDUCED CALORIE, HIGH FIBER","Pancakes, reduced calorie, high fiber" +55101015,"PANCAKES, PLAIN, REDUCED FAT","Pancakes, plain, reduced fat" +55101020,"PANCAKES, PLAIN, FAT FREE","Pancakes, plain, fat free" +55103000,"PANCAKES, W/ FRUIT (INCLUDE BLUEBERRY PANCAKES)","Pancakes, with fruit" +55103100,"PANCAKES W/ CHOC CHIPS","Pancakes, with chocolate chips" +55105000,"PANCAKES, BUCKWHEAT","Pancakes, buckwheat" +55105100,"PANCAKES, CORNMEAL","Pancakes, cornmeal" +55105200,"PANCAKES, WHOLE WHEAT","Pancakes, whole wheat" +55105205,"PANCAKES, WHOLE WHEAT, REDUCED FAT","Pancakes, whole wheat, reduced fat" +55105210,"PANCAKES, WHOLE WHEAT, FAT FREE","Pancakes, whole wheat, fat free" +55105300,"PANCAKES, SOURDOUGH","Pancakes, sour dough" +55105400,"PANCAKES, RYE","Pancakes, rye" +55201000,"WAFFLE, PLAIN","Waffle, plain" +55202000,"WAFFLE, WHEAT, BRAN, OR MULTIGRAIN","Waffle, wheat, bran, or multigrain" +55203000,"WAFFLE, FRUIT","Waffle, fruit" +55203500,"WAFFLE, NUT & HONEY (INCL EGGO)","Waffle, nut and honey" +55203600,"WAFFLE, CHOCOLATE CHIP","Waffle, chocolate chip" +55204000,"WAFFLE, CORNMEAL","Waffle, cornmeal" +55205000,"WAFFLE, 100% WHOLE WHEAT OR 100% WHOLE GRAIN","Waffle, 100% whole wheat or 100% whole grain" +55206000,"WAFFLE, OAT BRAN","Waffle, oat bran" +55207000,"WAFFLE, MULTI-BRAN (INCLUDE EGGO NUTRIGRAIN)","Waffle, multi-bran" +55211000,"WAFFLE, PLAIN, FAT FREE","Waffle, plain, fat free" +55211050,"WAFFLE, PLAIN, LOWFAT","Waffle, plain, lowfat" +55212000,"WAFFLE, WHOLE WHEAT, LOWFAT","Waffle, whole wheat, lowfat" +55301000,"FRENCH TOAST, PLAIN (INCLUDE ROMAN MEAL)","French toast, plain" +55301050,"FRENCH TOAST STICKS, PLAIN","French toast sticks, plain" +55310100,"BREAD FRITTERS, P.R.","Bread fritters, Puerto Rican style (Torrejas gallegas, Galician fritters)" +55401000,"CREPE, PLAIN (INCLUDE FRENCH PANCAKE)","Crepe, plain" +55501000,"FLOUR & WATER PATTY (INCLUDE CHINESE PANCAKE)","Flour and water patty" +55502000,"FLOUR AND WATER GRAVY","Flour and water gravy" +55610200,"DUMPLING, FRIED, PUERTO RICAN STYLE","Dumpling, fried, Puerto Rican style" +55610300,"DUMPLING, PLAIN","Dumpling, plain" +55701000,"CAKE MADE W/ GLUTINOUS RICE","Cake made with glutinous rice" +55702000,"CAKE OR PANCAKE MADE W/ RICE FLOUR &/OR DRIED BEANS","Cake or pancake made with rice flour and/or dried beans" +55702100,"DOSA (INDIAN)","Dosa (Indian), plain" +55703000,"CAKE MADE W/ GLUTINOUS RICE & DRIED BEANS","Cake made with glutinous rice and dried beans" +55801000,"FUNNEL CAKE WITH SUGAR","Funnel cake with sugar" +55801010,"FUNNEL CAKE WITH SUGAR AND FRUIT","Funnel cake with sugar and fruit" +56101000,"MACARONI, COOKED, NS AS TO ADDED FAT","Macaroni, cooked, NS as to fat added in cooking" +56101010,"MACARONI, COOKED, NO FAT ADDED","Macaroni, cooked, fat not added in cooking" +56101030,"MACARONI, COOKED, FAT ADDED","Macaroni, cooked, fat added in cooking" +56102000,"MACARONI, WHOLE WHEAT, COOKED, NS AS TO ADDED FAT","Macaroni, whole wheat, cooked, NS as to fat added in cooking" +56102010,"MACARONI, WHOLE WHEAT, NO FAT ADDED","Macaroni, whole wheat, cooked, fat not added in cooking" +56102020,"MACARONI, WHOLE WHEAT, FAT ADDED","Macaroni, whole wheat, cooked, fat added in cooking" +56103000,"MACARONI, SPINACH, NS AS TO ADDED FAT","Macaroni, cooked, spinach, NS as to fat added in cooking" +56103010,"MACARONI, SPINACH, NO FAT ADDED","Macaroni, cooked, spinach, fat not added in cooking" +56103020,"MACARONI, SPINACH, FAT ADDED","Macaroni, cooked, spinach, fat added in cooking" +56104000,"MACARONI,CKD,VEGETABLE,NS AS TO FAT ADDED","Macaroni, cooked, vegetable, NS as to fat added in cooking" +56104010,"MACARONI,COOKED,VEGETABLE,FAT NOT ADDED IN COOKING","Macaroni, cooked, vegetable, fat not added in cooking" +56104020,"MACARONI,COOKED,VEGETABLE, FAT ADDED IN COOKING","Macaroni, cooked, vegetable, fat added in cooking" +56112000,"NOODLES, COOKED, NS AS TO ADDED FAT","Noodles, cooked, NS as to fat added in cooking" +56112010,"NOODLES, COOKED, NO FAT ADDED","Noodles, cooked, fat not added in cooking" +56112030,"NOODLES, COOKED, FAT ADDED","Noodles, cooked, fat added in cooking" +56113000,"NOODLES, COOKED,WHOLE WHEAT,NS AS TO FAT ADDED","Noodles, cooked, whole wheat, NS as to fat added in cooking" +56113010,"NOODLES, WHOLE WHEAT, COOKED, NO FAT ADDED","Noodles, cooked, whole wheat, fat not added in cooking" +56113990,"NOODLES, COOKED, SPINACH, NS AS TO FAT","Noodles, cooked, spinach, NS as to fat added in cooking" +56114000,"NOODLES, SPINACH, COOKED, NO FAT ADDED","Noodles, cooked, spinach, fat not added in cooking" +56114020,"NOODLES, COOKED, SPINACH, FAT ADDED","Noodles, cooked, spinach, fat added in cooking" +56116000,"NOODLES, CHOW MEIN","Noodles, chow mein" +56116990,"LONG RICE NOODLES(FROM MUNG BEANS),CKD,NS FAT ADDed","Long rice noodles (made from mung beans) cooked, NS as to fat added in cooking" +56117000,"LONG RICE NOODLES, COOKED, NO FAT ADDED","Long rice noodles (made from mung beans), cooked, fat not added in cooking" +56117010,"LONG RICE NOODLES, COOKED, FAT ADDED","Long rice noodles (made from mung beans), cooked, fat added in cooking" +56117090,"CHOW FUN RICE NOODLES,COOKED,NS AS TO FAT ADDED","Chow fun rice noodles, cooked, NS as to fat added in cooking" +56117100,"CHOW FUN RICE NOODLES, COOKED, NO FAT ADDED","Chow fun rice noodles, cooked, fat not added in cooking" +56117110,"CHOW FUN RICE NOODLES, COOKED, FAT ADDED","Chow fun rice noodles, cooked, fat added in cooking" +56130000,"SPAGHETTI, COOKED, NS AS TO ADDED FAT","Spaghetti, cooked, NS as to fat added in cooking" +56130010,"SPAGHETTI, COOKED, NO FAT ADDED","Spaghetti, cooked, fat not added in cooking" +56131000,"SPAGHETTI, COOKED, FAT ADDED","Spaghetti, cooked, fat added in cooking" +56132990,"SPAGHETTI, COOKED, WHOLE WHEAT, NS AS TO ADDED FAT","Spaghetti, cooked, whole wheat, NS as to fat added in cooking" +56133000,"SPAGHETTI, COOKED, WHOLE WHEAT, NO FAT ADDED","Spaghetti, cooked, whole wheat, fat not added in cooking" +56133010,"SPAGHETTI, COOKED, WHOLE WHEAT, FAT ADDED","Spaghetti, cooked, whole wheat, fat added in cooking" +56200300,"CEREAL, COOKED, NFS","Cereal, cooked, NFS" +56200350,"CEREAL, COOKED, INSTANT, NS AS TO GRAIN","Cereal, cooked, instant, NS as to grain" +56200390,"BARLEY, COOKED, NS AS TO FAT ADDED IN COOKING","Barley, cooked, NS as to fat added in cooking" +56200400,"BARLEY, COOKED, NO FAT ADDED","Barley, cooked, fat not added in cooking" +56200490,"BUCKWHEAT GROATS, COOKED, NS AS TO FAT ADDED","Buckwheat groats, cooked, NS as to fat added in cooking" +56200500,"BUCKWHEAT GROATS, COOKED, NO FAT ADDED (INCL KASHA)","Buckwheat groats, cooked, fat not added in cooking" +56200510,"BUCKWHEAT GROATS, COOKED, FAT ADDED","Buckwheat groats, cooked, fat added in cooking" +56200990,"GRITS, COOKED,CORN/HOMINY, NS REG, QUICK, INST, NS FAT ADDED","Grits, cooked, corn or hominy, NS as to regular, quick, or instant, NS as to fat added in cooking" +56201000,"GRITS, CORN OR HOMINY, NFS, NO FAT ADDED","Grits, cooked, corn or hominy, NS as to regular, quick, or instant, fat not added in cooking" +56201010,"GRITS, CKD, CORN/HOMINY, REGULAR, NO FAT","Grits, cooked, corn or hominy, regular, fat not added in cooking" +56201020,"GRITS, COOKED, CORN/HOMINY, REGULAR, FAT ADDED","Grits, cooked, corn or hominy, regular, fat added in cooking" +56201030,"GRITS, COOKED, CORN/HOMINY, REGULAR, NS AS TO FAT","Grits, cooked, corn or hominy, regular, NS as to fat added in cooking" +56201040,"GRITS, COOKED, CORN/HOMINY, FAT ADDED","Grits, cooked, corn or hominy, NS as to regular, quick, or instant, fat added in cooking" +56201060,"GRITS,CKD,CORN/HOMINY,W/CHEESE,NS TYPE,NS FAT ADDED","Grits, cooked, corn or hominy, with cheese, NS as to regular, quick, or instant, NS as to fat added in cooking" +56201061,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,NS TYPE,FAT NOT ADDED","Grits, cooked, corn or hominy, with cheese, NS as to regular, quick, or instant, fat not added in cooking" +56201062,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,NS TYPE,FAT ADDED","Grits, cooked, corn or hominy, with cheese, NS as to regular, quick, or instant, fat added in cooking" +56201070,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,REG,NS FAT ADDED","Grits, cooked, corn or hominy, with cheese, regular, NS as to fat added in cooking" +56201071,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,REG,FAT NOT ADDED","Grits, cooked, corn or hominy, with cheese, regular, fat not added in cooking" +56201072,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,REG,FAT ADDED","Grits, cooked, corn or hominy, with cheese, regular, fat added in cooking" +56201080,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,QUICK,NS FAT ADDED","Grits, cooked, corn or hominy, with cheese, quick, NS as to fat added in cooking" +56201081,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,QUICK,FAT NOT ADDED","Grits, cooked, corn or hominy, with cheese, quick, fat not added in cooking" +56201082,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,QUICK,FAT ADDED","Grits, cooked, corn or hominy, with cheese, quick, fat added in cooking" +56201090,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,INSTANT,NS FAT ADDED","Grits, cooked, corn or hominy, with cheese, instant, NS as to fat added in cooking" +56201091,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,INSTANT,FAT NOT ADDED","Grits, cooked, corn or hominy, with cheese, instant, fat not added in cooking" +56201092,"GRITS,CKD,CORN/HOMINY,W/ CHEESE,INSTANT,FAT ADDED","Grits, cooked, corn or hominy, with cheese, instant, fat added in cooking" +56201110,"GRITS, COOKED, CORN/HOMINY, QUICK, NO FAT ADDED","Grits, cooked, corn or hominy, quick, fat not added in cooking" +56201120,"GRITS, COOKED, CORN/HOMINY, QUICK, FAT ADDED","Grits, cooked, corn or hominy, quick, fat added in cooking" +56201130,"GRITS, COOKED, CORN/HOMINY,QUICK,NS AS TO ADDED FAT","Grits, cooked, corn or hominy, quick, NS as to fat added in cooking" +56201210,"GRITS, COOKED, CORN/HOMINY, INSTANT, NO FAT ADDED","Grits, cooked, corn or hominy, instant, fat not added in cooking" +56201220,"GRITS, CORN/HOMINY, INSTANT, FAT ADDED","Grits, cooked, corn or hominy, instant, fat added in cooking" +56201230,"GRITS, CORN/HOMINY, INSTANT, COOKED, NS AS TO FAT","Grits, cooked, corn or hominy, instant, NS as to fat added in cooking" +56201240,"GRITS, FLAVORED, INSTANT, NO FAT ADDED","Grits, cooked, flavored, corn or hominy, instant, fat not added in cooking" +56201250,"GRITS, FLAVORED, INSTANT, FAT ADDED","Grits, cooked, flavored, corn or hominy, instant, fat added in cooking" +56201260,"GRITS, FLAVORED, INSTANT, NS AS TO ADDED FAT","Grits, cooked, flavored, corn or hominy, instant, NS as to fat added in cooking" +56201300,"GRITS,COOKED,CORN/HOM,NFS,MADE W/MILK, NS AS TO FAT ADDED","Grits, cooked, corn or hominy, NS as to regular, quick, or instant, made with milk, NS as to fat added in cooking" +56201510,"CORNMEAL MUSH, MADE W/ WATER","Cornmeal mush, made with water" +56201520,"CORNMEAL MUSH, FRIED","Cornmeal mush, fried" +56201530,"CORNMEAL MUSH, MADE W/ MILK","Cornmeal mush, made with milk" +56201540,"CORNMEAL, MADE W/ MILK & SUGAR, P. R. STYLE","Cornmeal, made with milk and sugar, Puerto Rican Style (Harina de maiz)" +56201550,"CORNMEAL DUMPLINGS","Cornmeal dumpling" +56201560,"CORNMEAL STICKS, BOILED (INCL CORNMEAL GUANINES)","Cornmeal sticks, boiled" +56201600,"CORNMEAL, LIME-TREATED, COOKED","Cornmeal, lime-treated, cooked (Masa harina)" +56201700,"CORNSTARCH W/ MILK, EATEN AS CEREAL","Cornstarch with milk, eaten as a cereal (2 tbsp cornstarch in 2-1/2 cups milk)" +56201750,"CORNSTARCH, DRY","Cornstarch, dry" +56201800,"CORNSTARCH, HYDROLYZED, POWDER","Cornstarch, hydrolyzed powder" +56201990,"MILLET, COOKED, NS AS TO FAT ADDED IN COOKING","Millet, cooked, NS as to fat added in cooking" +56202000,"MILLET, COOKED, NO FAT ADDED","Millet, cooked, fat not added in cooking" +56202100,"MILLET, COOKED, FAT ADDED IN COOKING","Millet, cooked, fat added in cooking" +56202960,"OATMEAL,COOKED,NS AS TO REG,QUICK/INST,NS TO FAT","Oatmeal, cooked, NS as to regular, quick or instant; NS as to fat added in cooking" +56202970,"OATMEAL, COOKED, QUICK, NS TO FAT ADDED","Oatmeal, cooked, quick (1 or 3 minutes), NS as to fat added in cooking" +56202980,"OATMEAL, COOKED, REG, NS TO FAT ADDED","Oatmeal, cooked, regular, NS as to fat added in cooking" +56203000,"OATMEAL, COOKED, NFS, NO FAT ADDED","Oatmeal, cooked, NS as to regular, quick or instant, fat not added in cooking" +56203010,"OATMEAL, COOKED, REGULAR, NO FAT ADDED","Oatmeal, cooked, regular, fat not added in cooking" +56203020,"OATMEAL, COOKED, QUICK, NO FAT ADDED","Oatmeal, cooked, quick (1 or 3 minutes), fat not added in cooking" +56203030,"OATMEAL, COOKED, INSTANT, NO FAT ADDED IN COOKING","Oatmeal, cooked, instant, fat not added in cooking" +56203040,"OATMEAL, FAT ADDED IN COOKING, NFS","Oatmeal, cooked, NS as to regular, quick, or instant, fat added in cooking" +56203050,"OATMEAL, REGULAR, FAT ADDED IN COOKING","Oatmeal, cooked, regular, fat added in cooking" +56203060,"OATMEAL, QUICK, FAT ADDED IN COOKING","Oatmeal, cooked, quick (1 or 3 minutes), fat added in cooking" +56203070,"OATMEAL, INSTANT, FAT ADDED","Oatmeal, cooked, instant, fat added in cooking" +56203080,"OATMEAL, INSTANT, NS AS TO ADDED FAT","Oatmeal, cooked, instant, NS as to fat added in cooking" +56203110,"OATMEAL, MAPLE FLAVOR, COOKED (INCL MAYPO)","Oatmeal with maple flavor, cooked" +56203200,"OATMEAL, W/ FRUIT, COOKED","Oatmeal with fruit, cooked" +56203210,"OATMEAL, NS TYPE, MADE W/ MILK, NO FAT ADDED","Oatmeal, NS as to regular, quick, or instant, made with milk, fat not added in cooking" +56203211,"OATMEAL, CKD, REG, MADE W/ MILK, FAT NOT ADDED IN COOKING","Oatmeal, cooked, regular, made with milk, fat not added in cooking" +56203212,"OATMEAL, CKD, QUICK, MADE W/ MILK, FAT NOT ADDED IN COOKING","Oatmeal, cooked, quick (1 or 3 minutes), made with milk, fat not added in cooking" +56203213,"OATMEAL, CKD, INST, MADE W/ MILK, FAT NOT ADDED IN COOKING","Oatmeal, cooked, instant, made with milk, fat not added in cooking" +56203220,"OATMEAL, NS TYPE, MADE W/ MILK, FAT ADDED","Oatmeal, NS as to regular, quick, or instant, made with milk, fat added in cooking" +56203221,"OATMEAL, CKD, REG, MADE W/ MILK, FAT ADDED IN COOKING","Oatmeal, cooked, regular, made with milk, fat added in cooking" +56203222,"OATMEAL, CKD, QUICK, MADE W/ MILK, FAT ADDED IN COOKING","Oatmeal, cooked, quick (1 or 3 minutes), made with milk, fat added in cooking" +56203223,"OATMEAL, CKD, INST, MADE W/ MILK, FAT ADDED IN COOKING","Oatmeal, cooked, instant, made with milk, fat added in cooking" +56203230,"OATMEAL, NS TYPE, MADE W/ MILK, NS AS TO ADDED FAT","Oatmeal, NS as to regular, quick, or instant, made with milk, NS as to fat added in cooking" +56203231,"OATMEAL, CKD, REG, MADE W/ MILK, NS AS TO FAT ADDED","Oatmeal, cooked, regular, made with milk, NS as to fat added in cooking" +56203232,"OATMEAL, CKD, QUICK, MADE W/ MILK, NS AS TO FAT ADDED","Oatmeal, cooked, quick (1 or 3 minutes), made with milk, NS as to fat added in cooking" +56203233,"OATMEAL, CKD, INST, MADE W/ MILK, NS AS TO FAT ADDED","Oatmeal, cooked, instant, made with milk, NS as to fat added in cooking" +56203540,"OATMEAL, MADE W/ MILK & SUGAR, P.R. STYLE","Oatmeal, made with milk and sugar, Puerto Rican style" +56203600,"OATMEAL, MULTIGRAIN, COOKED, NS FAT ADDED","Oatmeal, multigrain, cooked, NS as to fat added in cooking" +56203610,"OATMEAL, MULTIGRAIN, COOKED, FAT NOT ADDED","Oatmeal, multigrain, cooked, fat not added in cooking" +56203620,"OATMEAL, MULTIGRAIN, COOKED, FAT ADDED","Oatmeal, multigrain, cooked, fat added in cooking" +56204000,"QUINOA, COOKED, NS AS TO FAT ADDED IN COOKING","Quinoa, cooked, NS as to fat added in cooking" +56204005,"QUINOA, COOKED, FAT NOT ADDED IN COOKING","Quinoa, cooked, fat not added in cooking" +56204010,"QUINOA, COOKED, FAT ADDED IN COOKING","Quinoa, cooked, fat added in cooking" +56205000,"RICE, COOKED, NS AS TO TYPE","Rice, cooked, NFS" +56205002,"RICE, WHITE, COOKED, MADE WITH OIL","Rice, white, cooked, fat added in cooking, made with oil" +56205004,"RICE, WHITE, COOKED, MADE WITH BUTTER","Rice, white, cooked, fat added in cooking, made with butter" +56205006,"RICE, WHITE, COOKED, MADE WITH MARGARINE","Rice, white, cooked, fat added in cooking, made with margarine" +56205008,"RICE, WHITE, COOKED, FAT NOT ADDED IN COOKING","Rice, white, cooked, fat not added in cooking" +56205012,"RICE, BROWN, COOKED, MADE WITH OIL","Rice, brown, cooked, fat added in cooking, made with oil" +56205014,"RICE, BROWN, COOKED, MADE WITH BUTTER","Rice, brown, cooked, fat added in cooking, made with butter" +56205016,"RICE, BROWN, COOKED, MADE WITH MARGARINE","Rice, brown, cooked, fat added in cooking, made with margarine" +56205018,"RICE, BROWN, COOKED, FAT NOT ADDED IN COOKING","Rice, brown, cooked, fat not added in cooking" +56205050,"RICE, CREAM OF, COOKED, NO FAT ADDED","Rice, cream of, cooked, fat not added in cooking" +56205060,"RICE, COOKED, W/ MILK","Rice, cooked, with milk" +56205070,"RICE, SWEET, (RICE, COOKED, W/ HONEY)","Rice, sweet (rice, cooked, with honey)" +56205080,"RICE, CREAMED, W/ MILK & SUGAR, PUERTO RICAN","Rice, creamed, made with milk and sugar, Puerto Rican style" +56205090,"RICE, CREAM OF, COOKED, FAT ADDED IN COOKING","Rice, cream of, cooked, fat added in cooking" +56205130,"YELLOW RICE, COOKED, NS AS TO FAT ADDED IN COOKING","Yellow rice, cooked, NS as to fat added in cooking" +56205150,"YELLOW RICE, COOKED, FAT NOT ADDED IN COOKING","Yellow rice, cooked, fat not added in cooking" +56205170,"YELLOW RICE, COOKED, FAT ADDED IN COOKING","Yellow rice, cooked, fat added in cooking" +56205190,"RICE, WHITE, COOKED, GLUTINOUS (INCL STICKY RICE)","Rice, white, cooked, glutinous" +56205200,"RICE, FRZ DES,NONDAIRY,NOT CHOC (INCL RICE DREAM)","Rice, frozen dessert, nondairy, flavors other than chocolate" +56205205,"RICE, WILD, 100%, COOKED, NS AS TO FAT ADDED IN COOKING","Rice, wild, 100%, cooked, NS as to fat added in cooking" +56205210,"RICE, WILD, 100%, COOKED, NO FAT ADDED","Rice, wild, 100%, cooked, fat not added in cooking" +56205215,"RICE, WILD, 100%, COOKED, FAT ADDED IN COOKING","Rice, wild, 100%, cooked, fat added in cooking" +56205230,"RICE DESSERT BAR,FRZ,NOT CHOC,NONDAIRY,CAROB,COVER","Rice dessert bar, frozen, flavors other than chocolate, nondairy, carob covered" +56205240,"RICE DESSERT BAR,FRZ,CHOC,NONDAIRY,CHOC COVERED","Rice dessert bar, frozen, chocolate, nondairy, chocolate covered" +56205300,"RICE, WHITE & WILD, COOKED, NO FAT ADDED","Rice, white and wild, cooked, fat not added in cooking" +56205310,"RICE, BROWN & WILD, COOKED, NO FAT ADDED","Rice, brown and wild, cooked, fat not added in cooking" +56205320,"RICE, WHITE & WILD, FAT ADDED","Rice, white and wild, cooked, fat added in cooking" +56205330,"RICE, WHITE & WILD, NS AS TO ADDED FAT","Rice, white and wild, cooked, NS as to fat added in cooking" +56205340,"RICE, BROWN & WILD, FAT ADDED","Rice, brown and wild, cooked, fat added in cooking" +56205350,"RICE, BROWN & WILD, NS AS TO ADDED FAT","Rice, brown and wild, cooked, NS as to fat added in cooking" +56205410,"RICE, WHITE, COOKED W/ (FAT) OIL, PUERTO RICAN STYLE","Rice, white, cooked with (fat) oil, Puerto Rican style (Arroz blanco)" +56206970,"WHEAT, CREAM OF,COOKED,QUICK,NS AS TO ADDED FAT","Wheat, cream of, cooked, quick, NS as to fat added in cooking" +56206980,"WHEAT, CREAM OF,COOKED,REG,NS AS TO ADDED FAT","Wheat, cream of, cooked, regular, NS as to fat added in cooking" +56206990,"WHEAT, CREAM OF,COOKED,NS AS REG,QUICK,/INST","Wheat, cream of, cooked, NS as to regular, quick, or instant, NS as to fat added in cooking" +56207000,"WHEAT, CREAM OF, COOKED, NFS, NO FAT ADDED","Wheat, cream of, cooked, NS as to regular, quick, or instant, fat not added in cooking" +56207010,"WHEAT, CREAM OF, COOKED, REGULAR, NO FAT ADDED","Wheat, cream of, cooked, regular, fat not added in cooking" +56207020,"WHEAT, CREAM OF, COOKED, QUICK, NO FAT ADDED","Wheat, cream of, cooked, quick, fat not added in cooking" +56207030,"WHEAT, CREAM OF, COOKED, INSTANT, NO FAT ADDED","Wheat, cream of, cooked, instant, fat not added in cooking" +56207040,"WHEAT, CREAM OF, MADE W/ MILK","Wheat, cream of, cooked, made with milk" +56207050,"WHEAT, CREAM OF, MADE W/ MILK & SUGAR, P.R. STYLE","Wheat, cream of, cooked, made with milk and sugar, Puerto Rican style" +56207060,"WHEAT, CREAM OF, INSTANT, COOKED, FAT ADDED","Wheat, cream of, cooked, instant, fat added in cooking" +56207070,"WHEAT, CREAM OF, INSTANT,COOKED, NS AS TO ADDED FAT","Wheat, cream of, cooked, instant, NS as to fat added in cooking" +56207080,"WHEAT, CREAM OF,COOKED,NS AS TO REG,QUICK, OR INST","Wheat, cream of, cooked, NS as to regular, quick, or instant, fat added in cooking" +56207100,"WHEAT, ROLLED, COOKED, NO FAT ADDED","Wheat, rolled, cooked, fat not added in cooking" +56207110,"BULGUR, COOKED OR CANNED, NO FAT ADDED","Bulgur, cooked or canned, fat not added in cooking" +56207120,"BULGAR, COOKED OR CANNNED, FAT ADDED IN COOKING","Bulgur, cooked or canned, fat added in cooking" +56207130,"BULGUR, COOKED OR CANNED, NS AS TO ADDED FAT","Bulgur, cooked or canned, NS as to fat added in cooking" +56207140,"WHEAT ROLLED,COOKED,NS AS TO ADDED FAT","Wheat, rolled, cooked, NS as to fat added in cooking" +56207150,"COUSCOUS, PLAIN, COOKED, FAT NOT ADDED IN COOKING","Couscous, plain, cooked, fat not added in cooking" +56207160,"COUSCOUS, PLAIN, COOKED, NS AS TO ADDED FAT","Couscous, plain, cooked, NS as to fat added in cooking" +56207180,"COUSCOUS, PLAIN, COOKED, FAT ADDED IN COOKING","Couscous, plain, cooked, fat added in cooking" +56207190,"WHOLE WHEAT CEREAL, COOKED, NS AS TO ADDED FAT","Whole wheat cereal, cooked, NS as to fat added in cooking" +56207200,"WHOLE WHEAT CEREAL, COOKED, NO FAT ADDED","Whole wheat cereal, cooked, fat not added in cooking" +56207210,"WHOLE WHEAT CEREAL, COOKED, FAT ADDED","Whole wheat cereal, cooked, fat added in cooking" +56207220,"WHEAT, CREAM OF, COOKED, REGULAR, FAT ADDED","Wheat, cream of, cooked, regular, fat added in cooking" +56207230,"WHEAT, CREAM OF, COOKED,QUICK,FAT ADDED IN COOKING","Wheat, cream of, cooked, quick, fat added in cooking" +56207300,"WHOLE WHEAT CEREAL, W/ BARLEY, COOKED, NO FAT ADDED","Whole wheat cereal, wheat and barley, cooked, fat not added in cooking" +56207330,"WHOLE WHEAT CEREAL, WHEAT & BARLEY, FAT ADDED","Whole wheat cereal, wheat and barley, cooked, fat added in cooking" +56207340,"WHOLE WHEAT CEREAL, WHEAT & BARLEY, ADDED FAT NS","Whole wheat cereal, wheat and barley, cooked, NS as to fat added in cooking" +56207350,"WHEAT CEREAL, CHOC FLAVORED, COOKED W/ MILK","Wheat cereal, chocolate flavored, cooked, made with milk" +56207360,"WHEAT CEREAL, CHOC FLAVORED, COOKED, NO FAT ADDED","Wheat cereal, chocolate flavored, cooked, fat not added in cooking" +56207370,"WHEAT CEREAL, CHOC FLAV,COOKED,NS AS TO ADDED FAT","Wheat cereal, chocolate flavored, cooked, NS as to fat added in cooking" +56208500,"OAT BRAN CEREAL, COOKED, NO FAT ADDED","Oat bran cereal, cooked, fat not added in cooking" +56208510,"OAT BRAN CEREAL, COOKED, FAT ADDED","Oat bran cereal, cooked, fat added in cooking" +56208520,"OAT BRAN CEREAL, COOKED, NS AS TO ADDED FAT","Oat bran cereal, cooked, NS as to fat added in cooking" +56208530,"OAT BRAN CEREAL, MADE W/ MILK, NO FAT ADDED","Oat bran cereal, cooked, made with milk, fat not added in cooking" +56208540,"OAT BRAN CEREAL, MADE W/ MILK, FAT ADDED","Oat bran cereal, cooked, made with milk, fat added in cooking" +56208550,"OAT BRAN CEREAL, MADE W/ MILK, NS AS TO ADDED FAT","Oat bran cereal, cooked, made with milk, NS as to fat added in cooking" +56209000,"RYE, CREAM OF, COOKED","Rye, cream of, cooked" +56210000,"NESTUM, CEREAL","Nestum cereal" +5.7e+07,"CEREAL, NFS","Cereal, NFS" +57000050,"KASHI CEREAL, NS AS TO READY-TO-EAT OR COOKED","Kashi cereal, NS as to ready to eat or cooked" +57000100,"OAT CEREAL, NFS","Oat cereal, NFS" +57100100,"CEREAL, READY-TO-EAT, NFS","Cereal, ready-to-eat, NFS" +57101000,"ALL-BRAN CEREAL","All-Bran" +57102000,"ALPEN CEREAL","Alpen" +57103000,"ALPHA-BITS CEREAL","Alpha-Bits" +57103020,"ALPHA-BITS W/ MARSHMALLOWS CEREAL","Alpha-bits with marshmallows" +57103050,"AMARANTH FLAKES CEREAL","Amaranth Flakes" +57103100,"APPLE CINNAMON CHEERIOS","Apple Cinnamon Cheerios" +57104000,"APPLE JACKS CEREAL","Apple Jacks" +57106050,"BANANA NUT CRUNCH CEREAL (POST)","Banana Nut Crunch Cereal (Post)" +57106060,"BANANA NUT CHEERIOS","Banana Nut Cheerios" +57106100,"BASIC 4 (RTE CEREAL)","Basic 4" +57106250,"BERRY BERRY KIX","Berry Berry Kix" +57106260,"BERRY BURST CHEERIOS","Berry Burst Cheerios" +57106530,"BLUEBERRY MORNING, POST","Blueberry Morning, Post" +57107000,"BOOBERRY CEREAL","Booberry" +57110000,"ALL-BRAN BRAN BUDS CEREAL, KELLOGG'S (FORMERLY BRAN BUDS)","All-Bran Bran Buds, Kellogg's (formerly Bran Buds)" +57111000,"BRAN CHEX CEREAL","Bran Chex" +57117000,"CAP'N CRUNCH CEREAL","Cap'n Crunch" +57117500,"CAP'N CRUNCH'S CHRISTMAS CRUNCH CEREAL","Cap'n Crunch's Christmas Crunch" +57119000,"CAP'N CRUNCH'S CRUNCH BERRIES CEREAL","Cap'n Crunch's Crunch Berries" +57120000,"CAP'N CRUNCH'S PEANUT BUTTER CRUNCH CEREAL","Cap'n Crunch's Peanut Butter Crunch" +57123000,"CHEERIOS","Cheerios" +57124000,"CHEX CEREAL, NFS","Chex cereal, NFS" +57124050,"CHEX CINNAMON","Chex Cinnamon" +57124100,"CHOCOLATE CHEERIOS","Chocolate Cheerios" +57124200,"CHOCOLATE FLAVORED FROSTED PUFFED CORN CEREAL","Chocolate flavored frosted puffed corn cereal" +57124300,"CHOCOLATE LUCKY CHARMS","Chocolate Lucky Charms" +57125000,"CINNAMON TOAST CRUNCH CEREAL","Cinnamon Toast Crunch" +57125010,"CINNAMON TOAST CRUNCH REDUCED SUGAR","Cinnamon Toast Crunch Reduced Sugar" +57125900,"HONEY NUT CLUSTERS CEREAL","Honey Nut Clusters (formerly called Clusters)" +57126000,"COCOA KRISPIES CEREAL","Cocoa Krispies" +57127000,"COCOA PEBBLES CEREAL","Cocoa Pebbles" +57128000,"COCOA PUFFS CEREAL","Cocoa Puffs" +57128005,"COCOA PUFFS, REDUCED SUGAR","Cocoa Puffs, reduced sugar" +57130000,"COOKIE-CRISP CEREAL (INCLUDE ALL FLAVORS)","Cookie-Crisp" +57131000,"CRUNCHY CORN BRAN CEREAL, QUAKER","Crunchy Corn Bran, Quaker" +57132000,"CORN CHEX CEREAL","Corn Chex" +57134000,"CORN FLAKES, NFS (INCLUDE STORE BRANDS)","Corn flakes, NFS" +57134090,"CORN FLAKES, LOW SODIUM","Corn flakes, low sodium" +57135000,"CORN FLAKES, KELLOGG'S","Corn flakes, Kellogg's" +57137000,"CORN PUFFS CEREAL","Corn Puffs" +57139000,"COUNT CHOCULA CEREAL","Count Chocula" +57143000,"CRACKLIN' OAT BRAN CEREAL","Cracklin' Oat Bran" +57143500,"CRANBERRY ALMOND CRUNCH, POST","Cranberry Almond Crunch, Post" +57144000,"CRISP CRUNCH CEREAL","Crisp Crunch" +57148000,"CRISPIX CEREAL","Crispix" +57148500,"CRISPY BROWN RICE CEREAL","Crispy Brown Rice Cereal" +57151000,"CRISPY RICE CEREAL","Crispy Rice" +57201900,"DORA THE EXPLORER CEREAL","Dora the Explorer Cereal" +57206000,"FAMILIA CEREAL","Familia" +57206700,"FIBER ONE CEREAL","Fiber One" +57206705,"FIBER ONE CARAMEL DELIGHT","Fiber One Caramel Delight" +57206710,"FIBER ONE HONEY CLUSTERS","Fiber One Honey Clusters" +57206715,"FIBER ONE RAISIN BRAN CLUSTERS","Fiber One Raisin Bran Clusters" +57206800,"FIBER 7 FLAKES CEREAL, HEALTH VALLEY","Fiber 7 Flakes, Health Valley" +57207000,"BRAN FLAKES CEREAL, NFS (FORMERLY 40% BRAN FLAKES, NFS)","Bran Flakes, NFS (formerly 40% Bran Flakes, NFS)" +57208000,"ALL-BRAN COMPLETE WHEAT FLAKES, KELLOGG'S","All-Bran Complete Wheat Flakes, Kellogg's" +57209000,"NATURAL BRAN FLAKES CEREAL, POST","Natural Bran Flakes, Post (formerly called 40% Bran Flakes, Post)" +57211000,"FRANKENBERRY CEREAL","Frankenberry" +57213000,"FROOT LOOPS CEREAL","Froot Loops" +57213850,"FROSTED CHEERIOS CEREAL","Frosted Cheerios" +57214000,"FROSTED MINI-WHEATS CEREAL (INCL ALL FLAVORS)","Frosted Mini-Wheats" +57214100,"FROSTED WHEAT BITES","Frosted Wheat Bites" +57215000,"FROSTY O'S CEREAL","Frosty O's" +57216000,"FROSTED RICE CEREAL, NFS","Frosted rice, NFS" +57218000,"FROSTED RICE KRISPIES, KELLOGG'S","Frosted Rice Krispies, Kellogg's" +57219000,"FRUIT & FIBRE CEREAL, NFS","Fruit & Fibre (fiber), NFS" +57221000,"FRUIT & FIBRE CEREAL, W/ DATES, RAISINS, & WALNUTS","Fruit & Fibre (fiber) with dates, raisins, and walnuts" +57221650,"FRUIT HARVEST CEREAL, KELLOGG'S","Fruit Harvest cereal, Kellogg's" +57221700,"FRUIT RINGS, NFS (INCLUDE STORE BRANDS)","Fruit Rings, NFS" +57221800,"FRUIT WHIRLS CEREAL","Fruit Whirls" +57221810,"FRUITY CHEERIOS","Fruity Cheerios" +57223000,"FRUITY PEBBLES CEREAL","Fruity Pebbles" +57224000,"GOLDEN GRAHAMS CEREAL","Golden Grahams" +57227000,"GRANOLA, NFS","Granola, NFS" +57228000,"GRANOLA, HOMEMADE","Granola, homemade" +57229000,"GRANOLA, LOWFAT, KELLOGG'S","Granola, lowfat, Kellogg's" +57229500,"GRANOLA W/ RAISINS, LOWFAT, KELLOGG'S","Granola with Raisins, lowfat, Kellogg's" +57230000,"GRAPE-NUTS CEREAL","Grape-Nuts" +57231000,"GRAPE-NUTS FLAKES","Grape-Nuts Flakes" +57231100,"GRAPE-NUTS TRAIL MIX CRUNCH","Grape-Nuts Trail Mix Crunch" +57231200,"GREAT GRAINS, RAISIN, DATE, & PECAN,WHOLE GRAIN CEREAL, POST","Great Grains, Raisin, Date, and Pecan Whole Grain Cereal, Post" +57231250,"GREAT GRAINS DOUBLE PECAN WHOLE GRAIN CEREAL, POST","Great Grains Double Pecan Whole Grain Cereal, Post" +57237100,"HONEY BUNCHES OF OATS HONEY ROASTED CEREAL","Honey Bunches of Oats Honey Roasted Cereal" +57237200,"HONEY BUNCHES OF OATS WITH VANILLA CLUSTERS, POST","Honey Bunches of Oats with Vanilla Clusters, Post" +57237300,"HONEY BUNCHES OF OATS W/ ALMONDS, POST","Honey Bunches of Oats with Almonds, Post" +57237310,"HONEY BUNCHES OF OATS WITH PECAN BUNCHES","Honey Bunches of Oats with Pecan Bunches" +57237900,"HONEY BUNCHES OF OATS JUST BUNCHES","Honey Bunches of Oats Just Bunches" +57238000,"HONEYCOMB CEREAL, PLAIN","Honeycomb, plain" +57239000,"HONEYCOMB CEREAL, STRAWBERRY","Honeycomb, strawberry" +57239100,"HONEY CRUNCH CORN FLAKES CEREAL, KELLOGG'S","Honey Crunch Corn Flakes, Kellogg's" +57240100,"HONEY NUT CHEX CEREAL","Honey Nut Chex" +57241000,"HONEY NUT CHEERIOS","Honey Nut Cheerios" +57241200,"HONEY NUT SHREDDED WHEAT CEREAL, POST","Honey Nut Shredded Wheat, Post" +57243000,"HONEY SMACKS, KELLOGG'S","Honey Smacks, Kellogg's (formerly Smacks; Honey Smacks)" +57301500,"KASHI, PUFFED","Kashi, Puffed" +57301505,"KASHI AUTUMN WHEAT","Kashi Autumn Wheat" +57301510,"KASHI GOLEAN","Kashi GOLEAN" +57301511,"KASHI GOLEAN CRUNCH","Kashi GOLEAN Crunch" +57301512,"KASHI GOLEAN CRUNCH HONEY ALMOND FLAX","Kashi GOLEAN Crunch Honey Almond Flax" +57301520,"KASHI GOOD FRIENDS","Kashi Good Friends" +57301530,"KASHI HEART TO HEART HONEY TOASTED OAT","Kashi Heart to Heart Honey Toasted Oat" +57301535,"KASHI HEART TO HEART OAT FLAKES AND BLUEBERRY CLUSTERS","Kashi Heart to Heart Oat Flakes and Blueberry Clusters" +57301540,"KASHI HONEY SUNSHINE","Kashi Honey Sunshine" +57302100,"KING VITAMAN CEREAL","King Vitaman" +57303100,"KIX CEREAL","Kix" +57303105,"HONEY KIX","Honey Kix" +57304100,"LIFE CEREAL (PLAIN & CINNAMON)","Life (plain and cinnamon)" +57305100,"LUCKY CHARMS CEREAL","Lucky Charms" +57305150,"FROSTED OAT CEREAL W/ MARSHMALLOWS","Frosted oat cereal with marshmallows" +57305160,"MALT-O-MEAL BLUEBERRY MUFFIN TOPS","Malt-O-Meal Blueberry Muffin Tops" +57305165,"MALT-O-MEAL CINNAMON TOASTERS","Malt-O-Meal Cinnamon Toasters" +57305170,"MALT-O-MEAL COCO-ROOS CEREAL","Malt-O-Meal Coco-Roos" +57305174,"MALT-O-MEAL COLOSSAL CRUNCH","Malt-O-Meal Colossal Crunch" +57305175,"MALT-O-MEAL COCOA DYNO-BITES","Malt-O-Meal Cocoa Dyno-Bites" +57305180,"MALT-O-MEAL CORN BURSTS CEREAL","Malt-O-Meal Corn Bursts" +57305200,"MALT-O-MEAL CRISPY RICE CEREAL","Malt-O-Meal Crispy Rice" +57305210,"MALT-O-MEAL FROSTED FLAKES","Malt-O-Meal Frosted Flakes" +57305215,"MALT-O-MEAL FROSTED MINI SPOONERS","Malt-O-Meal Frosted Mini Spooners" +57305300,"MALT-O-MEAL FRUITY DYNO-BITES","Malt-O-Meal Fruity Dyno-Bites" +57305400,"MALT-O-MEAL HONEY GRAHAM SQUARES","Malt-O-Meal Honey Graham Squares" +57305500,"MALT-O-MEAL HONEY & NUT TOASTY O'S CEREAL","Malt-O-Meal Honey and Nut Toasty O's" +57305600,"MALT-O-MEAL MARSHMALLOW MATEYS CEREAL","Malt-O-Meal Marshmallow Mateys" +57306100,"MALT-O-MEAL PUFFED RICE CEREAL","Malt-O-Meal Puffed Rice" +57306120,"MALTO-O-MEAL PUFFED WHEAT CEREAL","Malt-O-Meal Puffed Wheat" +57306130,"MALT-O-MEAL RAISIN BRAN","Malt-O-Meal Raisin Bran" +57306500,"MALT-O-MEAL GOLDEN PUFFS CEREAL (FORMERLY SUGAR PUFFS)","Malt-O-Meal Golden Puffs (formerly Sugar Puffs)" +57306700,"MALT-O-MEAL TOASTED OAT CEREAL","Malt-O-Meal Toasted Oat Cereal" +57306800,"MALT-O-MEAL TOOTIE FRUITIES (RTE CEREAL)","Malt-O-meal Tootie Fruities" +57307010,"MAPLE PECAN CRUNCH CEREAL, POST","Maple Pecan Crunch Cereal, Post" +57307500,"MILLET, PUFFED (CEREAL)","Millet, puffed" +57307600,"MINI-SWIRLZ CINNAMON BUN CEREAL, KELLOGG'S","Mini-Swirlz Cinnamon Bun Cereal, Kellogg's" +57308150,"MUESLIX CEREAL, NFS","Mueslix cereal, NFS" +57308190,"MUESLI, DRIED FRUIT&NUTS","Muesli, dried fruit and nuts (formerly Muesli with raisins, dates, and almonds)" +57308300,"MULTI BRAN CHEX","Multi Bran Chex" +57308400,"MULTIGRAIN CHEERIOS","MultiGrain Cheerios" +57309100,"NATURE VALLEY GRANOLA, W/ FRUIT & NUTS","Nature Valley Granola, with fruit and nuts" +57316200,"NUTTY NUGGETS (RALSTON)","Nutty Nuggets, Ralston Purina" +57316300,"OAT BRAN FLAKES, HEALTH VALLEY","Oat Bran Flakes, Health Valley" +57316380,"OAT CLUSTER CHEERIOS CRUNCH","Oat Cluster Cheerios Crunch" +57316450,"OATMEAL CRISP W/ ALMONDS CEREAL","Oatmeal Crisp with Almonds" +57316500,"OATMEAL CRISP, RAISIN","Oatmeal Crisp, Raisin (formerly Oatmeal Raisin Crisp)" +57316710,"OH'S, HONEY GRAHAM CEREAL","Oh's, Honey Graham" +57319000,"100% NATURAL CEREAL, PLAIN, QUAKER","100% Natural Cereal, plain, Quaker" +57319500,"SUN COUNTRY 100% NATURAL GRANOLA, WITH ALMONDS","Sun Country 100% Natural Granola, with Almonds" +57320500,"100 % NATURAL CEREAL, W/ OATS,HONEY & RAISINS,QUAKER","100 % Natural Cereal, with oats, honey and raisins, Quaker" +57321500,"100% NATURAL WHOLEGRAIN CEREAL W/ RAISINS, LOWFAT, QUAKER","100 % Natural Wholegrain Cereal with raisins, lowfat, Quaker" +57321700,"OPTIMUM, NATURE'S PATH","Optimum, Nature's Path" +57321800,"OPTIMUM SLIM, NATURE'S PATH","Optimum Slim, Nature's Path" +57321900,"ORGANIC FLAX PLUS, NATURE'S PATH","Organic Flax Plus, Nature's Path" +57323000,"SWEET CRUNCH CEREAL, QUAKER (FORMERLY POPEYE)","Sweet Crunch, Quaker (formerly called Popeye)" +57325000,"PRODUCT 19 CEREAL","Product 19" +57326000,"PUFFINS CEREAL","Puffins Cereal" +57327450,"QUAKER OAT BRAN CEREAL","Quaker Oat Bran Cereal" +57327500,"QUAKER OATMEAL SQUARES CEREAL (FORMERLY QUAKER OAT SQUARES)","Quaker Oatmeal Squares (formerly Quaker Oat Squares)" +57328000,"QUISP CEREAL","Quisp" +57329000,"RAISIN BRAN CEREAL, NFS","Raisin bran, NFS" +57330000,"RAISIN BRAN, KELLOGG'S","Raisin Bran, Kellogg's" +57330010,"RAISIN BRAN CRUNCH, KELLOGG'S","Raisin Bran Crunch, Kellogg's" +57331000,"RAISIN BRAN CEREAL, POST","Raisin Bran, Post" +57332050,"RAISIN BRAN, TOTAL","Raisin Bran, Total" +57332100,"RAISIN NUT BRAN CEREAL","Raisin Nut Bran" +57335550,"REESE'S PEANUT BUTTER PUFFS CEREAL","Reese's Peanut Butter Puffs cereal" +57336000,"RICE CHEX CEREAL","Rice Chex" +57337000,"RICE FLAKES, NFS","Rice Flakes, NFS" +57339000,"RICE KRISPIES, KELLOGG'S","Rice Krispies, Kellogg's" +57339500,"RICE KRISPIES TREATS CEREAL, KELLOGG'S","Rice Krispies Treats Cereal, Kellogg's" +57340000,"PUFFED RICE CEREAL","Rice, puffed" +57341000,"SHREDDED WHEAT 'N BRAN CEREAL","Shredded Wheat'N Bran" +57341200,"SMART START STRONG HEART ANTIOXIDANTS CEREAL, KELLOGG'S","Smart Start Strong Heart Antioxidants Cereal, Kellogg's" +57342010,"SMORZ, KELLOGG'S","Smorz, Kellogg's" +57344000,"SPECIAL K CEREAL","Special K" +57344001,"SPECIAL K BLUEBERRY","Special K Blueberry" +57344005,"SPECIAL K CHOCOLATEY DELIGHT","Special K Chocolatey Delight" +57344007,"SPECIAL K LOW FAT GRANOLA","Special K Low Fat Granola" +57344010,"SPECIAL K RED BERRIES","Special K Red Berries" +57344015,"SPECIAL K FRUIT & YOGURT","Special K Fruit & Yogurt" +57344020,"SPECIAL K VANILLA ALMOND","Special K Vanilla Almond" +57344025,"SPECIAL K CINNAMON PECAN, KELLOGG'S","Special K Cinnamon Pecan, Kellogg's" +57346500,"OATMEAL HONEY NUT HEAVEN, QUAKER","Oatmeal Honey Nut Heaven, Quaker (formerly Toasted Oatmeal, Honey Nut)" +57347000,"CORN POPS CEREAL","Corn Pops" +57348000,"FROSTED CORN FLAKES, NFS","Frosted corn flakes, NFS" +57349000,"FROSTED FLAKES, KELLOGG'S","Frosted Flakes, Kellogg's" +57349020,"REDUCED SUGAR FROSTED FLAKES CEREAL, KELLOGG'S","Reduced Sugar Frosted Flakes Cereal, Kellogg's" +57355000,"GOLDEN CRISP CEREAL","Golden Crisp (Formerly called Super Golden Crisp)" +57401100,"TOASTED OAT CEREAL","Toasted oat cereal" +57403100,"TOASTIES, POST","Toasties, Post" +57406100,"TOTAL CEREAL","Total" +57406105,"TOTAL CRANBERRY CRUNCH","Total Cranberry Crunch" +57407100,"TRIX CEREAL","Trix" +57407110,"TRIX, REDUCED SUGAR","Trix, reduced sugar" +57408100,"UNCLE SAM CEREAL","Uncle Sam Cereal (formerly Uncle Sam's Hi Fiber Cereal)" +57409100,"WAFFLE CRISP CEREAL, POST","Waffle Crisp, Post" +57410000,"WEETABIX WHOLE WHEAT CEREAL","Weetabix Whole Wheat Cereal" +57411000,"WHEAT CHEX CEREAL","Wheat Chex" +57412000,"WHEAT GERM CEREAL, PLAIN","Wheat germ, plain" +57413000,"WHEAT GERM CEREAL, W/ SUGAR & HONEY","Wheat germ, with sugar and honey" +57416000,"PUFFED WHEAT CEREAL, PLAIN","Wheat, puffed, plain" +57416010,"WHEAT, PUFFED, PRESWEETENED W/ SUGAR","Wheat, puffed, presweetened with sugar" +57417000,"SHREDDED WHEAT, 100%","Shredded Wheat, 100%" +57418000,"WHEATIES CEREAL","Wheaties" +57419000,"YOGURT BURST CHEERIOS","Yogurt Burst Cheerios" +57601100,"WHEAT BRAN, UNPROCESSED","Wheat bran, unprocessed" +57602100,"OATS, RAW","Oats, raw" +57602500,"OAT BRAN, UNCOOKED","Oat bran, uncooked" +57603100,"RICE POLISHINGS","Rice polishings" +57603200,"RICE BRAN CEREAL, UNCOOKED","Rice bran, uncooked" +57604100,"WHOLE WHEAT, CRACKED","Whole wheat, cracked" +57801000,"BARLEY CEREAL, BABY, DRY, INSTANT","Barley cereal, baby food, dry, instant" +57803000,"MIXED CEREAL, BABY, DRY, INSTANT","Mixed cereal, baby food, dry, instant" +57804000,"OATMEAL CEREAL, BABY, DRY, INSTANT","Oatmeal cereal, baby food, dry, instant" +57805000,"RICE CEREAL, BABY, DRY, INSTANT","Rice cereal, baby food, dry, instant" +57805080,"RICE CEREAL W/ APPLES, BABY, DRY, INSTANT","Rice cereal with apples, baby food, dry, instant" +57805090,"RICE CEREAL WITH MIXED FRUITS, BABY FOOD, DRY, INSTANT","Rice cereal with mixed fruits, baby food, dry, instant" +57805100,"RICE CEREAL W/ BANANAS, BABY, DRY, INSTANT","Rice cereal with bananas, baby food, dry, instant" +57805500,"BROWN RICE CEREAL, BABY FOOD, DRY, INSTANT","Brown rice cereal, baby food, dry, instant" +57806000,"MIXED CEREAL W/ BANANAS, BABY, DRY, INSTANT","Mixed cereal with bananas, baby food, dry, instant" +57806050,"MULTIGRAIN, WHOLE GRAIN CEREAL, BABY FOOD, DRY, INSTANT","Multigrain, whole grain cereal, baby food, dry, instant" +57806100,"OATMEAL CEREAL W/ BANANAS, BABY, DRY, INSTANT","Oatmeal cereal with bananas, baby food, dry, instant" +57806200,"OATMEAL W/ FRUIT, BABY, DRY, INSTANT, TODDLER","Oatmeal cereal with fruit, baby food, dry, instant, toddler" +57807010,"WHOLE WHEAT CEREAL W/ APPLES, BABY, DRY, INSTANT","Whole wheat cereal with apples, baby food, dry, instant" +57820000,"CEREAL, BABY, JARRED, NFS","Cereal, baby food, jarred, NFS" +57820100,"RICE CEREAL, BABY FOOD, JARRED, NFS","Rice cereal, baby food, jarred, NFS" +57822000,"MIXED CEREAL W/ APPLESAUCE & BANANAS, BABY, JARRED","Mixed cereal with applesauce and bananas, baby food, jarred" +57823000,"OATMEAL W/ APPLESAUCE & BANANAS, BABY, JARRED","Oatmeal with applesauce and bananas, baby food, jarred" +57824000,"RICE CEREAL, W/ APPLESAUCE & BANANAS, BABY, JARRED","Rice cereal with applesauce and bananas, baby food, jarred" +57824500,"RICE CEREAL W/ MIXED FRUIT, BABY, JARRED","Rice cereal with mixed fruit, baby food, jarred" +57830100,"GERBER GRADUATES FINGER SNACKS CEREAL,BABY FOOD","Gerber Graduates Finger Snacks Cereal, baby food" +58100000,"BURRITO, TACO, OR QUESADILLA W/ EGG","Burrito, taco, or quesadilla with egg" +58100005,"BURRITO, TACO, OR QUESADILLA W/ EGG & POTATO","Burrito, taco, or quesadilla with egg and potato" +58100010,"BURRITO, TACO, OR QUESADILLA W/ EGG & BREAKFAST MEAT","Burrito, taco, or quesadilla with egg and breakfast meat" +58100013,"BURRITO, TACO, OR QUESADILLA WITH EGG AND BREAKFAST MEAT, FF","Burrito, taco, or quesadilla with egg and breakfast meat, from fast food" +58100015,"BURRITO, TACO, OR QUESADILLA W/EGG, POTATO, & BREAKFAST MEAT","Burrito, taco, or quesadilla with egg, potato, and breakfast meat" +58100017,"BURRITO, TACO, OR QUESADILLA WITH EGG, POTATO, BRK MEAT, FF","Burrito, taco, or quesadilla with egg, potato, and breakfast meat, from fast food" +58100020,"BURRITO, TACO, OR QUESADILLA W/EGG, BEANS,& BREAKFAST MEAT","Burrito, taco, or quesadilla with egg, beans, and breakfast meat" +58100100,"BURRITO W/ MEAT","Burrito with meat" +58100120,"BURRITO W/ MEAT & BEANS","Burrito with meat and beans" +58100125,"BURRITO WITH MEAT AND BEANS, FROM FAST FOOD","Burrito with meat and beans, from fast food" +58100135,"BURRITO W/ MEAT & SOUR CREAM","Burrito with meat and sour cream" +58100140,"BURRITO W/ MEAT, BEANS, & SOUR CREAM","Burrito with meat, beans, and sour cream" +58100145,"BURRITO WITH MEAT, BEANS, AND SOUR CREAM, FROM FAST FOOD","Burrito with meat, beans, and sour cream, from fast food" +58100160,"BURRITO W/ MEAT, BEANS, & RICE","Burrito with meat, beans, and rice" +58100165,"BURRITO W/ MEAT, BEANS, RICE, & SOUR CREAM","Burrito with meat, beans, rice, and sour cream" +58100200,"BURRITO W/ CHICKEN","Burrito with chicken" +58100220,"BURRITO W/ CHICKEN AND BEANS","Burrito with chicken and beans" +58100235,"BURRITO W/ CHICKEN & SOUR CREAM","Burrito with chicken and sour cream" +58100245,"BURRITO W/ CHICKEN, BEANS, & SOUR CREAM","Burrito with chicken, beans, and sour cream" +58100255,"BURRITO W/ CHICKEN, BEANS, & RICE","Burrito with chicken, beans, and rice" +58100260,"BURRITO W/ CHICKEN, BEANS, RICE, & SOUR CREAM","Burrito with chicken, beans, rice, and sour cream" +58100300,"BURRITO W/ BEANS & RICE, MEATLESS","Burrito with beans and rice, meatless" +58100320,"BURRITO W/ BEANS","Burrito with beans, meatless" +58100325,"BURRITO WITH BEANS, MEATLESS, FROM FAST FOOD","Burrito with beans, meatless, from fast food" +58100330,"BURRITO W/ BEANS, RICE, & SOUR CREAM, MEATLESS","Burrito with beans, rice, and sour cream, meatless" +58100360,"CHILAQUILES,TORTILLA CASSEROLE W/ SALSA,CHEESE, EGG","Chilaquiles, tortilla casserole with salsa, cheese, and egg" +58100370,"CHILAQUILES, TORTILLA CASSEROLE, NO EGG","Chilaquiles, tortilla casserole with salsa and cheese, no egg" +58100520,"ENCHILADA W/ MEAT & BEANS, RED-CHILE OR ENCHILADA SAUCE","Enchilada with meat and beans, red-chile or enchilada sauce" +58100525,"ENCHILADA WITH MEAT & BEANS, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada with meat and beans, green-chile or enchilada sauce" +58100530,"ENCHILADA W/ MEAT, RED-CHILE OR ENCHILADA SAUCE","Enchilada with meat, red-chile or enchilada sauce" +58100535,"ENCHILADA WITH MEAT, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada with meat, green-chile or enchilada sauce" +58100620,"ENCHILADA W/ CHICKEN & BEANS, RED-CHILE OR ENCHILADA SAUCE","Enchilada with chicken and beans, red-chile or enchilada sauce" +58100625,"ENCHILADA WITH CHIC & BEANS, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada with chicken and beans, green-chile or enchilada sauce" +58100630,"ENCHILADA W/ CHICKEN, RED-CHILE OR ENCHILADA SAUCE","Enchilada with chicken, red-chile or enchilada sauce" +58100635,"ENCHILADA WITH CHICKEN, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada with chicken, green-chile or enchilada sauce" +58100720,"ENCHILADA W/ BEANS, MEATLESS, RED-CHILE OR ENCHILADA SAUCE","Enchilada with beans, meatless, red-chile or enchilada sauce" +58100725,"ENCHILADA WITH BEANS, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada with beans, green-chile or enchilada sauce" +58100800,"ENCHILADA, JUST CHEESE, NO BEANS, RED-CHILE OR ENCHILADA SC","Enchilada, just cheese, meatless, no beans, red-chile or enchilada sauce" +58100805,"ENCHILADA, JUST CHEESE, GREEN-CHILE OR ENCHILADA SAUCE","Enchilada, just cheese, meatless, no beans, green-chile or enchilada sauce" +58101320,"TACO OR TOSTADA W/ MEAT","Taco or tostada with meat" +58101323,"TACO OR TOSTADA WITH MEAT, FROM FAST FOOD","Taco or tostada with meat, from fast food" +58101325,"TACO OR TOSTADA W/ MEAT & SOUR CREAM","Taco or tostada with meat and sour cream" +58101345,"SOFT TACO W/ MEAT","Soft taco with meat" +58101347,"SOFT TACO WITH MEAT, FROM FAST FOOD","Soft taco with meat, from fast food" +58101350,"SOFT TACO W/ MEAT & SOUR CREAM","Soft taco with meat and sour cream" +58101357,"SOFT TACO WITH MEAT AND SOUR CREAM, FROM FAST FOOD","Soft taco with meat and sour cream, from fast food" +58101450,"SOFT TACO WITH CHICKEN","Soft taco with chicken" +58101457,"SOFT TACO WITH CHICKEN, FROM FAST FOOD","Soft taco with chicken, from fast food" +58101460,"SOFT TACO W/ CHICKEN & SOUR CREAM","Soft taco with chicken and sour cream" +58101520,"TACO OR TOSTADA W/ CHICKEN","Taco or tostada with chicken" +58101525,"TACO OR TOSTADA W/ CHICKEN & SOUR CREAM","Taco or tostada with chicken and sour cream" +58101540,"TACO OR TOSTADA W/ FISH","Taco or tostada with fish" +58101555,"SOFT TACO W/ FISH","Soft taco with fish" +58101610,"SOFT TACO W/ BEANS","Soft taco with beans" +58101615,"SOFT TACO W/ BEANS & SOUR CREAM","Soft taco with beans and sour cream" +58101620,"SOFT TACO W/ MEAT & BEANS","Soft taco with meat and beans" +58101625,"SOFT TACO W/ CHICKEN & BEANS","Soft taco with chicken and beans" +58101630,"SOFT TACO W/ MEAT, BEANS, & SOUR CREAM","Soft taco with meat, beans, and sour cream" +58101635,"SOFT TACO W/ CHICKEN, BEANS, & SOUR CREAM","Soft taco with chicken, beans, and sour cream" +58101720,"TACO OR TOSTADA W/ BEANS","Taco or tostada with beans" +58101725,"TACO OR TOSTADA W/ BEANS & SOUR CREAM","Taco or tostada with beans and sour cream" +58101730,"TACO OR TOSTADA W/ MEAT & BEANS","Taco or tostada with meat and beans" +58101733,"TACO OR TOSTADA WITH MEAT AND BEANS, FROM FAST FOOD","Taco or tostada with meat and beans, from fast food" +58101735,"TACO OR TOSTADA W/ CHICKEN & BEANS","Taco or tostada with chicken and beans" +58101745,"TACO OR TOSTADA W/ MEAT, BEANS, & SOUR CREAM","Taco or tostada with meat, beans, and sour cream" +58101750,"TACO OR TOSTADA W/ CHICKEN, BEANS, & SOUR CREAM","Taco or tostada with chicken, beans, and sour cream" +58101800,"GROUND BEEF W/ TOMATO SAUCE, ON A CORNBREAD CRUST","Ground beef with tomato sauce and taco seasonings on a cornbread crust" +58101820,"MEXICAN CASSEROLE W/ BEEF & BEANS","Mexican casserole made with ground beef, beans, tomato sauce, cheese, taco seasonings, and corn chips" +58101830,"MEXICAN CASSEROLE W/ BEEF (INCL FRITO PIE, NFS)","Mexican casserole made with ground beef, tomato sauce, cheese, taco seasonings, and corn chips" +58101930,"TACO OR TOSTADA SALAD W/ MEAT","Taco or tostada salad with meat" +58101935,"TACO OR TOSTADA SALAD WITH CHICKEN","Taco or tostada salad with chicken" +58101940,"TACO OR TOSTADA SALAD, MEATLESS","Taco or tostada salad, meatless" +58101945,"TACO SALAD W/ MEAT & SOUR CREAM","Taco or tostada salad with meat and sour cream" +58101950,"TACO OR TOSTADA SALAD W/ CHICKEN & SOUR CREAM","Taco or tostada salad with chicken and sour cream" +58101955,"TACO OR TOSTADA SALAD, MEATLESS W/ SOUR CREAM","Taco or tostada salad, meatless with sour cream" +58103120,"TAMALE WITH MEAT","Tamale with meat" +58103130,"TAMALE WITH CHICKEN","Tamale with chicken" +58103200,"TAMALE, PLAIN, MEATLESS, NO SAUCE, PR STYLE","Tamale, plain, meatless, no sauce, Puerto Rican style or Carribean Style" +58103210,"TAMALE, MEATLESS, W/ SAUCE, P.R. OR CARIBBEAN STYLE","Tamale, meatless, with sauce, Puerto Rican or Caribbean style" +58103250,"TAMALE, PLAIN, MEATLESS, NO SAUCE, MEXICAN","Tamale, plain, meatless, no sauce, Mexican style" +58103310,"TAMALE CASSEROLE W/ MEAT","Tamale casserole with meat" +58104090,"NACHOS W/ CHEESE & SOUR CREAM","Nachos with cheese and sour cream" +58104120,"NACHOS W/ CHEESE","Nachos with cheese" +58104130,"NACHOS W/ MEAT & CHEESE","Nachos with meat and cheese" +58104150,"NACHOS W/ CHICKEN & CHEESE","Nachos with chicken and cheese" +58104160,"NACHOS W/ CHILI","Nachos with chili" +58104180,"NACHOS W/ MEAT, CHEESE, & SOUR CREAM","Nachos with meat, cheese, and sour cream" +58104190,"NACHOS W/ CHICKEN, CHEESE, & SOUR CREAM","Nachos with chicken, cheese, and sour cream" +58104260,"GORDITA, SOPE, OR CHALUPA W/ BEANS","Gordita, sope, or chalupa with beans" +58104270,"GORDITA, SOPE, OR CHALUPA W/ BEANS & SOUR CREAM","Gordita, sope, or chalupa with beans and sour cream" +58104280,"GORDITA, SOPE, OR CHALUPA W/ MEAT & SOUR CREAM","Gordita, sope, or chalupa with meat and sour cream" +58104290,"GORDITA, SOPE, OR CHALUPA W/ MEAT","Gordita, sope, or chalupa with meat" +58104320,"GORDITA, SOPE, OR CHALUPA W/ CHICKEN & SOUR CREAM","Gordita, sope, or chalupa with chicken and sour cream" +58104340,"GORDITA, SOPE, OR CHALUPA W/ CHICKEN","Gordita, sope, or chalupa with chicken" +58104500,"CHIMICHANGA W/ MEAT","Chimichanga with meat" +58104520,"CHIMICHANGA, MEATLESS","Chimichanga, meatless" +58104530,"CHIMICHANGA W/ CHICKEN","Chimichanga with chicken" +58104535,"CHIMICHANGA W/ MEAT & SOUR CREAM","Chimichanga with meat and sour cream" +58104540,"CHIMICHANGA, MEATLESS, W/ SOUR CREAM","Chimichanga, meatless, with sour cream" +58104550,"CHIMICHANGA W/ CHICKEN & SOUR CREAM","Chimichanga with chicken and sour cream" +58104710,"QUESADILLA, JUST CHEESE, MEATLESS","Quesadilla, just cheese, meatless" +58104720,"QUESADILLA, JUST CHEESE, FROM FAST FOOD","Quesadilla, just cheese, from fast food" +58104730,"QUESADILLA W/ MEAT","Quesadilla with meat" +58104740,"QUESADILLA W/ CHICKEN","Quesadilla with chicken" +58104745,"QUESADILLA WITH CHICKEN, FROM FAST FOOD","Quesadilla with chicken, from fast food" +58104750,"QUESADILLA W/ VEGETABLES","Quesadilla with vegetables" +58104760,"QUESADILLA W/ VEGETABLES & MEAT","Quesadilla with vegetables and meat" +58104770,"QUESADILLA W/ VEGETABLES & CHICKEN","Quesadilla with vegetables and chicken" +58104800,"TAQUITO OR FLAUTA W/ CHEESE","Taquito or flauta with cheese" +58104820,"TAQUITO OR FLAUTA W/ MEAT","Taquito or flauta with meat" +58104825,"TAQUITO OR FLAUTA W/ MEAT & CHEESE","Taquito or flauta with meat and cheese" +58104830,"TAQUITO OR FLAUTA W/ CHICKEN","Taquito or flauta with chicken" +58104835,"TAQUITO OR FLAUTA W/ CHICKEN AND CHEESE","Taquito or flauta with chicken and cheese" +58104900,"TAQUITO OR FLAUTA W/ EGG","Taquito or flauta with egg" +58104905,"TAQUITO OR FLAUTA W/ EGG & BREAKFAST MEAT","Taquito or flauta with egg and breakfast meat" +58105000,"FAJITA W/ CHICKEN & VEGETABLES","Fajita with chicken and vegetables" +58105050,"FAJITA W/ MEAT & VEGETABLES","Fajita with meat and vegetables" +58105075,"FAJITA W/ VEGETABLES","Fajita with vegetables" +58105100,"PUPUSA, CHEESE-FILLED","Pupusa, cheese-filled" +58105105,"PUPUSA, BEAN-FILLED","Pupusa, bean-filled" +58105110,"PUPUSA, MEAT-FILLED","Pupusa, meat-filled" +58106200,"PIZZA, CHEESE, PREP FROM FROZEN, THIN CRUST","Pizza, cheese, prepared from frozen, thin crust" +58106205,"PIZZA, CHEESE, PREP FROM FROZEN, THICK CRUST","Pizza, cheese, prepared from frozen, thick crust" +58106210,"PIZZA, CHEESE,FRM REST/FF, NS AS TO TYPE OF CRUST","Pizza, cheese, from restaurant or fast food, NS as to type of crust" +58106220,"PIZZA, CHEESE, FROM RESTAURANT OR FAST FOOD, THIN CRUST","Pizza, cheese, from restaurant or fast food, thin crust" +58106225,"PIZZA, CHEESE, FROM RESTAURANT OR FAST FOOD, REGULAR CRUST","Pizza, cheese, from restaurant or fast food, regular crust" +58106230,"PIZZA, CHEESE, FROM RESTAURANT OR FAST FOOD, THICK CRUST","Pizza, cheese, from restaurant or fast food, thick crust" +58106233,"PIZZA, CHEESE, STUFFED CRUST","Pizza, cheese, stuffed crust" +58106235,"PIZZA, CHEESE, FROM SCHOOL LUNCH, THIN CRUST","Pizza, cheese, from school lunch, thin crust" +58106236,"PIZZA, CHEESE, FROM SCHOOL LUNCH, THICK CRUST","Pizza, cheese, from school lunch, thick crust" +58106240,"PIZZA, EXTRA CHEESE, NS AS TO TYPE OF CRUST","Pizza, extra cheese, NS as to type of crust" +58106250,"PIZZA, EXTRA CHEESE, THIN CRUST","Pizza, extra cheese, thin crust" +58106255,"PIZZA, EXTRA CHEESE, REGULAR CRUST","Pizza, extra cheese, regular crust" +58106260,"PIZZA, EXTRA CHEESE, THICK CRUST","Pizza, extra cheese, thick crust" +58106300,"PIZZA, CHEESE, W/ VEGETABLES, PREP FROM FROZEN, THIN CRUST","Pizza, cheese, with vegetables, prepared from frozen, thin crust" +58106305,"PIZZA, CHEESE, W/ VEGETABLES, PREP FROM FROZEN, THICK CRUST","Pizza, cheese with vegetables, prepared from frozen, thick crust" +58106310,"PIZZA, CHEESE, W/ VEG, NS AS TO TYPE OF CRUST","Pizza, cheese, with vegetables, NS as to type of crust" +58106320,"PIZZA, CHEESE, W/ VEGETABLES, THIN CRUST","Pizza, cheese, with vegetables, thin crust" +58106325,"PIZZA, CHEESE, W/ VEGETABLES, REGULAR CRUST","Pizza, cheese, with vegetables, regular crust" +58106330,"PIZZA, CHEESE, W/ VEGETABLES, THICK CRUST","Pizza, cheese, with vegetables, thick crust" +58106340,"PIZZA W/ CHEESE & EXTRA VEGETABLES, NS AS TO CRUST","Pizza, with cheese and extra vegetables, NS as to type of crust" +58106345,"PIZZA W/ CHEESE & EXTRA VEGETABLES, THIN CRUST","Pizza with cheese and extra vegetables, thin crust" +58106347,"PIZZA W/ CHEESE & EXTRA VEGETABLES, REGULAR CRUST","Pizza with cheese and extra vegetables, regular crust" +58106350,"PIZZA W/ CHEESE & EXTRA VEGETABLES, THICK CRUST","Pizza with cheese and extra vegetables, thick crust" +58106357,"PIZZA, CHEESE, W/ FRUIT, NS AS TO TYPE OF CRUST","Pizza, cheese, with fruit, NS as to type of crust" +58106358,"PIZZA, CHEESE, W/ FRUIT, THIN CRUST","Pizza, cheese, with fruit, thin crust" +58106359,"PIZZA, CHEESE, W/ FRUIT, REGULAR CRUST","Pizza, cheese, with fruit, regular crust" +58106360,"PIZZA, CHEESE, W/ FRUIT, THICK CRUST","Pizza, cheese, with fruit, thick crust" +58106500,"PIZZA W/ MEAT, PREP FROM FROZEN, THIN CRUST","Pizza with meat, prepared from frozen, thin crust" +58106505,"PIZZA W/ MEAT, PREP FROM FROZEN, THICK CRUST","Pizza with meat, prepared from frozen, thick crust" +58106540,"PIZZA W/ PEPPERONI,FRM REST/FF, NS AS TO TYPE OF CRUST","Pizza with pepperoni, from restaurant or fast food, NS as to type of crust" +58106550,"PIZZA W/PEPPERONI, FROM RESTAURANT/FAST FOOD, THIN CRUST","Pizza with pepperoni, from restaurant or fast food, thin crust" +58106555,"PIZZA W/PEPPERONI, FROM RESTAURANT/FAST FOOD, REGULAR CRUST","Pizza with pepperoni, from restaurant or fast food, regular crust" +58106560,"PIZZA W/ PEPPERONI, FROM RESTAURANT/FAST FOOD, THICK CRUST","Pizza with pepperoni, from restaurant or fast food, thick crust" +58106565,"PIZZA WITH PEPPERONI, STUFFED CRUST","Pizza with pepperoni, stuffed crust" +58106570,"PIZZA WITH PEPPERONI, FROM SCHOOL LUNCH, THIN CRUST","Pizza with pepperoni, from school lunch, thin crust" +58106580,"PIZZA WITH PEPPERONI, FROM SCHOOL LUNCH, THICK CRUST","Pizza with pepperoni, from school lunch, thick crust" +58106610,"PIZZA W/ MEAT OTHER THAN PEPP, FRM REST/FF, NS TYPE OF CRUST","Pizza with meat other than pepperoni, from restaurant or fast food, NS as to type of crust" +58106620,"PIZZA W/MEAT NOT PEPPERONI, FRM RESTAURANT/FF,THIN CRUST","Pizza with meat other than pepperoni, from restaurant or fast food, thin crust" +58106625,"PIZZA W/MEAT NOT PEPPERONI, FRM RESTAURANT/FF, REG CRUST","Pizza with meat other than pepperoni, from restaurant or fast food, regular crust" +58106630,"PIZZA W/MEAT NOT PEPPERONI, FRM RESTAURANT/FF, THICK CRUST","Pizza with meat other than pepperoni, from restaurant or fast food, thick crust" +58106633,"PIZZA, W/MEAT NOT PEPPERONI, STUFFED CRUST","Pizza, with meat other than pepperoni, stuffed crust" +58106635,"PIZZA, W/MEAT OTHER THAN PEPPERONI, FRM SCL LUNCH, THIN CRUS","Pizza, with meat other than pepperoni, from school lunch, thin crust" +58106636,"PIZZA, W/MEAT OTHER THAN PEPPERONI, FRM SCL LUNCH, THICK CRU","Pizza, with meat other than pepperoni, from school lunch, thick crust" +58106640,"PIZZA W/ EXTRA MEAT, NS AS TO TYPE OF CRUST","Pizza with extra meat, NS as to type of crust" +58106650,"PIZZA W/ EXTRA MEAT, THIN CRUST","Pizza with extra meat, thin crust" +58106655,"PIZZA W/ EXTRA MEAT, REGULAR CRUST","Pizza with extra meat, regular crust" +58106660,"PIZZA W/ EXTRA MEAT, THICK CRUST","Pizza with extra meat, thick crust" +58106700,"PIZZA W/ MEAT & VEGS, PREP FROM FROZEN, THIN CRUST","Pizza with meat and vegetables, prepared from frozen, thin crust" +58106705,"PIZZA W/ MEAT & VEGS, PREP FROM FROZEN, THICK CRUST","Pizza with meat and vegetables, prepared from frozen, thick crust" +58106710,"PIZZA W/ MEAT & VEG, NS AS TO TYPE OF CRUST","Pizza with meat and vegetables, NS as to type of crust" +58106720,"PIZZA W/ MEAT & VEGETABLES, THIN CRUST","Pizza with meat and vegetables, thin crust" +58106725,"PIZZA W/ MEAT & VEGETABLES, REGULAR CRUST","Pizza with meat and vegetables, regular crust" +58106730,"PIZZA W/ MEAT & VEGETABLES, THICK CRUST","Pizza with meat and vegetables, thick crust" +58106735,"PIZZA W/ EXTRA MEAT & EXTRA VEGS, NS AS TO TYPE OF CRUST","Pizza with extra meat and extra vegetables, NS as to type of crust" +58106736,"PIZZA W/ EXTRA MEAT & EXTRA VEGS, THIN CRUST","Pizza with extra meat and extra vegetables, thin crust" +58106737,"PIZZA W/ EXTRA MEAT & EXTRA VEGS, THICK CRUST","Pizza with extra meat and extra vegetables, thick crust" +58106738,"PIZZA W/ EXTRA MEAT & EXTRA VEGS, REGULAR CRUST","Pizza with extra meat and extra vegetables, regular crust" +58106740,"PIZZA W/ MEAT & FRUIT, NS AS TO TYPE OF CRUST","Pizza with meat and fruit, NS as to type of crust" +58106750,"PIZZA W/ MEAT & FRUIT, THIN CRUST","Pizza with meat and fruit, thin crust" +58106755,"PIZZA W/ MEAT & FRUIT, REGULAR CRUST","Pizza with meat and fruit, regular crust" +58106760,"PIZZA W/ MEAT & FRUIT, THICK CRUST","Pizza with meat and fruit, thick crust" +58106820,"PIZZA W/ BEANS & VEG, THIN CRUST (INCL TACO PIZZA)","Pizza with beans and vegetables, thin crust" +58106830,"PIZZA W/ BEANS & VEG, THICK CRUST (INCL TACO PIZZA)","Pizza with beans and vegetables, thick crust" +58107050,"PIZZA, NO CHEESE, THIN CRUST","Pizza, no cheese, thin crust" +58107100,"PIZZA, NO CHEESE, THICK CRUST","Pizza, no cheese, thick crust" +58107220,"WHITE PIZZA, THIN CRUST","White pizza, thin crust" +58107230,"WHITE PIZZA, THICK CRUST","White pizza, thick crust" +58108000,"CALZONE, W/ CHEESE, MEATLESS (INCL STROMBOLI)","Calzone, with cheese, meatless" +58108010,"CALZONE, W/ MEAT & CHEESE (INCLUDE STROMBOLI)","Calzone, with meat and cheese" +58108050,"PIZZA ROLLS (INCLUDE PIZZA BITES)","Pizza rolls" +58110110,"EGG ROLL, MEATLESS","Egg roll, meatless" +58110120,"EGG ROLL, W/ SHRIMP","Egg roll, with shrimp" +58110130,"EGG ROLL, W/ BEEF/PORK","Egg roll, with beef and/or pork" +58110170,"EGG ROLL, W/ CHICKEN","Egg roll, with chicken or turkey" +58110200,"ROLL W/MEAT&/SHRIMP,VEGETABLES&RICE PAPER(NOT FRIED","Roll with meat and/or shrimp, vegetables and rice paper (not fried)" +58111110,"WON TON (WONTON), FRIED, FILLED W/MEAT, POULTRY, OR SEAFOOD","Won ton (wonton), fried, filled with meat, poultry, or seafood" +58111120,"WON TON (WONTON), FRIED, MEATLESS","Won ton (wonton), fried, meatless" +58111130,"WON TON (WONTON), FRIED, FILLED WITH MEAT, POULTRY, OR SEAFO","Won ton (wonton), fried, filled with meat, poultry, or seafood, and vegetable" +58111200,"PUFFS, FRIED, CRAB MEAT & CREAM CHEESE FILLED","Puffs, fried, crab meat and cream cheese filled" +58112510,"DUMPLING, STEAMED, FILLED W/ MEAT OR SEAFOOD","Dumpling, steamed, filled with meat, poultry, or seafood" +58115110,"TAMALE CASSEROLE, P.R. (TAMALES EN CAZUELA)","Tamale casserole, Puerto Rican style (Tamales en cazuela)" +58115150,"TAMAL IN A LEAF, P.R. (TAMALES EN HOJA)","Tamal in a leaf, Puerto Rican style (Tamales en hoja)" +58115210,"TACO W/ CRAB MEAT, P.R. (TACOS DE JUEYES)","Taco with crab meat, Puerto Rican style (Taco de jueye)" +58116110,"MEAT TURNOVER, PUERTO RICAN STYLE","Meat turnover, Puerto Rican style (Pastelillo de carne; Empanadilla)" +58116115,"EMPANADA, MEXICAN TURNOVER, W/ CHS & VEG","Empanada, Mexican turnover, filled with cheese and vegetables" +58116120,"EMPANADA, MEXICAN TURNOVER, W/ MEAT & VEGS","Empanada, Mexican turnover, filled with meat and vegetables" +58116130,"EMPANADA, MEXICAN TURNOVER, W/ CHIC & VEG","Empanada, Mexican turnover, filled with chicken and vegetables" +58116210,"MEAT PIE, P.R. (PASTELON DE CARNE)","Meat pie, Puerto Rican style (Pastelon de carne)" +58116310,"CHEESE TURNOVER, PUERTO RICAN STYLE","Cheese turnover, Puerto Rican style (Pastelillo de queso; Empanadilla)" +58117110,"CORNMEAL FRITTER, P.R. (AREPA, P.R. AREPITAS)","Cornmeal fritter, Puerto Rican style (Arepa; P.R. arepita)" +58117210,"CORNMEAL STICK, P.R. (SORULLOS / SORULLITOS DE MAIZ)","Cornmeal stick, Puerto Rican style (Sorullos / Sorullitos de maiz)" +58117310,"KIBBY, P.R. (BEEF & BULGUR) (PLATO ARABE)","Kibby, Puerto Rican style (beef and bulgur) (Plato Arabe)" +58117410,"CODFISH FRITTER, P.R. (BACALAITOS FRITOS)","Codfish fritter, Puerto Rican style (Bacalaitos fritos)" +58117510,"HAYACAS, P.R. (HOMINY, PORK OR HAM, VEGETABLES)","Hayacas, Puerto Rican style (hominy, pork or ham, vegetables)" +58118110,"CORNSTARCH COCONUT DESSERT, P.R. (TEMBLEQUE)","Cornstarch coconut dessert, Puerto Rican style (Tembleque)" +58118210,"CORNMEAL COCONUT DESSERT, P.R.","Cornmeal coconut dessert, Puerto Rican style (Harina de maiz con coco)" +58120110,"CREPES, FILLED W/ MEAT, FISH OR POULTRY, W/ SAUCE","Crepes, filled with meat, fish, or poultry, with sauce" +58120120,"CREPE,FILLED W/ MEAT, FISH & POULTRY,NO SCE ON TOP","Crepe, filled with beef, pork, fish and/or poultry, no sauce on top" +58121510,"DUMPLING, MEAT-FILLED (INCLUDE PIEROGI, PIROSHKI)","Dumpling, meat-filled" +58121610,"DUMPLING, POTATO/CHEESE-FILLED (INCLUDE PIEROGI)","Dumpling, potato- or cheese-filled" +58121620,"DUMPLING, VEGETABLE","Dumpling, vegetable" +58122210,"GNOCCHI, CHEESE","Gnocchi, cheese" +58122220,"GNOCCHI, POTATO","Gnocchi, potato" +58122250,"KISHKE, STUFFED DERMA","Kishke, stuffed derma" +58122310,"KNISH, POTATO (PASTRY FILLED WITH POTATO)","Knish, potato (pastry filled with potato)" +58122320,"KNISH, CHEESE (PASTRY FILLED WITH CHEESE)","Knish, cheese (pastry filled with cheese)" +58122330,"KNISH, MEAT (PASTRY FILLED WITH MEAT)","Knish, meat (pastry filled with meat)" +58123110,"SWEET BREAD DOUGH, FILLED WITH MEAT, STEAMED","Sweet bread dough, filled with meat, steamed" +58123120,"SWEET BREAD DOUGH, FILLED WITH BEAN PASTE, MEATLESS, STEAMED","Sweet bread dough, filled with bean paste, meatless, steamed" +58124210,"PASTRY, CHEESE-FILLED","Pastry, cheese-filled" +58124250,"SPANAKOPITTA (INCL GREEK SPINACH-CHEESE PIE)","Spanakopitta" +58124500,"PASTRY,FILLED W/POTATOES & PEAS, FRIED","Pastry, filled with potatoes and peas, fried" +58125110,"QUICHE W/ MEAT, POULTRY OR FISH","Quiche with meat, poultry or fish" +58125120,"SPINACH QUICHE, MEATLESS","Spinach quiche, meatless" +58125180,"CHEESE QUICHE, MEATLESS","Cheese quiche, meatless" +58126000,"BIEROCK (TURNOVER W/ BEEF & CABBAGE)","Bierock (turnover filled with ground beef and cabbage mixture)" +58126110,"TURNOVER, MEAT-FILLED, NO GRAVY","Turnover, meat-filled, no gravy" +58126120,"TURNOVER, MEAT-FILLED, W/ GRAVY","Turnover, meat-filled, with gravy" +58126130,"TURNOVER, MEAT- & CHEESE-FILLED, NO GRAVY","Turnover, meat- and cheese-filled, no gravy" +58126140,"TURNOVER, MEAT- & BEAN-FILLED, NO GRAVY","Turnover, meat- and bean-filled, no gravy" +58126150,"TURNOVER, MEAT & CHEESE, TOMATO SAUCE","Turnover, meat- and cheese-filled, tomato-based sauce" +58126160,"TURNOVER, CHEESE-FILLED, TOMATO-BASED SAUCE","Turnover, cheese-filled, tomato-based sauce" +58126170,"TURNOVER, MEAT & VEG (NO POTATO), NO GRAVY","Turnover, meat-and vegetable- filled (no potatoes, no gravy)" +58126180,"TURNOVER,MEAT- POTATO- & VEGETABLE-FILLED NO GRAVY","Turnover, meat-, potato-, and vegetable-filled, no gravy" +58126270,"TURNOVER,CHICKEN/TURKEY FILLED,NO GRAVY","Turnover, chicken- or turkey-, and cheese-filled, no gravy" +58126280,"TURNOVER, CHICKEN/TURKEY- & VEG-FILLED, LOWER FAT","Turnover, chicken- or turkey-, and vegetable-filled, lower in fat" +58126290,"TURNOVER, MEAT- & CHEESE-FILLED, LOWER FAT","Turnover, meat- and cheese-filled, lower in fat" +58126300,"TURNOVER, MEAT- & CHEESE-FILLED, TOMATO SAUCE, LOWER FAT","Turnover, meat- and cheese-filled, tomato-based sauce, lower in fat" +58126310,"TURNOVER, CHICKEN, W/ GRAVY","Turnover, chicken, with gravy" +58126400,"TURNOVER, FILLED W/ EGG, MEAT & CHEESE","Turnover, filled with egg, meat and cheese" +58126410,"TURNOVER, FILLED W/ EGG, MEAT & CHEESE, LOWER IN FAT","Turnover, filled with egg, meat, and cheese, lower in fat" +58127110,"VEGETABLES IN PASTRY (INCL ALL VARIETIES)","Vegetables in pastry" +58127150,"VEGETABLES & CHEESE IN PASTRY","Vegetables and cheese in pastry" +58127200,"CROISSANT, FILLED W/ BROCCOLI & CHEESE","Croissant sandwich, filled with broccoli and cheese" +58127210,"CROISSANT, FILLED W/ HAM & CHEESE","Croissant sandwich, filled with ham and cheese" +58127220,"CROISSANT, FILLED W/CHICKEN,BROCCOLI & CHEESE SAUCE","Croissant sandwich, filled with chicken, broccoli, and cheese sauce" +58127270,"CROISSANT W/ SAUSAGE & EGG","Croissant sandwich with sausage and egg" +58127290,"CROISSANT W/ BACON & EGG","Croissant sandwich with bacon and egg" +58127310,"CROISSANT W/ HAM, EGG, & CHEESE","Croissant sandwich with ham, egg, and cheese" +58127330,"CROISSANT W/ SAUSAGE, EGG, & CHEESE","Croissant sandwich with sausage, egg, and cheese" +58127350,"CROISSANT W/ BACON, EGG, & CHEESE","Croissant sandwich with bacon, egg, and cheese" +58127500,"VEGETABLE SUBMARINE SANDWICH, W/ FAT FREE SPREAD","Vegetable submarine sandwich, with fat free spread" +58128000,"BISCUIT W/ GRAVY","Biscuit with gravy" +58128110,"CHICKEN CORNBREAD","Chicken cornbread" +58128120,"CORNMEAL DRESSING W/ CHICKEN & VEGETABLES","Cornmeal dressing with chicken or turkey and vegetables" +58128210,"DRESSING W/ OYSTERS","Dressing with oysters" +58128220,"DRESSING W/ CHICKEN/TURKEY & VEGETABLES","Dressing with chicken or turkey and vegetables" +58128250,"DRESSING W/ MEAT & VEGETABLES","Dressing with meat and vegetables" +58130011,"LASAGNA WITH MEAT","Lasagna with meat" +58130013,"LASAGNA W/ MEAT, CANNED","Lasagna with meat, canned" +58130020,"LASAGNA, W/ MEAT & SPINACH","Lasagna with meat and spinach" +58130140,"LASAGNA WITH CHICKEN OR TURKEY","Lasagna with chicken or turkey" +58130150,"LASAGNA W/ CHIC OR TURKEY, & SPINACH","Lasagna, with chicken or turkey, and spinach" +58130310,"LASAGNA, MEATLESS","Lasagna, meatless" +58130320,"LASAGNA, MEATLESS, W/ VEGETABLES","Lasagna, meatless, with vegetables" +58130610,"LASAGNA W/ MEAT, WHOLE WHEAT NOODLES","Lasagna with meat, whole wheat noodles" +58130810,"LASAGNA, MEATLESS, WHOLE WHEAT NOODLES","Lasagna, meatless, whole wheat noodles" +58130910,"LASAGNA W/ MEAT, SPINACH NOODLES","Lasagna with meat, spinach noodles" +58130950,"LASAGNA, MEATLESS, SPINACH NOODLES","Lasagna, meatless, spinach noodles" +58131100,"RAVIOLI, FILLING NS, NO SAUCE","Ravioli, NS as to filling, no sauce" +58131110,"RAVIOLI, FILLING NS, TOMATO SAUCE","Ravioli, NS as to filling, with tomato sauce" +58131120,"RAVIOLI, NS AS TO FILLING, WITH CREAM SAUCE","Ravioli, NS as to filling, with cream sauce" +58131310,"RAVIOLI, MEAT-FILLED, NO SAUCE","Ravioli, meat-filled, no sauce" +58131320,"RAVIOLI, MEAT-FILLED, W/ TOMATO OR MEAT SAUCE","Ravioli, meat-filled, with tomato sauce or meat sauce" +58131323,"RAVIOLI, MEAT-FILLED, W/ TOMATO OR MEAT SAUCE, CANNED","Ravioli, meat-filled, with tomato sauce or meat sauce, canned" +58131330,"RAVIOLI, MEAT-FILLED, WITH CREAM SAUCE","Ravioli, meat-filled, with cream sauce" +58131510,"RAVIOLI, CHEESE-FILLED, NO SAUCE","Ravioli, cheese-filled, no sauce" +58131520,"RAVIOLI, CHEESE-FILLED, W/ TOMATO SAUCE","Ravioli, cheese-filled, with tomato sauce" +58131523,"RAVIOLI, CHEESE-FILLED, W/ TOMATO SAUCE, CANNED","Ravioli, cheese-filled, with tomato sauce, canned" +58131530,"RAVIOLI, CHEESE-FILLED, W/ MEAT SAUCE","Ravioli, cheese-filled, with meat sauce" +58131535,"RAVIOLI, CHEESE-FILLED, WITH CREAM SAUCE","Ravioli, cheese-filled, with cream sauce" +58131590,"RAVIOLI, CHEESE AND SPINACH-FILLED, NO SAUCE","Ravioli, cheese and spinach-filled, no sauce" +58131600,"RAVIOLI, CHEESE&SPINACH-FILLED, W/ CREAM SAUCE","Ravioli, cheese and spinach-filled, with cream sauce" +58131610,"RAVIOLI, CHEESE AND SPINACH FILLED, WITH TOMATO SAUCE","Ravioli, cheese and spinach filled, with tomato sauce" +58132110,"SPAGHETTI W/ TOMATO SAUCE, MEATLESS","Spaghetti with tomato sauce, meatless" +58132113,"PASTA, W/ TOMATO SAUCE & CHEESE, CANNED","Pasta with tomato sauce and cheese, canned" +58132310,"SPAGHETTI W/TOMAT SAUCE & MEAT SAUCE","Spaghetti with tomato sauce and meatballs or spaghetti with meat sauce or spaghetti with meat sauce and meatballs" +58132313,"PASTA W/ TOMATO SAUCE & MEAT/MEATBALLS, CANNED","Pasta with tomato sauce and meat or meatballs, canned" +58132340,"SPAGHETTI W/ TOMATO SAUCE & VEGETABLES","Spaghetti with tomato sauce and vegetables" +58132350,"SPAGHETTI, WHOLE WHEAT, W/ TOMATO SAUCE, MEATLESS","Spaghetti with tomato sauce, meatless, whole wheat noodles" +58132360,"SPAGHETTI, WHOLE WHEAT, W/ TOMATO & MEAT SAUCE","Spaghetti with tomato sauce and meatballs, whole wheat noodles or spaghetti with meat sauce, whole wheat noodles or spaghetti with meat sauce and meatballs, whole wheat noodles" +58132450,"SPAGHETTI W/ TOM SAUCE, MEATLESS, SPINACH NOODLES","Spaghetti with tomato sauce, meatless, made with spinach noodles" +58132460,"SPAGHETTI W/ TOMATO & MEAT SAUCE, SPINACH NOODLES","Spaghetti with tomato sauce and meatballs made with spinach noodles, or spaghetti with meat sauce made with spinach noodles, or spaghetti with meat sauce and meatballs made with spinach noodles" +58132710,"SPAGHETTI W/ TOMATO SAUCE & FRANKFURTERS/HOT DOG","Spaghetti with tomato sauce and frankfurters or hot dogs" +58132713,"PASTA W/ TOMATO SAUCE & FRANKFURTERS/HOT DOGS, CANNED","Pasta with tomato sauce and frankfurters or hot dogs, canned" +58132800,"SPAGHETTI W/ CLAM SAUCE, NS AS TO RED OR WHITE","Spaghetti with clam sauce, NS as to red or white" +58132810,"SPAGHETTI W/ RED CLAM SAUCE","Spaghetti with red clam sauce" +58132820,"SPAGHETTI W/ WHITE CLAM SAUCE","Spaghetti with white clam sauce" +58132910,"SPAGHETTI WITH TOMATO SAUCE AND POULTRY","Spaghetti with tomato sauce and poultry" +58133110,"MANICOTTI, CHEESE-FILLED, NO SAUCE","Manicotti, cheese-filled, no sauce" +58133120,"MANICOTTI, CHEESE-FILLED, W/ TOMATO SAUCE, MEATLESS","Manicotti, cheese-filled, with tomato sauce, meatless" +58133130,"MANICOTTI, CHEESE-FILLED, W/ MEAT SAUCE","Manicotti, cheese-filled, with meat sauce" +58133140,"MANICOTTI, VEG- & CHEESE-FILLED, W/TOM SCE,MEATLESS","Manicotti, vegetable- and cheese-filled, with tomato sauce, meatless" +58134110,"STUFFED SHELLS, CHEESE-FILLED, NO SAUCE","Stuffed shells, cheese-filled, no sauce" +58134120,"STUFFED SHELLS, CHEESE-FILLED, W/ TOM SC, MEATLESS","Stuffed shells, cheese-filled, with tomato sauce, meatless" +58134130,"STUFFED SHELLS, CHEESE-FILLED, W/ MEAT SAUCE","Stuffed shells, cheese-filled, with meat sauce" +58134160,"STUFFED SHELLS, CHEESE AND SPINACH FILLED, NO SAUCE","Stuffed shells, cheese- and spinach- filled, no sauce" +58134210,"STUFFED SHELLS, W/ CHICKEN, W/ TOM SCE","Stuffed shells, with chicken, with tomato sauce" +58134310,"STUFFED SHELLS, W/ FISH &/OR SHELLFISH, W/ TOM SCE","Stuffed shells, with fish and/or shellfish, with tomato sauce" +58134610,"TORTELLINI, MEAT-FILLED, W/ TOMATO SAUCE","Tortellini, meat-filled, with tomato sauce" +58134613,"TORTELLINI, MEAT-FILLED, W/ TOMATO SAUCE, CANNED","Tortellini, meat-filled, with tomato sauce, canned" +58134620,"TORTELLINI, CHEESE-FILLED, MEATLESS, W/TOMATO SAUCE","Tortellini, cheese-filled, meatless, with tomato sauce" +58134623,"TORTELLINI,CHEESE-FILLED,MEATLESS,W/TOMATO SAUCE,CANNED","Tortellini, cheese-filled, meatless, with tomato sauce, canned" +58134630,"TORTELLINI, CHEESE, W/ VEGETABLES & DRESSING","Tortellini, cheese-filled, meatless, with vegetables and vinaigrette dressing" +58134640,"TORTELLINI, CHEESE-FILLED, MEATLESS, W/ VINAIGRETTE","Tortellini, cheese-filled, meatless, with vinaigrette dressing" +58134650,"TORTELLINI, MEAT-FILLED, NO SAUCE","Tortellini, meat-filled, no sauce" +58134660,"TORTELLINI, CHEESE-FILLED, W/ CREAM SAUCE","Tortellini, cheese-filled, with cream sauce" +58134680,"TORTELLINI, CHEESE-FILLED, NO SAUCE","Tortellini, cheese-filled, no sauce" +58134710,"TORTELLINI, SPINACH-FILLED, W/ TOMATO SAUCE","Tortellini, spinach-filled, with tomato sauce" +58134720,"TORTELLINI, SPINACH-FILLED, NO SAUCE","Tortellini, spinach-filled, no sauce" +58134810,"CANNELONI, CHEESE & SPINACH-FILLED, NO SAUCE","Cannelloni, cheese- and spinach-filled, no sauce" +58135110,"CHOW FUN NOODLES W/ MEAT & VEGETABLES","Chow fun noodles with meat and vegetables" +58135120,"CHOW FUN NOODLES W/ VEGETABLES, MEATLESS","Chow fun noodles with vegetables, meatless" +58136110,"LO MEIN, NFS","Lo mein, NFS" +58136120,"LO MEIN, MEATLESS","Lo mein, meatless" +58136130,"LO MEIN WITH SHRIMP","Lo mein, with shrimp" +58136140,"LO MEIN W/ PORK","Lo mein, with pork" +58136150,"LO MEIN W/ BEEF","Lo mein, with beef" +58136160,"LO MEIN W/ CHICKEN (INCL TURKEY)","Lo mein, with chicken" +58137210,"PAD THAI, NFS","Pad Thai, NFS" +58137220,"PAD THAI, MEATLESS","Pad Thai, meatless" +58137230,"PAD THAI WITH CHICKEN","Pad Thai with chicken" +58137240,"PAD THAI WITH SEAFOOD","Pad Thai with seafood" +58137250,"PAD THAI WITH MEAT","Pad Thai with meat" +58140110,"SPAGHETTI W/ CORNED BEEF, P.R.","Spaghetti with corned beef, Puerto Rican style" +58140310,"MACARONI W/ TUNA, P.R. (MACARRONES CON ATUN)","Macaroni with tuna, Puerto Rican style (Macarrones con atun)" +58145110,"MACARONI OR NOODLES W/ CHEESE","Macaroni or noodles with cheese" +58145112,"MACARONI OR NOODLES WITH CHEESE, MADE FROM PACKAGED MIX","Macaroni or noodles with cheese, made from packaged mix" +58145113,"MACARONI OR NOODLES W/ CHEESE, CANNED","Macaroni or noodles with cheese, canned" +58145117,"MACARONI OR NOODLES WITH CHEESE, EASY MAC TYPE","Macaroni or noodles with cheese, Easy Mac type" +58145119,"MACARONI OR NOODLES WITH CHEESE, MADE FRM RED FAT PACKAGE","Macaroni or noodles with cheese, made from reduced fat packaged mix" +58145120,"MACARONI OR NOODLES W/ CHEESE & TUNA","Macaroni or noodles with cheese and tuna" +58145135,"MACARONI OR NOODLES WITH CHEESE AND MEAT","Macaroni or noodles with cheese and meat" +58145136,"MACARONI OR NOODLES W/CHEESE & MEAT, FR HAMBURGER HELPER","Macaroni or noodles with cheese and meat, prepared from Hamburger Helper mix" +58145140,"MACARONI OR NOODLES W/ CHEESE & TOMATO","Macaroni or noodles with cheese and tomato" +58145160,"MACARONI/NOODLES W/ CHEESE & FRANKFURTER/HOT DOG","Macaroni or noodles with cheese and frankfurters or hot dogs" +58145170,"MACARONI OR NOODLES WITH CHEESE AND EGG","Macaroni or noodles with cheese and egg" +58145190,"MACARONI W/ CHEESE & CHICKEN","Macaroni or noodles with cheese and chicken or turkey" +58146100,"PASTA W/ TOMATO SAUCE, MEATLESS","Pasta with tomato sauce, meatless" +58146110,"PASTA W/ MEAT SAUCE (INCLUDE AMER CHOP SUEY)","Pasta with meat sauce" +58146120,"PASTA W/ CHEESE & MEAT SAUCE","Pasta with cheese and meat sauce" +58146130,"PASTA W/ CARBONARA SAUCE","Pasta with carbonara sauce" +58146150,"PASTA W/ CHEESE & TOMATO SAUCE, MEATLESS","Pasta with cheese and tomato sauce, meatless" +58146160,"PASTA WITH VEGETABLES, NO SAUCE OR DRESSING","Pasta with vegetables, no sauce or dressing" +58146200,"PASTA, MEAT-FILLED, W/ GRAVY, CANNED","Pasta, meat-filled, with gravy, canned" +58146300,"PASTA, WHOLE WHEAT, WITH MEAT SAUCE","Pasta, whole wheat, with meat sauce" +58146310,"PASTA, WHOLE WHEAT, W/ TOMATO SAUCE, MEATLESS","Pasta, whole wheat, with tomato sauce, meatless" +58147100,"PASTA W/ PESTO SAUCE","Pasta with pesto sauce" +58147110,"MACARONI OR NOODLES W/ BEANS & TOMATO SAUCE","Macaroni or noodles with beans or lentils and tomato sauce" +58147310,"MACARONI, CREAMED","Macaroni, creamed" +58147330,"MACARONI OR NOODLES, CREAMED, WITH CHEESE","Macaroni or noodles, creamed, with cheese" +58147340,"MACARONI OR NOODLES, CREAMED, WITH CHEESE AND TUNA","Macaroni or noodles, creamed, with cheese and tuna" +58147350,"MACARONI, CREAMED, W/ VEGETABLES","Macaroni, creamed, with vegetables" +58147510,"FLAVORED PASTA (INCL LIPTON BEEF, CHICKEN FLAVORS)","Flavored pasta" +58147520,"YAT GA MEIN WITH MEAT, FISH, OR POULTRY","Yat Ga Mein with meat, fish, or poultry" +58148110,"MACARONI OR PASTA SALAD, W/ MAYO","Macaroni or pasta salad, made with mayonnaise" +58148111,"MACARONI OR PASTA SALAD, W/ LT MAYO","Macaroni or pasta salad, made with light mayonnaise" +58148112,"MACARONI OR PASTA SALAD, W/ MAYO-TYPE DRSG","Macaroni or pasta salad, made with mayonnaise-type salad dressing" +58148113,"MACARONI OR PASTA SALAD, W/LT MAYO-TYPE DRSG","Macaroni or pasta salad, made with light mayonnaise-type salad dressing" +58148114,"MACARONI OR PASTA SALAD, W/ ITALIAN DRSG","Macaroni or pasta salad, made with Italian dressing" +58148115,"MACARONI OR PASTA SALAD, W/LT ITALIAN DRSG","Macaroni or pasta salad, made with light Italian dressing" +58148116,"MACARONI OR PASTA SALAD, W/ CREAMY DRSG","Macaroni or pasta salad, made with creamy dressing" +58148117,"MACARONI OR PASTA SALAD, W/ LT CREAMY DRSG","Macaroni or pasta salad, made with light creamy dressing" +58148118,"MACARONI OR PASTA SALAD, W/ ANY TYPE OF FAT FREE DRSG","Macaroni or pasta salad, made with any type of fat free dressing" +58148120,"MACARONI OR PASTA SALAD WITH EGG","Macaroni or pasta salad with egg" +58148130,"MACARONI OR PASTA SALAD WITH TUNA","Macaroni or pasta salad with tuna" +58148140,"MACARONI OR PASTA SALAD WITH CRAB MEAT","Macaroni or pasta salad with crab meat" +58148150,"MACARONI OR PASTA SALAD WITH SHRIMP","Macaroni or pasta salad with shrimp" +58148160,"MACARONI OR PASTA SALAD WITH TUNA AND EGG","Macaroni or pasta salad with tuna and egg" +58148170,"MACARONI OR PASTA SALAD WITH CHICKEN","Macaroni or pasta salad with chicken" +58148180,"MACARONI OR PASTA SALAD WITH CHEESE","Macaroni or pasta salad with cheese" +58148550,"MACARONI OR PASTA SALAD W/ MEAT","Macaroni or pasta salad with meat" +58148600,"PASTA TETRAZZINI,DRY MIX,PREPARED W/ WATER","Pasta tetrazzini, dry mix, prepared with water" +58149110,"NOODLE PUDDING (INCLUDE KUGEL)","Noodle pudding" +58149160,"NOODLE PUDDING,W/ MILK","Noodle pudding, with milk" +58149210,"SOMEN SALAD W/ NOODLE, LETTUCE, EGG, FISH, PORK","Somen salad with noodles, lettuce, egg, fish, and pork" +58150100,"BIBIMBAP (KOREAN)","Bibimbap (Korean)" +58150110,"RICE, FRIED, MEATLESS","Rice, fried, meatless" +58150310,"RICE, FRIED, NFS","Rice, fried, NFS" +58150320,"RICE, FRIED, W/ CHICKEN (INCL TURKEY)","Rice, fried, with chicken" +58150330,"RICE, FRIED, W/ PORK","Rice, fried, with pork" +58150340,"RICE, FRIED, W/ BEEF","Rice, fried, with beef" +58150510,"RICE, FRIED, W/ SHRIMP","Rice, fried, with shrimp" +58150520,"DUKBOKI / TTEOKBOKKI (KOREAN)","Dukboki / Tteokbokki (Korean)" +58151100,"SUSHI, NFS","Sushi, NFS" +58151110,"SUSHI, NO VEG, NO SEAFOOD/FISH/SHELLFISH","Sushi, no vegetables, no seafood (no fish or shellfish)" +58151120,"SUSHI, W/ VEG, NO SEAFOOD/FISH/SHELLFISH","Sushi, with vegetables, no seafood (no fish or shellfish)" +58151130,"SUSHI, W/ VEG & SEAFD","Sushi, with vegetables and seafood" +58151140,"SUSHI, W/ VEGETABLES, ROLLED IN SEAWEED","Sushi, with vegetables, rolled in seaweed" +58151150,"SUSHI, WITH SEAFOOD, NO VEGETABLES","Sushi, with seafood, no vegetables" +58151160,"SUSHI, W/ EGG, NO VEG/SEAFD/FISH/SHLFISH, ROLL IN SEAWEED","Sushi, with egg, no vegetables, no seafood (no fish or shellfish), rolled in seaweed" +58155110,"RICE W/ CHICKEN, P.R. (ARROZ CON POLLO)","Rice with chicken, Puerto Rican style (Arroz con Pollo)" +58155210,"STUFFED RICE W/ CHICKEN, DOMINICAN STYLE","Stuffed rice with chicken, Dominican style (Arroz relleno Dominicano)" +58155310,"PAELLA, VALENCIANA STYLE, W/ MEAT","Paella, Valenciana style, with meat (Paella Valenciana)" +58155320,"SEAFOOD PAELLA, PUERTO RICAN STYLE","Seafood paella, Puerto Rican style" +58155410,"SOUPY RICE W/ CHICKEN, P.R. (ASOPAO DE POLLO)","Soupy rice with chicken, Puerto Rican style (Asopao de pollo)" +58155510,"SOUPY RICE MIXTURE W/ CHICKEN & POTATOES, P.R.STYLE","Soupy rice mixture with chicken and potatoes, Puerto Rican style" +58155610,"RICE MEAL FRITTER, PUERTO RICAN (ALMOJAMBANA)","Rice meal fritter, Puerto Rican style (Almojabana)" +58155810,"STEWED RICE, P.R. (ARROZ GUISADO)","Stewed rice, Puerto Rican style (arroz guisado)" +58155910,"RICE W/ SQUID, P.R. (ARROZ CON CALAMARES)","Rice with squid, Puerto Rican style (arroz con calamares)" +58156110,"FRIED RICE, P.R. (ARROZ FRITO)","Fried rice, Puerto Rican style (arroz frito)" +58156210,"RICE W/ VIENNA SAUSAGE, P.R. (ARROZ CON SALCHICHAS)","Rice with vienna sausage, Puerto Rican style (arroz con salchichas)" +58156310,"RICE W/ SPANISH SAUSAGE, P.R.","Rice with Spanish sausage, Puerto Rican style" +58156410,"RICE W/ ONIONS, P.R. (ARROZ CON CEBOLLAS)","Rice with onions, Puerto Rican style (arroz con cebollas)" +58156510,"SOUPY RICE, FROM P.R. ASOPAO DE POLLO","Soupy rice from Puerto Rican style Asopao de Pollo (chicken parts reported separately)" +58156610,"PIGEON PEA ASOPAO (ASOPAO DE GRANDULES)","Pigeon pea asopao (Asopao de gandules)" +58156710,"RICE W/ STEWED BEANS, P.R.","Rice with stewed beans, Puerto Rican style" +58157110,"SPICEY RICE PUDDING, P.R.","Spicy rice pudding, Puerto Rican style" +58157210,"RICE PUDDING MADE W/ COCONUT MILK, P.R.","Rice pudding made with coconut milk, Puerto Rican style" +58160000,"BIRYANI WITH VEGETABLES","Biryani with vegetables" +58160110,"RICE W/ BEANS","Rice with beans" +58160120,"RICE W/ BEANS & TOMATOES","Rice with beans and tomatoes" +58160130,"RICE W/ BEANS & CHICKEN","Rice with beans and chicken" +58160135,"RICE W/ BEANS AND BEEF","Rice with beans and beef" +58160140,"RICE W/ BEANS & PORK","Rice with beans and pork" +58160150,"RED BEANS & RICE","Red beans and rice" +58160160,"HOPPING JOHN (BLACKEYE PEAS & RICE)","Hopping John (blackeye peas and rice)" +58160400,"RICE, WHITE, WITH CORN, NS AS TO FAT ADDED IN COOKING","Rice, white, with corn, NS as to fat added in cooking" +58160410,"RICE, WHITE, WITH CORN, FAT NOT ADDED IN COOKING","Rice, white, with corn, fat not added in cooking" +58160420,"RICE, WHITE, WITH CORN, FAT ADDED IN COOKING","Rice, white, with corn, fat added in cooking" +58160430,"RICE, WHITE, WITH PEAS, NS AS TO FAT ADDED IN COOKING","Rice, white, with peas, NS as to fat added in cooking" +58160440,"RICE, WHITE, WITH PEAS, FAT NOT ADDED IN COOKING","Rice, white, with peas, fat not added in cooking" +58160450,"RICE, WHITE, WITH PEAS, FAT ADDED IN COOKING","Rice, white, with peas, fat added in cooking" +58160460,"RICE, WHITE, WITH CARROTS, NS AS TO FAT ADDED IN COOKING","Rice, white, with carrots, NS as to fat added in cooking" +58160470,"RICE, WHITE, WITH CARROTS, FAT NOT ADDED IN COOKING","Rice, white, with carrots, fat not added in cooking" +58160480,"RICE, WHITE, WITH CARROTS, FAT ADDED IN COOKING","Rice, white, with carrots, fat added in cooking" +58160490,"RICE, WHITE, W/ PEAS&CARROTS, NS AS TO FAT ADDED IN COOKING","Rice, white, with peas and carrots, NS as to fat added in cooking" +58160500,"RICE, WHITE, WITH PEAS AND CARROTS, FAT NOT ADDED IN COOKING","Rice, white, with peas and carrots, fat not added in cooking" +58160510,"RICE, WHITE, WITH PEAS AND CARROTS, FAT ADDED IN COOKING","Rice, white, with peas and carrots, fat added in cooking" +58160520,"RICE, WHITE, W/TOMATOES/TOMATO BASED SAUCE, NS AS TO FAT","Rice, white, with tomatoes (and/or tomato based sauce), NS as to fat added in cooking" +58160530,"RICE, WHITE, W/TOMATOES/ TOMATO BASED SAUCE, FAT NOT ADDED","Rice, white, with tomatoes (and/or tomato based sauce), fat not added in cooking" +58160540,"RICE, WHITE, W/ TOMATOES/TOMATO BASED SAUCE, FAT ADDED","Rice, white, with tomatoes (and/or tomato based sauce), fat added in cooking" +58160550,"RICE, WHITE, WITH DARK GREEN VEGETABLES, NS AS TO FAT ADDED","Rice, white, with dark green vegetables, NS as to fat added in cooking" +58160560,"RICE, WHITE, WITH DARK GREEN VEGS, FAT NOT ADDED IN CO","Rice, white, with dark green vegetables, fat not added in cooking" +58160570,"RICE, WHITE, WITH DARK GREEN VEGETABLES, FAT ADDED IN COOKIN","Rice, white, with dark green vegetables, fat added in cooking" +58160580,"RICE, WHITE, W/ CARROTS, TOMATOES, +/OR TOM SC, NS AS TO FAT","Rice, white, with carrots and tomatoes (and/or tomato-based sauce), NS as to fat added in cooking" +58160590,"RICE, WHITE, W/CARROTS, TOMATOES+/OR TOM SC, FAT NOT ADDED","Rice, white, with carrots and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58160600,"RICE, WHITE, W/ CARROTS, TOMATOES +/OR TOM SC, FAT ADDED","Rice, white, with carrots and tomatoes (and/or tomato-based sauce), fat added in cooking" +58160610,"RICE, WHITE, W/ DK GRN VEGS, TOMATOES +/OR TOM SC, NS FAT","Rice, white, with dark green vegetables and tomatoes (and/or tomato-based sauce), NS as to fat added in cooking" +58160620,"RICE, WHITE, W/ DK GRN VEGS, TOMATOES +/OR TOM SC, FAT NOT","Rice, white, with dark green vegetables and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58160630,"RICE, WHITE, W/DK GRN VEGS, TOMATOES +/OR TOM SC , FAT ADDED","Rice, white, with dark green vegetables and tomatoes (and/or tomato-based sauce), fat added in cooking" +58160640,"RICE, WHITE, WITH CARROTS AND DARK GREEN VEGS, NS FAT","Rice, white, with carrots and dark green vegetables, NS as to fat added in cooking" +58160650,"RICE, WHITE, WITH CARROTS AND DARK GREEN VEGS, FAT NOT ADDED","Rice, white, with carrots and dark green vegetables, fat not added in cooking" +58160660,"RICE, WHITE, WITH CARROTS AND DARK GREEN VEGS, FAT ADDED","Rice, white, with carrots and dark green vegetables, fat added in cooking" +58160670,"RICE, WHITE, W/ CARROTS, DARK GRN VEG&TOMATO/SC, NS FAT","Rice, white, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), NS as to fat added in cooking" +58160680,"RICE, WHITE, W/ CARROTS, DARK GRN VEG,&TOMATOES, NO FAT","Rice, white, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58160690,"RICE, WHITE, W/ CARROTS, DARK GRN VEG, & TOMATOES, W/ FAT","Rice, white, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), fat added in cooking" +58160700,"RICE, WHITE, WITH OTHER VEGS, NS AS TO FAT ADDED IN COOKING","Rice, white, with other vegetables, NS as to fat added in cooking" +58160710,"RICE, WHITE, WITH OTHER VEGS, FAT NOT ADDED IN COOKING","Rice, white, with other vegetables, fat not added in cooking" +58160720,"RICE, WHITE, WITH OTHER VEGS, FAT ADDED IN COOKING","Rice, white, with other vegetables, fat added in cooking" +58160800,"RICE, WHITE, WITH LENTILS, NS AS TO FAT ADDED IN COOKING","Rice, white, with lentils, NS as to fat added in cooking" +58160805,"RICE, WHITE, WITH LENTILS, FAT ADDED IN COOKING","Rice, white, with lentils, fat added in cooking" +58160810,"RICE, WHITE, WITH LENTILS, FAT NOT ADDED IN COOKING","Rice, white, with lentils, fat not added in cooking" +58161200,"RICE, COOKED W/ COCONUT MILK (ARROZ CON COCO)","Rice, cooked with coconut milk (Arroz con coco)" +58161320,"RICE, BROWN, W/ BEANS","Rice, brown, with beans" +58161325,"RICE, BROWN, W/ BEANS AND TOMATOES","Rice, brown, with beans and tomatoes" +58161420,"RICE, BROWN, W/ CORN, NS AS TO FAT","Rice, brown, with corn, NS as to fat added in cooking" +58161422,"RICE, BROWN, W/ CORN, FAT NOT ADDED","Rice, brown, with corn, fat not added in cooking" +58161424,"RICE, BROWN, W/ CORN, FAT ADDED","Rice, brown, with corn, fat added in cooking" +58161430,"RICE, BROWN, W/ PEAS, NS AS TO FAT","Rice, brown, with peas, NS as to fat added in cooking" +58161432,"RICE, BROWN, W/ PEAS, FAT NOT ADDED","Rice, brown, with peas, fat not added in cooking" +58161434,"RICE, BROWN, W/ PEAS, FAT ADDED","Rice, brown, with peas, fat added in cooking" +58161435,"RICE, BROWN, WITH CARROTS, NS AS TO FAT ADDED IN COOKING","Rice, brown, with carrots, NS as to fat added in cooking" +58161437,"RICE, BROWN, WITH CARROTS, FAT NOT ADDED IN COOKING","Rice, brown, with carrots, fat not added in cooking" +58161439,"RICE, BROWN, WITH CARROTS, FAT ADDED IN COOKING","Rice, brown, with carrots, fat added in cooking" +58161440,"RICE, BROWN, W/ PEAS AND CARROTS, NS AS TO FAT","Rice, brown, with peas and carrots, NS as to fat added in cooking" +58161442,"RICE, BROWN, W/ PEAS AND CARROTS, FAT NOT ADDED","Rice, brown, with peas and carrots, fat not added in cooking" +58161444,"RICE, BROWN, W/ PEAS AND CARROTS, FAT ADDED","Rice, brown, with peas and carrots, fat added in cooking" +58161460,"RICE, BROWN, WITH TOMATOES AND/OR TOMATO BASED SAUCE, NS AS","Rice, brown, with tomatoes (and/or tomato based sauce), NS as to fat added in cooking" +58161462,"RICE, BROWN, WITH TOMATOES AND/OR TOMATO BASED SAUCE, FAT NO","Rice, brown, with tomatoes (and/or tomato based sauce), fat not added in cooking" +58161464,"RICE, BROWN, WITH TOMATOES AND/OR TOMATO BASED SAUCE, FAT AD","Rice, brown, with tomatoes (and/or tomato based sauce), fat added in cooking" +58161470,"RICE, BROWN, WITH DARK GREEN VEGETABLES, NS AS TO FAT ADDED","Rice, brown, with dark green vegetables, NS as to fat added in cooking" +58161472,"RICE, BROWN, WITH DARK GREEN VEGETABLES, FAT NOT ADDED IN CO","Rice, brown, with dark green vegetables, fat not added in cooking" +58161474,"RICE, BROWN, WITH DARK GREEN VEGETABLES, FAT ADDED IN COOKIN","Rice, brown, with dark green vegetables, fat added in cooking" +58161480,"RICE, BROWN, WITH CARROTS &TOMATOES/SC, NS AS TO FAT ADDED","Rice, brown, with carrots and tomatoes (and/or tomato-based sauce), NS as to fat added in cooking" +58161482,"RICE, BROWN, WITH CARROTS & TOMATOES/SC, FAT NOT ADDED IN C","Rice, brown, with carrots and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58161484,"RICE, BROWN, WITH CARROTS & TOMATOES/SC, FAT ADDED IN COOKIN","Rice, brown, with carrots and tomatoes (and/or tomato-based sauce), fat added in cooking" +58161490,"RICE, BROWN, W/ DK GRN VEGS, TOMATOES/SC , NS AS TO FAT","Rice, brown, with dark green vegetables and tomatoes (and/or tomato-based sauce) , NS as to fat added in cooking" +58161492,"RICE, BROWN, W/ DK GRN VEGS, TOMATOES/SC , FAT NOT ADDED","Rice, brown, with dark green vegetables and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58161494,"RICE, BROWN, W/ DK GRN VEGS, TOMATOES/SC , FAT ADDED","Rice, brown, with dark green vegetables and tomatoes (and/or tomato-based sauce), fat added in cooking" +58161500,"RICE, BROWN, WITH CARROTS AND DARK GREEN VEGETABLES, NS FAT","Rice, brown, with carrots and dark green vegetables, NS as to fat added in cooking" +58161502,"RICE, BROWN, WITH CARROTS AND DARK GREEN VEGETABLES, FAT NOT","Rice, brown, with carrots and dark green vegetables, fat not added in cooking" +58161504,"RICE, BROWN, WITH CARROTS AND DARK GREEN VEGETABLES, FAT ADD","Rice, brown, with carrots and dark green vegetables, fat added in cooking" +58161510,"GRAPE LEAVES STUFFED W/ RICE","Grape leaves stuffed with rice" +58161520,"RICE, BROWN, W/CARROTS, DK GRN VEGS,TOMATOES/SC, NS FAT","Rice, brown, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), NS as to fat added in cooking" +58161522,"RICE, BROWN, W/ CARROTS, DK GRN VEGS,TOMATOES/SC, NO FAT","Rice, brown, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), fat not added in cooking" +58161524,"RICE, BROWN, W/CARROTS, DK GRN VEGS,TOMATOES/SC, FAT ADDED","Rice, brown, with carrots, dark green vegetables, and tomatoes (and/or tomato-based sauce), fat added in cooking" +58161530,"RICE, BROWN, W/ OTHER VEGS, NS AS TO FAT ADDED","Rice, brown, with other vegetables, NS as to fat added in cooking" +58161532,"RICE, BROWN, WITH OTHER VEGETABLES, FAT NOT ADDED IN COOKING","Rice, brown, with other vegetables, fat not added in cooking" +58161534,"RICE, BROWN, WITH OTHER VEGETABLES, FAT ADDED IN COOKING","Rice, brown, with other vegetables, fat added in cooking" +58161710,"RICE CROQUETTE","Rice croquette" +58162090,"STUFFED PEPPER W/ MEAT","Stuffed pepper, with meat" +58162110,"STUFFED PEPPER, W/ RICE & MEAT","Stuffed pepper, with rice and meat" +58162120,"STUFFED PEPPER, W/ RICE, MEATLESS","Stuffed pepper, with rice, meatless" +58162130,"STUFFED TOMATO W/ RICE & MEAT","Stuffed tomato, with rice and meat" +58162140,"STUFFED TOMATO W/ RICE, MEATLESS","Stuffed tomato, with rice, meatless" +58162310,"RICE PILAF","Rice pilaf" +58163130,"DIRTY RICE","Dirty rice" +58163310,"FLAVORED RICE MIXTURE","Flavored rice mixture" +58163330,"FLAVORED RICE MIXTURE W/ CHEESE","Flavored rice mixture with cheese" +58163360,"FLAVORED RICE, BROWN & WILD","Flavored rice, brown and wild" +58163380,"FLAVORED RICE&PASTA MIXTURE (INCL RICE-A-RONI)","Flavored rice and pasta mixture" +58163400,"FLAVORED RICE & PASTA MIXTURE, REDUCED SODIUM","Flavored rice and pasta mixture, reduced sodium" +58163410,"SPANISH RICE, FAT ADDED IN COOKING","Spanish rice, fat added in cooking" +58163420,"SPANISH RICE, FAT NOT ADDED IN COOKING","Spanish rice, fat not added in cooking" +58163430,"SPANISH RICE, NS AS TO FAT ADDED IN COOKING","Spanish rice, NS as to fat added in cooking" +58163450,"SPANISH RICE W/ GROUND BEEF","Spanish rice with ground beef" +58163510,"RICE DRESSING (INCLUDE COMBINED W/ BREAD)","Rice dressing" +58164110,"RICE W/ RAISINS","Rice with raisins" +58164210,"RICE DESSERT/SALAD W/ FRUIT","Rice dessert or salad with fruit" +58164500,"RICE, WHITE, WITH CHEESE AND/OR CREAM BASED SAUCE, NS FAT","Rice, white, with cheese and/or cream based sauce, NS as to fat added in cooking" +58164510,"RICE, WHITE, WITH CHEESE AND/OR CREAM BASED SAUCE, FAT NOT A","Rice, white, with cheese and/or cream based sauce, fat not added in cooking" +58164520,"RICE, WHITE, WITH CHEESE AND/OR CREAM BASED SAUCE, FAT ADDED","Rice, white, with cheese and/or cream based sauce, fat added in cooking" +58164530,"RICE, WHITE, WITH GRAVY, NS AS TO FAT ADDED IN COOKING","Rice, white, with gravy, NS as to fat added in cooking" +58164540,"RICE, WHITE, WITH GRAVY, FAT NOT ADDED IN COOKING","Rice, white, with gravy, fat not added in cooking" +58164550,"RICE, WHITE, WITH GRAVY, FAT ADDED IN COOKING","Rice, white, with gravy, fat added in cooking" +58164560,"RICE, WHITE, WITH SOY BASED SAUCE, NS AS TO FAT ADDED IN COO","Rice, white, with soy-based sauce, NS as to fat added in cooking" +58164570,"RICE, WHITE, WITH SOY BASED SAUCE, FAT NOT ADDED IN COOKING","Rice, white, with soy-based sauce, fat not added in cooking" +58164580,"RICE, WHITE, WITH SOY BASED SAUCE, FAT ADDED IN COOKING","Rice, white, with soy-based sauce, fat added in cooking" +58164800,"RICE, BROWN, WITH CHEESE AND/OR CREAM BASED SAUCE, NS FAT","Rice, brown, with cheese and/or cream based sauce, NS as to fat added in cooking" +58164810,"RICE, BROWN, WITH CHEESE AND/OR CREAM BASED SAUCE, FAT NOT A","Rice, brown, with cheese and/or cream based sauce, fat not added in cooking" +58164820,"RICE, BROWN, WITH CHEESE AND/OR CREAM BASED SAUCE, FAT ADDED","Rice, brown, with cheese and/or cream based sauce, fat added in cooking" +58164830,"RICE, BROWN, WITH GRAVY, NS AS TO FAT ADDED IN COOKING","Rice, brown, with gravy, NS as to fat added in cooking" +58164840,"RICE, BROWN, WITH GRAVY, FAT NOT ADDED IN COOKING","Rice, brown, with gravy, fat not added in cooking" +58164850,"RICE, BROWN, WITH GRAVY, FAT ADDED IN COOKING","Rice, brown, with gravy, fat added in cooking" +58164860,"RICE, BROWN, WITH SOY BASED SAUCE, NS AS TO FAT ADDED IN COO","Rice, brown, with soy-based sauce, NS as to fat added in cooking" +58164870,"RICE, BROWN, WITH A SOY BASED SAUCE, FAT NOT ADDED IN COOKI","Rice, brown, with soy-based sauce, fat not added in cooking" +58164880,"RICE, BROWN, WITH SOY BASED SAUCE, FAT ADDED IN COOKING","Rice, brown, with soy-based sauce, fat added in cooking" +58165000,"RICE, WHITE, WITH VEGS, CHEESE +/OR CREAM BASED SC, NS FAT","Rice, white, with vegetables, cheese and/or cream based sauce, NS as to fat added in cooking" +58165010,"RICE, WHITE, WITH VEGS, CHEESE +/OR CREAM BASED SC, FAT NOT","Rice, white, with vegetables, cheese and/or cream based sauce, fat not added in cooking" +58165020,"RICE, WHITE, WITH VEGS, CHEESE +/OR CREAM BASED SC,FAT ADDED","Rice, white, with vegetables, cheese and/or cream based sauce, fat added in cooking" +58165030,"RICE, WHITE, WITH VEGETABLES AND GRAVY, NS AS TO FAT ADDED","Rice, white, with vegetables and gravy, NS as to fat added in cooking" +58165040,"RICE, WHITE, WITH VEGETABLES AND GRAVY, FAT NOT ADDED","Rice, white, with vegetables and gravy, fat not added in cooking" +58165050,"RICE, WHITE, WITH VEGETABLES AND GRAVY, FAT ADDED IN COOKING","Rice, white, with vegetables and gravy, fat added in cooking" +58165060,"RICE, WHITE, WITH VEGETABLES, SOY-BASED SAUCE, NS AS TO FAT","Rice, white, with vegetables, soy-based sauce, NS as to fat added in cooking" +58165070,"RICE, WHITE, WITH VEGETABLES, SOY-BASED SAUCE, FAT NOT ADDED","Rice, white, with vegetables, soy-based sauce, fat not added in cooking" +58165080,"RICE, WHITE, WITH VEGETABLES, SOY-BASED SAUCE, FAT ADDED IN","Rice, white, with vegetables, soy-based sauce, fat added in cooking" +58165400,"RICE, BROWN, WITH VEGS, CHEESE +/OR CREAM BASED SC, NS FAT","Rice, brown, with vegetables, cheese and/or cream based sauce, NS as to fat added in cooking" +58165410,"RICE, BROWN, WITH VEGS, CHEESE +/OR CREAM BASED SC, FAT NOT","Rice, brown, with vegetables, cheese and/or cream based sauce, fat not added in cooking" +58165420,"RICE, BROWN, WITH VEGS, CHEESE +/OR CREAM BASED SC,FAT ADDED","Rice, brown, with vegetables, cheese and/or cream based sauce, fat added in cooking" +58165430,"RICE, BROWN, WITH VEGETABLES AND GRAVY, NS AS TO FAT ADDED I","Rice, brown, with vegetables and gravy, NS as to fat added in cooking" +58165440,"RICE, BROWN, WITH VEGETABLES AND GRAVY, FAT NOT ADDED","Rice, brown, with vegetables and gravy, fat not added in cooking" +58165450,"RICE, BROWN, WITH VEGETABLES AND GRAVY, FAT ADDED IN COOKING","Rice, brown, with vegetables and gravy, fat added in cooking" +58165460,"RICE, BROWN, WITH VEGETABLES, SOY-BASED SAUCE, NS AS TO FAT","Rice, brown, with vegetables, soy-based sauce, NS as to fat added in cooking" +58165470,"RICE, BROWN, WITH VEGETABLES, SOY-BASED SAUCE, FAT NOT ADDED","Rice, brown, with vegetables, soy-based sauce, fat not added in cooking" +58165480,"RICE, BROWN, WITH VEGETABLES, SOY-BASED SAUCE, FAT ADDED","Rice, brown, with vegetables, soy-based sauce, fat added in cooking" +58174000,"UPMA (INDIAN BREAKFAST DISH)","Upma (Indian breakfast dish)" +58175110,"TABBOULEH (INCLUDE TABBULI)","Tabbouleh (bulgar with tomatoes and parsley)" +58200100,"WRAP SANDWICH, W/ MEAT, POULTRY OR FISH, VEGETABLES & RICE","Wrap sandwich, filled with meat, poultry, or fish, vegetables, and rice" +58200200,"WRAP SANDWICH, W/ VEGETABLES & RICE","Wrap sandwich, filled with vegetables and rice" +58200250,"WRAP SANDWICH, W/ VEGETABLES","Wrap sandwich, filled with vegetables" +58200300,"WRAP SANDWICH, W/ MEAT, POULTRY, OR FISH, VEG, RICE & CHEESE","Wrap sandwich, filled with meat, poultry, or fish, vegetables, rice, and cheese" +58301020,"LASAGNA W/ CHEESE & SAUCE (DIET FROZEN MEAL)","Lasagna with cheese and sauce (diet frozen meal)" +58301030,"VEAL LASAGNA (DIET FROZEN MEAL) (INCL LEAN CUISINE)","Veal lasagna (diet frozen meal)" +58301050,"LASAGNA, W/ CHEESE & MEAT SAUCE (DIET FROZEN MEAL)","Lasagna with cheese and meat sauce (diet frozen meal)" +58301080,"LASAGNA W/CHEESE&MEAT SAU,REDUCED FAT&NA(DIET FROZ)","Lasagna with cheese and meat sauce, reduced fat and sodium (diet frozen meal)" +58301110,"VEGETABLE LASAGNA (FROZEN MEAL)","Vegetable lasagna (frozen meal)" +58301150,"ZUCCHINI LASAGNA (DIET FROZEN MEAL)","Zucchini lasagna (diet frozen meal)" +58302000,"MACARONI & CHEESE (DIET FROZEN MEAL)","Macaroni and cheese (diet frozen meal)" +58302050,"BEEF & NOODLES W/ MEAT SCE & CHEESE (DIET FRZ MEAL)","Beef and noodles with meat sauce and cheese (diet frozen meal)" +58302060,"SPAG W/ BEEF, TOM-BASED SAUCE, LOWFAT, RED SODIUM, FRZ, DIET","Spaghetti or noodles with beef in tomato-based sauce, lowfat, reduced sodium (diet frozen meal)" +58302080,"NOODLES W/ VEG, TOM-BASED SAUCE, FRZ, DIET","Noodles with vegetables in tomato-based sauce (diet frozen meal)" +58303100,"RICE W/ BROC CHEESE SCE (FRZ SIDE DISH)","Rice, with broccoli, cheese sauce (frozen side dish)" +58303200,"RICE,GREEN BEANS,WATER CHESTNUTS IN SCE (FRZ DISH)","Rice, with green beans, water chestnuts, in sherry mushroom sauce (frozen side dish)" +58304010,"SPAGHETTI & MEATBALLS DINNER, NFS (FROZEN MEAL)","Spaghetti and meatballs dinner, NFS (frozen meal)" +58304020,"SPAGHETTI,MEATBALLS,TOM SCE,APPLES,BREAD(FROZ MEAL)","Spaghetti and meatballs with tomato sauce, sliced apples, bread (frozen meal)" +58304050,"SPAGHETTI W/ MEAT & MUSHROOM SAUCE (DIET FROZ MEAL)","Spaghetti with meat and mushroom sauce (diet frozen meal)" +58304060,"SPAGHETTI W/ MEAT SAUCE (DIET FROZEN MEAL)","Spaghetti with meat sauce (diet frozen meal)" +58304200,"RAVIOLI, CHEESE-FILLED, TOMATO SCE (DIET FROZ MEAL)","Ravioli, cheese-filled, with tomato sauce (diet frozen meal)" +58304220,"RIGATONI W/ MEAT SCE & CHEESE (DIET FRZ MEAL)","Rigatoni with meat sauce and cheese (diet frozen meal)" +58304230,"RAVIOLI, CHEESE-FILLED W/ VEG & FRUIT (FZN MEAL)","Ravioli, cheese-filled, with vegetable and fruit (frozen meal)" +58304250,"MANICOTTI W/ CHEESE, TOMATO SAUCE (DIET FROZ MEAL)","Manicotti, cheese-filled, with tomato sauce (diet frozen meal)" +58304300,"CANNELLONI, CHEESE-FILLED, TOM SCE (DIET FROZ MEAL)","Cannelloni, cheese-filled, with tomato sauce (diet frozen meal)" +58304400,"LINGUINI W/ VEG & SEAFOOD IN SCE (DIET FROZEN MEAL)","Linguini with vegetables and seafood in white wine sauce (diet frozen meal)" +58305250,"PASTA,W/ VEGETABLES & CHEESE SAUCE (DIET FROZ MEAL)","Pasta with vegetable and cheese sauce (diet frozen meal)" +58306010,"BEEF ENCHILADA DINNER, NFS (FROZEN MEAL)","Beef enchilada dinner, NFS (frozen meal)" +58306020,"BEEF ENCHILADA, GRAVY, RICE, REFRIED BEANS (FROZEN)","Beef enchilada, chili gravy, rice, refried beans (frozen meal)" +58306070,"CHEESE ENCHILADA (FROZEN MEAL)","Cheese enchilada (frozen meal)" +58306100,"CHICKEN ENCHILADA ( DIET FROZEN MEAL)","Chicken enchilada (diet frozen meal)" +58306200,"CHICKEN FAJITAS (DIET FROZEN MEAL)","Chicken fajitas (diet frozen meal)" +58306500,"CHICKEN BURRITOS (DIET FROZEN MEAL)","Chicken burritos (diet frozen meal)" +58310210,"SAUSAGE & FRENCH TOAST (FROZEN MEAL)","Sausage and french toast (frozen meal)" +58310310,"PANCAKE & SAUSAGE (FROZEN MEAL)","Pancakes and sausage (frozen meal)" +58400000,"SOUP, NFS","Soup, NFS" +58400100,"NOODLE SOUP, NFS","Noodle soup, NFS" +58400200,"RICE SOUP, NFS","Rice soup, NFS" +58401010,"BARLEY SOUP, HOME RECIPE, CANNED, OR READY-TO-SERVE","Barley soup, home recipe, canned, or ready-to-serve" +58401200,"BARLEY SOUP, SWEET, WITH OR WITHOUT NUTS, ASIAN STYLE","Barley soup, sweet, with or without nuts, Asian Style" +58402010,"BEEF NOODLE SOUP, CANNED OR READY-TO-SERVE","Beef noodle soup, canned or ready-to-serve" +58402020,"BEEF DUMPLING SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Beef dumpling soup, home recipe, canned or ready-to-serve" +58402030,"BEEF RICE SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Beef rice soup, home recipe, canned or ready-to-serve" +58402100,"BEEF NOODLE SOUP, HOME RECIPE","Beef noodle soup, home recipe" +58403010,"CHICKEN OR TURKEY NOODLE SOUP, CANNED OR READY-TO-SERVE","Chicken or turkey noodle soup, canned or ready-to-serve" +58403040,"CHICKEN OR TURKEY NOODLE SOUP, HOME RECIPE","Chicken or turkey noodle soup, home recipe" +58403050,"CHICKEN OR TURKEY NOODLE SOUP, CREAM OF, HOME RECIPE, CANNED","Chicken or turkey noodle soup, cream of, home recipe, canned, or ready-to-serve" +58403060,"CHICKEN OR TURKEY NOODLE SOUP, REDUCED SODIUM,CANNED, RTF","Chicken or turkey noodle soup, reduced sodium, canned or ready-to-serve" +58403100,"NOODLE & POTATO SOUP, P.R.","Noodle and potato soup, Puerto Rican style" +58404010,"CHICKEN OR TURKEY RICE SOUP, CANNED, OR READY-TO-SERVE","Chicken or turkey rice soup, canned, or ready-to-serve" +58404030,"CHICKEN OR TURKEY RICE SOUP, HOME RECIPE","Chicken or turkey rice soup, home recipe" +58404040,"CHICKEN OR TURKEY RICE SOUP, REDUCED SODIUM, CANNED, PREPARE","Chicken or turkey rice soup, reduced sodium, canned, prepared with water or ready-to-serve" +58404050,"CHICKEN OR TURKEY RICE SOUP, REDUCED SODIUM, CANNED, PREPARE","Chicken or turkey rice soup, reduced sodium, canned, prepared with milk" +58404100,"RICE AND POTATO SOUP, P.R.","Rice and potato soup, Puerto Rican style" +58404500,"MATZO BALL SOUP","Matzo ball soup" +58404510,"CHICKEN OR TURKEY SOUP WITH DUMPLINGS AND POTATOES,","Chicken or turkey soup with dumplings and potatoes, home recipe, canned, or ready-to-serve" +58404520,"CHICKEN OR TURKEY SOUP WITH DUMPLINGS, HOME RECIPE, CANNED O","Chicken or turkey soup with dumplings, home recipe, canned or ready-to-serve" +58407010,"INSTANT SOUP, NOODLE","Instant soup, noodle" +58407030,"SOUP, MOSTLY NOODLES","Soup, mostly noodles" +58407035,"SOUP, MOSTLY NOODLES, REDUCED SODIUM","Soup, mostly noodles, reduced sodium" +58407050,"INSTANT SOUP, NOODLE W/ EGG, SHRIMP OR CHICKEN","Instant soup, noodle with egg, shrimp or chicken" +58408010,"WON TON (WONTON) SOUP","Won ton (wonton) soup" +58408500,"NOODLE SOUP WITH VEGETABLES, ASIAN STYLE","Noodle soup with vegetables, Asian style" +58409000,"NOODLE SOUP,W/ FISH BALL,SHRIMP,&DK GREEN LEAFY VEG","Noodle soup, with fish ball, shrimp, and dark green leafy vegetable" +58421000,"SOPA SECA (DRY SOUP), Mexican style, NFS","Sopa seca (dry soup), Mexican style, NFS" +58421010,"SOPA SECA DE FIDEO, MEXICAN STYLE, MADE WITH DRY NOODLES, HO","Sopa Seca de Fideo, Mexican style, made with dry noodles, home recipe" +58421020,"SOPA DE FIDEO AGUADA, MEXICAN STYLE NOODLE SOUP, HOME RECIPE","Sopa de Fideo Aguada, Mexican style noodle soup, home recipe" +58421060,"SOPA SECA DE ARROZ (DRY RICE SOUP), MEXICAN STYLE, HOME RECI","Sopa seca de arroz (dry rice soup), Mexican style, home recipe" +58421080,"SOPA DE TORTILLA, MEXICAN STYLE TORTILLA SOUP, HOME RECIPE","Sopa de tortilla, Mexican style tortilla soup, home recipe" +58503000,"MACARONI, TOMATOES & BEEF, BABY, NS STR/JR","Macaroni, tomatoes, and beef, baby food, NS as to strained or junior" +58503010,"MACARONI, TOMATOES & BEEF, BABY, STR","Macaroni, tomatoes, and beef, baby food, strained" +58503020,"MACARONI, TOMATOES & BEEF, BABY, JR","Macaroni, tomatoes, and beef, baby food, junior" +58503050,"MACARONI W/ BEEF & TOM SCE, BABY FOOD, TODDLER","Macaroni with beef and tomato sauce, baby food, toddler" +58508000,"MACARONI & CHEESE, BABY, STRAINED","Macaroni and cheese, baby food, strained" +58508300,"MACARONI & CHEESE, BABY, TODDLER","Macaroni and cheese, baby food, toddler" +58509020,"SPAGHETTI, TOMATO SAUCE & BEEF, BABY, JUNIOR","Spaghetti, tomato sauce, and beef, baby food, junior" +58509100,"RAVIOLI, CHEESE-FILLED, W/ TOM SAUCE, BABY, TODDLER","Ravioli, cheese-filled, with tomato sauce, baby food, toddler" +58509200,"MACARONI W/ VEGETABLES, BABY, STRAINED","Macaroni with vegetables, baby food, strained" +59003000,"MEAT SUBSTITUTE,CEREAL- & VEGETABLE PROTEIN-BASED","Meat substitute, cereal- and vegetable protein-based, fried" +61100500,"CALAMONDIN, RAW","Calamondin, raw" +61101010,"GRAPEFRUIT, RAW (INCLUDE GRAPEFRUIT, NFS)","Grapefruit, raw" +61101200,"GRAPEFRUIT, CANNED OR FROZEN, NS AS TO ADDED SWTNER","Grapefruit, canned or frozen, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +61101220,"GRAPEFRUIT, CANNED OR FROZEN, UNSWT, WATER PACK","Grapefruit, canned or frozen, unsweetened, water pack" +61101230,"GRAPEFRUIT, CANNED OR FROZEN, IN LIGHT SYRUP","Grapefruit, canned or frozen, in light syrup" +61104010,"GRAPEFRUIT & ORANGE SECTIONS, RAW","Grapefruit and orange sections, raw" +61104200,"GRAPEFRUIT & ORANGE SEC, CKD/CND/FRZ, NS SWEETENER","Grapefruit and orange sections, cooked, canned, or frozen, NS as to added sweetener" +61104220,"GRAPEFRUIT & ORANGE SEC, CKD/CND/FRZ, UNSWEETENED","Grapefruit and orange sections, cooked, canned, or frozen, unsweetened, water pack" +61104230,"GRAPEFRUIT & ORANGE SEC, CKD/CND/FRZ, LIGHT SYRUP","Grapefruit and orange sections, cooked, canned, or frozen, in light syrup" +61110010,"KUMQUAT, RAW","Kumquat, raw" +61110230,"KUMQUAT, COOKED OR CANNED, IN SYRUP","Kumquat, cooked or canned, in syrup" +61113010,"LEMON, RAW","Lemon, raw" +61113500,"LEMON PIE FILLING","Lemon pie filling" +61116010,"LIME, RAW","Lime, raw" +61119010,"ORANGE, RAW","Orange, raw" +61119020,"ORANGE SECTIONS, CANNED, JUICE PACK","Orange, sections, canned, juice pack" +61119100,"ORANGE PEEL","Orange peel" +61122300,"ORANGES, MANDARIN, CANNED OR FROZEN, SWEETENER NS","Orange, mandarin, canned or frozen, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +61122320,"ORANGES, MANDARIN, CANNED OR FROZEN, JUICE PACK","Orange, mandarin, canned or frozen, juice pack" +61122330,"ORANGES, MANDARIN, CANNED OR FROZEN, IN LIGHT SYRUP","Orange, mandarin, canned or frozen, in light syrup" +61122350,"ORANGES, MANDARIN, CANNED OR FROZEN, DRAINED","Orange, mandarin, canned or frozen, drained" +61125000,"TANGELO, RAW","Tangelo, raw" +61125010,"TANGERINE, RAW (INCLUDE MANDARIN ORANGE, SATSUMA)","Tangerine, raw" +61201010,"GRAPEFRUIT JUICE, FRESHLY SQUEEZED","Grapefruit juice, freshly squeezed" +61201020,"GRAPEFRUIT JUICE, NS AS TO FORM","Grapefruit juice, NS as to form" +61201220,"GRAPEFRUIT JUICE, CANNED, BOTTLED OR IN A CARTON","Grapefruit juice, canned, bottled or in a carton" +61201620,"GRAPEFRUIT JUICE, FROZEN (RECONSTITUTED WITH WATER)","Grapefruit juice, frozen (reconstituted with water)" +61204000,"LEMON JUICE, NS AS TO FORM","Lemon juice, NS as to form" +61204010,"LEMON JUICE, FRESHLY SQUEEZED","Lemon juice, freshly squeezed" +61204200,"LEMON JUICE, CANNED OR BOTTLED","Lemon juice, canned or bottled" +61204600,"LEMON JUICE, FROZEN","Lemon juice, frozen" +61207000,"LIME JUICE, NS AS TO FORM","Lime juice, NS as to form" +61207010,"LIME JUICE, FRESHLY SQUEEZED","Lime juice, freshly squeezed" +61207200,"LIME JUICE, CANNED OR BOTTLED","Lime juice, canned or bottled" +61207600,"LIME JUICE, FROZEN","Lime juice, frozen" +61210000,"ORANGE JUICE, NFS","Orange juice, NFS" +61210010,"ORANGE JUICE, FRESHLY SQUEEZED","Orange juice, freshly squeezed" +61210220,"ORANGE JUICE, CANNED, BOTTLED OR IN A CARTON","Orange juice, canned, bottled or in a carton" +61210250,"ORANGE JUICE, W/ CALCIUM, CAN/BOTTLED/CARTON","Orange juice, with calcium added, canned, bottled or in a carton" +61210620,"ORANGE JUICE, FROZEN (RECONSTITUTED WITH WATER)","Orange juice, frozen (reconstituted with water)" +61210720,"ORANGE JUICE, FROZEN, NOT RECONSTITUTED","Orange juice, frozen, not reconstituted" +61210820,"ORANGE JUICE,FROZ, W/,CALCIUM ADDED,RECON W/WATER","Orange juice, frozen, with calcium added (reconstituted with water)" +61213000,"TANGERINE JUICE, NFS","Tangerine juice, NFS" +61213220,"TANGERINE JUICE, CANNED","Tangerine juice, canned" +61213620,"TANGERINE JUICE, FROZEN (RECONSTITUTED)","Tangerine juice, frozen (reconstituted with water)" +61213800,"FRUIT JUICE BLEND, INCL CITRUS, 100% JUICE","Fruit juice blend, including citrus, 100% juice" +61213900,"FRUIT JUICE BLEND, INCL CITRUS, 100% JUICE, W/ CALCIUM","Fruit juice blend, including citrus, 100% juice, with calcium added" +62101000,"FRUIT, DRIED, NFS (ASSUME UNCOOKED)","Fruit, dried, NFS (assume uncooked)" +62101050,"FRUIT MIXTURE, DRIED","Fruit mixture, dried (mixture includes three or more of the following: apples, apricots, dates, papaya, peaches, pears, pineapples, prunes, raisins)" +62101100,"APPLE, DRIED, UNCOOKED","Apple, dried, uncooked" +62101150,"APPLE, DRIED, UNCOOKED, LOW SODIUM","Apple, dried, uncooked, low sodium" +62101200,"APPLE, DRIED, COOKED, NS AS TO ADDED SWEETENER","Apple, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62101220,"APPLE, DRIED, COOKED, UNSWEETENED","Apple, dried, cooked, unsweetened" +62101230,"APPLE, DRIED, COOKED, W/ SUGAR","Apple, dried, cooked, with sugar" +62101300,"APPLE CHIPS","Apple chips" +62104100,"APRICOT, DRIED, UNCOOKED","Apricot, dried, uncooked" +62104200,"APRICOT, DRIED, COOKED, NS AS TO ADDED SWEETENER","Apricot, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62104220,"APRICOT, DRIED, COOKED, UNSWEETENED","Apricot, dried, cooked, unsweetened" +62104230,"APRICOT, DRIED, COOKED, W/ SUGAR","Apricot, dried, cooked, with sugar" +62105000,"BLUEBERRIES, DRIED","Blueberries, dried" +62106000,"CHERRIES, DRIED","Cherries, dried" +62107100,"BANANA FLAKES, DEHYDRATED","Banana flakes, dehydrated" +62107200,"BANANA CHIPS","Banana chips" +62108100,"CURRANTS, DRIED","Currants, dried" +62109100,"CRANBERRIES, DRIED","Cranberries, dried" +62110100,"DATE","Date" +62113100,"FIG, DRIED, UNCOOKED","Fig, dried, uncooked" +62113200,"FIG, DRIED, COOKED, NS AS TO ADDED SWEETENER","Fig, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62113220,"FIG, DRIED, COOKED, UNSWEETENED","Fig, dried, cooked, unsweetened" +62113230,"FIG, DRIED, COOKED, W/ SUGAR","Fig, dried, cooked, with sugar" +62114000,"LYCHEE, DRIED (LYCHEE NUTS)","Lychee, dried (lychee nuts)" +62114050,"MANGO, DRIED","Mango, dried" +62114110,"PAPAYA, DRIED","Papaya, dried" +62116100,"PEACH, DRIED, UNCOOKED","Peach, dried, uncooked" +62116200,"PEACH, DRIED, COOKED, NS AS TO ADDED SWEETENER","Peach, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62116220,"PEACH, DRIED, COOKED, UNSWEETENED","Peach, dried, cooked, unsweetened" +62116230,"PEACH, DRIED, COOKED, W/ SUGAR","Peach, dried, cooked, with sugar" +62119100,"PEAR, DRIED, UNCOOKED","Pear, dried, uncooked" +62119200,"PEAR, DRIED, COOKED, NS AS TO SWEETENER","Pear, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62119220,"PEAR, DRIED, COOKED, UNSWEETENED","Pear, dried, cooked, unsweetened" +62119230,"PEAR, DRIED, COOKED, W/ SUGAR","Pear, dried, cooked, with sugar" +62120100,"PINEAPPLE, DRIED","Pineapple, dried" +62121100,"PLUM, ROCK SALT, DRIED","Plum, rock salt, dried" +62122100,"PRUNE, DRIED, UNCOOKED","Prune, dried, uncooked" +62122200,"PRUNE, DRIED, COOKED, NS AS TO ADDED SWEETENER","Prune, dried, cooked, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +62122220,"PRUNE, DRIED, COOKED, UNSWEETENED","Prune, dried, cooked, unsweetened" +62122230,"PRUNE, DRIED, COOKED, W/ SUGAR","Prune, dried, cooked, with sugar" +62125100,"RAISINS (INCLUDE CINNAMON-COATED RAISINS)","Raisins" +62125110,"RAISINS, COOKED","Raisins, cooked" +62126000,"TAMARIND PULP, DRIED, SWEETENED (""PULPITAS"")","Tamarind pulp, dried, sweetened (""Pulpitas"")" +63100100,"FRUIT, NS AS TO TYPE","Fruit, NS as to type" +63101000,"APPLE, RAW","Apple, raw" +63101110,"APPLESAUCE, STEWED APPLES, NS AS TO ADDED SWEETENER","Applesauce, stewed apples, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63101120,"APPLESAUCE, STEWED APPLES, UNSWEETENED (INCL FRESH)","Applesauce, stewed apples, unsweetened" +63101130,"APPLESAUCE, STEWED APPLES, W/ SUGAR","Applesauce, stewed apples, with sugar" +63101140,"APPLESAUCE, STEWED APPLES, W/ LOW CALORIE SWEETENER","Applesauce, stewed apples, sweetened with low calorie sweetener" +63101150,"APPLESAUCE / OTHER FRUITS(INCLUDE MOTT'S FRUIT PAK)","Applesauce with other fruits" +63101210,"APPLE, COOKED OR CANNED, W/ SYRUP","Apple, cooked or canned, with syrup" +63101310,"APPLE, BAKED, NS AS TO ADDED SWEETENER","Apple, baked, NS as to added sweetener" +63101320,"APPLE, BAKED, UNSWEETENED","Apple, baked, unsweetened" +63101330,"APPLE, BAKED, W/ SUGAR","Apple, baked, with sugar" +63101410,"APPLE RINGS, FRIED","Apple rings, fried" +63101420,"APPLE, PICKLED (INCLUDE SPICED)","Apple, pickled" +63101500,"APPLE, FRIED","Apple, fried" +63103010,"APRICOT, RAW","Apricot, raw" +63103110,"APRICOT, COOKED OR CANNED, NS AS TO ADDED SWEETENER","Apricot, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63103120,"APRICOT, COOKED OR CANNED, WATER PACK, UNSWEETENED","Apricot, cooked or canned, unsweetened, water pack" +63103130,"APRICOT, COOKED OR CANNED, IN HEAVY SYRUP","Apricot, cooked or canned, in heavy syrup" +63103140,"APRICOT, COOKED OR CANNED, IN LIGHT SYRUP","Apricot, cooked or canned, in light syrup" +63103150,"APRICOT, COOKED OR CANNED, DRAINED SOLIDS","Apricot, cooked or canned, drained solids" +63103170,"APRICOT, COOKED OR CANNED, JUICE PACK","Apricot, cooked or canned, juice pack" +63105010,"AVOCADO, RAW","Avocado, raw" +63107010,"BANANA, RAW","Banana, raw" +63107050,"BANANA, WHITE, RIPE (GUINEO BLANCO MADURO)","Banana, white, ripe (guineo blanco maduro)" +63107070,"BANANA, CHINESE, RAW (INCL CAVENDISH,DWARF,FINGER)","Banana, Chinese, raw" +63107080,"BANANA, RED, RIPE (INCLUDE GUINEO MORADO)","Banana, red, ripe (guineo morado)" +63107090,"BANANA, RED, FRIED","Banana, red, fried" +63107110,"BANANA, BAKED","Banana, baked" +63107210,"BANANA, RIPE, FRIED","Banana, ripe, fried" +63107310,"BANANA, RIPE, BOILED","Banana, ripe, boiled" +63107410,"BANANA, BATTER-DIPPED, FRIED","Banana, batter-dipped, fried" +63109010,"CANTALOUPE (MUSKMELON), RAW (INCLUDE MELON, NFS)","Cantaloupe (muskmelon), raw" +63109610,"CANTALOUPE, FROZEN (BALLS)","Cantaloupe, frozen (balls)" +63109700,"CARAMBOLA (STARFRUIT),RAW","Carambola (starfruit), raw" +63109750,"CARAMBOLA (STARFRUIT), COOKED, W/ SUGAR","Carambola (starfruit), cooked, with sugar" +63110010,"CASSABA MELON, RAW","Cassaba melon, raw" +63111010,"CHERRIES, MARASCHINO","Cherries, maraschino" +63113010,"CHERRIES, SOUR, RED, RAW","Cherries, sour, red, raw" +63113030,"CHERRY PIE FILLING","Cherry pie filling" +63113050,"CHERRY PIE FILLING, LOW CALORIE","Cherry pie filling, low calorie" +63113110,"CHERRIES, SOUR, RED, COOKED, UNSWEETENED","Cherries, sour, red, cooked, unsweetened" +63115010,"CHERRIES, SWEET, RAW (INCLUDE CHERRIES, FRESH, NFS)","Cherries, sweet, raw (Queen Anne, Bing)" +63115110,"CHERRIES, SWEET, COOKED/CANNED,NS AS TO ADDED SWEET","Cherries, sweet, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63115120,"CHERRIES, SWEET, COOKED, UNSWEETENED, WATER PACK","Cherries, sweet, cooked, unsweetened, water pack" +63115130,"CHERRIES, SWEET, COOKED OR CANNED, IN HEAVY SYRUP","Cherries, sweet, cooked or canned, in heavy syrup" +63115140,"CHERRIES, SWEET, COOKED OR CANNED, IN LIGHT SYRUP","Cherries, sweet, cooked or canned, in light syrup" +63115150,"CHERRIES, SWEET, COOKED OR CANNED, DRAINED SOLIDS","Cherries, sweet, cooked or canned, drained solids" +63115170,"CHERRIES, SWEET, COOKED OR CANNED, JUICE PACK","Cherries, sweet, cooked or canned, juice pack" +63115200,"CHERRIES, FROZEN","Cherries, frozen" +63117010,"CURRANTS, RAW","Currants, raw" +63119010,"FIG, RAW","Fig, raw" +63119110,"FIG, COOKED OR CANNED, NS AS TO ADDED SWEETENER","Fig, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63119120,"FIG, COOKED OR CANNED, UNSWEETENED, WATER PACK","Fig, cooked or canned, unsweetened, water pack" +63119130,"FIG, COOKED OR CANNED, IN HEAVY SYRUP","Fig, cooked or canned, in heavy syrup" +63119140,"FIGS, COOKED OR CANNED, IN LIGHT SYRUP","Figs, cooked or canned, in light syrup" +63123000,"GRAPES, RAW, NS AS TO TYPE","Grapes, raw, NS as to type" +63123010,"GRAPES, EUROPEAN TYPE,ADHERENT SKIN,RAW(INCL TOKAY)","Grapes, European type, adherent skin, raw" +63123020,"GRAPES, AMERICAN TYPE, SLIP SKIN, RAW(INCL CONCORD)","Grapes, American type, slip skin, raw" +63123110,"GRAPES, SEEDLESS, COOKED/CANNED, NS ADDED SWEETNER","Grapes, seedless, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63123120,"GRAPES, SEEDLESS, COOKED OR CANNED, UNSWEETENED","Grapes, seedless, cooked or canned, unsweetened, water pack" +63123130,"GRAPES, SEEDLESS, COOKED OR CANNED, IN HEAVY SYRUP","Grapes, seedless, cooked or canned, in heavy syrup" +63125010,"GUAVA, RAW","Guava, raw" +63125100,"GUAVA SHELL (ASSUME CANNED IN HEAVY SYRUP)","Guava shell (assume canned in heavy syrup)" +63126010,"JUNEBERRY, RAW","Juneberry, raw" +63126500,"KIWI FRUIT, RAW","Kiwi fruit, raw" +63126510,"LYCHEE, RAW","Lychee, raw" +63126600,"LYCHEE, COOKED OR CANNED, IN SUGAR OR SYRUP","Lychee, cooked or canned, in sugar or syrup" +63127010,"HONEYDEW MELON, RAW","Honeydew melon, raw" +63127610,"HONEYDEW MELON, FROZEN (BALLS)","Honeydew, frozen (balls)" +63129010,"MANGO, RAW","Mango, raw" +63129020,"MANGO, PICKLED","Mango, pickled" +63129030,"MANGO, COOKED","Mango, cooked" +63131010,"NECTARINE, RAW","Nectarine, raw" +63131110,"NECTARINE, COOKED","Nectarine, cooked" +63133010,"PAPAYA, RAW","Papaya, raw" +63133050,"PAPAYA, GREEN, COOKED","Papaya, green, cooked" +63133100,"PAPAYA, COOKED OR CANNED, IN SUGAR OR SYRUP","Papaya, cooked or canned, in sugar or syrup" +63134010,"PASSION FRUIT, RAW","Passion fruit, raw" +63135010,"PEACH, RAW","Peach, raw" +63135110,"PEACH, COOKED OR CANNED, NS AS TO SWEETENER","Peach, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63135120,"PEACH, COOKED OR CANNED, UNSWEETENED, WATER PACK","Peach, cooked or canned, unsweetened, water pack" +63135130,"PEACH, COOKED OR CANNED, IN HEAVY SYRUP","Peach, cooked or canned, in heavy syrup" +63135140,"PEACH, COOKED OR CANNED, IN LIGHT OR MEDIUM SYRUP","Peach, cooked or canned, in light or medium syrup" +63135150,"PEACH, COOKED OR CANNED, DRAINED SOLIDS","Peach, cooked or canned, drained solids" +63135170,"PEACH, COOKED OR CANNED, JUICE PACK","Peach, cooked or canned, juice pack" +63135610,"PEACH, FROZEN, NS AS TO ADDED SWEETENER","Peach, frozen, NS as to added sweetener" +63135620,"PEACH, FROZEN, UNSWEETENED","Peach, frozen, unsweetened" +63135630,"PEACH, FROZEN, W/ SUGAR","Peach, frozen, with sugar" +63135650,"PEACH, PICKLED","Peach, pickled" +63135660,"PEACH, SPICED","Peach, spiced" +63137010,"PEAR, RAW","Pear, raw" +63137050,"PEAR, JAPANESE, RAW","Pear, Japanese, raw" +63137110,"PEAR, COOKED OR CANNED, NS AS TO ADDED SWEETENER","Pear, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63137120,"PEAR, COOKED OR CANNED, UNSWEETENED, WATER PACK","Pear, cooked or canned, unsweetened, water pack" +63137130,"PEAR, COOKED OR CANNED, IN HEAVY SYRUP","Pear, cooked or canned, in heavy syrup" +63137140,"PEAR, COOKED OR CANNED, IN LIGHT SYRUP","Pear, cooked or canned, in light syrup" +63137150,"PEAR, COOKED OR CANNED, DRAINED SOLIDS","Pear, cooked or canned, drained solids" +63137170,"PEAR, COOKED OR CANNED, JUICE PACK","Pear, cooked or canned, juice pack" +63139010,"PERSIMMONS, RAW","Persimmon, raw" +63141010,"PINEAPPLE, RAW","Pineapple, raw" +63141110,"PINEAPPLE, CANNED, NS AS TO ADDED SWEETENER","Pineapple, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63141120,"PINEAPPLE, COOKED OR CANNED, UNSWEETENED, WATERPACK","Pineapple, cooked or canned, unsweetened, waterpack" +63141130,"PINEAPPLE, COOKED OR CANNED, IN HEAVY SYRUP","Pineapple, cooked or canned, in heavy syrup" +63141140,"PINEAPPLE, COOKED OR CANNED, IN LIGHT SYRUP","Pineapple, cooked or canned, in light syrup" +63141150,"PINEAPPLE, COOKED OR CANNED, DRAINED SOLIDS","Pineapple, cooked or canned, drained solids" +63141170,"PINEAPPLE, COOKED OR CANNED, JUICE PACK","Pineapple, cooked or canned, juice pack" +63143010,"PLUM, RAW","Plum, raw" +63143110,"PLUM, COOKED OR CANNED, NS AS TO ADDED SWEETENER","Plum, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63143120,"PLUM, COOKED OR CANNED, UNSWEETENED, WATER PACK","Plum, cooked or canned, unsweetened, water pack" +63143130,"PLUM, COOKED OR CANNED, IN HEAVY SYRUP","Plum, cooked or canned, in heavy syrup" +63143140,"PLUM, COOKED OR CANNED, IN LIGHT SYRUP","Plum, cooked or canned, in light syrup" +63143150,"PLUM, COOKED OR CANNED, DRAINED SOLIDS","Plum, cooked or canned, drained solids" +63143170,"PLUM, COOKED OR CANNED, JUICE PACK","Plum, cooked or canned, juice pack" +63143650,"PLUM, PICKLED","Plum, pickled" +63145010,"POMEGRANATE, RAW","Pomegranate, raw" +63147010,"RHUBARB, RAW","Rhubarb, raw" +63147110,"RHUBARB, COOKED OR CANNED, NS ADDED SWEETNER","Rhubarb, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63147120,"RHUBARB, COOKED OR CANNED, UNSWEETENED","Rhubarb, cooked or canned, unsweetened" +63147130,"RHUBARB, COOKED OR CANNED, IN HEAVY SYRUP","Rhubarb, cooked or canned, in heavy syrup" +63147140,"RHUBARB, COOKED OR CANNED, IN LIGHT SYRUP","Rhubarb, cooked or canned, in light syrup" +63147150,"RHUBARB, COOKED OR CANNED, DRAINED SOLIDS","Rhubarb, cooked or canned, drained solids" +63147600,"RHUBARB, FROZEN, NS AS TO ADDED SWEETENER","Rhubarb, frozen, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63147620,"RHUBARB, FROZEN, W/ SUGAR","Rhubarb, frozen, with sugar" +63148750,"TAMARIND, RAW","Tamarind, raw" +63149010,"WATERMELON, RAW","Watermelon, raw" +63200100,"BERRIES, RAW, NFS","Berries, raw, NFS" +63200200,"BERRIES, FROZEN, NFS","Berries, frozen, NFS" +63201010,"BLACKBERRIES, RAW","Blackberries, raw" +63201110,"BLACKBERRIES, COOKED OR CANNED, NS ADDED SWEETNER","Blackberries, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63201130,"BLACKBERRIES, COOKED OR CANNED, IN HEAVY SYRUP","Blackberries, cooked or canned, in heavy syrup" +63201600,"BLACKBERRIES, FROZEN","Blackberries, frozen" +63201800,"BLACKBERRIES, FROZEN, SWEETENED, NFS","Blackberries, frozen, sweetened, NS as to type of sweetener" +63203010,"BLUEBERRIES, RAW","Blueberries, raw" +63203110,"BLUEBERRIES, COOKED OR CANNED, NS AS TO SWEETENER","Blueberries, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63203120,"BLUEBERRIES, COOKED OR CANNED, UNSWEET, WATER PACK","Blueberries, cooked or canned, unsweetened, water pack" +63203125,"BLUEBERRIES, COOKED OR CANNED, IN LIGHT SYRUP","Blueberries, cooked or canned, in light syrup" +63203130,"BLUEBERRIES, COOKED OR CANNED, IN HEAVY SYRUP","Blueberries, cooked or canned, in heavy syrup" +63203550,"BLUEBERRIES, FROZEN, SWEETENED","Blueberries, frozen, sweetened" +63203570,"BLUEBERRIES, FROZEN, NS SWEETENED OR UNSWEETENED","Blueberries, frozen, NS as to sweetened or unsweetened" +63203600,"BLUEBERRIES, FROZEN, UNSWEETENED","Blueberries, frozen, unsweetened" +63203700,"BLUEBERRY PIE FILLING","Blueberry pie filling" +63205010,"BOYSENBERRIES, RAW","Boysenberries, raw" +63205600,"BOYSENBERRIES, FROZEN","Boysenberries, frozen" +63207000,"CRANBERRIES, NS AS TO RAW, COOKED OR CANNED","Cranberries, NS as to raw, cooked, or canned" +63207010,"CRANBERRIES, RAW","Cranberries, raw" +63207110,"CRANBERRIES, COOKED OR CANNED (INCL CRANBERRY SCE)","Cranberries, cooked or canned" +63208000,"DEWBERRIES, RAW","Dewberries, raw" +63214000,"HUCKLEBERRIES, RAW","Huckleberries, raw" +63215010,"LOGANBERRIES, RAW","Loganberries, raw" +63215600,"LOGANBERRIES, FROZEN","Loganberries, frozen" +63217010,"MULBERRIES, RAW","Mulberries, raw" +63219000,"RASPBERRIES, RAW, NS AS TO COLOR","Raspberries, raw, NS as to color" +63219010,"RASPBERRIES, BLACK, RAW","Raspberries, black, raw" +63219020,"RASPBERRIES, RED, RAW","Raspberries, red, raw" +63219110,"RASPBERRIES, COOKED OR CANNED, NS ADDED SWEETENER","Raspberries, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63219120,"RASPBERRIES, CKD OR CND, UNSWEETENED, WATER PACK","Raspberries, cooked or canned, unsweetened, water pack" +63219130,"RASPBERRIES, COOKED OR CANNED, IN HEAVY SYRUP","Raspberries, cooked or canned, in heavy syrup" +63219600,"RASPBERRIES, FROZEN, NS AS TO ADDED SWEETNER","Raspberries, frozen, NS as to added sweetener" +63219610,"RASPBERRIES, FROZEN, UNSWEETENED","Raspberries, frozen, unsweetened" +63219620,"RASPBERRIES, FROZEN, W/ SUGAR","Raspberries, frozen, with sugar" +63223020,"STRAWBERRIES, RAW","Strawberries, raw" +63223030,"STRAWBERRIES, RAW, W/ SUGAR","Strawberries, raw, with sugar" +63223110,"STRAWBERRIES, COOKED OR CANNED, NS ADDED SWEETNER","Strawberries, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63223120,"STRAWBERRIES, CKD OR CND, UNSWEETENED, WATER PACK","Strawberries, cooked or canned, unsweetened, water pack" +63223130,"STRAWBERRIES, COOKED OR CANNED, IN SYRUP","Strawberries, cooked or canned, in syrup" +63223600,"STRAWBERRIES, FROZEN, NS AS TO ADDED SWEETNER","Strawberries, frozen, NS as to added sweetener" +63223610,"STRAWBERRIES, FROZEN, UNSWEETENED","Strawberries, frozen, unsweetened" +63223620,"STRAWBERRIES, FROZEN, W/ SUGAR","Strawberries, frozen, with sugar" +63224000,"YOUNGBERRIES, RAW","Youngberries, raw" +63301010,"AMBROSIA","Ambrosia" +63307010,"CRANBERRY-ORANGE RELISH, UNCOOKED","Cranberry-orange relish, uncooked" +63307100,"CRANBERRY-RASPBERRY SAUCE","Cranberry-raspberry Sauce" +63311000,"FRUIT SALAD, FRESH OR RAW, (EXCL CITRUS), NO DRSG","Fruit salad, fresh or raw, (excluding citrus fruits), no dressing" +63311050,"FRUIT SALAD, FRESH OR RAW, (INCL CITRUS), NO DRSG","Fruit salad, fresh or raw, (including citrus fruits), no dressing" +63311080,"FRUIT COCKTAIL OR MIX, FROZEN","Fruit cocktail or mix, frozen" +63311110,"FRUIT COCKTAIL, COOKED OR CANNED, NS ADDED SWEETNER","Fruit cocktail, cooked or canned, NS as to sweetened or unsweetened; sweetened, NS as to type of sweetener" +63311120,"FRUIT COCKTAIL, CKD OR CND, UNSWEET, WATER PACK","Fruit cocktail, cooked or canned, unsweetened, water pack" +63311130,"FRUIT COCKTAIL, COOKED OR CANNED, IN HEAVY SYRUP","Fruit cocktail, cooked or canned, in heavy syrup" +63311140,"FRUIT COCKTAIL, COOKED OR CANNED, IN LIGHT SYRUP","Fruit cocktail, cooked or canned, in light syrup" +63311145,"TROPICAL FRUIT COCKTAIL, COOKED OR CANNED, IN LIGHT SYRUP","Tropical fruit cocktail, cooked or canned, in light syrup" +63311150,"FRUIT COCKTAIL, COOKED OR CANNED, DRAINED SOLIDS","Fruit cocktail, cooked or canned, drained solids" +63311170,"FRUIT COCKTAIL, COOKED OR CANNED, JUICE PACK","Fruit cocktail, cooked or canned, juice pack" +63320100,"FRUIT SALAD, P.R. STYLE (ENSALADA DE FRUTA)","Fruit salad, Puerto Rican style (Mixture includes bananas, papayas, oranges, etc.) (Ensalada de frutas tropicales)" +63401010,"APPLE SALAD W/ DRESSING (INCLUDE WALDORF SALAD)","Apple salad with dressing" +63401015,"APPLE AND GRAPE SALAD W/ YOGURT & WALNUTS","Apple and grape salad with yogurt and walnuts" +63401060,"APPLE, CANDIED (INCLUDE CARAMEL APPLES)","Apple, candied" +63401070,"FRUIT, CHOCOLATE COVERED","Fruit, chocolate covered" +63401990,"BANANA, CHOCOLATE-COVERED, W/ NUTS","Banana, chocolate-covered with nuts" +63402010,"BANANA WHIP","Banana whip" +63402030,"PRUNE WHIP","Prune whip" +63402045,"FRIED DWARF BANANA, PUERTO RICAN STYLE","Fried dwarf banana, Puerto Rican style" +63402050,"FRIED DWARF BANANA W/ CHEESE, PUERTO RICAN STYLE","Fried dwarf banana with cheese, Puerto Rican style" +63402950,"FRUIT SALAD (NO CITRUS) W/ SALAD DRESSING","Fruit salad (excluding citrus fruits) with salad dressing or mayonnaise" +63402960,"FRUIT SALAD (EXCLUDING CITRUS FRUITS) WITH WHIPPED CREAM","Fruit salad (excluding citrus fruits) with whipped cream" +63402970,"FRUIT SALAD (EXCLUDING CITRUS FRUITS) WITH NONDAIRY WHIPPED","Fruit salad (excluding citrus fruits) with nondairy whipped topping" +63402980,"FRUIT SALAD (NO CITRUS) W/ MARSHMALLOWS","Fruit salad (excluding citrus fruits) with marshmallows" +63402990,"FRUIT SALAD (W/ CITRUS) W/ PUDDING","Fruit salad (including citrus fruits) with pudding" +63403000,"FRUIT SALAD (NO CITRUS FRUITS) W/ PUDDING","Fruit salad (excluding citrus fruits) with pudding" +63403010,"FRUIT SALAD (INCL CITRUS FRUITS) W/ SALAD DRESSING","Fruit salad (including citrus fruits) with salad dressing or mayonnaise" +63403020,"FRUIT SALAD (INCLUDING CITRUS FRUIT) WITH WHIPPED CREAM","Fruit salad (including citrus fruit) with whipped cream" +63403030,"FRUIT SALAD (INCLUDING CITRUS FRUITS) WITH NONDAIRY WHIPPED","Fruit salad (including citrus fruits) with nondairy whipped topping" +63403040,"FRUIT SALAD W/ MARSHMALLOWS","Fruit salad (including citrus fruits) with marshmallows" +63403100,"FRUIT DESSERT W/ CREAM & OR PUDDING & NUTS","Fruit dessert with cream and/or pudding and nuts" +63403150,"LIME SOUFFLE (INCLUDE OTHER CITRUS FRUITS)","Lime souffle" +63409010,"GUACAMOLE","Guacamole" +63409020,"CHUTNEY","Chutney" +63411010,"CRANBERRY SALAD, CONGEALED","Cranberry salad, congealed" +63413010,"PINEAPPLE SALAD W/ DRESSING","Pineapple salad with dressing" +63415100,"SOUP, FRUIT","Soup, fruit" +63420100,"FRUIT JUICE BAR, FROZEN, ORANGE FLAVOR","Fruit juice bar, frozen, orange flavor" +63420110,"FRUIT JUICE BAR, FROZEN, FLAVOR OTHER THAN ORANGE","Fruit juice bar, frozen, flavor other than orange" +63420200,"FRUIT JUICE BAR, FROZ, LOW CAL SWEETNER, NOT ORANGE","Fruit juice bar, frozen, sweetened with low calorie sweetener, flavors other than orange" +63430100,"SORBET, FRUIT, NONCITRUS FLAVOR","Sorbet, fruit, noncitrus flavor" +63430110,"SORBET, FRUIT, CITRUS FLAVOR","Sorbet, fruit, citrus flavor" +63430500,"FRUIT JUICE BAR W/ CREAM, FROZEN","Fruit juice bar with cream, frozen" +64100100,"FRUIT JUICE, NFS","Fruit juice, NFS" +64100110,"FRUIT JUICE BLEND, 100% JUICE","Fruit juice blend, 100% juice" +64100200,"FRUIT JUICE BLEND, WITH CRANBERRY, 100% JUICE","Fruit juice blend, with cranberry, 100% juice" +64101010,"APPLE CIDER (INCLUDE CIDER, NFS)","Apple cider" +64104010,"APPLE JUICE","Apple juice" +64104600,"BLACKBERRY JUICE (INCL BOYSENBERRY JUICE)","Blackberry juice" +64105400,"CRANBERRY JUICE, 100%, NOT A BLEND","Cranberry juice, 100%, not a blend" +64116020,"GRAPE JUICE","Grape juice" +64120010,"PAPAYA JUICE","Papaya juice" +64121000,"PASSION FRUIT JUICE","Passion fruit juice" +64124020,"PINEAPPLE JUICE","Pineapple juice" +64126000,"POMEGRANATE JUICE","Pomegranate juice" +64132010,"PRUNE JUICE","Prune juice" +64132500,"STRAWBERRY JUICE","Strawberry juice" +64133100,"WATERMELON JUICE","Watermelon juice" +64134000,"FRUIT SMOOTHIE DRINK, W/ FRUIT OR JUICE ONLY (NO DAIRY)","Fruit smoothie drink, made with fruit or fruit juice only (no dairy products)" +64200100,"FRUIT NECTAR, NFS","Fruit nectar, NFS" +64201010,"APRICOT NECTAR","Apricot nectar" +64201500,"BANANA NECTAR","Banana nectar" +64202010,"CANTALOUPE NECTAR","Cantaloupe nectar" +64203020,"GUAVA NECTAR","Guava nectar" +64204010,"MANGO NECTAR","Mango nectar" +64205010,"PEACH NECTAR","Peach nectar" +64210010,"PAPAYA NECTAR","Papaya nectar" +64213010,"PASSION FRUIT NECTAR","Passion fruit nectar" +64215010,"PEAR NECTAR","Pear nectar" +64221010,"SOURSOP (GUANABANA) NECTAR","Soursop (Guanabana) nectar" +64401000,"VINEGAR","Vinegar" +67100100,"FRUIT, BABY, NFS","Fruit, baby food, NFS" +67100110,"FRUIT BAR, WITH ADDED VITAMIN C, BABY FOOD, TODDLER","Fruit bar, with added vitamin C, baby food, toddler" +67100200,"TROPICAL FRUIT MEDLEY, BABY FOOD, STRAINED","Tropical fruit medley, baby food, strained" +67100300,"APPLES, BABY, TODDLER","Apples, baby food, toddler" +67101000,"APPLE-RASPBERRY, BABY, NS AS TO STRAINED OR JUNIOR","Apple-raspberry, baby food, NS as to strained or junior" +67101010,"APPLE-RASPBERRY, BABY, STRAINED","Apple-raspberry, baby food, strained" +67101020,"APPLE-RASPBERRY, BABY, JUNIOR","Apple-raspberry, baby food, junior" +67102000,"APPLESAUCE, BABY, NS AS TO STRAINED OR JUNIOR","Applesauce, baby food, NS as to strained or junior" +67102010,"APPLESAUCE, BABY, STRAINED","Applesauce, baby food, strained" +67102020,"APPLESAUCE, BABY, JUNIOR","Applesauce, baby food, junior" +67104000,"APPLESAUCE & APRICOTS, BABY, NS AS TO STR OR JR","Applesauce and apricots, baby food, NS as to strained or junior" +67104010,"APPLESAUCE & APRICOTS, BABY, STRAINED","Applesauce and apricots, baby food, strained" +67104020,"APPLESAUCE & APRICOTS, BABY, JUNIOR","Applesauce and apricots, baby food, junior" +67104030,"APPLESAUCE W/ BANANAS, BABY, NS STRAINED/JUNIOR","Applesauce with bananas, baby food, NS as to strained or junior" +67104040,"APPLESAUCE W/ BANANAS, BABY, STRAINED","Applesauce with bananas, baby food, strained" +67104060,"APPLESAUCE W/ BANANAS, BABY, JUNIOR","Applesauce with bananas, baby food, junior" +67104070,"APPLESAUCE W/ CHERRIES, BABY, STRAINED","Applesauce with cherries, baby food, strained" +67104080,"APPLESAUCE W/ CHERRIES, BABY, JUNIOR","Applesauce with cherries, baby food, junior" +67104090,"APPLESAUCE W/ CHERRIES, BABY, NS STRAINED/JUNIOR","Applesauce with cherries, baby food, NS as to strained or junior" +67105030,"BANANAS,BABY FOOD,STRAINED","Bananas, baby food, strained" +67106010,"BANANAS W/ APPLES & PEARS, BABY, STRAINED","Bananas with apples and pears, baby food, strained" +67106050,"BANANA WITH MIXED BERRIES, BABY FOOD, STRAINED","Banana with mixed berries, baby food, strained" +67108000,"PEACHES, BABY, NS AS TO STRAINED OR JUNIOR","Peaches, baby food, NS as to strained or junior" +67108010,"PEACHES, BABY, STRAINED","Peaches, baby food, strained" +67108020,"PEACHES, BABY, JUNIOR","Peaches, baby food, junior" +67108030,"PEACHES, BABY, TODDLER","Peaches, baby food, toddler" +67109000,"PEARS, BABY, NS AS TO STRAINED OR JUNIOR","Pears, baby food, NS as to strained or junior" +67109010,"PEARS, BABY, STRAINED","Pears, baby food, strained" +67109020,"PEARS, BABY, JUNIOR","Pears, baby food, junior" +67109030,"PEARS, BABY, TODDLER","Pears, baby food, toddler" +67110000,"PRUNES, BABY, STRAINED","Prunes, baby food, strained" +67113000,"APPLES & PEARS, BABY, NS AS TO STRAINED OR JUNIOR","Apples and pears, baby food, NS as to strained or junior" +67113010,"APPLES & PEARS, BABY, STRAINED","Apples and pears, baby food, strained" +67113020,"APPLES & PEARS, BABY, JUNIOR","Apples and pears, baby food, junior" +67114000,"PEARS & PINEAPPLE, BABY, NS AS TO STR OR JR","Pears and pineapple, baby food, NS as to strained or junior" +67114010,"PEARS & PINEAPPLE, BABY, STRAINED","Pears and pineapple, baby food, strained" +67114020,"PEARS & PINEAPPLE, BABY, JUNIOR","Pears and pineapple, baby food, junior" +67202000,"APPLE JUICE, BABY","Apple juice, baby food" +67202010,"APPLE JUICE, W/ CALCIUM, BABY","Apple juice, with added calcium, baby food" +67203000,"APPLE W/ OTHER FRUIT JUICE, BABY","Apple with other fruit juice, baby food" +67203200,"APPLE-BANANA JUICE, BABY","Apple-banana juice, baby food" +67203400,"APPLE-CHERRY JUICE, BABY","Apple-cherry juice, baby food" +67203450,"APPLE-CRANBERRY JUICE, BABY","Apple-cranberry juice, baby food" +67203500,"APPLE-GRAPE JUICE, BABY","Apple-grape juice, baby food" +67203600,"APPLE-PEACH JUICE, BABY","Apple-peach juice, baby food" +67203700,"APPLE-PRUNE JUICE, BABY","Apple-prune juice, baby food" +67203800,"GRAPE JUICE, BABY","Grape juice, baby food" +67204000,"MIXED FRUIT JUICE, NOT CITRUS, BABY","Mixed fruit juice, not citrus, baby food" +67204100,"MIXED FRUIT JUICE, NOT CITRUS, W/ CALCIUM, BABY","Mixed fruit juice, not citrus, with added calcium, baby food" +67205000,"ORANGE JUICE, BABY","Orange juice, baby food" +67211000,"ORANGE-APPLE-BANANA JUICE, BABY","Orange-apple-banana juice, baby food" +67212000,"PEAR JUICE, BABY FOOD","Pear juice, baby food" +67230000,"APPLE-SWEET POTATO-JUICE,BABY FOOD","Apple-sweet potato juice, baby food" +67230500,"ORANGE-CARROT JUICE, BABY FOOD","Orange-carrot juice, baby food" +67250100,"BANANA JUICE W/ LOWFAT YOGURT, BABY FOOD","Banana juice with lowfat yogurt, baby food" +67250150,"MIXED FRUIT JUICE W/ LOWFAT YOGURT, BABY FOOD","Mixed fruit juice with lowfat yogurt, baby food" +67260000,"FRUIT JUICE DRINK, BABY, W/ HI VIT C + CA, B VITS","Fruit juice drink, baby, with high vitamin C plus added calcium and B vitamins" +67304000,"PLUMS, BABY, NS AS TO STRAINED OR JUNIOR","Plums, baby food, NS as to strained or junior" +67304010,"PLUMS, BABY, STRAINED","Plums, baby food, strained" +67304020,"PLUMS, BABY, JUNIOR","Plums, baby food, junior" +67304030,"PLUMS, BANANAS & RICE, BABY, STRAINED","Plums, bananas, and rice, baby food strained" +67304500,"PRUNES W/ OATMEAL, BABY, STRAINED","Prunes with oatmeal, baby food, strained" +67307000,"APRICOTS, BABY, NS AS TO STR OR JR","Apricots, baby food, NS as to strained or junior" +67307010,"APRICOTS, BABY, STRAINED","Apricots, baby food, strained" +67307020,"APRICOTS, BABY, JUNIOR","Apricots, baby food, junior" +67308000,"BANANAS, BABY, NS AS TO STR OR JR","Bananas, baby food, NS as to strained or junior" +67308020,"BANANAS, BABY, JUNIOR","Bananas, baby food, junior" +67309000,"BANANAS & PINEAPPLE, BABY,NS AS TO STR/JR","Bananas and pineapple, baby food, NS as to strained or junior" +67309010,"BANANAS & PINEAPPLE, BABY, STRAINED","Bananas and pineapple, baby food, strained" +67309020,"BANANAS & PINEAPPLE, BABY, JUNIOR","Bananas and pineapple, baby food, junior" +67309030,"BANANAS AND STRAWBERRY, BABY FOOD, JUNIOR","Bananas and strawberry, baby food, junior" +67404000,"FRUIT DESSERT, BABY, NS AS TO STR OR JR","Fruit dessert, baby food, NS as to strained or junior" +67404010,"FRUIT DESSERT, BABY, STRAINED","Fruit dessert, baby food, strained" +67404020,"FRUIT DESSERT, BABY, JUNIOR","Fruit dessert, baby food, junior" +67404050,"FRUIT SUPREME DESSERT, BABY, ALL FLAVORS","Fruit Supreme dessert, baby food" +67404070,"APPLE YOGURT DESSERT, BABY, STRAINED","Apple yogurt dessert, baby food, strained" +67404110,"BANANA APPLE DESSERT, BABY FOOD, STRAINED","Banana apple dessert, baby food, strained" +67404300,"BLUEBERRY YOGURT DESSERT, BABY, STRAINED","Blueberry yogurt dessert, baby food, strained" +67404500,"MIXED FRUIT YOGURT DESSERT, BABY, STRAINED","Mixed fruit yogurt dessert, baby food, strained" +67404550,"CHERRY COBBLER, BABY, JUNIOR","Cherry cobbler, baby food, junior" +67405000,"PEACH COBBLER, BABY, NS AS TO STRAINED OR JUNIOR","Peach cobbler, baby food, NS as to strained or junior" +67405010,"PEACH COBBLER, BABY, STRAINED","Peach cobbler, baby food, strained" +67405020,"PEACH COBBLER, BABY, JUNIOR","Peach cobbler, baby food, junior" +67408010,"BANANA PUDDING, BABY, STRAINED","Banana pudding, baby food, strained" +67408500,"BANANA YOGURT DESSERT, BABY, STRAINED","Banana yogurt dessert, baby food, strained" +67410000,"CHERRY VANILLA PUDDING, BABY","Cherry vanilla pudding, baby food, strained" +67412000,"DUTCH APPLE DESSERT, BABY, NS AS TO STR OR JR","Dutch apple dessert, baby food, NS as to strained or junior" +67412010,"DUTCH APPLE DESSERT, BABY, STRAINED","Dutch apple dessert, baby food, strained" +67412020,"DUTCH APPLE DESSERT, BABY, JUNIOR","Dutch apple dessert, baby food, junior" +67413700,"PEACH YOGURT DESSERT, BABY, STRAINED","Peach yogurt dessert, baby food, strained" +67414010,"PINEAPPLE DESSERT, BABY, STRAINED","Pineapple dessert, baby food, strained" +67414100,"MANGO DESSERT, BABY","Mango dessert, baby food" +67415000,"TUTTI-FRUITTI PUDDING, BABY, NS AS TO STR OR JR","Tutti-fruitti pudding, baby food, NS as to strained or junior" +67415010,"TUTTI-FRUTTI PUDDING, BABY, STRAINED","Tutti-fruitti pudding, baby food, strained" +67415020,"TUTTI-FRUITTI PUDDING, BABY, JUNIOR","Tutti-fruitti pudding, baby food, junior" +67430000,"FRUIT FLAVORED SNACK, BABY FOOD","Fruit flavored snack, baby food" +67430500,"YOGURT AND FRUIT SNACK, BABY FOOD","Yogurt and fruit snack, baby food" +67501000,"APPLES & CHICKEN, BABY FOOD, STRAINED","Apples and chicken, baby food, strained" +67501100,"APPLES W/ HAM, BABY, STRAINED","Apples with ham, baby food, strained" +67600100,"APPLES & SWEET POTATOES, BABY, STRAINED","Apples and sweet potatoes, baby food, strained" +71000100,"WHITE POTATO, NFS","White potato, NFS" +71001000,"WHITE POTATO, RAW, W/ OR W/O PEEL","White potato, raw, with or without peel (assume peel not eaten)" +71050000,"WHITE POTATO, DRY, POWDERED, NOT RECONSTITUTED","White potato, dry, powdered, not reconstituted" +71101000,"WHITE POTATO, BAKED, PEEL NOT EATEN","White potato, baked, peel not eaten" +71101100,"WHITE POT,BAKED,PEEL EATEN,NS TO FAT ADDED IN COOK","White potato, baked, peel eaten, NS as to fat added in cooking" +71101110,"WHITE POT,BAKED,PEEL EATEN,FAT NOT ADDED IN COOKING","White potato, baked, peel eaten, fat not added in cooking" +71101120,"WHITE POT, BAKED,PEEL EATEN, FAT ADDED IN COOKING","White potato, baked, peel eaten, fat added in cooking" +71101150,"WHITE POTATO SKINS, W/ ADHERING FLESH, BAKED","White potato skins, with adhering flesh, baked" +71103000,"WHITE POTATO, BOILED, W/O PEEL, NS AS TO FAT","White potato, boiled, without peel, NS as to fat added in cooking" +71103010,"WHITE POTATO, BOILED, W/O PEEL, FAT NOT ADDED","White potato, boiled, without peel, fat not added in cooking" +71103020,"WHITE POTATO, BOILED, W/O PEEL, FAT ADDED","White potato, boiled, without peel, fat added in cooking" +71103100,"WHITE POTATO, BOILED W/ PEEL, PEEL NOT EATEN, NS AS TO FAT","White potato, boiled with peel, peel not eaten, NS as to fat added in cooking" +71103110,"WHITE POTATO, BOILED W/PEEL, PEEL NOT EATEN, FAT NOT ADDED","White potato, boiled with peel, peel not eaten, fat not added in cooking" +71103120,"WHITE POTATO, BOILED W/ PEEL, PEEL NOT EATEN, FAT ADDED","White potato, boiled with peel, peel not eaten, fat added in cooking" +71103200,"WHITE POTATO, CANNED, LOW SODIUM,NS AS TO ADDED FAT","White potato, boiled, without peel, canned, low sodium, NS as to fat added in cooking" +71103210,"WHITE POTATO, CANNED, LOW SODIUM, NO FAT ADDED","White potato, boiled, without peel, canned, low sodium, fat not added in cooking" +71103220,"WHITE POTATO, CANNED, LOW SODIUM, FAT ADDED","White potato, boiled, without peel, canned, low sodium, fat added in cooking" +71104000,"WHITE POTATO, ROASTED, NS FAT ADDED","White potato, roasted, NS as to fat added in cooking" +71104010,"WHITE POTATO, ROASTED, FAT NOT ADDED","White potato, roasted, fat not added in cooking" +71104020,"WHITE POTATO, ROASTED, FAT ADDED","White potato, roasted, fat added in cooking" +71106000,"STEWED POTATOES, P.R. (PAPAS GUISADAS)","Stewed potatoes, Puerto Rican style (Papas guisadas)" +71106010,"POTATO ONLY FROM P.R. MIXED DISHES","Potato only from Puerto Rican mixed dishes, gravy and other components reported separately" +71106020,"POTATO FROM PUERTO RICAN STYLE,POT ROAST, W/ GRAVY","Potato from Puerto Rican style stuffed pot roast, with gravy" +71106050,"POTATO FROM PUERTO RICAN BEEF STEW, W/ GRAVY","Potato from Puerto Rican beef stew, with gravy" +71106070,"POTATO FROM PUERTO RICAN CHICKEN FRICASSEE, W/ SCE","Potato from Puerto Rican chicken fricassee, with sauce" +71201015,"WHITE POTATO CHIPS, REGULAR CUT","White potato chips, regular cut" +71201020,"WHITE POTATO CHIPS, RUFFLED/RIPPLED/CRINKLE CUT","White potato chips, ruffled, rippled, or crinkle cut" +71201050,"WHITE POTATO, CHIPS, REDUCED FAT","White potato, chips, reduced fat" +71201080,"WHITE POTATO, CHIPS, FAT FREE","White potato, chips, fat free" +71201090,"WHITE POTATO, CHIPS, FAT FREE, W/ OLEAN","White potato, chips, fat free, made with Olean" +71201100,"WHITE POTATO, CHIPS, RESTRUCTURED","White potato, chips, restructured" +71201200,"WHITE POTATO, CHIPS, RESTRUCTURED, RED FAT/SODIUM","White potato, chips, restructured, reduced fat and reduced sodium" +71201210,"WHITE POTATO, CHIPS, RESTRUCTURED, FAT FREE, W/ OLEAN","White potato, chips, restructured, fat free, made with Olean" +71201250,"WHITE POTATO, CHIPS, RESTRUCTURED, BAKED","White potato, chips, restructured, baked" +71201300,"POTATO-BASED SNACKS, REDUCED FAT, LOW SODIUM","Potato based snacks, reduced fat, low sodium, all flavors" +71202000,"WHITE POTATO, CHIPS, UNSALTED","White potato, chips, unsalted" +71202100,"WHITE POTATO, CHIPS, UNSALTED, REDUCED FAT","White potato, chips, unsalted, reduced fat" +71202500,"WHITE POTATO CHIPS, LIGHTLY SALTED","White potato chips, lightly salted" +71204000,"POTATO PUFFS, CHEESE-FILLED","Potato puffs, cheese-filled" +71205000,"WHITE POTATO, STICKS","White potato, sticks" +71211000,"WHITE POTATO SKINS, CHIPS","White potato skins, chips" +71220000,"VEGETABLE CHIPS","Vegetable chips" +71301000,"WHITE POTATO, COOKED, W/ SAUCE, NS AS TO SAUCE","White potato, cooked, with sauce, NS as to sauce" +71301020,"WHITE POTATO, COOKED, WITH CHEESE","White potato, cooked, with cheese" +71301120,"WHITE POTATO, COOKED, WITH HAM AND CHEESE","White potato, cooked, with ham and cheese" +71305010,"WHITE POTATO, SCALLOPED","White potato, scalloped" +71305110,"WHITE POTATO, SCALLOPED, W/ HAM","White potato, scalloped, with ham" +71401000,"WHITE POTATO, FRENCH FRIES, NS AS TO FROM FRESH/FRZ","White potato, french fries, NS as to from fresh or frozen" +71401010,"WHITE POTATO, FRENCH FRIES, FROM FRESH, DEEP-FRIED","White potato, french fries, from fresh, deep fried" +71401015,"WHITE POTATO, FRENCH FRIES, FROM FRESH, OVEN BAKED","White potato, french fries, from fresh, oven baked" +71401020,"WHITE POTATO, FRENCH FRIES, FROM FROZEN, OVEN-BAKED","White potato, french fries, from frozen, oven baked" +71401030,"WHITE POTATO, FRENCH FRIES, FRM FRZ, DEEP FRD, FF/REST","White potato, french fries, from frozen, deep fried, from fast food / restaurant" +71401035,"WHITE POTATO, FRENCH FRIES, FR FRZN, NS AS TO FRIED OR BKD","White potato, french fries, from frozen, NS as to deep fried or oven baked" +71402500,"WHITE POTATO, FRENCH FRIES, W/ CHEESE","White potato, french fries, with cheese" +71402505,"WHITE POTATO, FRENCH FRIES, W/ CHEESE AND BACON","White potato, french fries, with cheese and bacon" +71402510,"WHITE POTATO, FRENCH FRIES, W/ CHILI & CHEESE","White potato, french fries, with chili and cheese" +71402520,"WHITE POTATO, FRENCH FRIES, W/ CHILI CON CARNE","White potato, french fries, with chili con carne" +71403000,"WHITE POTATO, HOME FRIES","White potato, home fries" +71403500,"WHITE POTATO, HOME FRIES, W/ GREEN/RED PEPPERS & ONIONS","White potato, home fries, with green or red peppers and onions" +71405000,"WHITE POTATO, HASH BROWN","White potato, hash brown, NS as to from fresh, frozen, or dry mix" +71405010,"WHITE POTATO, HASH BROWN, FROM FRESH","White potato, hash brown, from fresh" +71405020,"WHITE POTATO, HASH BROWN, FROM FROZEN","White potato, hash brown, from frozen" +71405030,"WHITE POTATO, HASH BROWN, FROM DRY MIX","White potato, hash brown, from dry mix" +71405100,"WHITE POTATO, HASH BROWN W/ CHEESE","White potato, hash brown, with cheese" +71410000,"WHITE POTATO SKINS, W/ ADHERING FLESH, FRIED","White potato skins, with adhering flesh, fried" +71410500,"WHITE POTATO SKINS W/ FLESH, FRIED, W/ CHEESE","White potato skins, with adhering flesh, fried, with cheese" +71411000,"POTATO SKINS W/ ADHERING FLESH, W/ CHEESE & BACON","White potato skins, with adhering flesh, fried, with cheese and bacon" +71501000,"WHITE POTATO, MASHED, NFS","White potato, mashed, NFS" +71501010,"WHITE POTATO, FRESH, MASHED, MADE W/ MILK","White potato, from fresh, mashed, made with milk" +71501015,"WHITE POTATO, FRESH, MASHED, MADE W/ MILK,/ SOUR CRM/CHEZ","White potato, from fresh, mashed, made with milk, and sour cream and/or cream cheese" +71501020,"WHITE POTATO, FRESH, MASHED, MADE W/ MILK & FAT","White potato, from fresh, mashed, made with milk and fat" +71501025,"WHITE POTATO, FRESH, MASHED, MADE W/ MILK/SOUR CRM/CHEZ &FAT","White potato, from fresh, mashed, made with milk, and sour cream and/or cream cheese and fat" +71501030,"WHITE POTATO, FRESH, MASHED, MADE W/ FAT","White potato, from fresh, mashed, made with fat" +71501040,"WHITE POTATO, DRY, MASHED, MADE W/ MILK & FAT","White potato, from dry, mashed, made with milk and fat" +71501050,"WHITE POTATO, FRESH, MASHED, MADE W/ MILK, FAT & CHEESE","White potato, from fresh, mashed, made with milk, fat and cheese" +71501055,"WHITE POTATO, FRESH, MASHED, MADE W/ SOUR CRM/CHEZ & FAT","White potato, from fresh, mashed, made with sour cream and/or cream cheese and fat" +71501060,"WHITE POTATO, DRY, MASHED, MADE W/ MILK, FAT & EGG","White potato, from dry, mashed, made with milk, fat and egg" +71501070,"WHITE POTATO, DRY, MASHED, MADE W/ MILK, FAT, EGG & CHEESE","White potato, from dry, mashed, made with milk, fat, egg and cheese" +71501080,"WHITE POTATO, FRESH, MASHED, NOT MADE W/ MILK OR FAT","White potato, from fresh, mashed, not made with milk or fat" +71501090,"WHITE POTATO, DRY, MASHED, MADE W/ MILK, NO FAT","White potato, from dry, mashed, made with milk, no fat" +71501200,"WHITE POTATO, COMPLETE DRY MIX, MASHED, MADE W/ WATER","White potato, from complete dry mix, mashed, made with water" +71501300,"WHITE POTATO, DRY, MASHED, NS AS TO MILK OR FAT","White potato, from dry, mashed, NS as to milk or fat" +71501310,"WHITE POTATO, FRESH, MASHED, NS AS TO MILK OR FAT","White potato, from fresh, mashed, NS as to milk or fat" +71503010,"WHITE POTATO, PATTY (INCLUDE POTATO CROQUETTES)","White potato, patty" +71505000,"WHITE POTATO, PUFFS","White potato, puffs" +71507000,"WHITE POTATO, BAKED, STUFFED, PEEL NOT EATEN, NS TOPPING","White potato, stuffed, baked, peel not eaten, NS as to topping" +71507005,"WHITE POTATO,BAKED,STUFF W/ BUTTER/MARG, NO PEEL","White potato, stuffed, baked, peel not eaten, stuffed with butter or margarine" +71507010,"WHITE POTATO, BAKED, STUFFED W/SOUR CREAM, NO PEEL","White potato, stuffed, baked, peel not eaten, stuffed with sour cream" +71507020,"WHITE POT,BAKED, STUFFED W/ CHEESE, PEEL NOT EATEN","White potato, stuffed, baked, peel not eaten, stuffed with cheese" +71507030,"WHITE POT, BAKED, STUFFED W/ CHILI, PEEL NOT EATEN","White potato, stuffed, baked, peel not eaten, stuffed with chili" +71507040,"WHITE POT, BAKED, STUFFED W/BROC&CHEESE SCE,NO PEEL","White potato, stuffed, baked, peel not eaten, stuffed with broccoli and cheese sauce" +71507050,"WHITE POT, BAKED, STUFFD W/ MEAT IN CRM SC, NO PEEL","White potato, stuffed, baked, peel not eaten, stuffed with meat in cream sauce" +71507100,"WHITE POT,BAKD,STUF W/CHIC,BROC,CHEESE,PEEL NOT EAT","White potato, stuffed, baked, peel not eaten, stuffed with chicken, broccoli and cheese sauce" +71508000,"WHITE POTATO, BAKED, STUFFED, PEEL EATEN","White potato, stuffed, baked, peel eaten, NS as to topping" +71508005,"WHITE POTATO,BAKED,STUFF W/ BUTTER/MARG, PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with butter or margarine" +71508010,"WHITE POTATO, BAKED, STUFFED W/SOUR CRM, PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with sour cream" +71508020,"WHITE POTATO, BAKED, STUFFED W/ CHEESE, PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with cheese" +71508030,"WHITE POTATO, BAKED, STUFFED W/ CHILI, PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with chili" +71508040,"WHITE POT, BKD, STUFD W/BROC&CHEESE SCE,PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with broccoli and cheese sauce" +71508050,"WHITE POT,BAKED, STUFFED W/MEAT&CRM SCE,PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with meat in cream sauce" +71508060,"WHITE POT, BAKED, STUFD W/ BACON&CHEESE, PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with bacon and cheese" +71508070,"WHITE POT,STUFF,BAKED,NO PEEL,W/ BACON & CHEESE","White potato, stuffed, baked, peel not eaten, stuffed with bacon and cheese" +71508100,"WHITE POT,BAKED,STUFF W/CHIC,BROC,CHEESE,PEEL EATEN","White potato, stuffed, baked, peel eaten, stuffed with chicken, broccoli and cheese sauce" +71508120,"WHITE POT,STUFF W/HAM,BROC,&CHEESE SAUCE,BKD,W/PEEL","White potato, stuffed with ham, broccoli and cheese sauce, baked, peel eaten" +71601010,"POTATO SALAD WITH EGG, W/ MAYO","Potato salad with egg, made with mayonnaise" +71601015,"POTATO SALAD W/ EGG, MADE W/ LT MAYO","Potato salad with egg, made with light mayonnaise" +71601020,"POTATO SALAD W/ EGG, MADE W/ MAYO-TYPE DRSG","Potato salad with egg, made with mayonnaise-type salad dressing" +71601025,"POTATO SALAD W/ EGG, MADE W/ LT MAYO-TYPE DRSG","Potato salad with egg, made with light mayonnaise-type salad dressing" +71601030,"POTATO SALAD W/ EGG, MADE W/ CREAMY DRSG","Potato salad with egg, made with creamy dressing" +71601035,"POTATO SALAD W/EGG, MADE W/ LT CREAMY DRSG","Potato salad with egg, made with light creamy dressing" +71601040,"POTATO SALAD W/ EGG, MADE W/ ITALIAN DRSG","Potato salad with egg, made with Italian dressing" +71601045,"POTATO SALAD W/ EGG, MADE W/ LT ITALIAN DRSG","Potato salad with egg, made with light Italian dressing" +71601050,"POTATO SALAD W/ EGG, MADE W/ ANY TYPE OF FAT FREE DRSG","Potato salad with egg, made with any type of fat free dressing" +71602010,"POTATO SALAD, GERMAN","Potato salad, German style" +71603010,"POTATO SALAD, MADE WITH MAYONNAISE","Potato salad, made with mayonnaise" +71603015,"POTATO SALAD, W/ LT MAYO","Potato salad, made with light mayonnaise" +71603020,"POTATO SALAD, W/ MAYO-TYPE DRSG","Potato salad, made with mayonnaise-type salad dressing" +71603025,"POTATO SALAD, W/ LT MAYO-TYPE DRSG","Potato salad, made with light mayonnaise-type salad dressing" +71603030,"POTATO SALAD, W/ CREAMY DRSG","Potato salad, made with creamy dressing" +71603035,"POTATO SALAD, W/ LT CREAMY DRSG","Potato salad, made with light creamy dressing" +71603040,"POTATO SALAD, W/ ITALIAN DRESSING","Potato salad, made with Italian dressing" +71603045,"POTATO SALAD, W/ LT ITALIAN DRSG","Potato salad, made with light Italian dressing" +71603050,"POTATO SALAD, W/ ANY TYPE OF FAT FREE DRSG","Potato salad, made with any type of fat free dressing" +71701000,"POTATO PANCAKE","Potato pancake" +71701500,"NORWEGIAN LEFSE, POTATO & FLOUR PANCAKE","Norwegian Lefse, potato and flour pancake" +71702000,"POTATO PUDDING","Potato pudding" +71703000,"STEWED POTATOES, MEXICAN (PAPAS GUISADAS)","Stewed potatoes, Mexican style (Papas guisadas)" +71703040,"STEWED POT W/TOM,MEXICAN(PAPAS GUISADAS CON TOMATE)","Stewed potatoes with tomatoes, Mexican style (Papas guisadas con tomate)" +71704000,"STEWED POTATOES WITH TOMATOES","Stewed potatoes with tomatoes" +71801000,"POTATO SOUP, NS AS TO MADE W/MILK OR WATER","Potato soup, NS as to made with milk or water" +71801010,"POTATO SOUP, CREAM OF, W/ MILK","Potato soup, cream of, prepared with milk" +71801020,"POTATO SOUP, PREPARED W/ WATER","Potato soup, prepared with water" +71801100,"POTATO & CHEESE SOUP","Potato and cheese soup" +71803010,"POTATO CHOWDER (INCL CORN CHOWDER)","Potato chowder" +71851010,"PLANTAIN SOUP, P.R. (SOPA DE PLATANO)","Plantain soup, Puerto Rican style (Sopa de platano)" +71900100,"PLANTAIN, BOILED, NS AS TO GREEN OR RIPE","Plantain, boiled, NS as to green or ripe" +71900200,"PLANTAIN, FRIED, NS TO GREEN OR RIPE","Plantain, fried, NS as to green or ripe" +71901010,"GREEN PLANTAIN, BOILED OR BAKED","Green plantains, boiled" +71901110,"FRIED GREEN PLANTAIN, P.R.","Fried green plantain, Puerto Rican style" +71905000,"RIPE PLANTAIN, RAW","Ripe plantain, raw" +71905010,"RIPE PLANTAIN, BOILED (INCL BAKED RIPE PLANTAIN)","Ripe plantain, boiled" +71905110,"FRIED RIPE PLANTAIN, P.R. (PLATANO MADURO FRITO)","Fried ripe plantain, Puerto Rican style (Platano maduro frito)" +71905120,"PLANTAIN, RIPE, ROLLED IN FLOUR, FRIED","Plantain, ripe, rolled in flour, fried" +71905210,"CANDIED RIPE PLANTAIN, P.R. (PLATANO EN ALMIBAR)","Candied ripe plantain, Puerto Rican style (Platano en almibar)" +71905410,"PLANTAIN CHIPS","Plantain chips" +71910110,"GREEN BANANA (COOKED IN SALT WATER)","Green banana, cooked (in salt water)" +71910210,"GREEN BANANA, FRIED","Green banana, fried" +71910310,"PICKLED GREEN BANANA, P.R","Pickled green bananas, Puerto Rican style (Guineos verdes en escabeche)" +71930090,"CASSAVA (YUCA BLANCA), COOKED, NS AS TO ADDED FAT","Cassava (yuca blanca), cooked, NS as to fat added in cooking" +71930100,"CASSAVA (YUCA BLANCA), COOKED, NO FAT ADDED","Cassava (yuca blanca), cooked, fat not added in cooking" +71930120,"CASSAVA (YUCA BLANCA), COOKED, FAT ADDED","Cassava (yuca blanca), cooked, fat added in cooking" +71930200,"CASABE, CASSAVA BREAD","Casabe, cassava bread" +71931010,"CASSAVA W/ CREOLE SAUCE, P.R. (YUCA AL MAJO)","Cassava with creole sauce, Puerto Rican style (Yuca al mojo)" +71941110,"SWEET POTATOES, WHITE, P.R., FRIED","Sweet potatoes, white, Puerto Rican, fried" +71941120,"SWEET POTATOES, WHITE, P.R., BOILED","Sweet potatoes, white, Puerto Rican, boiled" +71941130,"SWEET POTATOES, WHITE, P.R., ROASTED OR BAKED","Sweet potatoes, white, Puerto Rican, roasted or baked" +71945010,"YAM, PUERTO RICAN, COOKED (NAME HERVIDO)","Yam, Puerto Rican, cooked (Name hervido)" +71945020,"YAM BUNS, P.R. (BUNUELOS DE NAME)","Yam buns, Puerto Rican style (Bunuelos de name)" +71950010,"TANNIER, COOKED (INCLUDE YAUTIA)","Tannier, cooked" +71961010,"CELERIAC, COOKED (INCLUDE P.R. APIO)","Celeriac, cooked" +71962010,"DASHEEN, BOILED (INCLUDE MALANGA)","Dasheen, boiled" +71962020,"DASHEEN, FRIED (INCLUDE MALANGA)","Dasheen, fried" +71962040,"TARO, BAKED","Taro, baked" +71970110,"STARCHY VEGETABLES, P.R. STYLE, NFS (VIANDAS HERVIDAS)","Starchy vegetables, Puerto Rican style, NFS (viandas hervidas)" +71970120,"STARCHY VEGETABLES, P.R., NO PLANTAINS","Starchy vegetables, Puerto Rican style, including tannier, white sweet potato and yam, with green or ripe plantains (viandas hervidas)" +71970130,"STARCHY VEGETABLES, P.R., NO PLANTAINS","Starchy vegetables, Puerto Rican style, including tannier, white sweet potato and yam, no plantain (viandas hervidas)" +71970200,"FUFU (AFRICAN)","Fufu (African)" +71980100,"POI","Poi" +71980200,"TARO CHIPS","Taro chips" +72101100,"BEET GREENS, RAW","Beet greens, raw" +72101200,"BEET GREENS, COOKED, NS AS TO ADDED FAT","Beet greens, cooked, NS as to fat added in cooking" +72101210,"BEET GREENS, COOKED, FAT NOT ADDED","Beet greens, cooked, fat not added in cooking" +72101220,"BEET GREENS, COOKED, FAT ADDED","Beet greens, cooked, fat added in cooking" +72103000,"BROCCOLI RAAB, RAW","Broccoli raab, raw" +72103010,"BROCCOLI RAAB, COOKED, NS AS TO FAT ADDED","Broccoli raab, cooked, NS as to fat added in cooking" +72103020,"BROCCOLI RAAB, COOKED, FAT NOT ADDED","Broccoli raab, cooked, fat not added in cooking" +72103030,"BROCCOLI RAAB, COOKED, FAT ADDED IN COOKING","Broccoli raab, cooked, fat added in cooking" +72104100,"CHARD, RAW","Chard, raw" +72104200,"CHARD, COOKED, NS AS TO ADDED FAT","Chard, cooked, NS as to fat added in cooking" +72104210,"CHARD, COOKED, FAT NOT ADDED","Chard, cooked, fat not added in cooking" +72104220,"CHARD, COOKED, FAT ADDED","Chard, cooked, fat added in cooking" +72107100,"COLLARDS, RAW","Collards, raw" +72107200,"COLLARDS, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Collards, cooked, NS as to form, NS as to fat added in cooking" +72107201,"COLLARDS,COOKED,FROM FRESH,NS FAT ADDED","Collards, cooked, from fresh, NS as to fat added in cooking" +72107202,"COLLARDS,COOKED,FROM FROZEN,NS FAT ADDED","Collards, cooked, from frozen, NS as to fat added in cooking" +72107203,"COLLARDS,COOKED,FROM CANNED,NS FAT ADDED","Collards, cooked, from canned, NS as to fat added in cooking" +72107210,"COLLARDS, COOKED, NS AS TO FORM, FAT NOT ADDED","Collards, cooked, NS as to form, fat not added in cooking" +72107211,"COLLARDS,COOKED,FROM FRESH,FAT NOT ADDED","Collards, cooked, from fresh, fat not added in cooking" +72107212,"COLLARDS,COOKED,FROM FROZEN,FAT NOT ADDED","Collards, cooked, from frozen, fat not added in cooking" +72107213,"COLLARDS,COOKED,FROM CANNED,FAT NOT ADDED","Collards, cooked, from canned, fat not added in cooking" +72107220,"COLLARDS, COOKED, NS AS TO FORM, FAT ADDED","Collards, cooked, NS as to form, fat added in cooking" +72107221,"COLLARDS,COOKED,FROM FRESH,FAT ADDED","Collards, cooked, from fresh, fat added in cooking" +72107222,"COLLARDS,COOKED,FROM FROZEN,FAT ADDED","Collards, cooked, from frozen, fat added in cooking" +72107223,"COLLARDS,COOKED,FROM CANNED,FAT ADDED","Collards, cooked, from canned, fat added in cooking" +72110100,"CRESS, RAW","Cress, raw" +72110200,"CRESS, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Cress, cooked, NS as to form, NS as to fat added in cooking" +72110201,"CRESS, COOKED, FROM FRESH, NS FAT ADDED","Cress, cooked, from fresh, NS as to fat added in cooking" +72110203,"CRESS, COOKED, FROM CANNED, NS FAT ADDED","Cress, cooked, from canned, NS as to fat added in cooking" +72110210,"CRESS, COOKED, NS AS TO FORM, FAT NOT ADDED","Cress, cooked, NS as to form, fat not added in cooking" +72110211,"CRESS, COOKED, FROM FRESH, FAT NOT ADDED","Cress, cooked, from fresh, fat not added in cooking" +72110213,"CRESS, COOKED, FROM CANNED, FAT NOT ADDED","Cress, cooked, from canned, fat not added in cooking" +72110220,"CRESS, COOKED, NS AS TO FORM, FAT ADDED","Cress, cooked, NS as to form, fat added in cooking" +72110221,"CRESS, COOKED, FROM FRESH, FAT ADDED","Cress, cooked, from fresh, fat added in cooking" +72110223,"CRESS, COOKED, FROM CANNED, FAT ADDED","Cress, cooked, from canned, fat added in cooking" +72113100,"DANDELION GREENS, RAW","Dandelion greens, raw" +72113200,"DANDELION GREENS, COOKED, NS AS TO ADDED FAT","Dandelion greens, cooked, NS as to fat added in cooking" +72113210,"DANDELION GREENS, COOKED, FAT NOT ADDED","Dandelion greens, cooked, fat not added in cooking" +72113220,"DANDELION GREENS, COOKED, FAT ADDED","Dandelion greens, cooked, fat added in cooking" +72116000,"ENDIVE, CHICORY, ESCAROLE OR ROMAINE LETTUCE, RAW","Endive, chicory, escarole, or romaine lettuce, raw" +72116150,"CAESAR SALAD (WITH ROMAINE), NO DRESSING","Caesar salad (with romaine), no dressing" +72116200,"ESCAROLE, COOKED, NS AS TO ADDED FAT","Escarole, cooked, NS as to fat added in cooking" +72116210,"ESCAROLE, COOKED, FAT NOT ADDED","Escarole, cooked, fat not added in cooking" +72116220,"ESCAROLE, COOKED, FAT ADDED","Escarole, cooked, fat added in cooking" +72116230,"ESCAROLE, CREAMED","Escarole, creamed" +72118200,"GREENS, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Greens, cooked, NS as to form, NS as to fat added in cooking" +72118201,"GREENS, COOKED, FROM FRESH, NS FAT ADDED","Greens, cooked, from fresh, NS as to fat added in cooking" +72118202,"GREENS, COOKED, FROM FROZ, NS FAT ADDED","Greens, cooked, from frozen, NS as to fat added in cooking" +72118203,"GREENS, COOKED, FROM CANNED, NS FAT ADDED","Greens, cooked, from canned, NS as to fat added in cooking" +72118210,"GREENS, COOKED, NS AS TO FORM, FAT NOT ADDED","Greens, cooked, NS as to form, fat not added in cooking" +72118211,"GREENS, COOKED, FROM FRESH, FAT NOT ADDED","Greens, cooked, from fresh, fat not added in cooking" +72118212,"GREENS, COOKED, FROM FROZEN, FAT NOT ADDED","Greens, cooked, from frozen, fat not added in cooking" +72118213,"GREENS, COOKED, FROM CANNED, FAT NOT ADDED","Greens, cooked, from canned, fat not added in cooking" +72118220,"GREENS, COOKED, NS AS TO FORM, FAT ADDED","Greens, cooked, NS as to form, fat added in cooking" +72118221,"GREENS, COOKED, FROM FRESH, FAT ADDED","Greens, cooked, from fresh, fat added in cooking" +72118222,"GREENS, COOKED, FROM FROZEN, FAT ADDED","Greens, cooked, from frozen, fat added in cooking" +72118223,"GREENS, COOKED, FROM CANNED, FAT ADDED","Greens, cooked, from canned, fat added in cooking" +72118300,"CHAMNAMUL (KOREAN LEAF VEGETABLE), COOKED, NS AS TO FAT","Chamnamul (Korean leaf vegetable), cooked, NS as to fat added in cooking" +72118305,"CHAMNAMUL (KOREAN LEAF VEGETABLE), COOKED, FAT NOT ADDED","Chamnamul (Korean leaf vegetable), cooked, fat not added in cooking" +72118310,"CHAMNAMUL (KOREAN LEAF VEGETABLE), COOKED, FAT ADDED","Chamnamul (Korean leaf vegetable), cooked, fat added in cooking" +72119200,"KALE, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Kale, cooked, NS as to form, NS as to fat added in cooking" +72119201,"KALE,COOKED,FROM FRESH,NS FAT ADDED","Kale, cooked, from fresh, NS as to fat added in cooking" +72119202,"KALE,COOKED,FROM FROZEN,NS FAT ADDED","Kale, cooked, from frozen, NS as to fat added in cooking" +72119203,"KALE,COOKED,FROM CANNED,NS FAT ADDED","Kale, cooked, from canned, NS as to fat added in cooking" +72119210,"KALE, COOKED, NS AS TO FORM, FAT NOT ADDED","Kale, cooked, NS as to form, fat not added in cooking" +72119211,"KALE,COOKED,FROM FRESH,FAT NOT ADDED","Kale, cooked, from fresh, fat not added in cooking" +72119212,"KALE,COOKED,FROM FROZEN,FAT NOT ADDED","Kale, cooked, from frozen, fat not added in cooking" +72119213,"KALE,COOKED,FROM CANNED,FAT NOT ADDED","Kale, cooked, from canned, fat not added in cooking" +72119220,"KALE, COOKED, NS AS TO FORM, FAT ADDED","Kale, cooked, NS as to form, fat added in cooking" +72119221,"KALE,COOKED,FROM FRESH,FAT ADDED","Kale, cooked, from fresh, fat added in cooking" +72119222,"KALE,COOKED,FROM FROZEN,FAT ADDED","Kale, cooked, from frozen, fat added in cooking" +72119223,"KALE,COOKED,FROM CANNED,FAT ADDED","Kale, cooked, from canned, fat added in cooking" +72120200,"LAMBSQUARTER, COOKED, NS AS TO ADDED FAT","Lambsquarter, cooked, NS as to fat added in cooking" +72120210,"CRESS, COOKED, FAT NOT ADDEDS","Lambsquarter, cooked, fat not added in cooking" +72120220,"LAMBSQUARTER, COOKED, FAT ADDED","Lambsquarter, cooked, fat added in cooking" +72121210,"MUSTARD CABBAGE,COOKED, FAT NOT ADDED IN COOKING","Mustard cabbage, cooked, fat not added in cooking" +72122100,"MUSTARD GREENS, RAW","Mustard greens, raw" +72122200,"MUSTARD GREENS, COOKED, NS FORM, NS FAT ADDED","Mustard greens, cooked, NS as to form, NS as to fat added in cooking" +72122201,"MUSTARD GREENS,COOKED,FROM FRESH,NS FAT ADDED","Mustard greens, cooked, from fresh, NS as to fat added in cooking" +72122202,"MUSTARD GREENS,COOKED,FROM FROZEN,NS FAT ADDED","Mustard greens, cooked, from frozen, NS as to fat added in cooking" +72122203,"MUSTARD GREENS,COOKED,FROM CANNED,NS FAT ADDED","Mustard greens, cooked, from canned, NS as to fat added in cooking" +72122210,"MUSTARD GREENS, COOKED, NS FORM, FAT NOT ADDED","Mustard greens, cooked, NS as to form, fat not added in cooking" +72122211,"MUSTARD GREENS,COOKED,FROM FRESH,FAT NOT ADDED","Mustard greens, cooked, from fresh, fat not added in cooking" +72122212,"MUSTARD GREENS,COOKED,FROM FROZEN,FAT NOT ADDED","Mustard greens, cooked, from frozen, fat not added in cooking" +72122213,"MUSTARD GREENS,COOKED,FROM CANNED,FAT NOT ADDED","Mustard greens, cooked, from canned, fat not added in cooking" +72122220,"MUSTARD GREEN, COOKED, NS FORM, FAT ADDED","Mustard greens, cooked, NS as to form, fat added in cooking" +72122221,"MUSTARD GREENS,COOKED,FROM FRESH,FAT ADDED","Mustard greens, cooked, from fresh, fat added in cooking" +72122222,"MUSTARD GREENS,COOKED,FROM FROZEN,FAT ADDED","Mustard greens, cooked, from frozen, fat added in cooking" +72122223,"MUSTARD GREENS,COOKED,FROM CANNED,FAT ADDED","Mustard greens, cooked, from canned, fat added in cooking" +72123000,"POKE GREENS, COOKED, NS AS TO ADDED FAT","Poke greens, cooked, NS as to fat added in cooking" +72123010,"POKE GREENS, COOKED, FAT NOT ADDED","Poke greens, cooked, fat not added in cooking" +72123020,"POKE GREENS, COOKED, FAT ADDED","Poke greens, cooked, fat added in cooking" +72124100,"RADICCHIO, RAW","Radicchio, raw" +72125100,"SPINACH, RAW","Spinach, raw" +72125200,"SPINACH, COOKED, NS FORM, NS AS TO ADDED FAT","Spinach, cooked, NS as to form, NS as to fat added in cooking" +72125201,"SPINACH,COOKED,FROM FRESH,NS FAT ADDED","Spinach, cooked, from fresh, NS as to fat added in cooking" +72125202,"SPINACH,COOKED,FROM FROZEN,NS FAT ADDED","Spinach, cooked, from frozen, NS as to fat added in cooking" +72125203,"SPINACH,COOKED,FROM CANNED,NS FAT ADDED","Spinach, cooked, from canned, NS as to fat added in cooking" +72125210,"SPINACH, COOKED, NS AS TO FORM, FAT NOT ADDED","Spinach, cooked, NS as to form, fat not added in cooking" +72125211,"SPINACH,COOKED,FROM FRESH,FAT NOT ADDED","Spinach, cooked, from fresh, fat not added in cooking" +72125212,"SPINACH,COOKED,FROM FROZEN,FAT NOT ADDED","Spinach, cooked, from frozen, fat not added in cooking" +72125213,"SPINACH,COOKED,FROM CANNED,FAT NOT ADDED","Spinach, cooked, from canned, fat not added in cooking" +72125220,"SPINACH, COOKED, NS AS TO FORM, FAT ADDED","Spinach, cooked, NS as to form, fat added in cooking" +72125221,"SPINACH,COOKED,FROM FRESH,FAT ADDED","Spinach, cooked, from fresh, fat added in cooking" +72125222,"SPINACH,COOKED,FROM FROZEN,FAT ADDED","Spinach, cooked, from frozen, fat added in cooking" +72125223,"SPINACH,COOKED,FROM CANNED,FAT ADDED","Spinach, cooked, from canned, fat added in cooking" +72125230,"SPINACH, NS AS TO FORM, CREAMED","Spinach, NS as to form, creamed" +72125231,"SPINACH, FROM FRESH, CREAMED","Spinach, from fresh, creamed" +72125232,"SPINACH, FROM FROZEN, CREAMED","Spinach, from frozen, creamed" +72125233,"SPINACH, FROM CANNED, CREAMED","Spinach, from canned, creamed" +72125240,"SPINACH SOUFFLE","Spinach souffle" +72125250,"SPINACH, COOKED, NS AS TO FORM, W/ CHEESE SAUCE","Spinach, cooked, NS as to form, with cheese sauce" +72125251,"SPINACH, COOKED, FROM FRESH, W/ CHEESE SAUCE","Spinach, cooked, from fresh, with cheese sauce" +72125252,"SPINACH, COOKED, FROM FROZEN, W/ CHEESE SAUCE","Spinach, cooked, from frozen, with cheese sauce" +72125253,"SPINACH, COOKED, FROM CANNED, W/ CHEESE SAUCE","Spinach, cooked, from canned, with cheese sauce" +72125260,"SPINACH & CHEESE CASSEROLE","Spinach and cheese casserole" +72125310,"SPINACH AND COTTAGE CHEESE","Palak Paneer or Saag Paneer (Indian)" +72125500,"SPINACH & CHICK PEAS, FAT ADDED","Spinach and chickpeas, fat added" +72126000,"TARO LEAVES, COOKED, FAT NOT ADDED IN COOKING","Taro leaves, cooked, fat not added in cooking" +72127000,"THISTLE LEAVES, COOKED, FAT NOT ADDED IN COOKING","Thistle leaves, cooked, fat not added in cooking" +72128200,"TURNIP GREENS, COOKED, NS FORM, NS AS TO ADDED FAT","Turnip greens, cooked, NS as to form, NS as to fat added in cooking" +72128201,"TURNIP GREENS,COOKED,FROM FRESH,NS FAT ADDED","Turnip greens, cooked, from fresh, NS as to fat added in cooking" +72128202,"TURNIP GREENS,COOKED,FROM FROZEN,NS FAT ADDED","Turnip greens, cooked, from frozen, NS as to fat added in cooking" +72128203,"TURNIP GREENS,COOKED,FROM CANNED,NS FAT ADDED","Turnip greens, cooked, from canned, NS as to fat added in cooking" +72128210,"TURNIP GREENS, NS FORM, COOKED, FAT NOT ADDED","Turnip greens, cooked, NS as to form, fat not added in cooking" +72128211,"TURNIP GREENS,COOKED,FROM FRESH,FAT NOT ADDED","Turnip greens, cooked, from fresh, fat not added in cooking" +72128212,"TURNIP GREENS,COOKED,FROM FROZEN,FAT NOT ADDED","Turnip greens, cooked, from frozen, fat not added in cooking" +72128213,"TURNIP GREENS,COOKED,FROM CANNED,FAT NOT ADDED","Turnip greens, cooked, from canned, fat not added in cooking" +72128220,"TURNIP GREENS, COOKED, NS FORM, FAT ADDED","Turnip greens, cooked, NS as to form, fat added in cooking" +72128221,"TURNIP GREENS,COOKED,FROM FRESH,FAT ADDED","Turnip greens, cooked, from fresh, fat added in cooking" +72128222,"TURNIP GREENS,COOKED,FROM FROZEN,FAT ADDED","Turnip greens, cooked, from frozen, fat added in cooking" +72128223,"TURNIP GREENS,COOKED,FROM CANNED,FAT ADDED","Turnip greens, cooked, from canned, fat added in cooking" +72128400,"TURNIP GREENS W/ ROOTS, CKD, NS FORM, NS ADDED FAT","Turnip greens with roots, cooked, NS as to form, NS as to fat added in cooking" +72128401,"TURNIP GREENS W/ ROOTS, CKD, FROM FRESH, NS ADDED FAT","Turnip greens with roots, cooked, from fresh, NS as to fat added in cooking" +72128402,"TURNIP GREENS W/ ROOTS, CKD, FROM FROZ, NS ADDED FAT","Turnip greens with roots, cooked, from frozen, NS as to fat added in cooking" +72128403,"TURNIP GREENS W/ ROOTS, CKD, FROM CAN, NS ADDED FAT","Turnip greens with roots, cooked, from canned, NS as to fat added in cooking" +72128410,"TURNIP GREENS W/ ROOTS, CKD, NS FORM, FAT NOT ADDED","Turnip greens with roots, cooked, NS as to form, fat not added in cooking" +72128411,"TURNIP GREENS W/ ROOTS, CKD, FROM FRESH, NO FAT ADDED","Turnip greens with roots, cooked, from fresh, fat not added in cooking" +72128412,"TURNIP GREENS W/ ROOTS, CKD, FROM FROZ, NO FAT ADDED","Turnip greens with roots, cooked, from frozen, fat not added in cooking" +72128413,"TURNIP GREENS W/ ROOTS, CKD, FROM CAN, NO FAT ADDED","Turnip greens with roots, cooked, from canned, fat not added in cooking" +72128420,"TURNIP GREENS W/ ROOTS, COOKED, NS FORM, FAT ADDED","Turnip greens with roots, cooked, NS as to form, fat added in cooking" +72128421,"TURNIP GREENS W/ ROOTS, CKD, FROM FRESH, FAT ADDED","Turnip greens with roots, cooked, from fresh, fat added in cooking" +72128422,"TURNIP GREENS W/ ROOTS, CKD, FROM FROZ, FAT ADDED","Turnip greens with roots, cooked, from frozen, fat added in cooking" +72128423,"TURNIP GREENS W/ ROOTS, CKD, FROM CAN, FAT ADDED","Turnip greens with roots, cooked, from canned, fat added in cooking" +72128500,"TURNIP GREENS, CANNED, LOW NA, NS AS TO ADDED FAT","Turnip greens, canned, low sodium, cooked, NS as to fat added in cooking" +72128510,"TURNIP GREENS, CANNED, LOW SODIUM, FAT NOT ADDED","Turnip greens, canned, low sodium, cooked, fat not added in cooking" +72128520,"TURNIP GREENS, CANNED, LOW SODIUM, FAT ADDED","Turnip greens, canned, low sodium, cooked, fat added in cooking" +72130100,"WATERCRESS, RAW","Watercress, raw" +72130200,"WATERCRESS, COOKED, FAT NOT ADDED IN COOKING","Watercress, cooked, fat not added in cooking" +72132200,"BITTERMELON,HORSERADISH,JUTE,RADISH LVES,CKD,NO FAT","Bitter melon leaves, horseradish leaves, jute leaves, or radish leaves, cooked, fat not added in cooking" +72133200,"SWEET POTATO,SQUASH,PUMPKIN LEAVES,CKD,FAT NOT ADDED","Sweet potato leaves, squash leaves, pumpkin leaves, chrysanthemum leaves, bean leaves, or swamp cabbage, cooked, fat not added in cooking" +72201100,"BROCCOLI, RAW","Broccoli, raw" +72201200,"BROCCOLI, CKD, NS FORM, NS FAT (INCL BROCCOLI, NFS)","Broccoli, cooked, NS as to form, NS as to fat added in cooking" +72201201,"BROCCOLI, CKD, FROM FRESH, NS FAT (INCL BROCCOLI, NFS)","Broccoli, cooked, from fresh, NS as to fat added in cooking" +72201202,"BROCCOLI, CKD, FROM FROZ, NS FAT (INCL BROCCOLI, NFS)","Broccoli, cooked, from frozen, NS as to fat added in cooking" +72201210,"BROCCOLI, COOKED, NS AS TO FORM, NO FAT ADDED","Broccoli, cooked, NS as to form, fat not added in cooking" +72201211,"BROCCOLI, COOKED, FROM FRESH, NO FAT ADDED","Broccoli, cooked, from fresh, fat not added in cooking" +72201212,"BROCCOLI, COOKED, FROM FROZ, NO FAT ADDED","Broccoli, cooked, from frozen, fat not added in cooking" +72201220,"BROCCOLI, COOKED, NS AS TO FORM, FAT ADDED","Broccoli, cooked, NS as to form, fat added in cooking" +72201221,"BROCCOLI, COOKED, FROM FRESH, FAT ADDED","Broccoli, cooked, from fresh, fat added in cooking" +72201222,"BROCCOLI, COOKED, FROM FROZ, FAT ADDED","Broccoli, cooked, from frozen, fat added in cooking" +72201230,"BROCCOLI, COOKED, NS AS TO FORM, W/ CHEESE SAUCE","Broccoli, cooked, NS as to form, with cheese sauce" +72201231,"BROCCOLI, COOKED, FROM FRESH, W/ CHEESE SAUCE","Broccoli, cooked, from fresh, with cheese sauce" +72201232,"BROCCOLI, COOKED, FROM FROZEN, W/ CHEESE SAUCE","Broccoli, cooked, from frozen, with cheese sauce" +72201240,"BROCCOLI, COOKED, NS AS TO FORM, W/ MUSHROOM SAUCE","Broccoli, cooked, NS as to form, with mushroom sauce" +72201241,"BROCCOLI, COOKED, FROM FRESH, W/ MUSHROOM SAUCE","Broccoli, cooked, from fresh, with mushroom sauce" +72201242,"BROCCOLI, COOKED, FROM FROZEN, W/ MUSHROOM SAUCE","Broccoli, cooked, from frozen, with mushroom sauce" +72201250,"BROCCOLI, COOKED, NS AS TO FORM, W/ CREAM SAUCE","Broccoli, cooked, NS as to form, with cream sauce" +72201251,"BROCCOLI, COOKED, FROM FRESH, W/ CREAM SAUCE","Broccoli, cooked, from fresh, with cream sauce" +72201252,"BROCCOLI, COOKED, FROM FROZEN, W/ CREAM SAUCE","Broccoli, cooked, from frozen, with cream sauce" +72202010,"BROCCOLI CASSEROLE (BROC, NOODLES, CREAM SAUCE)","Broccoli casserole (broccoli, noodles, and cream sauce)" +72202020,"BROCCOLI CASSEROLE (BROC,RICE,CHEESE,MUSHROOM SCE)","Broccoli casserole (broccoli, rice, cheese, and mushroom sauce)" +72202030,"BROCCOLI, BATTER-DIPPED & FRIED","Broccoli, batter-dipped and fried" +72302000,"BROCCOLI SOUP, PREPARED WITH MILK, HOME RECIPE, CANNED OR RE","Broccoli soup, prepared with milk, home recipe, canned or ready-to-serve" +72302020,"BROCCOLI SOUP, PREP W/ WATER","Broccoli soup, prepared with water, home recipe, canned, or ready-to-serve" +72302100,"BROCCOLI CHEESE SOUP, PREPARED WITH MILK, HOME RECIPE, CANNE","Broccoli cheese soup, prepared with milk, home recipe, canned, or ready-to-serve" +72306000,"WATERCRESS BROTH W/ SHRIMP","Watercress broth with shrimp" +72307000,"SPINACH SOUP","Spinach soup" +72308000,"DARK-GREEN LEAFY VEGETABLE SOUP WITH MEAT, ASIAN STYLE","Dark-green leafy vegetable soup with meat, Asian style" +72308500,"DARK-GREEN LEAFY VEGETABLE SOUP, MEATLESS, ASIAN STYLE","Dark-green leafy vegetable soup, meatless, Asian style" +73101010,"CARROTS, RAW","Carrots, raw" +73101110,"CARROTS, RAW, SALAD (INCLUDE CARROT-RAISIN SALAD)","Carrots, raw, salad" +73101210,"CARROTS, RAW, SALAD W/ APPLES","Carrots, raw, salad with apples" +73102200,"CARROTS, COOKED, NS AS TO FORM, NS FAT ADDED","Carrots, cooked, NS as to form, NS as to fat added in cooking" +73102201,"CARROTS, COOKED, FROM FRESH, NS FAT ADDED","Carrots, cooked, from fresh, NS as to fat added in cooking" +73102202,"CARROTS, COOKED, FROM FROZEN, NS FAT ADDED","Carrots, cooked, from frozen, NS as to fat added in cooking" +73102203,"CARROTS, COOKED, FROM CANNED, NS FAT ADDED","Carrots, cooked, from canned, NS as to fat added in cooking" +73102210,"CARROTS, COOKED, NS AS TO FORM, FAT NOT ADDED","Carrots, cooked, NS as to form, fat not added in cooking" +73102211,"CARROTS, COOKED, FROM FRESH, FAT NOT ADDED","Carrots, cooked, from fresh, fat not added in cooking" +73102212,"CARROTS, COOKED, FROM FROZEN, FAT NOT ADDED","Carrots, cooked, from frozen, fat not added in cooking" +73102213,"CARROTS, COOKED, FROM CANNED, FAT NOT ADDED","Carrots, cooked, from canned, fat not added in cooking" +73102220,"CARROTS, COOKED, NS AS TO FORM, FAT ADDED","Carrots, cooked, NS as to form, fat added in cooking" +73102221,"CARROTS, COOKED, FROM FRESH, FAT ADDED","Carrots, cooked, from fresh, fat added in cooking" +73102222,"CARROTS, COOKED, FROM FROZEN, FAT ADDED","Carrots, cooked, from frozen, fat added in cooking" +73102223,"CARROTS, COOKED, FROM CANNED, FAT ADDED","Carrots, cooked, from canned, fat added in cooking" +73102230,"CARROTS, COOKED, NS AS TO FORM, CREAMED","Carrots, cooked, NS as to form, creamed" +73102231,"CARROTS, COOKED, FROM FRESH, CREAMED","Carrots, cooked, from fresh, creamed" +73102232,"CARROTS, COOKED, FROM FROZEN, CREAMED","Carrots, cooked, from frozen, creamed" +73102233,"CARROTS, COOKED, FROM CANNED, CREAMED","Carrots, cooked, from canned, creamed" +73102240,"CARROTS, COOKED, NS AS TO FORM, GLAZED","Carrots, cooked, NS as to form, glazed" +73102241,"CARROTS, COOKED, FROM FRESH, GLAZED","Carrots, cooked, from fresh, glazed" +73102242,"CARROTS, COOKED, FROM FROZEN, GLAZED","Carrots, cooked, from frozen, glazed" +73102243,"CARROTS, COOKED, FROM CANNED, GLAZED","Carrots, cooked, from canned, glazed" +73102250,"CARROTS, COOKED, NS AS TO FORM, W/ CHEESE SAUCE","Carrots, cooked, NS as to form, with cheese sauce" +73102251,"CARROTS, COOKED, FROM FRESH, W/ CHEESE SAUCE","Carrots, cooked, from fresh, with cheese sauce" +73102252,"CARROTS, COOKED, FROM FROZEN, W/ CHEESE SAUCE","Carrots, cooked, from frozen, with cheese sauce" +73102253,"CARROTS, COOKED, FROM CANNED, W/ CHEESE SAUCE","Carrots, cooked, from canned, with cheese sauce" +73103000,"CARROTS, CANNED, LOW SODIUM, NS AS TO ADDED FAT","Carrots, canned, low sodium, NS as to fat added in cooking" +73103010,"CARROTS, CANNED, LOW SODIUM, NO FAT ADDED","Carrots, canned, low sodium, fat not added in cooking" +73103020,"CARROTS, CANNED, LOW SODIUM, FAT ADDED","Carrots, canned, low sodium, fat added in cooking" +73105010,"CARROT JUICE","Carrot juice" +73111030,"PEAS & CARROTS, NS AS TO FORM, CREAMED","Peas and carrots, NS as to form, creamed" +73111031,"PEAS & CARROTS, FROM FRESH, CREAMED","Peas and carrots, from fresh, creamed" +73111032,"PEAS & CARROTS, FROM FROZEN, CREAMED","Peas and carrots, from frozen, creamed" +73111033,"PEAS & CARROTS, FROM CANNED, CREAMED","Peas and carrots, from canned, creamed" +73111200,"PEAS & CARROTS, COOKED, NS FORM, NS AS TO ADDED FAT","Peas and carrots, cooked, NS as to form, NS as to fat added in cooking" +73111201,"PEAS & CARROTS, COOKED, FROM FRESH, NS FAT ADDED","Peas and carrots, cooked, from fresh, NS as to fat added in cooking" +73111202,"PEAS & CARROTS, COOKED, FROM FROZ, NS FAT ADDED","Peas and carrots, cooked, from frozen, NS as to fat added in cooking" +73111203,"PEAS & CARROTS, COOKED, FROM CANNED, NS FAT ADDED","Peas and carrots, cooked, from canned, NS as to fat added in cooking" +73111210,"PEAS & CARROTS, COOKED, NS FORM, FAT NOT ADDED","Peas and carrots, cooked, NS as to form, fat not added in cooking" +73111211,"PEAS & CARROTS, COOKED, FROM FRESH, FAT NOT ADDED","Peas and carrots, cooked, from fresh, fat not added in cooking" +73111212,"PEAS & CARROTS, COOKED, FROM FROZ, FAT NOT ADDED","Peas and carrots, cooked, from frozen, fat not added in cooking" +73111213,"PEAS & CARROTS, COOKED, FROM CANNED, FAT NOT ADDED","Peas and carrots, cooked, from canned, fat not added in cooking" +73111220,"PEAS & CARROTS, COOKED, NS AS TO FORM, FAT ADDED","Peas and carrots, cooked, NS as to form, fat added in cooking" +73111221,"PEAS & CARROTS, COOKED, FROM FRESH, FAT ADDED","Peas and carrots, cooked, from fresh, fat added in cooking" +73111222,"PEAS & CARROTS, COOKED, FROM FROZ, FAT ADDED","Peas and carrots, cooked, from frozen, fat added in cooking" +73111223,"PEAS & CARROTS, COOKED, FROM CANNED, FAT ADDED","Peas and carrots, cooked, from canned, fat added in cooking" +73111250,"PEAS & CARROTS, CANNED, LOW SODIUM, NS ADDED FAT","Peas and carrots, canned, low sodium, NS as to fat added in cooking" +73111260,"PEAS & CARROTS, CANNED, LOW SODIUM, FAT ADDED","Peas and carrots, canned, low sodium, fat added in cooking" +73111270,"PEAS & CARROTS, CANNED, LOW SODIUM, NO FAT ADDED","Peas and carrots, canned, low sodium, fat not added in cooking" +73111400,"CARROTS IN TOMATO SAUCE","Carrots in tomato sauce" +73112000,"CARROT CHIPS, DRIED","Carrot chips, dried" +73201000,"PUMPKIN, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Pumpkin, cooked, NS as to form, NS as to fat added in cooking" +73201001,"PUMPKIN, COOKED, FROM FRESH, NS AS TO ADDED FAT","Pumpkin, cooked, from fresh, NS as to fat added in cooking" +73201002,"PUMPKIN, COOKED, FROM FROZEN, NS AS TO ADDED FAT","Pumpkin, cooked, from frozen, NS as to fat added in cooking" +73201003,"PUMPKIN, COOKED, FROM CANNED, NS AS TO ADDED FAT","Pumpkin, cooked, from canned, NS as to fat added in cooking" +73201010,"PUMPKIN, COOKED, NS AS TO FORM, FAT NOT ADDED","Pumpkin, cooked, NS as to form, fat not added in cooking" +73201011,"PUMPKIN, COOKED, FROM FRESH, FAT NOT ADDED","Pumpkin, cooked, from fresh, fat not added in cooking" +73201012,"PUMPKIN, COOKED, FROM FROZEN, FAT NOT ADDED","Pumpkin, cooked, from frozen, fat not added in cooking" +73201013,"PUMPKIN, COOKED, FROM CANNED, FAT NOT ADDED","Pumpkin, cooked, from canned, fat not added in cooking" +73201020,"PUMPKIN, COOKED, NS AS TO FORM, FAT ADDED","Pumpkin, cooked, NS as to form, fat added in cooking" +73201021,"PUMPKIN, COOKED, FROM FRESH, FAT ADDED","Pumpkin, cooked, from fresh, fat added in cooking" +73201022,"PUMPKIN, COOKED, FROM FROZEN, FAT ADDED","Pumpkin, cooked, from frozen, fat added in cooking" +73201023,"PUMPKIN, COOKED, FROM CANNED, FAT ADDED","Pumpkin, cooked, from canned, fat added in cooking" +73210010,"CALABAZA (SPANISH PUMPKIN), COOKED","Calabaza (Spanish pumpkin), cooked" +73210110,"PUMPKIN FRITTERS, P.R.","Pumpkin fritters, Puerto Rican style" +73211110,"SWEET POTATO & PUMPKIN CASSEROLE, P.R","Sweet potato and pumpkin casserole, Puerto Rican style" +73301000,"SQUASH, WINTER, MASHED, NS AS TO ADDED FAT/SUGAR","Squash, winter type, mashed, NS as to fat or sugar added in cooking" +73301010,"SQUASH, WINTER, MASHED, NO FAT OR SUGAR ADDED","Squash, winter type, mashed, no fat or sugar added in cooking" +73301020,"SQUASH, WINTER, COOKED, MASHED, FAT ADDED, NO SUGAR","Squash, winter type, mashed, fat added in cooking, no sugar added in cooking" +73301030,"SQUASH, WINTER, COOKED, MASHED, FAT & SUGAR ADDED","Squash, winter type, mashed, fat and sugar added in cooking" +73302010,"SQUASH, WINTER, RAW","Squash, winter type, raw" +73303000,"SQUASH, WINTER, BAKED, NS FAT OR SUGAR ADDED","Squash, winter type, baked, NS as to fat or sugar added in cooking" +73303010,"SQUASH, WINTER, BAKED, NO FAT OR SUGAR ADDED","Squash, winter type, baked, no fat or sugar added in cooking" +73303020,"SQUASH, WINTER, BAKED, FAT ADDED, NO SUGAR","Squash, winter type, baked, fat added in cooking, no sugar added in cooking" +73303030,"SQUASH, WINTER, BAKED, FAT & SUGAR ADDED","Squash, winter type, baked, fat and sugar added in cooking" +73303040,"SQUASH, WINTER, BAKED, NO ADDED FAT, SUGAR ADDED","Squash, winter type, baked, no fat added in cooking, sugar added in cooking" +73304010,"SQUASH, FRITTER OR CAKE","Squash fritter or cake" +73305010,"SQUASH, WINTER, BAKED W/ CHEESE","Squash, winter, baked with cheese" +73305020,"SQUASH, WINTER, SOUFFLE","Squash, winter, souffle" +73401000,"SWEET POTATO, NFS","Sweet potato, NFS" +73402000,"SWEET POTATO, BAKED, PEEL EATEN, NS AS TO ADDED FAT","Sweet potato, baked, peel eaten, NS as to fat added in cooking" +73402010,"SWEET POTATO, BAKED, PEEL EATEN, NO FAT ADDED","Sweet potato, baked, peel eaten, fat not added in cooking" +73402020,"SWEET POTATO, BAKED, PEEL EATEN, FAT ADDED","Sweet potato, baked, peel eaten, fat added in cooking" +73403000,"SWEET POTATO, BAKED, PEEL NOT EATEN, NS AS TO FAT","Sweet potato, baked, peel not eaten, NS as to fat added in cooking" +73403010,"SWEET POTATO, BAKED, PEEL NOT EATEN, FAT NOT ADDED","Sweet potato, baked, peel not eaten, fat not added in cooking" +73403020,"SWEET POTATO, BAKED, PEEL NOT EATEN, FAT ADDED","Sweet potato, baked, peel not eaten, fat added in cooking" +73405000,"SWEET POTATO, BOILED, W/O PEEL, NS AS TO ADDED FAT","Sweet potato, boiled, without peel, NS as to fat added in cooking" +73405010,"SWEET POTATO, BOILED, W/O PEEL, FAT NOT ADDED","Sweet potato, boiled, without peel, fat not added in cooking" +73405020,"SWEET POTATO, BOILED, W/O PEEL, FAT ADDED","Sweet potato, boiled, without peel, fat added in cooking" +73405100,"SWEET POTATO, BOILED W/ PEEL, PEEL NOT EATEN, NS AS TO FAT","Sweet potato, boiled with peel, peel not eaten, NS as to fat added in cooking" +73405110,"SWEET POTATO, BOILED W/ PEEL, PEEL NOT EATEN, FAT NOT ADDED","Sweet potato, boiled with peel, peel not eaten, fat not added in cooking" +73405120,"SWEET POTATO, BOILED W/ PEEL, PEEL NOT EATEN, FAT ADDED","Sweet potato, boiled with peel, peel not eaten, fat added in cooking" +73406000,"SWEET POTATO, CANDIED","Sweet potato, candied" +73406010,"SWEET POTATO W/ FRUIT","Sweet potato with fruit" +73407000,"SWEET POTATO, CANNED, NS AS TO SYRUP","Sweet potato, canned, NS as to syrup" +73407010,"SWEET POTATO, CANNED, W/O SYRUP","Sweet potato, canned without syrup" +73407020,"SWEET POTATO, CANNED IN SYRUP","Sweet potato, canned in syrup" +73407030,"SWEET POTATO, CANNED IN SYRUP, W/ FAT ADDED","Sweet potato, canned in syrup, with fat added in cooking" +73409000,"SWEET POTATO, CASSEROLE OR MASHED","Sweet potato, casserole or mashed" +73410110,"SWEET POTATO, FRIED","Sweet potato, fried" +73410210,"SWEET POTATO, CHIPS","Sweet potato, chips" +73410300,"SWEET POTATO, FRENCH FRIES","Sweet potato, french fries" +73421000,"SWEET POTATO, YELLOW, P.R., COOKED","Sweet potato, yellow, Puerto Rican, cooked" +73501000,"CARROT SOUP, CREAM OF, PREPARED WITH MILK, HOME RECIPE, CANN","Carrot soup, cream of, prepared with milk, home recipe, canned or ready-to-serve" +73501010,"CARROT WITH RICE SOUP, CREAM OF, PREPARED WITH MILK, HOME RE","Carrot with rice soup, cream of, prepared with milk, home recipe, canned or ready-to-serve" +74101000,"TOMATOES, RAW","Tomatoes, raw" +74102000,"TOMATOES, GREEN, RAW","Tomatoes, green, raw" +74201000,"TOMATOES, COOKED, NS AS TO FORM, NS AS TO METHOD","Tomatoes, cooked, NS as to form, NS as to method" +74201001,"TOMATOES, COOKED, FROM FRESH, NS AS TO METHOD","Tomatoes, cooked, from fresh, NS as to method" +74201003,"TOMATOES, COOKED, FROM CANNED, NS AS TO METHOD","Tomatoes, cooked, from canned, NS as to method" +74202010,"TOMATOES, NS AS TO FORM, BROILED","Tomatoes, NS as to form, broiled" +74202011,"TOMATOES, FROM FRESH, BROILED","Tomatoes, from fresh, broiled" +74202050,"TOMATOES, RED, NS AS TO FORM, FRIED","Tomatoes, red, NS as to form, fried" +74202051,"TOMATOES, RED, FROM FRESH, FRIED","Tomatoes, red, from fresh, fried" +74203010,"TOMATOES, NS AS TO FORM, SCALLOPED","Tomatoes, NS as to form, scalloped" +74203011,"TOMATOES, FROM FRESH, SCALLOPED","Tomatoes, from fresh, scalloped" +74204010,"TOMATOES, NS AS TO FORM, STEWED","Tomatoes, NS as to form, stewed" +74204011,"TOMATOES, FROM FRESH, STEWED","Tomatoes, from fresh, stewed" +74204013,"TOMATOES, FROM CANNED, STEWED","Tomatoes, from canned, stewed" +74204500,"TOMATOES, CANNED, LOW SODIUM","Tomatoes, canned, low sodium" +74205010,"TOMATOES, GREEN, COOKED, NS AS TO FORM (INCL FRIED)","Tomatoes, green, cooked, NS as to form" +74205011,"TOMATOES, GREEN, COOKED, FROM FRESH (INCL FRIED)","Tomatoes, green, cooked, from fresh" +74205020,"TOMATOES, GREEN, PICKLED","Tomato, green, pickled" +74206000,"TOMATOES, RED, DRIED","Tomatoes, red, dried" +74301100,"TOMATO JUICE","Tomato juice" +74301150,"TOMATO JUICE, LOW SODIUM","Tomato juice, low sodium" +74302000,"TOMATO JUICE COCKTAIL","Tomato juice cocktail" +74303000,"TOMATO & VEGETABLE JUICE, MOSTLY TOMATO (INCL V-8)","Tomato and vegetable juice, mostly tomato" +74303100,"TOMATO & VEGETABLE JUICE, MOSTLY TOMATO, LOW SODIUM","Tomato and vegetable juice, mostly tomato, low sodium" +74304000,"TOMATO JUICE W/ CLAM OR BEEF JUICE","Tomato juice with clam or beef juice" +74401010,"TOMATO CATSUP","Tomato catsup" +74401110,"TOMATO CATSUP, REDUCED SODIUM","Tomato catsup, reduced sodium" +74402010,"TOMATO CHILI SAUCE (CATSUP TYPE)","Tomato chili sauce (catsup-type)" +74402100,"SALSA, NFS","Salsa, NFS" +74402110,"SALSA, PICO DE GALLO","Salsa, pico de gallo" +74402150,"SALSA, RED, COMMERCIALLY-PREPARED","Salsa, red, commercially-prepared" +74402200,"SALSA, RED, HOMEMADE","Salsa, red, homemade" +74402250,"ENCHILADA SAUCE, RED","Enchilada sauce, red" +74402260,"ENCHILADA SAUCE, GREEN","Enchilada sauce, green" +74402350,"SALSA VERDE OR SALSA, GREEN","Salsa verde or salsa, green" +74404010,"SPAGHETTI SAUCE, MEATLESS","Spaghetti sauce, meatless" +74404020,"SPAGHETTI SAUCE W/ VEGETABLES, HOMEMADE-STYLE","Spaghetti sauce with vegetables, homemade-style" +74404030,"SPAGHETTI SAUCE W/ MEAT, CANNED, NO EXTRA MEAT","Spaghetti sauce with meat, canned, no extra meat added" +74404050,"SPAGHETTI SAUCE, MEATLESS, REDUCED SODIUM","Spaghetti sauce, meatless, reduced sodium" +74404060,"SPAGHETTI SAUCE, MEATLESS, FAT FREE","Spaghetti sauce, meatless, fat free" +74404090,"VODKA FLAVORED PASTA SAUCE MADE WITH TOMATOES AND CREAM","Vodka flavored pasta sauce made with tomatoes and cream" +74405010,"TOMATO RELISH (INCLUDE TOMATO PRESERVES)","Tomato relish" +74406010,"BARBECUE SAUCE","Barbecue sauce" +74406050,"BARBECUE SAUCE, REDUCED SODIUM","Barbecue sauce, reduced sodium" +74406100,"STEAK SAUCE, TOMATO-BASE (INCLUDE A-1)","Steak sauce, tomato-base" +74406500,"COCKTAIL SAUCE","Cocktail sauce" +74410110,"PUERTO RICAN SEASONING WITH HAM","Puerto Rican seasoning with ham" +74415110,"PUERTO RICAN SEASONING W/ HAM & TOMATO SAUCE","Puerto Rican seasoning with ham and tomato sauce" +74420110,"PUERTO RICAN SEASONING WO/ HAM & TOMATO SAUCE","Puerto Rican seasoning without ham and tomato sauce" +74501010,"TOMATO ASPIC","Tomato aspic" +74503010,"TOMATO & CORN, COOKED, FAT NOT ADDED IN COOKING","Tomato and corn, cooked, fat not added in cooking" +74504000,"TOMATO & OKRA, COOKED, NS AS TO ADDED FAT","Tomato and okra, cooked, NS as to fat added in cooking" +74504010,"TOMATO & OKRA, COOKED, NO FAT ADDED","Tomato and okra, cooked, fat not added in cooking" +74504020,"TOMATO & OKRA, COOKED, FAT ADDED","Tomato and okra, cooked, fat added in cooking" +74504100,"TOMATO & ONION, COOKED, NS FAT ADDED","Tomato and onion, cooked, NS as to fat added in cooking" +74504110,"TOMATO & ONION, COOKED, FAT NOT ADDED IN COOKING","Tomato and onion, cooked, fat not added in cooking" +74504120,"TOMATO & ONION, COOKED, FAT ADDED","Tomato and onion, cooked, fat added in cooking" +74504150,"TOMATO & CELERY, COOKED, FAT NOT ADDED IN COOKING","Tomato and celery, cooked, fat not added in cooking" +74505000,"TOMATO W/ CORN & OKRA, COOKED, NS AS TO ADDED FAT","Tomato with corn and okra, cooked, NS as to fat added in cooking" +74505010,"TOMATO W/ CORN & OKRA, COOKED, NO FAT ADDED","Tomato with corn and okra, cooked, fat not added in cooking" +74505020,"TOMATO W/ CORN & OKRA, COOKED, FAT ADDED","Tomato with corn and okra, cooked, fat added in cooking" +74506000,"TOMATO & CUCUMBER SALAD W/ OIL & VINEGAR","Tomato and cucumber salad made with tomato, cucumber, oil, and vinegar" +74601000,"TOMATO SOUP, NFS","Tomato soup, NFS" +74601010,"TOMATO SOUP, CREAM OF,PREP W/ MILK","Tomato soup, cream of, prepared with milk" +74602010,"TOMATO SOUP, PREPARED WITH WATER, OR READY-TO-SERVE","Tomato soup, prepared with water, or ready-to-serve" +74602050,"TOMATO SOUP, INSTANT TYPE, PREPARED W/ WATER","Tomato soup, instant type, prepared with water" +74602200,"TOMATO SOUP, CANNED, REDUCED SODIUM, PREPARED WITH WATER, OR","Tomato soup, canned, reduced sodium, prepared with water, or ready-to-serve" +74602300,"TOMATO SOUP, CANNED, REDUCED SODIUM, PREP W/ MILK","Tomato soup, canned, reduced sodium, prepared with milk" +74603010,"TOMATO BEEF SOUP, PREPARED W/ WATER","Tomato beef soup, prepared with water" +74604010,"TOMATO BEEF NOODLE SOUP, PREPARED W/ WATER","Tomato beef noodle soup, prepared with water" +74604100,"TOMATO BEEF RICE SOUP, PREPARED W/ WATER","Tomato beef rice soup, prepared with water" +74604500,"TOMATO NOODLE SOUP, CANNED, PREPARED WITH WATER OR READY-TO-","Tomato noodle soup, canned, prepared with water or ready-to-serve" +74604600,"TOMATO NOODLE SOUP, CANNED, PREPARED WITH MILK","Tomato noodle soup, canned, prepared with milk" +74605010,"TOMATO RICE SOUP, PREPARED W/ WATER","Tomato rice soup, prepared with water" +74606010,"TOMATO VEGETABLE SOUP, PREP W/ WATER","Tomato vegetable soup, prepared with water" +74606020,"TOMATO VEGETABLE SOUP W/NOODLES, PREPARED W/ WATER","Tomato vegetable soup with noodles, prepared with water" +74701000,"TOMATO SANDWICH","Tomato sandwich" +75100250,"RAW VEGETABLE, NFS","Raw vegetable, NFS" +75100300,"SPROUTS, NFS","Sprouts, NFS" +75100500,"ALFALFA SPROUTS, RAW","Alfalfa sprouts, raw" +75100750,"ARTICHOKE, JERUSALEM, RAW (INCLUDE SUNCHOKE)","Artichoke, Jerusalem, raw" +75100800,"ASPARAGUS, RAW","Asparagus, raw" +75101000,"BEAN SPROUTS, RAW (SOYBEAN/MUNG)","Bean sprouts, raw (soybean or mung)" +75101800,"BEANS, STRING, GREEN, RAW","Beans, string, green, raw" +75102000,"BEANS, LIMA, RAW","Beans, lima, raw" +75102500,"BEETS, RAW","Beets, raw" +75102600,"BROCCOFLOWER, RAW","Broccoflower, raw" +75102750,"BRUSSELS SPROUTS, RAW","Brussels sprouts, raw" +75103000,"CABBAGE, GREEN, RAW","Cabbage, green, raw" +75104000,"CABBAGE, CHINESE, RAW","Cabbage, Chinese, raw" +75105000,"CABBAGE, RED, RAW","Cabbage, red, raw" +75105500,"CACTUS, RAW","Cactus, raw" +75107000,"CAULIFLOWER, RAW","Cauliflower, raw" +75109000,"CELERY, RAW (INCLUDE CELERY, NFS)","Celery, raw" +75109010,"FENNEL BULB, RAW","Fennel bulb, raw" +75109400,"BASIL, RAW","Basil, raw" +75109500,"CHIVES, RAW (INCLUDE CHIVES, NFS)","Chives, raw" +75109550,"CILANTRO, RAW","Cilantro, raw" +75109600,"CORN, RAW","Corn, raw" +75111000,"CUCUMBER, RAW (INCLUDE CUCUMBER, NFS)","Cucumber, raw" +75111200,"EGGPLANT, RAW","Eggplant, raw" +75111500,"GARLIC, RAW","Garlic, raw" +75111800,"JICAMA, RAW (INCLUDE YAMBEAN)","Jicama, raw" +75112000,"KOHLRABI, RAW","Kohlrabi, raw" +75112500,"LEEK, RAW","Leek, raw" +75113000,"LETTUCE, RAW","Lettuce, raw" +75113060,"LETTUCE, BOSTON, RAW","Lettuce, Boston, raw" +75113070,"LETTUCE, MANOA","Lettuce, manoa" +75113080,"LETTUCE, ARUGULA, RAW","Lettuce, arugula, raw" +75114000,"MIXED SALAD GREENS, RAW","Mixed salad greens, raw" +75115000,"MUSHROOMS, RAW","Mushrooms, raw" +75117010,"ONIONS, YOUNG GREEN, RAW","Onions, young green, raw" +75117020,"ONIONS, MATURE, RAW","Onions, mature, raw" +75119000,"PARSLEY, RAW","Parsley, raw" +75120000,"PEAS, GREEN, RAW","Peas, green, raw" +75121000,"PEPPER, HOT CHILI, RAW (INCLUDE JALAPENO)","Pepper, hot chili, raw" +75121400,"PEPPER, POBLANO, RAW","Pepper, poblano, raw" +75121500,"PEPPER, SERRANO, RAW","Pepper, Serrano, raw" +75122000,"PEPPER, RAW, NFS","Pepper, raw, NFS" +75122100,"PEPPER, SWEET, GREEN, RAW","Pepper, sweet, green, raw" +75122200,"PEPPER, SWEET, RED, RAW","Pepper, sweet, red, raw" +75124000,"PEPPER, BANANA, RAW","Pepper, banana, raw" +75125000,"RADISH, RAW","Radish, raw" +75127000,"RUTABAGA, RAW","Rutabaga, raw" +75127500,"SEAWEED, RAW (INCLUDE BLANCHED)","Seaweed, raw" +75127750,"SNOWPEA (PEA POD), RAW","Snowpeas (pea pod), raw" +75128000,"SQUASH, SUMMER, YELLOW, RAW","Squash, summer, yellow, raw" +75128010,"SQUASH, SUMMER, GREEN, RAW (INCLUDE ZUCCHINI)","Squash, summer, green, raw" +75129000,"TURNIP, RAW","Turnip, raw" +75132000,"MIXED VEGETABLE JUICE (OTHER THAN TOMATO)","Mixed vegetable juice (vegetables other than tomato)" +75132100,"CELERY JUICE","Celery juice" +75140500,"BROCCOLI SALAD W/CAULIFLOWER,CHEESE,BACON,&DRESSING","Broccoli salad with cauliflower, cheese, bacon bits, and dressing" +75140510,"BROCCOLI SLAW SALAD","Broccoli slaw salad" +75140990,"CABBAGE SALAD OR COLESLAW, FROM FAST FOOD / RESTAURANT","Cabbage salad or coleslaw, from fast food / restaurant" +75141000,"CABBAGE SALAD OR COLESLAW, MADE WITH COLESLAW DRESSING","Cabbage salad or coleslaw, made with coleslaw dressing" +75141005,"CABBAGE SALAD OR COLESLAW, MADE W/ LIGHT COLESLAW DRESSING","Cabbage salad or coleslaw, made with light coleslaw dressing" +75141020,"CABBAGE SALAD OR COLESLAW, W/ ITALIAN DRSG","Cabbage salad or coleslaw, made with Italian dressing" +75141025,"CABBAGE SALAD OR COLESLAW, W/LT ITALIAN DRSG","Cabbage salad or coleslaw, made with light Italian dressing" +75141030,"CABBAGE SALAD OR COLESLAW, W/ CREAMY DRSG","Cabbage salad or coleslaw, made with creamy dressing" +75141035,"CABBAGE SALAD OR COLESLAW, W/ LT CREAMY DRSG","Cabbage salad or coleslaw, made with light creamy dressing" +75141040,"CABBAGE SALAD OR COLESLAW, W/ FAT FREE DRSG","Cabbage salad or coleslaw, made with any type of fat free dressing" +75141100,"CABBAGE SALAD OR COLESLAW, W/APPLES/RAISINS, DRESS","Cabbage salad or coleslaw with apples and/or raisins, with dressing" +75141200,"CABBAGE SALAD OR COLESLAW, W/ PINEAPPLE, DRESSING","Cabbage salad or coleslaw with pineapple, with dressing" +75141300,"CABBAGE, CHINESE, SALAD, W/ DRESSING","Cabbage, Chinese, salad, with dressing" +75141500,"CELERY, STUFFED W/ CHEESE","Celery, stuffed with cheese" +75142000,"CUCUMBER & VEGETABLE NAMASU","Cucumber and vegetable namasu" +75142500,"CUCUMBER SALAD, MADE WITH SOUR CREAM DRESSING","Cucumber salad, made with sour cream dressing" +75142550,"CUCUMBER SALAD, W/ ITALIAN DRSG","Cucumber salad, made with Italian dressing" +75142600,"CUCUMBER SALAD MADE W/ CUCUMBER AND VINEGAR","Cucumber salad made with cucumber and vinegar" +75143000,"LETTUCE SALAD W/ ASSORTED VEGETABLES","Lettuce, salad with assorted vegetables including tomatoes and/or carrots, no dressing" +75143050,"LETTUCE SALAD, W/ ASST VEG, NO TOM OR CAR, NO DRESS","Lettuce, salad with assorted vegetables excluding tomatoes and carrots, no dressing" +75143100,"LETTUCE SALAD, W/ AVOCADO, TOMATO/CAR, NO DRESS","Lettuce, salad with avocado, tomato, and/or carrots, with or without other vegetables, no dressing" +75143200,"LETTUCE SALAD, W/ CHEESE, TOM/CAR, NO DRESSING","Lettuce, salad with cheese, tomato and/or carrots, with or without other vegetables, no dressing" +75143300,"LETTUCE SALAD, W/ EGG, TOM/CAR, NO DRESSING","Lettuce, salad with egg, tomato, and/or carrots, with or without other vegetables, no dressing" +75143350,"LETTUCE SALAD W/ EGG, CHEESE, TOM/CAR, NO DRESSING","Lettuce, salad with egg, cheese, tomato, and/or carrots, with or without other vegetables, no dressing" +75144100,"LETTUCE, WILTED, W/ BACON DRESSING","Lettuce, wilted, with bacon dressing" +75145000,"SEVEN-LAYER SALAD(LETTUCE, MAYO, CHEESE, EGG, PEAS)","Seven-layer salad (lettuce salad made with a combination of onion, celery, green pepper, peas, mayonnaise, cheese, eggs, and/or bacon)" +75146000,"GREEK SALAD, NO DRESSING","Greek Salad, no dressing" +75147000,"SPINACH SALAD, NO DRESSING","Spinach salad, no dressing" +75148010,"COBB SALAD, NO DRESSING","Cobb salad, no dressing" +75200100,"VEGETABLES, NS AS TO TYPE, NS AS TO ADDED FAT","Vegetables, NS as to type, cooked, NS as to fat added in cooking" +75200110,"VEGETABLES, NS AS TO TYPE, NO FAT ADDED","Vegetables, NS as to type, cooked, fat not added in cooking" +75200120,"VEGETABLES, NS AS TO TYPE, COOKED, FAT ADDED","Vegetables, NS as to type, cooked, fat added in cooking" +75200600,"ALGAE, DRIED (INCLUDE SPIRULINA)","Algae, dried" +75200700,"ALOE VERA JUICE","Aloe vera juice" +75201000,"ARTICHOKE, GLOBE(FRENCH), CKD, NS FORM, NS FAT ADDED","Artichoke, globe (French), cooked, NS as to form, NS as to fat added in cooking" +75201001,"ARTICHOKE, GLOBE(FRENCH), CKD, FROM FRESH, NS FAT ADDED","Artichoke, globe (French), cooked, from fresh, NS as to fat added in cooking" +75201002,"ARTICHOKE, GLOBE(FRENCH), CKD, FROM FROZ, NS FAT ADDED","Artichoke, globe (French), cooked, from frozen, NS as to fat added in cooking" +75201003,"ARTICHOKE, GLOBE(FRENCH), CKD, FROM CAN, NS FAT ADDED","Artichoke, globe (French), cooked, from canned, NS as to fat added in cooking" +75201010,"ARTICHOKE,GLOBE (FRENCH),CKD,NS FORM,FAT NOT ADDED","Artichoke, globe (French), cooked, NS as to form, fat not added in cooking" +75201011,"ARTICHOKE,GLOBE (FRENCH),CKD,FROM FRESH,FAT NOT ADDED","Artichoke, globe (French), cooked, from fresh, fat not added in cooking" +75201012,"ARTICHOKE,GLOBE (FRENCH),CKD,FROM FROZ,FAT NOT ADDED","Artichoke, globe (French), cooked, from frozen, fat not added in cooking" +75201013,"ARTICHOKE,GLOBE (FRENCH),CKD,FROM CAN,FAT NOT ADDED","Artichoke, globe (French), cooked, from canned, fat not added in cooking" +75201020,"ARTICHOKE, GLOBE (FRENCH), CKD, NS FORM, FAT ADDED","Artichoke, globe (French), cooked, NS as to form, fat added in cooking" +75201021,"ARTICHOKE, GLOBE (FRENCH), CKD, FROM FRESH, FAT ADDED","Artichoke, globe (French), cooked, from fresh, fat added in cooking" +75201022,"ARTICHOKE, GLOBE (FRENCH), CKD, FROM FROZ, FAT ADDED","Artichoke, globe (French), cooked, from frozen, fat added in cooking" +75201023,"ARTICHOKE, GLOBE (FRENCH), CKD, FROM CAN, FAT ADDED","Artichoke, globe (French), cooked, from canned, fat added in cooking" +75201030,"ARTICHOKE SALAD IN OIL","Artichoke salad in oil" +75202000,"ASPARAGUS, COOKED, NS AS TO FORM, NS FAT ADDED","Asparagus, cooked, NS as to form, NS as to fat added in cooking" +75202001,"ASPARAGUS, COOKED, FROM FRESH, NS FAT ADDED","Asparagus, cooked, from fresh, NS as to fat added in cooking" +75202002,"ASPARAGUS, COOKED, FROM FROZEN, NS FAT ADDED","Asparagus, cooked, from frozen, NS as to fat added in cooking" +75202003,"ASPARAGUS, COOKED, FROM CANNED, NS FAT ADDED","Asparagus, cooked, from canned, NS as to fat added in cooking" +75202010,"ASPARAGUS, COOKED, NS AS TO FORM, FAT NOT ADDED","Asparagus, cooked, NS as to form, fat not added in cooking" +75202011,"ASPARAGUS, COOKED, FROM FRESH, FAT NOT ADDED","Asparagus, cooked, from fresh, fat not added in cooking" +75202012,"ASPARAGUS, COOKED, FROM FROZEN, FAT NOT ADDED","Asparagus, cooked, from frozen, fat not added in cooking" +75202013,"ASPARAGUS, COOKED, FROM CANNED, FAT NOT ADDED","Asparagus, cooked, from canned, fat not added in cooking" +75202020,"ASPARAGUS, COOKED, NS AS TO FORM, FAT ADDED","Asparagus, cooked, NS as to form, fat added in cooking" +75202021,"ASPARAGUS, COOKED, FROM FRESH, FAT ADDED","Asparagus, cooked, from fresh, fat added in cooking" +75202022,"ASPARAGUS, COOKED, FROM FROZEN, FAT ADDED","Asparagus, cooked, from frozen, fat added in cooking" +75202023,"ASPARAGUS, COOKED, FROM CANNED, FAT ADDED","Asparagus, cooked, from canned, fat added in cooking" +75203000,"BAMBOO SHOOTS, COOKED, FAT NOT ADDED IN COOKING","Bamboo shoots, cooked, fat not added in cooking" +75203020,"BAMBOO SHOOTS, COOKED, FAT ADDED IN COOKING","Bamboo shoots, cooked, fat added in cooking" +75204000,"BEANS, LIMA, IMMATURE, COOKED, NS FORM, NS AS TO FAT","Beans, lima, immature, cooked, NS as to form, NS as to fat added in cooking" +75204001,"BEANS, LIMA, IMMATURE, COOKED, FROM FRESH, NS FAT ADDED","Beans, lima, immature, cooked, from fresh, NS as to fat added in cooking" +75204002,"BEANS, LIMA, IMMATURE, COOKED, FROM FROZEN, NS FAT ADDED","Beans, lima, immature, cooked, from frozen, NS as to fat added in cooking" +75204003,"BEANS, LIMA, IMMATURE, COOKED, FROM CANNED, NS FAT ADDED","Beans, lima, immature, cooked, from canned, NS as to fat added in cooking" +75204010,"BEANS, LIMA, IMMATURE, COOKED, NS FORM, NO FAT ADDED","Beans, lima, immature, cooked, NS as to form, fat not added in cooking" +75204011,"BEANS, LIMA, IMMATURE, COOKED, FROM FRESH, NO FAT ADDED","Beans, lima, immature, cooked, from fresh, fat not added in cooking" +75204012,"BEANS, LIMA, IMMATURE, COOKED, FROM FROZ, NO FAT ADDED","Beans, lima, immature, cooked, from frozen, fat not added in cooking" +75204013,"BEANS, LIMA, IMMATURE, COOKED, FROM CAN, NO FAT ADDED","Beans, lima, immature, cooked, from canned, fat not added in cooking" +75204020,"BEANS, LIMA, IMMATURE, COOKED, NS FORM, FAT ADDED","Beans, lima, immature, cooked, NS as to form, fat added in cooking" +75204021,"BEANS, LIMA, IMMATURE, COOKED, FROM FRESH, FAT ADDED","Beans, lima, immature, cooked, from fresh, fat added in cooking" +75204022,"BEANS, LIMA, IMMATURE, COOKED, FROM FROZ, FAT ADDED","Beans, lima, immature, cooked, from frozen, fat added in cooking" +75204023,"BEANS, LIMA, IMMATURE, COOKED, FROM CAN, FAT ADDED","Beans, lima, immature, cooked, from canned, fat added in cooking" +75204100,"BEANS, LIMA,IMMATURE,CANNED,LOW SODIUM,NS AS TO FAT","Beans, lima, immature, canned, low sodium, NS as to fat added in cooking" +75204110,"BEANS, LIMA,IMMATURE,CANNED,LOW SODIUM,NO FAT ADDED","Beans, lima, immature, canned, low sodium, fat not added in cooking" +75204120,"BEANS, LIMA, IMMATURE, CANNED,LOW SODIUM, FAT ADDED","Beans, lima, immature, canned, low sodium, fat added in cooking" +75204980,"BEANS, STRING, CKD, NS FORM, NS COLOR, FAT ADDED","Beans, string, cooked, NS as to form, NS as to color, fat added in cooking" +75204981,"BEANS, STRING, CKD, FROM FRESH, NS COLOR, FAT ADDED","Beans, string, cooked, from fresh, NS as to color, fat added in cooking" +75204982,"BEANS, STRING, CKD, FROM FROZ, NS COLOR, FAT ADDED","Beans, string, cooked, from frozen, NS as to color, fat added in cooking" +75204983,"BEANS, STRING, CKD, FROM CAN, NS COLOR, FAT ADDED","Beans, string, cooked, from canned, NS as to color, fat added in cooking" +75204990,"BEANS, STRING, CKD, NS FORM, NS COLOR, NO FAT ADDED","Beans, string, cooked, NS as to form, NS as to color, fat not added in cooking" +75204991,"BEANS, STRING, CKD, FROM FRESH, NS COLOR, NO FAT ADDED","Beans, string, cooked, from fresh, NS as to color, fat not added in cooking" +75204992,"BEANS, STRING, CKD, FROM FROZ, NS COLOR, NO FAT ADDED","Beans, string, cooked, from frozen, NS as to color, fat not added in cooking" +75204993,"BEANS, STRING, CKD, FROM CAN, NS COLOR, NO FAT ADDED","Beans, string, cooked, from canned, NS as to color, fat not added in cooking" +75205000,"BEANS, STRING, CKD, NS FORM, NS COLOR, NS FAT ADDED","Beans, string, cooked, NS as to form, NS as to color, NS as to fat added in cooking" +75205001,"BEANS, STRING, CKD, FROM FRESH, NS COLOR, NS FAT ADDED","Beans, string, cooked, from fresh, NS as to color, NS as to fat added in cooking" +75205002,"BEANS, STRING, CKD, FROM FROZ, NS COLOR, NS FAT ADDED","Beans, string, cooked, from frozen, NS as to color, NS as to fat added in cooking" +75205003,"BEANS, STRING, CKD, FROM CAN, NS COLOR, NS FAT ADDED","Beans, string, cooked, from canned, NS as to color, NS as to fat added in cooking" +75205010,"BEANS, STRING, GREEN, COOKED, NS FORM, NS FAT ADDED","Beans, string, green, cooked, NS as to form, NS as to fat added in cooking" +75205011,"BEANS, STRING, GREEN, COOKED, FROM FRESH, NS FAT ADDED","Beans, string, green, cooked, from fresh, NS as to fat added in cooking" +75205012,"BEANS, STRING, GREEN, COOKED, FROM FROZEN, NS FAT ADDED","Beans, string, green, cooked, from frozen, NS as to fat added in cooking" +75205013,"BEANS, STRING, GREEN, COOKED, FROM CANNED, NS FAT ADDED","Beans, string, green, cooked, from canned, NS as to fat added in cooking" +75205020,"BEANS, STRING, GREEN, COOKED, NS FORM,FAT NOT ADDED","Beans, string, green, cooked, NS as to form, fat not added in cooking" +75205021,"BEANS, STRING, GREEN, COOKED, FROM FRESH, FAT NOT ADDED","Beans, string, green, cooked, from fresh, fat not added in cooking" +75205022,"BEANS, STRING, GREEN, COOKED, FROM FROZEN, FAT NOT ADDED","Beans, string, green, cooked, from frozen, fat not added in cooking" +75205023,"BEANS, STRING, GREEN, COOKED, FROM CANNED, FAT NOT ADDED","Beans, string, green, cooked, from canned, fat not added in cooking" +75205030,"BEANS, STRING, GREEN, COOKED, NS FORM, FAT ADDED","Beans, string, green, cooked, NS as to form, fat added in cooking" +75205031,"BEANS, STRING, GREEN, COOKED, FROM FRESH, FAT ADDED","Beans, string, green, cooked, from fresh, fat added in cooking" +75205032,"BEANS, STRING, GREEN, COOKED, FROM FROZEN, FAT ADDED","Beans, string, green, cooked, from frozen, fat added in cooking" +75205033,"BEANS, STRING, GREEN, COOKED, FROM CANNED, FAT ADDED","Beans, string, green, cooked, from canned, fat added in cooking" +75205110,"BEANS, GREEN, CANNED, LO NA, NS AS TO ADDED FAT","Beans, string, green, canned, low sodium, NS as to fat added in cooking" +75205120,"BEANS, GREEN, CANNED, LO NA, FAT NOT ADDED","Beans, string, green, canned, low sodium, fat not added in cooking" +75205130,"BEANS, GREEN, CANNED, LO NA, FAT ADDED","Beans, string, green, canned, low sodium, fat added in cooking" +75206000,"BEANS, STRING, YELLOW, COOKED, NS FORM, NS ADDED FAT","Beans, string, yellow, cooked, NS as to form, NS as to fat added in cooking" +75206001,"BEANS, STRING, YELLOW, COOKED, FROM FRESH, NS ADDED FAT","Beans, string, yellow, cooked, from fresh, NS as to fat added in cooking" +75206002,"BEANS, STRING, YELLOW, COOKED, FROM FROZ, NS ADDED FAT","Beans, string, yellow, cooked, from frozen, NS as to fat added in cooking" +75206003,"BEANS, STRING, YELLOW, COOKED, FROM CANNED, NS ADDED FAT","Beans, string, yellow, cooked, from canned, NS as to fat added in cooking" +75206010,"BEANS, STRING, YELLOW, COOKED, NS FORM, NO FAT ADDED","Beans, string, yellow, cooked, NS as to form, fat not added in cooking" +75206011,"BEANS, STRING, YELLOW, COOKED, FROM FRESH, NO FAT ADDED","Beans, string, yellow, cooked, from fresh, fat not added in cooking" +75206012,"BEANS, STRING, YELLOW, COOKED, FROM FROZ, NO FAT ADDED","Beans, string, yellow, cooked, from frozen, fat not added in cooking" +75206013,"BEANS, STRING, YELLOW, COOKED, FROM CANNED, NO FAT ADDED","Beans, string, yellow, cooked, from canned, fat not added in cooking" +75206020,"BEANS, STRING, YELLOW, COOKED, NS FORM, FAT ADDED","Beans, string, yellow, cooked, NS as to form, fat added in cooking" +75206021,"BEANS, STRING, YELLOW, COOKED, FROM FRESH, FAT ADDED","Beans, string, yellow, cooked, from fresh, fat added in cooking" +75206022,"BEANS, STRING, YELLOW, COOKED, FROM FROZ, FAT ADDED","Beans, string, yellow, cooked, from frozen, fat added in cooking" +75206023,"BEANS, STRING, YELLOW, COOKED, FROM CAN, FAT ADDED","Beans, string, yellow, cooked, from canned, fat added in cooking" +75207000,"BEAN SPROUTS, COOKED, NS FORM, NS AS TO ADDED FAT","Bean sprouts, cooked, NS as to form, NS as to fat added in cooking" +75207001,"BEAN SPROUTS, COOKED, FROM FRESH, NS FAT ADDED","Bean sprouts, cooked, from fresh, NS as to fat added in cooking" +75207003,"BEAN SPROUTS, COOKED, FROM CANNED, NS FAT ADDED","Bean sprouts, cooked, from canned, NS as to fat added in cooking" +75207010,"BEAN SPROUTS, COOKED, NS AS TO FORM, FAT NOT ADDED","Bean sprouts, cooked, NS as to form, fat not added in cooking" +75207011,"BEAN SPROUTS, COOKED, FROM FRESH, FAT NOT ADDED","Bean sprouts, cooked, from fresh, fat not added in cooking" +75207013,"BEAN SPROUTS, COOKED, FROM CANNED, FAT NOT ADDED","Bean sprouts, cooked, from canned, fat not added in cooking" +75207020,"BEAN SPROUTS, COOKED, NS AS TO FORM, FAT ADDED","Bean sprouts, cooked, NS as to form, fat added in cooking" +75207021,"BEAN SPROUTS, COOKED, FROM FRESH, FAT ADDED","Bean sprouts, cooked, from fresh, fat added in cooking" +75207023,"BEAN SPROUTS, COOKED, FROM CANNED, FAT ADDED","Bean sprouts, cooked, from canned, fat added in cooking" +75208000,"BEETS, COOKED, NS AS TO FORM, NS AS TO FAT ADDED","Beets, cooked, NS as to form, NS as to fat added in cooking" +75208001,"BEETS, COOKED, FROM FRESH, NS AS TO FAT ADDED","Beets, cooked, from fresh, NS as to fat added in cooking" +75208002,"BEETS, COOKED, FROM FROZEN, NS AS TO FAT ADDED","Beets, cooked, from frozen, NS as to fat added in cooking" +75208003,"BEETS, COOKED, FROM CANNED, NS AS TO FAT ADDED","Beets, cooked, from canned, NS as to fat added in cooking" +75208010,"BEETS, COOKED, NS AS TO FORM, FAT NOT ADDED","Beets, cooked, NS as to form, fat not added in cooking" +75208011,"BEETS, COOKED, FROM FRESH, FAT NOT ADDED","Beets, cooked, from fresh, fat not added in cooking" +75208012,"BEETS, COOKED, FROM FROZEN, FAT NOT ADDED","Beets, cooked, from frozen, fat not added in cooking" +75208013,"BEETS, COOKED, FROM CANNED, FAT NOT ADDED","Beets, cooked, from canned, fat not added in cooking" +75208020,"BEETS, COOKED, NS AS TO FORM, FAT ADDED","Beets, cooked, NS as to form, fat added in cooking" +75208021,"BEETS, COOKED, FROM FRESH, FAT ADDED","Beets, cooked, from fresh, fat added in cooking" +75208022,"BEETS, COOKED, FROM FROZEN, FAT ADDED","Beets, cooked, from frozen, fat added in cooking" +75208023,"BEETS, COOKED, FROM CANNED, FAT ADDED","Beets, cooked, from canned, fat added in cooking" +75208100,"BEETS, CANNED, LOW SODIUM, NS AS TO ADDED FAT","Beets, canned, low sodium, NS as to fat added in cooking" +75208110,"BEETS, CANNED, LOW SODIUM, FAT NOT ADDED","Beets, canned, low sodium, fat not added in cooking" +75208120,"BEETS, CANNED, LOW SODIUM, FAT ADDED","Beets, canned, low sodium, fat added in cooking" +75208290,"BITTERMELON, COOKED, NS AS TO ADDED FAT","Bitter melon, cooked, NS as to fat added in cooking" +75208300,"BITTERMELON, COOKED, NO FAT ADDED(INCL BALSAM PEAR)","Bitter melon, cooked, fat not added in cooking" +75208310,"BITTERMELON, COOKED, FAT ADDED (INCL BALSAM PEAR)","Bitter melon, cooked, fat added in cooking" +75208500,"BREADFRUIT, COOKED,FAT NOT ADDED IN COOKING","Breadfruit, cooked, fat not added in cooking" +75208520,"BREADFRUIT, FRIED","Breadfruit, fried" +75208700,"BROCCOFLOWER,COOKED,NS AS TO FAT ADDED IN COOKING","Broccoflower, cooked, NS as to fat added in cooking" +75208710,"BROCCOFLOWER,COOKED,FAT NOT ADDED IN COOKING","Broccoflower, cooked, fat not added in cooking" +75208720,"BROCCOFLOWER,COOKED,FAT ADDED IN COOKING","Broccoflower, cooked, fat added in cooking" +75209000,"BRUSSELS SPROUTS, COOKED, NS FORM, NS ADDED FAT","Brussels sprouts, cooked, NS as to form, NS as to fat added in cooking" +75209001,"BRUSSELS SPROUTS, COOKED, FROM FRESH, NS ADDED FAT","Brussels sprouts, cooked, from fresh, NS as to fat added in cooking" +75209002,"BRUSSELS SPROUTS, COOKED, FROM FROZ, NS ADDED FAT","Brussels sprouts, cooked, from frozen, NS as to fat added in cooking" +75209010,"BRUSSELS SPROUTS, COOKED, NS FORM, FAT NOT ADDED","Brussels sprouts, cooked, NS as to form, fat not added in cooking" +75209011,"BRUSSELS SPROUTS, COOKED, FROM FRESH, FAT NOT ADDED","Brussels sprouts, cooked, from fresh, fat not added in cooking" +75209012,"BRUSSELS SPROUTS, COOKED, FROM FROZ, FAT NOT ADDED","Brussels sprouts, cooked, from frozen, fat not added in cooking" +75209020,"BRUSSELS SPROUTS, COOKED, NS AS TO FORM, FAT ADDED","Brussels sprouts, cooked, NS as to form, fat added in cooking" +75209021,"BRUSSELS SPROUTS, COOKED, FROM FRESH, FAT ADDED","Brussels sprouts, cooked, from fresh, fat added in cooking" +75209022,"BRUSSELS SPROUTS, COOKED, FROM FROZ, FAT ADDED","Brussels sprouts, cooked, from frozen, fat added in cooking" +75209500,"BURDOCK, COOKED, FAT NOT ADDED IN COOKING","Burdock, cooked, fat not added in cooking" +75210000,"CABBAGE, CHINESE, COOKED, NS AS TO ADDED FAT","Cabbage, Chinese, cooked, NS as to fat added in cooking" +75210010,"CABBAGE, CHINESE, COOKED, FAT NOT ADDED","Cabbage, Chinese, cooked, fat not added in cooking" +75210020,"CABBAGE, CHINESE, COOKED, FAT ADDED","Cabbage, Chinese, cooked, fat added in cooking" +75211010,"CABBAGE, GREEN, COOKED, NS FAT","Cabbage, green, cooked, NS as to fat added in cooking" +75211020,"CABBAGE, GREEN, COOKED, FAT NOT ADDED","Cabbage, green, cooked, fat not added in cooking" +75211030,"CABBAGE, GREEN, COOKED, FAT ADDED","Cabbage, green, cooked, fat added in cooking" +75212000,"CABBAGE, RED, COOKED, NS AS TO ADDED FAT","Cabbage, red, cooked, NS as to fat added in cooking" +75212010,"CABBAGE, RED, COOKED, FAT NOT ADDED","Cabbage, red, cooked, fat not added in cooking" +75212020,"CABBAGE, RED, COOKED, FAT ADDED","Cabbage, red, cooked, fat added in cooking" +75213000,"CABBAGE, SAVOY, COOKED, NS AS TO ADDED FAT","Cabbage, savoy, cooked, NS as to fat added in cooking" +75213010,"CABBAGE, SAVOY, COOKED, FAT NOT ADDED","Cabbage, savoy, cooked, fat not added in cooking" +75213020,"CABBAGE, SAVOY, COOKED, FAT ADDED","Cabbage, savoy, cooked, fat added in cooking" +75213100,"CACTUS, COOKED, NS AS TO ADDED FAT","Cactus, cooked, NS as to fat added in cooking" +75213110,"CACTUS, COOKED, FAT NOT ADDED","Cactus, cooked, fat not added in cooking" +75213120,"CACTUS, COOKED, FAT ADDED","Cactus, cooked, fat added in cooking" +75214000,"CAULIFLOWER, COOKED, NS FORM, NS FAT ADDED","Cauliflower, cooked, NS as to form, NS as to fat added in cooking" +75214001,"CAULIFLOWER, COOKED, FROM FRESH, NS FAT ADDED","Cauliflower, cooked, from fresh, NS as to fat added in cooking" +75214002,"CAULIFLOWER, COOKED, FROM FROZEN, NS FAT ADDED","Cauliflower, cooked, from frozen, NS as to fat added in cooking" +75214003,"CAULIFLOWER, COOKED, FROM CANNED, NS FAT ADDED","Cauliflower, cooked, from canned, NS as to fat added in cooking" +75214010,"CAULIFLOWER, COOKED, NS FORM, FAT NOT ADDED","Cauliflower, cooked, NS as to form, fat not added in cooking" +75214011,"CAULIFLOWER, COOKED, FROM FRESH, FAT NOT ADDED","Cauliflower, cooked, from fresh, fat not added in cooking" +75214012,"CAULIFLOWER, COOKED, FROM FROZEN, FAT NOT ADDED","Cauliflower, cooked, from frozen, fat not added in cooking" +75214013,"CAULIFLOWER, COOKED, FROM CANNED, FAT NOT ADDED","Cauliflower, cooked, from canned, fat not added in cooking" +75214020,"CAULIFLOWER, COOKED, NS AS TO FORM, FAT ADDED","Cauliflower, cooked, NS as to form, fat added in cooking" +75214021,"CAULIFLOWER, COOKED, FROM FRESH, FAT ADDED","Cauliflower, cooked, from fresh, fat added in cooking" +75214022,"CAULIFLOWER, COOKED, FROM FROZEN, FAT ADDED","Cauliflower, cooked, from frozen, fat added in cooking" +75214023,"CAULIFLOWER, COOKED, FROM CANNED, FAT ADDED","Cauliflower, cooked, from canned, fat added in cooking" +75215000,"CELERY, COOKED, NS AS TO ADDED FAT","Celery, cooked, NS as to fat added in cooking" +75215010,"CELERY, COOKED, FAT NOT ADDED","Celery, cooked, fat not added in cooking" +75215020,"CELERY, COOKED, FAT ADDED","Celery, cooked, fat added in cooking" +75215100,"FENNEL BULB, COOKED, NS AS TO FAT ADDED","Fennel bulb, cooked, NS as to fat added in cooking" +75215110,"FENNEL BULB, COOKED, FAT NOT ADDED IN COOKING","Fennel bulb, cooked, fat not added in cooking" +75215120,"FENNEL BULB, COOKED, FAT ADDED IN COOKING","Fennel bulb, cooked, fat added in cooking" +75215510,"CHRISTOPHINE, COOKED, FAT NOT ADDED IN COOKING","Christophine, cooked, fat not added in cooking" +75216000,"CORN, COOKED, NS FORM, NS COLOR. NS FAT ADDED","Corn, cooked, NS as to form, NS as to color, NS as to fat added in cooking" +75216001,"CORN, COOKED, FROM FRESH, NS COLOR. NS FAT ADDED","Corn, cooked, from fresh, NS as to color, NS as to fat added in cooking" +75216002,"CORN, COOKED, FROM FROZEN, NS COLOR. NS FAT ADDED","Corn, cooked, from frozen, NS as to color, NS as to fat added in cooking" +75216003,"CORN, COOKED, FROM CANNED, NS COLOR, NS FAT ADDED","Corn, cooked, from canned, NS as to color, NS as to fat added in cooking" +75216010,"CORN, COOKED, NS FORM, NS COLOR, FAT NOT ADDED","Corn, cooked, NS as to form, NS as to color, fat not added in cooking" +75216011,"CORN, COOKED, FROM FRESH, NS COLOR, FAT NOT ADDED","Corn, cooked, from fresh, NS as to color, fat not added in cooking" +75216012,"CORN, COOKED, FROM FROZEN, NS COLOR, FAT NOT ADDED","Corn, cooked, from frozen, NS as to color, fat not added in cooking" +75216013,"CORN, COOKED, FROM CANNED, NS COLOR, FAT NOT ADDED","Corn, cooked, from canned, NS as to color, fat not added in cooking" +75216020,"CORN, COOKED, NS FORM, NS COLOR, FAT ADDED","Corn, cooked, NS as to form, NS as to color, fat added in cooking" +75216021,"CORN, COOKED, FROM FRESH, NS COLOR, FAT ADDED","Corn, cooked, from fresh, NS as to color, fat added in cooking" +75216022,"CORN, COOKED, FROM FROZEN, NS COLOR, FAT ADDED","Corn, cooked, from frozen, NS as to color, fat added in cooking" +75216023,"CORN, COOKED, FROM CANNED, NS COLOR, FAT ADDED","Corn, cooked, from canned, NS as to color, fat added in cooking" +75216050,"CORN, NS AS TO FORM, NS AS TO COLOR, CREAM STYLE","Corn, NS as to form, NS as to color, cream style" +75216053,"CORN, FROM CANNED, NS AS TO COLOR, CREAM STYLE","Corn, from canned, NS as to color, cream style" +75216070,"CORN, DRIED, COOKED","Corn, dried, cooked" +75216100,"CORN, YELLOW, COOKED, NS FORM, NS FAT ADDED","Corn, yellow, cooked, NS as to form, NS as to fat added in cooking" +75216101,"CORN, YELLOW, COOKED, FROM FRESH, NS FAT ADDED","Corn, yellow, cooked, from fresh, NS as to fat added in cooking" +75216102,"CORN, YELLOW, COOKED, FROM FROZEN, NS FAT ADDED","Corn, yellow, cooked, from frozen, NS as to fat added in cooking" +75216103,"CORN, YELLOW, COOKED, FROM CANNED, NS FAT ADDED","Corn, yellow, cooked, from canned, NS as to fat added in cooking" +75216110,"CORN, YELLOW, COOKED, NS FORM, FAT NOT ADDED","Corn, yellow, cooked, NS as to form, fat not added in cooking" +75216111,"CORN, YELLOW, COOKED, FROM FRESH, FAT NOT ADDED","Corn, yellow, cooked, from fresh, fat not added in cooking" +75216112,"CORN, YELLOW, COOKED, FROM FROZEN, FAT NOT ADDED","Corn, yellow, cooked, from frozen, fat not added in cooking" +75216113,"CORN, YELLOW, COOKED, FROM CANNED, FAT NOT ADDED","Corn, yellow, cooked, from canned, fat not added in cooking" +75216120,"CORN, YELLOW, COOKED, NS FORM, FAT ADDED","Corn, yellow, cooked, NS as to form, fat added in cooking" +75216121,"CORN, YELLOW, COOKED, FROM FRESH, FAT ADDED","Corn, yellow, cooked, from fresh, fat added in cooking" +75216122,"CORN, YELLOW, COOKED, FROM FROZEN, FAT ADDED","Corn, yellow, cooked, from frozen, fat added in cooking" +75216123,"CORN, YELLOW, COOKED, FROM CANNED, FAT ADDED","Corn, yellow, cooked, from canned, fat added in cooking" +75216150,"CORN, YELLOW, NS AS TO FORM, CREAM STYLE","Corn, yellow, NS as to form, cream style" +75216153,"CORN, YELLOW, FROM CANNED, CREAM STYLE","Corn, yellow, from canned, cream style" +75216160,"CORN, YELLOW & WHITE, COOKED, NS FORM, NS FAT ADDED","Corn, yellow and white, cooked, NS as to form, NS as to fat added in cooking" +75216161,"CORN, YELLOW & WHITE, COOKED, FROM FRESH, NS FAT ADDED","Corn, yellow and white, cooked, from fresh, NS as to fat added in cooking" +75216162,"CORN, YELLOW & WHITE, COOKED, FROM FROZ, NS FAT ADDED","Corn, yellow and white, cooked, from frozen, NS as to fat added in cooking" +75216163,"CORN, YELLOW & WHITE, COOKED, FROM CAN, NS FAT ADDED","Corn, yellow and white, cooked, from canned, NS as to fat added in cooking" +75216170,"CORN, YELLOW & WHITE, COOKED, NS FORM, NO FAT ADDED","Corn, yellow and white, cooked, NS as to form, fat not added in cooking" +75216171,"CORN, YELLOW & WHITE, COOKED, FROM FRESH, NO FAT ADDED","Corn, yellow and white, cooked, from fresh, fat not added in cooking" +75216172,"CORN, YELLOW & WHITE, COOKED, FROM FROZ, NO FAT ADDED","Corn, yellow and white, cooked, from frozen, fat not added in cooking" +75216173,"CORN, YELLOW & WHITE, COOKED, FROM CAN, NO FAT ADDED","Corn, yellow and white, cooked, from canned, fat not added in cooking" +75216180,"CORN, YELLOW & WHITE, COOKED, NS FORM, FAT ADDED","Corn, yellow and white, cooked, NS as to form, fat added in cooking" +75216181,"CORN, YELLOW & WHITE, COOKED, FROM FRESH, FAT ADDED","Corn, yellow and white, cooked, from fresh, fat added in cooking" +75216182,"CORN, YELLOW & WHITE, COOKED, FROM FROZ, FAT ADDED","Corn, yellow and white, cooked, from frozen, fat added in cooking" +75216183,"CORN, YELLOW & WHITE, COOKED, FROM CAN, FAT ADDED","Corn, yellow and white, cooked, from canned, fat added in cooking" +75216190,"CORN, YELLOW, NS AS TO FORM, CREAM STYLE, FAT ADDED","Corn, yellow, NS as to form, cream style, fat added in cooking" +75216193,"CORN, YELLOW, FROM CANNED, CREAM STYLE, FAT ADDED","Corn, yellow, from canned, cream style, fat added in cooking" +75216200,"CORN, WHITE, COOKED, NS FORM, NS FAT ADDED","Corn, white, cooked, NS as to form, NS as to fat added in cooking" +75216201,"CORN, WHITE, COOKED, FROM FRESH, NS FAT ADDED","Corn, white, cooked, from fresh, NS as to fat added in cooking" +75216202,"CORN, WHITE, COOKED, FROM FROZEN, NS FAT ADDED","Corn, white, cooked, from frozen, NS as to fat added in cooking" +75216203,"CORN, WHITE, COOKED, FROM CANNED, NS FAT ADDED","Corn, white, cooked, from canned, NS as to fat added in cooking" +75216210,"CORN, WHITE, COOKED, NS AS TO FORM, FAT NOT ADDED","Corn, white, cooked, NS as to form, fat not added in cooking" +75216211,"CORN, WHITE, COOKED, FROM FRESH, FAT NOT ADDED","Corn, white, cooked, from fresh, fat not added in cooking" +75216212,"CORN, WHITE, COOKED, FROM FROZEN, FAT NOT ADDED","Corn, white, cooked, from frozen, fat not added in cooking" +75216213,"CORN, WHITE, COOKED, FROM CANNED, FAT NOT ADDED","Corn, white, cooked, from canned, fat not added in cooking" +75216220,"CORN, WHITE, COOKED, NS AS TO FORM, FAT ADDED","Corn, white, cooked, NS as to form, fat added in cooking" +75216221,"CORN, WHITE, COOKED, FROM FRESH, FAT ADDED","Corn, white, cooked, from fresh, fat added in cooking" +75216222,"CORN, WHITE, COOKED, FROM FROZEN, FAT ADDED","Corn, white, cooked, from frozen, fat added in cooking" +75216223,"CORN, WHITE, COOKED, FROM CANNED, FAT ADDED","Corn, white, cooked, from canned, fat added in cooking" +75216250,"CORN, WHITE, NS AS TO FORM, CREAM STYLE","Corn, white, NS as to form, cream style" +75216253,"CORN, WHITE, FROM CANNED, CREAM STYLE","Corn, white, from canned, cream style" +75216300,"CORN, YELLOW, CANNED, LO NA, NS AS TO ADDED FAT","Corn, yellow, canned, low sodium, NS as to fat added in cooking" +75216310,"CORN, YELLOW, CANNED, LOW SODIUM, FAT NOT ADDED","Corn, yellow, canned, low sodium, fat not added in cooking" +75216320,"CORN, YELLOW, CANNED, LOW SODIUM, FAT ADDED","Corn, yellow, canned, low sodium, fat added in cooking" +75216700,"CUCUMBER, COOKED, NS AS TO ADDED FAT","Cucumber, cooked, NS as to fat added in cooking" +75216710,"CUCUMBER, COOKED, FAT NOT ADDED","Cucumber, cooked, fat not added in cooking" +75216720,"CUCUMBER, COOKED, FAT ADDED","Cucumber, cooked, fat added in cooking" +75217000,"EGGPLANT, COOKED, NS AS TO ADDED FAT","Eggplant, cooked, NS as to fat added in cooking" +75217010,"EGGPLANT, COOKED, FAT NOT ADDED","Eggplant, cooked, fat not added in cooking" +75217020,"EGGPLANT, COOKED, FAT ADDED","Eggplant, cooked, fat added in cooking" +75217300,"FLOWERS / BLOSSOMS OF SESBANIA/LILY/SQUASH, NO FAT","Flowers or blossoms of sesbania, squash, or lily, fat not added in cooking" +75217400,"GARLIC, COOKED","Garlic, cooked" +75217490,"HOMINY, COOKED, NS AS TO ADDED FAT","Hominy, cooked, NS as to fat added in cooking" +75217500,"HOMINY, COOKED, NO FAT ADDED","Hominy, cooked, fat not added in cooking" +75217520,"HOMINY, COOKED, FAT ADDED","Hominy, cooked, fat added in cooking" +75218010,"KOHLRABI, COOKED,FAT NOT ADDED IN COOKING","Kohlrabi, cooked, fat not added in cooking" +75218400,"LEEK, COOKED, NS AS TO FAT ADDED IN COOKING","Leek, cooked, NS as to fat added in cooking" +75218500,"LOTUS ROOT, COOKED, FAT NOT ADDED IN COOKING","Lotus root, cooked, fat not added in cooking" +75219000,"MUSHROOMS, COOKED, NS FORM, NS AS TO ADDED FAT","Mushrooms, cooked, NS as to form, NS as to fat added in cooking" +75219001,"MUSHROOMS, COOKED, FROM FRESH, NS FAT ADDED","Mushrooms, cooked, from fresh, NS as to fat added in cooking" +75219002,"MUSHROOMS, COOKED, FROM FROZ, NS FAT ADDED","Mushrooms, cooked, from frozen, NS as to fat added in cooking" +75219003,"MUSHROOMS, COOKED, FROM CANNED, NS FAT ADDED","Mushrooms, cooked, from canned, NS as to fat added in cooking" +75219010,"MUSHROOMS, COOKED, NS AS TO FORM, FAT NOT ADDED","Mushrooms, cooked, NS as to form, fat not added in cooking" +75219011,"MUSHROOMS, COOKED, FROM FRESH, FAT NOT ADDED","Mushrooms, cooked, from fresh, fat not added in cooking" +75219012,"MUSHROOMS, COOKED, FROM FROZ, FAT NOT ADDED","Mushrooms, cooked, from frozen, fat not added in cooking" +75219013,"MUSHROOMS, COOKED, FROM CANNED, FAT NOT ADDED","Mushrooms, cooked, from canned, fat not added in cooking" +75219020,"MUSHROOMS, COOKED, NS AS TO FORM, FAT ADDED","Mushrooms, cooked, NS as to form, fat added in cooking" +75219021,"MUSHROOMS, COOKED, FROM FRESH, FAT ADDED","Mushrooms, cooked, from fresh, fat added in cooking" +75219022,"MUSHROOMS, COOKED, FROM FROZ, FAT ADDED","Mushrooms, cooked, from frozen, fat added in cooking" +75219023,"MUSHROOMS, COOKED, FROM CANNED, FAT ADDED","Mushrooms, cooked, from canned, fat added in cooking" +75219100,"MUSHROOM, ASIAN, COOKED, FROM DRIED","Mushroom, Asian, cooked, from dried" +75220000,"OKRA, COOKED, NS FORM, NS FAT ADDED","Okra, cooked, NS as to form, NS as to fat added in cooking" +75220001,"OKRA, COOKED, FROM FRESH, NS FAT ADDED","Okra, cooked, from fresh, NS as to fat added in cooking" +75220002,"OKRA, COOKED, FROM FROZ, NS FAT ADDED","Okra, cooked, from frozen, NS as to fat added in cooking" +75220003,"OKRA, COOKED, FROM CANNED, NS FAT ADDED","Okra, cooked, from canned, NS as to fat added in cooking" +75220010,"OKRA, COOKED, NS FORM, FAT NOT ADDED","Okra, cooked, NS as to form, fat not added in cooking" +75220011,"OKRA, COOKED, FROM FRESH, FAT NOT ADDED","Okra, cooked, from fresh, fat not added in cooking" +75220012,"OKRA, COOKED, FROM FROZ, FAT NOT ADDED","Okra, cooked, from frozen, fat not added in cooking" +75220013,"OKRA, COOKED, FROM CANNED, FAT NOT ADDED","Okra, cooked, from canned, fat not added in cooking" +75220020,"OKRA, COOKED, NS FORM, FAT ADDED","Okra, cooked, NS as to form, fat added in cooking" +75220021,"OKRA, COOKED, FROM FRESH, FAT ADDED","Okra, cooked, from fresh, fat added in cooking" +75220022,"OKRA, COOKED, FROM FROZ, FAT ADDED","Okra, cooked, from frozen, fat added in cooking" +75220023,"OKRA, COOKED, FROM CANNED, FAT ADDED","Okra, cooked, from canned, fat added in cooking" +75220050,"LETTUCE, COOKED, FAT NOT ADDED IN COOKING","Lettuce, cooked, fat not added in cooking" +75220100,"LUFFA (CHINESE OKRA), COOKED, NO FAT ADDED","Luffa (Chinese okra), cooked, fat not added in cooking" +75221000,"ONIONS, MATURE, COOKED, NS FORM, NS AS TO ADDED FAT","Onions, mature, cooked, NS as to form, NS as to fat added in cooking" +75221001,"ONIONS, MATURE, COOKED, FROM FRESH, NS FAT ADDED","Onions, mature, cooked, from fresh, NS as to fat added in cooking" +75221002,"ONIONS, MATURE, COOKED, FROM FROZ, NS FAT ADDED","Onions, mature, cooked, from frozen, NS as to fat added in cooking" +75221010,"ONIONS, MATURE, COOKED, NS FORM, FAT NOT ADDED","Onions, mature, cooked, NS as to form, fat not added in cooking" +75221011,"ONIONS, MATURE, COOKED, FROM FRESH, FAT NOT ADDED","Onions, mature, cooked, from fresh, fat not added in cooking" +75221012,"ONIONS, MATURE, COOKED, FROM FROZ, FAT NOT ADDED","Onions, mature, cooked, from frozen, fat not added in cooking" +75221020,"ONIONS, MATURE, COOKED, NS AS TO FORM, FAT ADDED","Onions, mature, cooked or sauteed, NS as to form, fat added in cooking" +75221021,"ONIONS, MATURE, COOKED, FROM FRESH, FAT ADDED","Onions, mature, cooked or sauteed, from fresh, fat added in cooking" +75221022,"ONIONS, MATURE, COOKED, FROM FROZ, FAT ADDED","Onions, mature, cooked or sauteed, from frozen, fat added in cooking" +75221030,"ONIONS, PEARL, COOKED, NS FORM (INCL PICKLED/COCKTAIL)","Onions, pearl, cooked, NS as to form" +75221031,"ONIONS, PEARL, COOKED, FROM FRESH (INCL PICKLED/COCKTAIL)","Onions, pearl, cooked, from fresh" +75221032,"ONIONS, PEARL, COOKED, FROM FROZ (INCL PICKLED/COCKTAIL)","Onions, pearl, cooked, from frozen" +75221033,"ONIONS, PEARL, COOKED, FROM CAN (INCL PICKLED/COCKTAIL)","Onions, pearl, cooked, from canned" +75221040,"ONIONS, YOUNG GREEN, COOKED, NS FORM, NS ADDED FAT","Onion, young green, cooked, NS as to form, NS as to fat added in cooking" +75221041,"ONIONS, YOUNG GREEN, COOKED, FROM FRESH, NS ADDED FAT","Onion, young green, cooked, from fresh, NS as to fat added in cooking" +75221050,"ONIONS, YOUNG GREEN, COOKED, NS FORM, NO FAT ADDED","Onions, young green, cooked, NS as to form, fat not added in cooking" +75221051,"ONIONS, YOUNG GREEN, COOKED, FROM FRESH, NO FAT ADDED","Onions, young green, cooked, from fresh, fat not added in cooking" +75221060,"ONIONS, YOUNG GREEN, COOKED, NS FORM, FAT ADDED","Onion, young green, cooked, NS as to form, fat added in cooking" +75221061,"ONIONS, YOUNG GREEN, COOKED, FROM FRESH, FAT ADDED","Onion, young green, cooked, from fresh, fat added in cooking" +75221100,"ONIONS, DEHYDRATED","Onion, dehydrated" +75221160,"PALM HEARTS, COOKED (ASSUME NO FAT ADDED)","Palm hearts, cooked (assume fat not added in cooking)" +75221210,"PARSLEY, COOKED (ASSUME NO FAT ADDED)","Parsley, cooked (assume fat not added in cooking)" +75222000,"PARSNIPS, COOKED, NS AS TO ADDED FAT","Parsnips, cooked, NS as to fat added in cooking" +75222010,"PARSNIPS, COOKED, FAT NOT ADDED","Parsnips, cooked, fat not added in cooking" +75222020,"PARSNIPS, COOKED, FAT ADDED","Parsnips, cooked, fat added in cooking" +75223000,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,NS FORM,NS FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, NS as to form, NS as to fat added in cooking" +75223001,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD, FROM FRESH,NS FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from fresh, NS as to fat added in cooking" +75223002,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD, FROM FROZ,NS FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from frozen, NS as to fat added in cooking" +75223003,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD, FROM CAN,NS FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from canned, NS as to fat added in cooking" +75223010,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,NS FORM,NO FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, NS as to form, fat not added in cooking" +75223011,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM FRESH,NO FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from fresh, fat not added in cooking" +75223012,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM FROZ,NO FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from frozen, fat not added in cooking" +75223013,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM CAN,NO FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from canned, fat not added in cooking" +75223020,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,NS FORM,W/ FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, NS as to form, fat added in cooking" +75223021,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM FRESH,W/ FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from fresh, fat added in cooking" +75223022,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM FROZ,W/ FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from frozen, fat added in cooking" +75223023,"PEAS,COW/FIELD/BLACKEYE,NOT DRY,CKD,FROM CAN,W/ FAT","Peas, cowpeas, field peas, or blackeye peas (not dried), cooked, from canned, fat added in cooking" +75224010,"PEAS, GREEN, COOKED, NS FORM, NS AS TO ADDED FAT","Peas, green, cooked, NS as to form, NS as to fat added in cooking" +75224011,"PEAS, GREEN, COOKED, FROM FRESH, NS FAT ADDED","Peas, green, cooked, from fresh, NS as to fat added in cooking" +75224012,"PEAS, GREEN, COOKED, FROM FROZ, NS FAT ADDED","Peas, green, cooked, from frozen, NS as to fat added in cooking" +75224013,"PEAS, GREEN, COOKED, FROM CANNED, NS FAT ADDED","Peas, green, cooked, from canned, NS as to fat added in cooking" +75224020,"PEAS, GREEN, COOKED, NS AS TO FORM, FAT NOT ADDED","Peas, green, cooked, NS as to form, fat not added in cooking" +75224021,"PEAS, GREEN, COOKED, FROM FRESH, FAT NOT ADDED","Peas, green, cooked, from fresh, fat not added in cooking" +75224022,"PEAS, GREEN, COOKED, FROM FROZ, FAT NOT ADDED","Peas, green, cooked, from frozen, fat not added in cooking" +75224023,"PEAS, GREEN, COOKED, FROM CANNED, FAT NOT ADDED","Peas, green, cooked, from canned, fat not added in cooking" +75224030,"PEAS, GREEN, COOKED, NS AS TO FORM, FAT ADDED","Peas, green, cooked, NS as to form, fat added in cooking" +75224031,"PEAS, GREEN, COOKED, FROM FRESH, FAT ADDED","Peas, green, cooked, from fresh, fat added in cooking" +75224032,"PEAS, GREEN, COOKED, FROM FROZ, FAT ADDED","Peas, green, cooked, from frozen, fat added in cooking" +75224033,"PEAS, GREEN, COOKED, FROM CANNED, FAT ADDED","Peas, green, cooked, from canned, fat added in cooking" +75224110,"PEAS, GREEN, CANNED, LOW SODIUM, NS AS TO ADDED FAT","Peas, green, canned, low sodium, NS as to fat added in cooking" +75224120,"PEAS, GREEN, CANNED, LOW SODIUM, FAT NOT ADDED","Peas, green, canned, low sodium, fat not added in cooking" +75224130,"PEAS, GREEN, CANNED, LOW SODIUM, FAT ADDED","Peas, green, canned, low sodium, fat added in cooking" +75225010,"PIGEON PEAS, COOKED, NS AS TO FORM, FAT NOT ADDED","Pigeon peas, cooked, NS as to form, fat not added in cooking" +75225011,"PIGEON PEAS, COOKED, FROM FRESH, FAT NOT ADDED","Pigeon peas, cooked, from fresh, fat not added in cooking" +75225013,"PIGEON PEAS, COOKED, FROM CANNED, FAT NOT ADDED","Pigeon peas, cooked, from canned, fat not added in cooking" +75226000,"PEPPERS, GREEN, COOKED, NS AS TO FAT","Peppers, green, cooked, NS as to fat added in cooking" +75226010,"PEPPERS, GREEN, COOKED, FAT NOT ADDED","Peppers, green, cooked, fat not added in cooking" +75226020,"PEPPERS, GREEN, COOKED, FAT ADDED","Peppers, green, cooked, fat added in cooking" +75226040,"PEPPERS, RED, COOKED, NS AS TO ADDED FAT","Peppers, red, cooked, NS as to fat added in cooking" +75226050,"PEPPERS, RED, COOKED, FAT NOT ADDED","Peppers, red, cooked, fat not added in cooking" +75226060,"PEPPERS, RED, COOKED, FAT ADDED","Peppers, red, cooked, fat added in cooking" +75226090,"PEPPERS, HOT, COOKED, NS FORM, NS FAT ADDED","Peppers, hot, cooked, NS as to form, NS as to fat added in cooking" +75226091,"PEPPERS, HOT, COOKED, FROM FRESH, NS FAT ADDED","Peppers, hot, cooked, from fresh, NS as to fat added in cooking" +75226092,"PEPPERS, HOT, COOKED, FROM FROZ, NS FAT ADDED","Peppers, hot, cooked, from frozen, NS as to fat added in cooking" +75226093,"PEPPERS, HOT, COOKED, FROM CANNED, NS FAT ADDED","Peppers, hot, cooked, from canned, NS as to fat added in cooking" +75226100,"PEPPERS, HOT, COOKED, NS FORM, NO FAT ADDED","Peppers, hot, cooked, NS as to form, fat not added in cooking" +75226101,"PEPPERS, HOT, COOKED, FROM FRESH, NO FAT ADDED","Peppers, hot, cooked, from fresh, fat not added in cooking" +75226102,"PEPPERS, HOT, COOKED, FROM FROZ, NO FAT ADDED","Peppers, hot, cooked, from frozen, fat not added in cooking" +75226103,"PEPPERS, HOT, COOKED, FROM CANNED, NO FAT ADDED","Peppers, hot, cooked, from canned, fat not added in cooking" +75226110,"PEPPERS, HOT, COOKED, NS FORM, FAT ADDED","Peppers, hot, cooked, NS as to form, fat added in cooking" +75226111,"PEPPERS, HOT, COOKED, FROM FRESH, FAT ADDED","Peppers, hot, cooked, from fresh, fat added in cooking" +75226112,"PEPPERS, HOT, COOKED, FROM FROZ, FAT ADDED","Peppers, hot, cooked, from frozen, fat added in cooking" +75226113,"PEPPERS, HOT, COOKED, FROM CANNED, FAT ADDED","Peppers, hot, cooked, from canned, fat added in cooking" +75226700,"PIMIENTO","Pimiento" +75227100,"RADISH, JAPANESE (DAIKON), COOKED, NO FAT ADDED","Radish, Japanese (daikon), cooked, fat not added in cooking" +75227110,"RADISH, JAPANESE (DAIKON), COOKED, FAT ADDED","Radish, Japanese (daikon), cooked, fat added in cooking" +75228000,"RUTABAGA, COOKED, NS AS TO ADDED FAT","Rutabaga, cooked, NS as to fat added in cooking" +75228010,"RUTABAGA, COOKED, FAT NOT ADDED","Rutabaga, cooked, fat not added in cooking" +75228020,"RUTABAGA, COOKED, FAT ADDED","Rutabaga, cooked, fat added in cooking" +75229010,"SALSIFY (VEGETABLE OYSTER), COOKED, NO FAT ADDED","Salsify (vegetable oyster), cooked, fat not added in cooking" +75230000,"SAUERKRAUT, NS AS TO ADDED FAT","Sauerkraut, cooked, NS as to fat added in cooking" +75230010,"SAUERKRAUT, NO FAT ADDED","Sauerkraut, cooked, fat not added in cooking" +75230020,"SAUERKRAUT, FAT ADDED","Sauerkraut, cooked, fat added in cooking" +75230100,"SAUERKRAUT, CANNED, LO NA","Sauerkraut, canned, low sodium" +75231000,"SNOWPEA(PEA POD), COOKED, NS FORM, NS AS TO FAT","Snowpea (pea pod), cooked, NS as to form, NS as to fat added in cooking" +75231001,"SNOWPEA(PEA POD), COOKED, FROM FRESH, NS AS TO FAT","Snowpea (pea pod), cooked, from fresh, NS as to fat added in cooking" +75231002,"SNOWPEA(PEA POD), COOKED, FROM FROZEN, NS AS TO FAT","Snowpea (pea pod), cooked, from frozen, NS as to fat added in cooking" +75231010,"SNOWPEA(PEA POD), COOKED, NS FORM, NO FAT ADDED","Snowpea (pea pod), cooked, NS as to form, fat not added in cooking" +75231011,"SNOWPEA(PEA POD), COOKED, FROM FRESH, NO FAT ADDED","Snowpea (pea pod), cooked, from fresh, fat not added in cooking" +75231012,"SNOWPEA(PEA POD), COOKED, FROM FROZ, NO FAT ADDED","Snowpea (pea pod), cooked, from frozen, fat not added in cooking" +75231020,"SNOWPEA(PEA POD), COOKED, NS AS TO FORM, FAT ADDED","Snowpea (pea pod), cooked, NS as to form, fat added in cooking" +75231021,"SNOWPEA(PEA POD), COOKED, FROM FRESH, FAT ADDED","Snowpea (pea pod), cooked, from fresh, fat added in cooking" +75231022,"SNOWPEA(PEA POD), COOKED, FROM FROZ, FAT ADDED","Snowpea (pea pod), cooked, from frozen, fat added in cooking" +75232000,"SEAWEED, DRIED","Seaweed, dried" +75232050,"SEAWEED, PREPARED W/ SOY SAUCE","Seaweed, prepared with soy sauce" +75232100,"SEAWEED, COOKED, NS AS TO FAT ADDED IN COOKING","Seaweed, cooked, NS as to fat added in cooking" +75232110,"SEAWEED, COOKED, FAT NOT ADDED IN COOKING","Seaweed, cooked, fat not added in cooking" +75232120,"SEAWEED, COOKED, FAT ADDED IN COOKING","Seaweed, cooked, fat added in cooking" +75233000,"SQUASH, SUMMER, COOKED, NS FORM, NS AS TO ADDED FAT","Squash, summer, cooked, NS as to form, NS as to fat added in cooking" +75233001,"SQUASH, SUMMER, COOKED, FROM FRESH, NS FAT ADDED","Squash, summer, cooked, from fresh, NS as to fat added in cooking" +75233002,"SQUASH, SUMMER, COOKED, FROM FROZ, NS FAT ADDED","Squash, summer, cooked, from frozen, NS as to fat added in cooking" +75233003,"SQUASH, SUMMER, COOKED, FROM CANNED, NS FAT ADDED","Squash, summer, cooked, from canned, NS as to fat added in cooking" +75233010,"SQUASH, SUMMER, COOKED, NS FORM, FAT NOT ADDED","Squash, summer, cooked, NS as to form, fat not added in cooking" +75233011,"SQUASH, SUMMER,YELLOW OR GREEN, CKD, FRESH, FAT NOT ADDED","Squash, summer,yellow or green, cooked, from fresh, fat not added in cooking" +75233012,"SQUASH, SUMMER, COOKED, FROM FROZ, FAT NOT ADDED","Squash, summer, cooked, from frozen, fat not added in cooking" +75233013,"SQUASH, SUMMER, COOKED, FROM CANNED, FAT NOT ADDED","Squash, summer, cooked, from canned, fat not added in cooking" +75233020,"SQUASH, SUMMER, COOKED, NS AS TO FORM, FAT ADDED","Squash, summer, cooked, NS as to form, fat added in cooking" +75233021,"SQUASH, SUMMER, COOKED, FROM FRESH, FAT ADDED","Squash, summer, cooked, from fresh, fat added in cooking" +75233022,"SQUASH, SUMMER, COOKED, FROM FROZ, FAT ADDED","Squash, summer, cooked, from frozen, fat added in cooking" +75233023,"SQUASH, SUMMER, COOKED, FROM CANNED, FAT ADDED","Squash, summer, cooked, from canned, fat added in cooking" +75233200,"SQUASH, SPAGHETTI, NS AS TO ADDED FAT","Squash, spaghetti, cooked, NS as to fat added in cooking" +75233210,"SQUASH, SPAGHETTI, FAT ADDED","Squash, spaghetti, cooked, fat added in cooking" +75233220,"SQUASH, SPAGHETTI, NO FAT ADDED","Squash, spaghetti, cooked, fat not added in cooking" +75233510,"SEQUIN (PORTUGUESE SQUASH), COOKED, NO FAT ADDED","Sequin (Portuguese squash), cooked, fat not added in cooking" +75234000,"TURNIP, COOKED, NS AS TO FORM, NS AS TO ADDED FAT","Turnip, cooked, NS as to form, NS as to fat added in cooking" +75234001,"TURNIP, COOKED, FROM FRESH, NS AS TO ADDED FAT","Turnip, cooked, from fresh, NS as to fat added in cooking" +75234002,"TURNIP, COOKED, FROM FROZ, NS AS TO ADDED FAT","Turnip, cooked, from frozen, NS as to fat added in cooking" +75234003,"TURNIP, COOKED, FROM CAN, NS AS TO ADDED FAT","Turnip, cooked, from canned, NS as to fat added in cooking" +75234010,"TURNIP, COOKED, NS AS TO FORM, FAT NOT ADDED","Turnip, cooked, NS as to form, fat not added in cooking" +75234011,"TURNIP, COOKED, FROM FRESH, FAT NOT ADDED","Turnip, cooked, from fresh, fat not added in cooking" +75234012,"TURNIP, COOKED, FROM FROZ, FAT NOT ADDED","Turnip, cooked, from frozen, fat not added in cooking" +75234013,"TURNIP, COOKED, FROM CANNED, FAT NOT ADDED","Turnip, cooked, from canned, fat not added in cooking" +75234020,"TURNIP, COOKED, NS AS TO FORM, FAT ADDED","Turnip, cooked, NS as to form, fat added in cooking" +75234021,"TURNIP, COOKED, FROM FRESH, FAT ADDED","Turnip, cooked, from fresh, fat added in cooking" +75234022,"TURNIP, COOKED, FROM FROZ, FAT ADDED","Turnip, cooked, from frozen, fat added in cooking" +75234023,"TURNIP, COOKED, FROM CAN, FAT ADDED","Turnip, cooked, from canned, fat added in cooking" +75235000,"WATER CHESTNUT","Water chestnut" +75235750,"WINTER MELON, COOKED (INCL CHINESE MELON, TOGAN)","Winter melon, cooked" +75236000,"YEAST (INCLUDE BREWER'S YEAST)","Yeast" +75236500,"YEAST EXTRACT SPREAD (INCL VEGEMITE, MARMITE)","Yeast extract spread" +75301100,"BEANS, LIMA, & CORN (SUCCOTASH), NS AS TO ADDED FAT","Beans, lima and corn (succotash), cooked, NS as to fat added in cooking" +75301110,"BEANS, LIMA, & CORN (SUCCOTASH), NO FAT ADDED","Beans, lima and corn (succotash), cooked, fat not added in cooking" +75301120,"BEANS, LIMA, & CORN (SUCCOTASH), FAT ADDED","Beans, lima and corn (succotash), cooked, fat added in cooking" +75302010,"BEANS, STRING, GREEN, W/ TOMATOES, FAT NOT ADDED IN COOKING","Beans, string, green, with tomatoes, cooked, fat not added in cooking" +75302020,"BEANS, STRING, GREEN, W/ ONIONS, FAT NOT ADDED IN COOKING","Beans, string, green, with onions, cooked, fat not added in cooking" +75302030,"BEANS, STRING, GREEN, W/ CHICKPEAS, FAT NOT ADDED IN COOKING","Beans, string, green, with chickpeas, cooked, fat not added in cooking" +75302040,"BEANS, STRING, GREEN, W/ ALMONDS, FAT NOT ADDED IN COOKING","Beans, string, green, with almonds, cooked, fat not added in cooking" +75302045,"BEANS, STRING, GREEN, W/ ALMONDS, FAT ADDED IN COOKING","Beans, string, green, with almonds, cooked, fat added in cooking" +75302050,"BEANS, STRING, GREEN, & POTATOES, FAT NOT ADDED","Beans, string, green, and potatoes, cooked, fat not added in cooking" +75302060,"BEANS, STRING, GREEN, W/ PINTO BEANS, FAT NOT ADDED","Beans, string, green, with pinto beans, cooked, fat not added in cooking" +75302070,"BEANS, STRING, GREEN, W/ SPAETZEL, FAT NOT ADDED","Beans, string, green, with spaetzel, cooked, fat not added in cooking" +75302080,"BEAN SALAD, YELLOW &/OR GREEN STRING BEANS","Bean salad, yellow and/or green string beans" +75302200,"BEANS, STRING, GREEN, W/ ONIONS, NS AS TO FAT ADDED","Beans, string, green, with onions, NS as to fat added in cooking" +75302210,"BEANS, STRING, GREEN, W/ ONIONS, FAT ADDED IN COOKING","Beans, string, green, with onions, fat added in cooking" +75302500,"BEANS, STRING, GREEN, & POTATOES, NS AS TO FAT ADDED","Beans, string, green, and potatoes, cooked, NS as to fat added in cooking" +75302510,"BEANS, STRING, GREEN, & POTATOES, FAT ADDED","Beans, string, green, and potatoes, cooked, fat added in cooking" +75303000,"CORN W/ PEPPERS, RED OR GREEN,COOKED, NS FAT ADDED","Corn with peppers, red or green, cooked, NS as to fat added in cooking" +75303010,"CORN W/ PEPPERS, RED OR GREEN,COOKED, NO FAT ADDED","Corn with peppers, red or green, cooked, fat not added in cooking" +75303020,"CORN W/ PEPPERS, RED OR GREEN,COOKED,FAT ADDED","Corn with peppers, red or green, cooked, fat added in cooking" +75306010,"EGGPLANT IN TOM SCE, COOKED,NO FAT ADDED","Eggplant in tomato sauce, cooked, fat not added in cooking" +75307000,"GREEN PEPPERS & ONIONS, COOKED,FAT ADDED IN COOKING","Green peppers and onions, cooked, fat added in cooking" +75311000,"MIXED VEGS (CORN,LIMA,PEAS,GRBNS,CAR), NS FORM & FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, NS as to form, NS as to fat added in cooking" +75311002,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), FROZ, NS FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from frozen, NS as to fat added in cooking" +75311003,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), CANNED, NS FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from canned, NS as to fat added in cooking" +75311010,"MIXED VEGS (CORN,LIMA,PEAS,GRBN,CAR), NS FORM, NO FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, NS as to form, fat not added in cooking" +75311012,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), FROZ, NO FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from frozen, fat not added in cooking" +75311013,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), CANNED, NO FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from canned, fat not added in cooking" +75311020,"MIXED VEGS (CORN,LIMA,PEAS,GRBNS,CAR), NS FORM,W/FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, NS as to form, fat added in cooking" +75311022,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), FROZ, W/ FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from frozen, fat added in cooking" +75311023,"MIXED VEGETABLES (CORN,LIMA,PEAS,GRBNS,CAR), CANNED, W/ FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), cooked, from canned, fat added in cooking" +75311100,"MIXED VEGETABLES, CANNED, LOW SODIUM, NS ADDED FAT","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), canned, low sodium, NS as to fat added in cooking" +75311110,"MIXED VEGETABLES, CANNED, LOW SODIUM, NO FAT ADDED","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), canned, low sodium, fat not added in cooking" +75311120,"MIXED VEGETABLES, CANNED, LOW SODIUM, FAT ADDED","Mixed vegetables (corn, lima beans, peas, green beans, and carrots), canned, low sodium, fat added in cooking" +75315000,"PEAS & CORN, COOKED, NS AS TO ADDED FAT","Peas and corn, cooked, NS as to fat added in cooking" +75315010,"PEAS & CORN, COOKED, NO FAT ADDED","Peas and corn, cooked, fat not added in cooking" +75315020,"PEAS & CORN, COOKED, FAT ADDED","Peas and corn, cooked, fat added in cooking" +75315100,"PEAS & ONIONS, COOKED, NS AS TO ADDED FAT","Peas and onions, cooked, NS as to fat added in cooking" +75315110,"PEAS & ONIONS, COOKED, FAT NOT ADDED","Peas and onions, cooked, fat not added in cooking" +75315120,"PEAS & ONIONS, COOKED, FAT ADDED","Peas and onions, cooked, fat added in cooking" +75315200,"PEAS W/ MUSHROOMS, COOKED, NS AS TO FAT","Peas with mushrooms, cooked, NS as to fat added in cooking" +75315210,"PEAS W/ MUSHROOMS, COOKED, NO FAT ADDED","Peas with mushrooms, cooked, fat not added in cooking" +75315215,"PEAS W/ MUSHROOMS, COOKED, FAT ADDED","Peas with mushrooms, cooked, fat added in cooking" +75315250,"COWPEAS W/ SNAP BEANS,COOKED, NO FAT ADDED IN COOK","Cowpeas with snap beans, cooked, fat not added in cooking" +75315300,"PEAS & POTATOES, COOKED, NO FAT ADDED IN COOKING","Peas and potatoes, cooked, fat not added in cooking" +75315305,"PEAS AND POTATOES, COOKED, NS AS TO FAT","Peas and potatoes, cooked, NS as to fat added in cooking" +75315310,"PEAS AND POTATOES, COOKED, FAT ADDED","Peas and potatoes, cooked, fat added in cooking" +75316000,"SQUASH, SUMMER, & ONIONS,COOKED, NO FAT ADDED","Squash, summer, and onions, cooked, fat not added in cooking" +75316010,"ZUCCHINI W/ TOM SCE, CKD,NO FAT ADDED IN COOKING","Zucchini with tomato sauce, cooked, fat not added in cooking" +75316020,"SQUASH, SUMMER, & ONIONS, COOKED, FAT ADDED","Squash, summer, and onions, cooked, fat added in cooking" +75316050,"RATATOUILLE","Ratatouille" +75317000,"VEGETABLES,STEWTYPE(POT,CRT,ONION,CELERY)COOK,NS FA","Vegetables, stew type (including potatoes, carrots, onions, celery) cooked, NS as to fat added in cooking" +75317010,"VEGETABLES,STEWTYPE(POT,CRT,ONION,CELERY)COOK,W/FAT","Vegetables, stew type (including potatoes, carrots, onions, celery) cooked, fat added in cooking" +75317020,"VEGETABLES,STEWTYPE(POT,CRT,ONION,CELERY)COOK,NO FA","Vegetables, stew type (including potatoes, carrots, onions, celery) cooked, fat not added in cooking" +75330100,"VEG COMBINATION (INCL CAR/ DK GRN), NO SAUCE, NS FAT","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, no sauce, NS as to fat added in cooking" +75330110,"VEG COMBINATION (INCL CAR/ DK GRN), NO SAUCE, FAT NOT ADDED","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, no sauce, fat not added in cooking" +75330120,"VEG COMBINATION (INCL CAR/ DK GRN), NO SAUCE, FAT ADDED","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, no sauce, fat added in cooking" +75330130,"VEG COMBINATION (NO CAR/ DK GRN), NO SAUCE, NS FAT","Vegetable combination (excluding carrots, broccoli, and dark-green leafy), cooked, no sauce, NS as to fat added in cooking" +75330140,"VEG COMBINATION (NO CAR/ DK GRN), NO SAUCE, FAT NOT ADDED","Vegetable combination (excluding carrots, broccoli, and dark-green leafy), cooked, no sauce, fat not added in cooking" +75330150,"VEG COMBINATION (NO CAR/ DK GRN), NO SAUCE, FAT ADDED","Vegetable combination (excluding carrots, broccoli, and dark-green leafy), cooked, no sauce, fat added in cooking" +75340000,"VEG ASIAN,ORIENTAL STYLE,CKD,NS FAT ADDED IN COOKING","Vegetable combinations, Asian style, (broccoli, green pepper, water chestnut, etc) cooked, NS as to fat added in cooking" +75340010,"VEG COMBO ASIAN STYLE, CKD, FAT, NOT ADDED","Vegetable combinations, Asian style, (broccoli, green pepper, water chestnuts, etc), cooked, fat not added in cooking" +75340020,"VEG COMBO, ASIAN STYLE, CKD, FAT ADDED","Vegetable combinations, Asian style, (broccoli, green pepper, water chestnuts, etc), cooked, fat added in cooking" +75340160,"VEG & PASTA COMBOS, W/ CREAM/CHEESE SCE, COOKED","Vegetable and pasta combinations with cream or cheese sauce (broccoli, pasta, carrots, corn, zucchini, peppers, cauliflower, peas, etc.), cooked" +75340200,"JAI, MONK'S FOOD (MSHRMS,LILY RTS,B.CURD,W.CHSTNUT)","Jai, Monk's Food (mushrooms, lily roots, bean curd, water chestnuts)" +75340300,"PINACBET (EGGPLANT W/ TOMATO, BITTERMELON, ETC)","Pinacbet (eggplant with tomatoes, bitter melon, etc.)" +75365000,"VEGETABLE MIXTURE, DRIED (INCL SALAD CRUNCHIES)","Vegetable mixture, dried" +75400500,"ARTICHOKES, STUFFED","Artichokes, stuffed" +75401010,"ASPARAGUS, NS FORM, CREAMED OR W/ CHEESE SAUCE","Asparagus, NS as to form, creamed or with cheese sauce" +75401011,"ASPARAGUS, FROM FRESH, CREAMED OR W/ CHEESE SAUCE","Asparagus, from fresh, creamed or with cheese sauce" +75401012,"ASPARAGUS, FROM FROZEN, CREAMED OR W/ CHEESE SAUCE","Asparagus, from frozen, creamed or with cheese sauce" +75401013,"ASPARAGUS, FROM CANNED, CREAMED OR W/ CHEESE SAUCE","Asparagus, from canned, creamed or with cheese sauce" +75402010,"BEANS, LIMA, IMMATURE, NS FORM, CREAMED/ CHEESE SCE","Beans, lima, immature, NS as to form, creamed or with cheese sauce" +75402011,"BEANS, LIMA, IMMATURE, FROM FRESH, CREAMED/CHEESE SCE","Beans, lima, immature, from fresh, creamed or with cheese sauce" +75402012,"BEANS, LIMA, IMMATURE, FROM FROZEN, CREAMED/CHEESE SCE","Beans, lima, immature, from frozen, creamed or with cheese sauce" +75402013,"BEANS, LIMA, IMMATURE, FROM CANNED, CREAMED/CHEESE SCE","Beans, lima, immature, from canned, creamed or with cheese sauce" +75402020,"BEANS, LIMA, IMMATURE, CKD, NS FORM, W/ MUSHROOM SCE","Beans, lima, immature, cooked, NS as to form, with mushroom sauce" +75402021,"BEANS, LIMA, IMMATURE, CKD, FROM FRESH, W/ MUSHROOM SCE","Beans, lima, immature, cooked, from fresh, with mushroom sauce" +75402022,"BEANS, LIMA, IMMATURE, CKD, FROM FROZ, W/ MUSHROOM SCE","Beans, lima, immature, cooked, from frozen, with mushroom sauce" +75402023,"BEANS, LIMA, IMMATURE, CKD, FROM CAN, W/ MUSHROOM SCE","Beans, lima, immature, cooked, from canned, with mushroom sauce" +75403010,"BEANS, STRING, GREEN, NS FORM, CREAMED/CHEESE SCE","Beans, string, green, NS as to form, creamed or with cheese sauce" +75403011,"BEANS, STRING, GREEN, FROM FRESH, CREAMED/CHEESE SCE","Beans, string, green, from fresh, creamed or with cheese sauce" +75403012,"BEANS, STRING, GREEN, FROM FROZEN, CREAMED/CHEESE SCE","Beans, string, green, from frozen, creamed or with cheese sauce" +75403013,"BEANS, STRING, GREEN, FROM CANNED, CREAMED/CHEESE SCE","Beans, string, green, from canned, creamed or with cheese sauce" +75403020,"BEANS, STRING, GREEN, CKD, NS FORM, W/ MUSHROOM SCE","Beans, string, green, cooked, NS as to form, with mushroom sauce" +75403021,"BEANS, STRING, GREEN, CKD, FROM FRESH, W/ MUSHROOM SCE","Beans, string, green, cooked, from fresh, with mushroom sauce" +75403022,"BEANS, STRING, GREEN, CKD, FROM FROZ, W/ MUSHROOM SCE","Beans, string, green, cooked, from frozen, with mushroom sauce" +75403023,"BEANS, STRING, GREEN, CKD, FROM CAN, W/ MUSHROOM SCE","Beans, string, green, cooked, from canned, with mushroom sauce" +75403200,"BEANS, STRING, GREEN, SZECHUAN-STYLE, FAT ADDED","Beans, string, green, cooked, Szechuan-style, fat added in cooking" +75404010,"BEANS, STRING, YELLOW, NS FORM, CREAMED/ CHEESE SCE","Beans, string, yellow, NS as to form, creamed or with cheese sauce" +75404011,"BEANS, STRING, YELLOW, FROM FRESH, CREAMED/ CHEESE SCE","Beans, string, yellow, from fresh, creamed or with cheese sauce" +75404012,"BEANS, STRING, YELLOW, FROM FROZ, CREAMED/ CHEESE SCE","Beans, string, yellow, from frozen, creamed or with cheese sauce" +75404013,"BEANS, STRING, YELLOW, FROM CANNED, CREAMED/ CHEESE SCE","Beans, string, yellow, from canned, creamed or with cheese sauce" +75405010,"BEETS WITH HARVARD SAUCE","Beets with Harvard sauce" +75406010,"BRUSSEL SPROUTS, NS AS TO FORM, CREAMED","Brussels sprouts, NS as to form, creamed" +75406011,"BRUSSEL SPROUTS, FROM FRESH, CREAMED","Brussels sprouts, from fresh, creamed" +75406012,"BRUSSEL SPROUTS, FROM FROZ, CREAMED","Brussels sprouts, from frozen, creamed" +75407010,"CABBAGE, CREAMED","Cabbage, creamed" +75409010,"CAULIFLOWER, NS FORM, CREAMED(INCL W/ CHEESE SAUCE)","Cauliflower, NS as to form, creamed" +75409011,"CAULIFLOWER, FROM FRESH, CREAMED(INCL W/ CHEESE SAUCE)","Cauliflower, from fresh, creamed" +75409012,"CAULIFLOWER, FROM FROZ, CREAMED(INCL W/ CHEESE SAUCE)","Cauliflower, from frozen, creamed" +75409013,"CAULIFLOWER, FROM CANNED, CREAMED(INCL W/ CHEESE SAUCE)","Cauliflower, from canned, creamed" +75409020,"CAULIFLOWER, BATTER-DIPPED, FRIED","Cauliflower, batter-dipped, fried" +75410010,"CELERY, CREAMED","Celery, creamed" +75410500,"CHILES RELLENOS, CHEESE-FILLED","Chiles rellenos, cheese-filled (stuffed chili peppers)" +75410530,"CHILES RELLENOS, FILLED W/ MEAT & CHEESE","Chiles rellenos, filled with meat and cheese (stuffed chili peppers)" +75410550,"JALAPENO PEPPER, STUFFED W/ CHEESE, BATTERED, FRIED","Jalapeno pepper, stuffed with cheese, breaded or battered, fried" +75411010,"CORN, SCALLOPED OR PUDDING (INCLUDE CORN SOUFFLE)","Corn, scalloped or pudding" +75411020,"CORN FRITTER","Corn fritter" +75411030,"CORN, COOKED, NS FORM, W/ CREAM SAUCE, MADE W/ MILK","Corn, cooked, NS as to form, with cream sauce, made with milk" +75411031,"CORN, COOKED, FROM FRESH, W/ CREAM SAUCE, MADE W/ MILK","Corn, cooked, from fresh, with cream sauce, made with milk" +75411032,"CORN, COOKED, FROM FROZ, W/ CREAM SAUCE, MADE W/ MILK","Corn, cooked, from frozen, with cream sauce, made with milk" +75411033,"CORN, COOKED, FROM CAN, W/ CREAM SAUCE, MADE W/ MILK","Corn, cooked, from canned, with cream sauce, made with milk" +75412010,"EGGPLANT, BATTER-DIPPED, FRIED","Eggplant, batter-dipped, fried" +75412030,"EGGPLANT DIP (INCL BABA GHANOUSH)","Eggplant dip" +75412060,"EGGPLANT PARMESAN CASSEROLE, REGULAR","Eggplant parmesan casserole, regular" +75412070,"EGGPLANT W/ CHEESE & TOMATO SAUCE","Eggplant with cheese and tomato sauce" +75413010,"KOHLRABI, CREAMED","Kohlrabi, creamed" +75414010,"MUSHROOMS, NS AS TO FORM, CREAMED","Mushrooms, NS as to form, creamed" +75414011,"MUSHROOMS, FROM FRESH, CREAMED","Mushrooms, from fresh, creamed" +75414012,"MUSHROOMS, FROM FROZEN, CREAMED","Mushrooms, from frozen, creamed" +75414013,"MUSHROOMS, FROM CANNED, CREAMED","Mushrooms, from canned, creamed" +75414020,"MUSHROOMS, STUFFED","Mushrooms, stuffed" +75414030,"MUSHROOM, BATTER-DIPPED, FRIED","Mushrooms, batter-dipped, fried" +75414500,"OKRA, BATTER-DIPPED, FRIED","Okra, batter-dipped, fried" +75415010,"ONIONS, NS AS TO FORM, CREAMED","Onions, NS as to form, creamed" +75415011,"ONIONS, FROM FRESH, CREAMED","Onions, from fresh, creamed" +75415020,"ONION RINGS, NS FORM, BATTER-DIPPED, BAKED/FRIED","Onion rings, NS as to form, batter-dipped, baked or fried" +75415021,"ONION RINGS, FROM FRESH, BATTERED, BAKED/FRIED","Onion rings, from fresh, batter-dipped, baked or fried" +75415022,"ONION RINGS, FROM FROZ, BATTERED, BAKED/FRIED","Onion rings, from frozen, batter-dipped, baked or fried" +75416010,"PARSNIPS, CREAMED","Parsnips, creamed" +75416500,"PEA SALAD","Pea salad" +75416600,"PEA SALAD W/ CHEESE","Pea salad with cheese" +75417010,"PEAS, NS AS TO FORM, CREAMED","Peas, NS as to form, creamed" +75417011,"PEAS, FROM FRESH, CREAMED","Peas, from fresh, creamed" +75417012,"PEAS, FROM FROZEN, CREAMED","Peas, from frozen, creamed" +75417013,"PEAS, FROM CANNED, CREAMED","Peas, from canned, creamed" +75417020,"PEAS, COOKED, NS AS TO FORM, W/ MUSHROOM SAUCE","Peas, cooked, NS as to form, with mushroom sauce" +75417021,"PEAS, COOKED, FROM FRESH, W/ MUSHROOM SAUCE","Peas, cooked, from fresh, with mushroom sauce" +75417022,"PEAS, COOKED, FROM FROZEN, W/ MUSHROOM SAUCE","Peas, cooked, from frozen, with mushroom sauce" +75417023,"PEAS, COOKED, FROM CANNED, W/ MUSHROOM SAUCE","Peas, cooked, from canned, with mushroom sauce" +75417030,"PEAS, COOKED, NS AS TO FORM, W/ TOMATO SAUCE","Peas, cooked, NS as to form, with tomato sauce" +75417031,"PEAS, COOKED, FROM FRESH, W/ TOMATO SAUCE","Peas, cooked, from fresh, with tomato sauce" +75417032,"PEAS, COOKED, FROM FROZEN, W/ TOMATO SAUCE","Peas, cooked, from frozen, with tomato sauce" +75417033,"PEAS, COOKED, FROM CANNED, W/ TOMATO SAUCE","Peas, cooked, from canned, with tomato sauce" +75418000,"SQUASH, SUMMER, BREADED, BAKED","Squash,summer, yellow or green, breaded or battered, baked" +75418010,"SQUASH, SUMMER, BREADED OR BATTERED, FRIED","Squash, summer, yellow or green, breaded or battered, fried" +75418020,"SQUASH, SUMMER, CASSEROLE, W/ TOMATO & CHEESE","Squash, summer, casserole with tomato and cheese" +75418030,"SQUASH, SUMMER, CASSEROLE, W/ RICE & TOMATO SAUCE","Squash, summer, casserole, with rice and tomato sauce" +75418040,"SQUASH, SUMMER, CASSEROLE, W/ CHEESE SAUCE","Squash, summer, casserole, with cheese sauce" +75418050,"SQUASH, SUMMER, NS AS TO FORM, CREAMED","Squash, summer, NS as to form, creamed" +75418051,"SQUASH, SUMMER, FROM FRESH, CREAMED","Squash, summer, from fresh, creamed" +75418052,"SQUASH, SUMMER, FROM FROZEN, CREAMED","Squash, summer, from frozen, creamed" +75418053,"SQUASH, SUMMER, FROM CANNED, CREAMED","Squash, summer, from canned, creamed" +75418060,"SQUASH, SUMMER, SOUFFLE","Squash, summer, souffle" +75418100,"TURNIPS, NS AS TO FORM, CREAMED","Turnips, NS as to form, creamed" +75418101,"TURNIPS, FROM FRESH, CREAMED","Turnips, from fresh, creamed" +75418102,"TURNIPS, FROM FROZEN, CREAMED","Turnips, from frozen, creamed" +75418103,"TURNIPS, FROM CANNED, CREAMED","Turnips, from canned, creamed" +75418220,"CREAMED CHRISTOPHINE, P.R. (CHAYOTE A LA CREMA)","Creamed christophine, Puerto Rican style (Chayote a la crema)" +75439010,"VEGETABLE STEW, W/O MEAT","Vegetable stew without meat" +75439500,"CHOW MEIN OR CHOP SUEY, MEATLESS, NO NOODLES","Chow mein or chop suey, meatless, no noodles" +75440100,"VEG COMBINATION (INCL CAR/ DK GRN), W/ SOY-BASE SCE","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, with soy-based sauce" +75440110,"VEG COMBINATION (NO CAR/ DK GRN), W/ SOY-BASE SAUCE","Vegetable combination (excluding carrots, broccoli, and dark-green leafy), cooked, with soy-based sauce" +75440170,"VEGETABLE STICKS, BREADED(INCL CORN,CARROT,GR BEAN)","Vegetable sticks, breaded (including corn, carrots, and green beans)" +75440200,"VEGETABLE TEMPURA","Vegetable tempura" +75440300,"VEG COMBINATIONS (INCL CAR/DK GRN), W/ TOMATO SAUCE","Vegetable combinations (including carrots, broccoli, and/or dark-green leafy), cooked, with tomato sauce" +75440310,"VEG COMBINATIONS (NO CAR/DK GRN), W/ TOMATO SAUCE","Vegetable combinations (excluding carrots, broccoli, and dark-green leafy), cooked, with tomato sauce" +75440400,"VEGETABLE,IN CHICK-PEA FLOUR BATTER,(PAKORA),FRIED","Vegetables, dipped in chick-pea flour batter, (pakora), fried" +75440500,"VEG COMBINATION (INCL CAR/DK GRN), W/ CHEESE SAUCE","Vegetable combinations (including carrots, broccoli, and/or dark-green leafy), cooked, with cheese sauce" +75440510,"VEG COMBINATION (NO CAR/ DK GRN), W/ CHEESE SAUCE","Vegetable combinations (excluding carrots, broccoli, and dark-green leafy), cooked, with cheese sauce" +75440600,"VEGETABLE CURRY","Vegetable curry" +75450500,"VEG COMBINATION (INCL CAR, DK GRN), W/ CREAM SAUCE","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, with cream sauce" +75450510,"VEG COMBINATION (NO CAR, DK GRN), W/ CREAM SAUCE","Vegetable combination (excluding carrots, broccoli, and dark-green leafy), cooked, with cream sauce" +75450600,"VEG COMBINATION(INCL CAR,BROC,DK GRN)W/BUTTER SAUCE","Vegetable combination (including carrots, broccoli, and/or dark-green leafy), cooked, with butter sauce" +75460700,"VEGETABLE COMBINATION (INCL CAR/DK GRN), W/ PASTA","Vegetable combinations (including carrots, broccoli, and/or dark-green leafy), cooked, with pasta" +75460710,"VEGETABLE COMBINATION (NO CAR/DK GRN), W/ PASTA","Vegetable combinations (excluding carrots, broccoli, and dark-green leafy), cooked, with pasta" +75460800,"VEGETABLE COMB(INCL CAR/DK GRN),CKD,W/ BUTTER SAUCE","Vegetable combinations (including carrots, broccoli, and/or dark-green leafy), cooked, with butter sauce and pasta" +75460810,"VEGETABLE COMB (NO CAR/DK GRN),CKD, W/ BUTTER SAUCE","Vegetable combinations (excluding carrots, broccoli, and dark-green leafy), cooked, with butter sauce and pasta" +75460900,"CHOW MEIN OR CHOP SUEY, MEATLESS, WITH NOODLES","Chow mein or chop suey, meatless, with noodles" +75500110,"BEANS, STRING, GREEN, PICKLED","Beans, string, green, pickled" +75500210,"BEETS, PICKLED (INCLUDE W/ ONIONS, BEET SALAD)","Beets, pickled" +75500510,"CELERY, PICKLED","Celery, pickled" +75501010,"CORN RELISH","Corn relish" +75502010,"CAULIFLOWER, PICKLED","Cauliflower, pickled" +75502500,"CABBAGE, FRESH, PICKLED, JAPANESE","Cabbage, fresh, pickled, Japanese style" +75502510,"CABBAGE, RED, PICKLED (INCL SWEET & SOUR CABBAGE)","Cabbage, red, pickled" +75502520,"CABBAGE, KIMCHI (KIM CHEE) STYLE","Cabbage, Kimchi (Kim Chee) style" +75502550,"CABBAGE, MUSTARD, SALTED","Cabbage, mustard, salted" +75503010,"CUCUMBER PICKLES, DILL","Cucumber pickles, dill" +75503020,"CUCUMBER PICKLES, RELISH","Cucumber pickles, relish" +75503030,"CUCUMBER PICKLES, SOUR","Cucumber pickles, sour" +75503040,"CUCUMBER PICKLES, SWEET","Cucumber pickles, sweet" +75503080,"EGGPLANT, PICKLED","Eggplant, pickled" +75503090,"HORSERADISH","Horseradish" +75503100,"MUSTARD PICKLES (INCL CHOW-CHOW, HOT DOG RELISH)","Mustard pickles" +75503110,"CUCUMBER PICKLE, DILL, REDUCED SALT","Cucumber pickles, dill, reduced salt" +75503140,"CUCUMBER PICKLE, SWEET, REDUCED SALT","Cucumber pickles, sweet, reduced salt" +75505000,"MUSHROOMS, PICKLED","Mushrooms, pickled" +75506010,"MUSTARD (INCL HORSERADISH MUSTARD, CHINESE MUSTARD)","Mustard" +75506100,"MUSTARD SAUCE","Mustard sauce" +75507000,"OKRA, PICKLED","Okra, pickled" +75510000,"OLIVES, NFS","Olives, NFS" +75510010,"OLIVES, GREEN","Olives, green" +75510020,"OLIVES, BLACK","Olives, black" +75510030,"OLIVES, GREEN, STUFFED","Olives, green, stuffed" +75511010,"HOT PEPPER SAUCE","Hot pepper sauce" +75511020,"PEPPERS, PICKLED","Peppers, pickled" +75511040,"PEPPER, HOT, PICKLED","Pepper, hot, pickled" +75511100,"PICKLES, NS AS TO VEGETABLE","Pickles, NS as to vegetable" +75511200,"PICKLES, MIXED","Pickles, mixed" +75512010,"RADISHES, PICKLED, HAWAIIAN","Radishes, pickled, Hawaiian style" +75512510,"RECAITO (P.R. LITTLE CORIANDER)","Recaito (Puerto Rican little coriander)" +75513010,"SEAWEED, PICKLED","Seaweed, pickled" +75515000,"VEGETABLES, PICKLED, HAWAIIAN","Vegetables, pickled, Hawaiian style" +75515010,"VEGETABLE RELISH","Vegetable relish" +75515100,"VEGETABLES, PICKLED (INCLUDE GIARDINIERA)","Vegetables, pickled" +75534030,"TURNIP, PICKLED","Turnip, pickled" +75534500,"TSUKEMONO, JAPANESE PICKLES","Tsukemono, Japanese pickles" +75535000,"ZUCCHINI, PICKLED","Zucchini, pickled" +75600150,"SOUP, CREAM OF, NFS","Soup, cream of, NFS" +75601000,"ASPARAGUS SOUP, CREAM OF, NS AS TO W/ MILK OR WATER","Asparagus soup, cream of, NS as to made with milk or water" +75601010,"ASPARAGUS SOUP, CREAM OF,W/ MILK","Asparagus soup, cream of, prepared with milk" +75601020,"ASPARAGUS SOUP, CREAM OF, PREPARED W/ WATER","Asparagus soup, cream of, prepared with water" +75601100,"BEET SOUP (BORSCHT)","Beet soup (borscht)" +75601200,"CABBAGE SOUP, HOME RECIPE, CANNED OR READY-TO-SERVE","Cabbage soup, home recipe, canned or ready-to-serve" +75601210,"CABBAGE WITH MEAT SOUP, HOME RECIPE, CANNED OR READY-TO-SERV","Cabbage with meat soup, home recipe, canned or ready-to-serve" +75603010,"CELERY SOUP, CREAM OF, PREPARED WITH MILK, HOME RECIPE, CANN","Celery soup, cream of, prepared with milk, home recipe, canned or ready-to-serve" +75603020,"CELERY SOUP, CREAM OF, PREPARED WITH WATER, HOME RECIPE, CAN","Celery soup, cream of, prepared with water, home recipe, canned or ready-to-serve" +75604010,"CORN SOUP, CREAM OF, W/ MILK","Corn soup, cream of, prepared with milk" +75604020,"CORN SOUP, CREAM OF, PREPARED W/ WATER","Corn soup, cream of, prepared with water" +75604600,"GAZPACHO","Gazpacho" +75605010,"LEEK SOUP, CREAM OF, PREP W/ MILK","Leek soup, cream of, prepared with milk" +75607000,"MUSHROOM SOUP, NFS","Mushroom soup, NFS" +75607010,"MUSHROOM SOUP, CREAM OF, PREP W/ MILK","Mushroom soup, cream of, prepared with milk" +75607020,"MUSHROOM SOUP, CREAM OF, PREPARED W/ WATER","Mushroom soup, cream of, prepared with water" +75607040,"MUSHROOM SOUP, W/ MEAT BROTH, PREPARED W/ WATER","Mushroom soup, with meat broth, prepared with water" +75607050,"MUSHROOM SOUP, CM OF, LOW SOD, PREP W/ WATER","Mushroom soup, cream of, low sodium, prepared with water" +75607060,"MUSHROOM SOUP, CREAM OF, NS AS TO W/ MILK OR WATER","Mushroom soup, cream of, NS as to made with milk or water" +75607080,"MUSHROOM W/ CHICKEN SOUP, CREAM OF, PREP W/ MILK","Mushroom with chicken soup, cream of, prepared with milk" +75607090,"MUSHROOM SOUP, CREAM OF, CAN, RED. SOD., NS W/ MILK/WATER","Mushroom soup, cream of, canned, reduced sodium, NS as to made with milk or water" +75607100,"MUSHROOM SOUP, CREAM OF, CAN, RED. SODIUM, PREP W/ MILK","Mushroom soup, cream of, canned, reduced sodium, prepared with milk" +75607130,"MUSHROOM SOUP, MADE FROM DRY MIX","Mushroom soup, made from dry mix" +75607140,"MUSHROOM SOUP, CM OF, CAN, RED SOD, PREP W/ WATER","Mushroom soup, cream of, canned, reduced sodium, prepared with water" +75608010,"ONION SOUP, CREAM OF, PREP W/ MILK","Onion soup, cream of, prepared with milk" +75608100,"ONION SOUP, FRENCH","Onion soup, French" +75608200,"ONION SOUP, MADE FROM DRY MIX","Onion soup, made from dry mix" +75609010,"PEA SOUP, PREPARED WITH MILK","Pea soup, prepared with milk" +75611010,"VEGETABLE SOUP, CREAM OF, PREP W/ MILK","Vegetable soup, cream of, prepared with milk" +75612010,"ZUCCHINI SOUP, CREAM OF, PREP W/ MILK","Zucchini soup, cream of, prepared with milk" +75646010,"SHAV SOUP","Shav soup" +75647000,"SEAWEED SOUP","Seaweed soup" +75649010,"VEGETABLE SOUP, CANNED, PREPARED WITH WATER OR READY-TO-SERV","Vegetable soup, canned, prepared with water or ready-to-serve" +75649050,"VEGETABLE SOUP, MADE FROM DRY MIX","Vegetable soup, made from dry mix" +75649070,"VEGETABLE SOUP, FROM DRY MIX, LOW SODIUM","Vegetable soup, made from dry mix, low sodium" +75649110,"VEGETABLE SOUP, HOME RECIPE","Vegetable soup, home recipe" +75649150,"VEGETABLE NOODLE SOUP, HOME RECIPE","Vegetable noodle soup, home recipe" +75650990,"MINESTRONE SOUP, REDUCED SODIUM, CANNED OR READY-TO-SERVE","Minestrone soup, reduced sodium, canned or ready-to-serve" +75651000,"MINESTRONE SOUP, HOME RECIPE","Minestrone soup, home recipe" +75651010,"MINESTRONE SOUP, CANNED, PREPARED WITH WATER, OR READY-TO-SE","Minestrone soup, canned, prepared with water, or ready-to-serve" +75651020,"VEGETABLE BEEF SOUP, CANNED, PREPARED WITH WATER, OR READY-T","Vegetable beef soup, canned, prepared with water, or ready-to-serve" +75651030,"VEGETABLE BEEF NOODLE SOUP, PREPARED W/ WATER","Vegetable beef noodle soup, prepared with water" +75651040,"VEGETABLE NOODLE SOUP, CANNED, PREPARED WITH WATER, OR READY","Vegetable noodle soup, canned, prepared with water, or ready-to-serve" +75651070,"VEGETABLE RICE SOUP, CANNED, PREPARED WITH WATER OR READY-TO","Vegetable rice soup, canned, prepared with water or ready-to-serve" +75651080,"VEGETABLE BEEF SOUP WITH RICE, CANNED, PREPARED WITH WATER O","Vegetable beef soup with rice, canned, prepared with water or ready-to-serve" +75651110,"VEGETABLE CHICKEN RICE SOUP, CANNED, PREP W/WATER OR RTF","Vegetable chicken rice soup, canned, prepared with water or ready-to-serve" +75651140,"VEGETABLE SOUP WITH CHICKEN BROTH, MEXICAN STYLE, HOME RECIP","Vegetable soup with chicken broth, Mexican style, home recipe (Sopa Ranchera)" +75651150,"VEGETABLE NOODLE SOUP, RED SODIUM, CAN, PREP W/ WATER/RTS","Vegetable noodle soup, reduced sodium, canned, prepared with water or ready-to-serve" +75652010,"VEGETABLE BEEF SOUP, HOME RECIPE","Vegetable beef soup, home recipe" +75652030,"VEGETABLE BEEF SOUP, CANNED, PREPARED WITH MILK","Vegetable beef soup, canned, prepared with milk" +75652040,"VEG BEEF SOUP W/ NOODLES, HOME RECIPE","Vegetable beef soup with noodles or pasta, home recipe" +75652050,"VEG BEEF SOUP W/ RICE, HOME RECIPE","Vegetable beef soup with rice, home recipe" +75654010,"VEGETARIAN VEGETABLE SOUP, PREPARED W/ WATER","Vegetarian vegetable soup, prepared with water" +75656010,"VEGETABLE SOUP, SPANISH, STEW TYPE","Vegetable soup, Spanish style, stew type" +75656020,"VEGETABLE SOUP, CHUNKY STYLE","Vegetable soup, chunky style" +75656040,"VEGETABLE SOUP W/ PASTA, CHUNKY STYLE","Vegetable soup, with pasta, chunky style" +75656060,"VEG BEEF SOUP, CHUNKY STYLE (INCL VEG W/ MEAT SOUPS","Vegetable beef soup, chunky style" +75657000,"VEGETABLE BROTH, BOUILLON (INCL POT LIQUOR)","Vegetable broth, bouillon" +76102010,"SPINACH, CREAMED, BABY, STRAINED","Spinach, creamed, baby food, strained" +76102030,"BROCCOLI, CARROTS & CHEESE, BABY, JUNIOR","Broccoli, carrots and cheese, baby food, junior" +76201000,"CARROTS, BABY, NS AS TO STRAINED OR JUNIOR","Carrots, baby food, NS as to strained or junior" +76201010,"CARROTS, BABY, STRAINED","Carrots, baby food, strained" +76201020,"CARROTS, BABY, JUNIOR","Carrots, baby food, junior" +76201030,"CARROTS, BABY FOOD, TODDLER","Carrots, baby food, toddler" +76202000,"CARROTS & PEAS, BABY, STRAINED","Carrots and peas, baby food, strained" +76205000,"SQUASH, BABY, NS AS TO STRAINED OR JUNIOR","Squash, baby food, NS as to strained or junior" +76205010,"SQUASH, BABY, STRAINED","Squash, baby food, strained" +76205020,"SQUASH, BABY, JUNIOR","Squash, baby food, junior" +76205030,"SQUASH & CORN, BABY, STRAINED","Squash and corn, baby food, strained" +76205060,"CORN AND SWEET POTATOES, BABY FOOD, STRAINED","Corn and sweet potatoes, baby food, strained" +76209000,"SWEET POTATOES, BABY, NS AS TO STRAINED OR JUNIOR","Sweet potatoes, baby food, NS as to strained or junior" +76209010,"SWEET POTATOES, BABY, STRAINED","Sweet potatoes, baby food, strained" +76209020,"SWEET POTATOES, BABY, JUNIOR","Sweet potatoes, baby food, junior" +76401000,"BEANS, GREEN STRING, BABY, NS AS TO STR OR JR","Beans, green string, baby food, NS as to strained or junior" +76401010,"BEANS, GREEN STRING, BABY, STRAINED","Beans, green string, baby food, strained" +76401020,"BEANS, GREEN STRING, BABY, JUNIOR","Beans, green string, baby food, junior" +76401060,"BEANS, GREEN STRING, BABY, TODDLER","Beans, green string, baby food, toddler" +76402000,"GREEN BEANS & POTATOES, BABY, STRAINED","Green beans and potatoes, baby food, strained" +76403010,"BEETS, BABY, STRAINED","Beets, baby food, strained" +76405000,"CORN, CREAMED, BABY, NS AS TO STRAINED OR JUNIOR","Corn, creamed, baby food, NS as to strained or junior" +76405010,"CORN, CREAMED, BABY, STRAINED","Corn, creamed, baby food, strained" +76405020,"CORN, CREAMED, BABY, JUNIOR","Corn, creamed, baby food, junior" +76407000,"MIXED VEG, GARDEN VEG, BABY, NS AS TO STR OR JR","Mixed vegetables, garden vegetables, baby food, NS as to strained or junior" +76407010,"MIXED VEGETABLES, GARDEN VEGETABLES, BABY, STRAINED","Mixed vegetables, garden vegetables, baby food, strained" +76407020,"MIXED VEGETABLES, GARDEN VEGETABLES, BABY, JUNIOR","Mixed vegetables, garden vegetables, baby food, junior" +76409000,"PEAS, BABY, NS AS TO STRAINED OR JUNIOR","Peas, baby food, NS as to strained or junior" +76409010,"PEAS, BABY, STRAINED","Peas, baby food, strained" +76409020,"PEAS, BABY, JUNIOR","Peas, baby food, junior" +76409030,"PEAS, BABY, TODDLER","Peas, baby food, toddler" +76420000,"POTATOES, BABY, TODDLER","Potatoes, baby food, toddler" +76501000,"VEGETABLES & RICE, BABY, STRAINED","Vegetables and rice, baby food, strained" +76502000,"PEAS & BROWN RICE, BABY","Peas and brown rice, baby food" +76601010,"VEGETABLE & BACON, BABY, STRAINED","Vegetable and bacon, baby food, strained" +76602000,"CARROTS & BEEF, BABY, STRAINED","Carrots and beef, baby food, strained" +76603000,"VEGETABLE & BEEF, BABY, NS AS TO STRAINED OR JUNIOR","Vegetable and beef, baby food, NS as to strained or junior" +76603010,"VEGETABLE & BEEF, BABY, STRAINED","Vegetable and beef, baby food, strained" +76603020,"VEGETABLE & BEEF, BABY, JUNIOR","Vegetable and beef, baby food, junior" +76604000,"BROCCOLI & CHICKEN, BABY, STRAINED","Broccoli and chicken, baby food, strained" +76604500,"SWEET POTATOES & CHICKEN, BABY, STRAINED","Sweet potatoes and chicken, baby food, strained" +76605000,"VEGETABLE & CHICKEN, BABY, NS AS TO STR OR JR","Vegetable and chicken, baby food, NS as to strained or junior" +76605010,"VEGETABLE & CHICKEN, BABY, STRAINED","Vegetable and chicken, baby food, strained" +76605020,"VEGETABLE & CHICKEN, BABY, JUNIOR","Vegetable and chicken, baby food, junior" +76607000,"VEGETABLE & HAM, BABY, NS AS TO STRAINED OR JUNIOR","Vegetable and ham, baby food, NS as to strained or junior" +76607010,"VEGETABLE & HAM, BABY, STRAINED","Vegetable and ham, baby food, strained" +76607020,"VEGETABLE & HAM, BABY, JUNIOR","Vegetable and ham, baby food, junior" +76607030,"POTATOES W/ CHEESE & HAM, BABY FOOD, TODDLER","Potatoes with cheese and ham, baby food, toddler" +76607100,"POTATOES WITH CHEESE AND BROCCOLI, BABY FOOD, TODDLER","Potatoes with cheese and broccoli, baby food, toddler" +76609010,"VEGETABLE & LAMB, BABY, STRAINED","Vegetable and lamb, baby food, strained" +76611000,"VEGETABLE & TURKEY, BABY, NS AS TO STR OR JR","Vegetable and turkey, baby food, NS as to strained or junior" +76611010,"VEGETABLE & TURKEY, BABY, STRAINED","Vegetable and turkey, baby food, strained" +76611020,"VEGETABLE & TURKEY, BABY, JUNIOR","Vegetable and turkey, baby food, junior" +77121010,"FRIED STUFFED POTATOES, P.R. (RELLENOS DE PAPAS)","Fried stuffed potatoes, Puerto Rican style (Rellenos de papas)" +77121110,"POTATO&HAM FRITTERS,P.R.(FRITURAS DE PAPA Y JAMON)","Potato and ham fritters, Puerto Rican style (Frituras de papa y jamon)" +77141010,"POTATO CHICKEN PIE, P.R. (PASTELON DE POLLO)","Potato chicken pie, Puerto Rican style (Pastelon de pollo)" +77201210,"GREEN PLANTAIN W/ CRACKLINGS, P.R. (MOFONGO)","Green plantain with cracklings, Puerto Rican style (Mofongo)" +77205110,"RIPE PLANTAIN FRITTERS, P.R. (PIONONO)","Ripe plantain fritters, Puerto Rican style (Pionono)" +77205610,"RIPE PLANTAIN MEAT PIE, P.R. (PINON)","Ripe plantain meat pie, Puerto Rican style (Pinon)" +77230210,"CASSAVA PASTELES, P.R. (PASTELES DE YUCA)","Cassava Pasteles, Puerto Rican style (Pasteles de yuca)" +77230510,"CASSAVA FRITTER STUFFED W/ CRAB, P.R. (EMPANADA DE YUCA)","Cassava fritter stuffed with crab meat, Puerto Rican style (Empanada de yuca y jueyes)" +77250110,"STUFFED TANNIER FRITTERS, P.R. (ALCAPURRIAS)","Stuffed tannier fritters, Puerto Rican style (Alcapurrias)" +77250710,"TANNIER FRITTERS, P.R. (FRITURAS DE YAUTIA)","Tannier fritters, Puerto Rican style (Frituras de yautia)" +77272010,"PUERTO RICAN PASTELES (PASTELES DE MASA)","Puerto Rican pasteles (Pasteles de masa)" +77316010,"STUFFED CABBAGE, W/ MEAT, P.R.(REPOLLO RELLENO CON CARNE)","Stuffed cabbage, with meat, Puerto Rican style (Repollo relleno con carne)" +77316510,"STUFFED CABBAGE, W MEAT& RICE, SYRIAN DISH, P.R. STYLE","Stuffed cabbage, with meat and rice, Syrian dish, Puerto Rican style (Repollo relleno con carne y con arroz; Arabe Mihsy Melful)" +77316600,"EGGPLANT AND MEAT CASSEROLE","Eggplant and meat casserole" +77513010,"SPANISH STEW, P.R. (COCIDO ESPANOL)","Spanish stew, Puerto Rican style (Cocido Espanol)" +77563010,"PUERTO RICAN STEW (SALCOCHO / SANCOCHO)","Puerto Rican stew (Salcocho / Sancocho)" +78101000,"VEGETABLE & FRUIT JUICE BLEND,100% JUICE,W/ HIGH VIT C,+ E,A","Vegetable and fruit juice blend, 100% juice, with high vitamin C plus added vitamin E and vitamin A" +81100000,"TABLE FAT, NFS","Table fat, NFS" +81100500,"BUTTER, NFS","Butter, NFS" +81101000,"BUTTER, STICK, SALTED","Butter, stick, salted" +81101010,"BUTTER, WHIPPED, TUB, SALTED","Butter, whipped, tub, salted" +81101020,"BUTTER, WHIPPED, STICK, SALTED","Butter, whipped, stick, salted" +81101100,"BUTTER, STICK, UNSALTED","Butter, stick, unsalted" +81101110,"BUTTER, WHIPPED, TUB, UNSALTED","Butter, whipped, tub, unsalted" +81101120,"BUTTER, WHIPPED, STICK, UNSALTED","Butter, whipped, stick, unsalted" +81101500,"LIGHT BUTTER, STICK, SALTED","Light butter, stick, salted" +81101510,"LIGHT BUTTER, STICK, UNSALTED","Light butter, stick, unsalted" +81101520,"LIGHT BUTTER, WHIPPED, TUB, SALTED","Light butter, whipped, tub, salted" +81102000,"MARGARINE, NFS","Margarine, NFS" +81102010,"MARGARINE, STICK, SALTED","Margarine, stick, salted" +81102020,"MARGARINE, TUB, SALTED","Margarine, tub, salted" +81103020,"MARGARINE, WHIPPED, TUB, SALTED","Margarine, whipped, tub, salted" +81103030,"MARGARINE, STICK, UNSALTED","Margarine, stick, unsalted" +81103040,"MARGARINE-LIKE SPREAD, STICK, SALTED","Margarine-like spread, stick, salted" +81103041,"MARGARINE-LIKE SPREAD, MADE W/ YOGURT, STICK, SALTED","Margarine-like spread, made with yogurt, stick, salted" +81103060,"MARGARINE, TUB, UNSALTED","Margarine, tub, unsalted" +81103070,"MARGARINE, WHIPPED, TUB, UNSALTED","Margarine, whipped, tub, unsalted" +81103080,"MARGARINE-LIKE SPREAD, TUB, SALTED","Margarine-like spread, tub, salted" +81103090,"MARGARINE-LIKE SPREAD, LIQUID, SALTED","Margarine-like spread, liquid, salted" +81103100,"MARGARINE-LIKE SPREAD, STICK, UNSALTED","Margarine-like spread, stick, unsalted" +81103120,"MARGARINE-LIKE SPREAD, TUB, UNSALTED","Margarine-like spread, tub, unsalted" +81103130,"MARGARINE-LIKE SPREAD, WHIPPED, TUB, SALTED","Margarine-like spread, whipped, tub, salted" +81103140,"MARGARINE-LIKE SPREAD, TUB, SWEETENED","Margarine-like spread, tub, sweetened" +81104010,"MARGARINE-LIKE SPREAD, RED CAL, 40% FAT, TUB, SALTED","Margarine-like spread, reduced calorie, about 40% fat, tub, salted" +81104011,"MARGARINE-LIKE SPREAD,RED CAL,40% FAT,MADE W/ YOGURT,TUB","Margarine-like spread, reduced calorie, about 40% fat, made with yogurt, tub, salted" +81104020,"MARGARINE-LIKE SPREAD, RED CAL, 40% FAT, STICK, SALTED","Margarine-like spread, reduced calorie, about 40% fat, stick, salted" +81104050,"MARGARINE-LIKE SPREAD, RED CAL, 20% FAT, TUB, SALTED","Margarine-like spread, reduced calorie, about 20% fat, tub, salted" +81104070,"MARGARINE-LIKE SPREAD, RED CAL, 20% FAT, TUB, UNSALTED","Margarine-like spread, reduced calorie, about 20% fat, tub, unsalted" +81104100,"MARGARINE-LIKE SPREAD, FAT FREE, TUB, SALTED","Margarine-like spread, fat free, tub, salted" +81104110,"MARGARINE-LIKE SPREAD, FAT FREE, LIQUID, SALTED","Margarine-like spread, fat free, liquid, salted" +81104500,"VEGETABLE OIL-BUTTER SPREAD, STICK, SALTED","Vegetable oil-butter spread, stick, salted" +81104510,"VEGETABLE OIL-BUTTER SPREAD, TUB, SALTED","Vegetable oil-butter spread, tub, salted" +81104550,"VEGETABLE OIL-BUTTER SPREAD, RED CAL, STICK, SALTED","Vegetable oil-butter spread, reduced calorie, stick, salted" +81104560,"VEGETABLE OIL-BUTTER SPREAD, RED CAL, TUB, SALTED","Vegetable oil-butter spread, reduced calorie, tub, salted" +81105010,"BUTTER-MARGARINE BLEND, STICK, SALTED","Butter-margarine blend, stick, salted" +81105020,"BUTTER-MARGARINE BLEND, TUB, SALTED","Butter-margarine blend, tub, salted" +81105500,"BUTTER-VEG OIL BLEND","Butter-vegetable oil blend" +81106010,"BUTTER REPLACEMENT, FAT-FREE POWDER, NOT RECONST","Butter replacement, fat-free powder" +81201000,"ANIMAL FAT OR DRIPPINGS","Animal fat or drippings" +81202000,"LARD","Lard" +81203000,"SHORTENING, NS AS TO VEGETABLE OR ANIMAL","Shortening, NS as to vegetable or animal" +81203100,"SHORTENING, VEGETABLE","Shortening, vegetable" +81203200,"SHORTENING, ANIMAL","Shortening, animal" +81204000,"GHEE, CLARIFIED BUTTER","Ghee, clarified butter" +81301000,"GARLIC SAUCE","Garlic sauce" +81301020,"LEMON-BUTTER SAUCE","Lemon-butter sauce" +81302010,"HOLLANDAISE SAUCE","Hollandaise sauce" +81302040,"SANDWICH SPREAD","Sandwich spread" +81302050,"TARTAR SAUCE","Tartar sauce" +81302060,"HORSERADISH SAUCE","Horseradish sauce" +81302070,"PESTO SAUCE","Pesto sauce" +81312000,"TARTAR SAUCE, REDUCED FAT/CALORIE","Tartar sauce, reduced fat/calorie" +81322000,"HONEY BUTTER","Honey butter" +81330210,"ADOBO FRESCO (INCL ADOBO CRIOLLO)","Adobo fresco" +82101000,"VEGETABLE OIL, NFS (INCLUDE OIL, NFS)","Vegetable oil, NFS" +82101300,"ALMOND OIL","Almond oil" +82101500,"COCONUT OIL","Coconut oil" +82102000,"CORN OIL","Corn oil" +82102500,"CORN & CANOLA OIL","Corn and canola oil" +82103000,"COTTONSEED OIL","Cottonseed oil" +82103500,"FLAXSEED OIL","Flaxseed oil" +82104000,"OLIVE OIL","Olive oil" +82105000,"PEANUT OIL","Peanut oil" +82105500,"RAPESEED OIL (INCL CANOLA OIL, PURITAN)","Rapeseed oil" +82105750,"CANOLA & SOYBEAN OIL","Canola and soybean oil" +82105800,"CANOLA, SOYBEAN & SUNFLOWER OIL","Canola, soybean and sunflower oil" +82106000,"SAFFLOWER OIL","Safflower oil" +82107000,"SESAME OIL","Sesame oil" +82108000,"SOYBEAN OIL","Soybean oil" +82108250,"SOYBEAN & SUNFLOWER OIL","Soybean and sunflower oil" +82108500,"SUNFLOWER OIL","Sunflower oil" +82108700,"WALNUT OIL","Walnut oil" +82109000,"WHEAT GERM OIL","Wheat germ oil" +83100100,"SALAD DRESSING, NFS, FOR SALADS","Salad dressing, NFS, for salads" +83100200,"SALAD DRESSING, NFS, FOR SANDWICHES","Salad dressing, NFS, for sandwiches" +83101000,"BLUE OR ROQUEFORT CHEESE DRESSING","Blue or roquefort cheese dressing" +83101500,"BACON DRESSING (HOT)","Bacon dressing (hot)" +83101600,"BACON & TOMATO DRESSING","Bacon and tomato dressing" +83102000,"CAESAR DRESSING","Caesar dressing" +83103000,"COLESLAW DRESSSING","Coleslaw dressing" +83104000,"FRENCH OR CATALINA DRESSING","French or Catalina dressing" +83105500,"HONEY MUSTARD DRESSING","Honey mustard dressing" +83106000,"ITALIAN DRESSING, W/ VINEGAR & OIL","Italian dressing, made with vinegar and oil" +83107000,"MAYONNAISE, REGULAR","Mayonnaise, regular" +83108000,"MAYONNAISE, IMITATION","Mayonnaise, imitation" +83109000,"RUSSIAN DRESSING","Russian dressing" +83110000,"MAYONNAISE-TYPE SALAD DRESSING","Mayonnaise-type salad dressing" +83112000,"AVOCADO DRESSING","Avocado dressing" +83112500,"CREAMY DRESSING","Creamy dressing" +83112950,"POPPY SEED DRESSING","Poppy seed dressing" +83112990,"SESAME DRESSING","Sesame dressing" +83114000,"THOUSAND ISLAND DRESSING","Thousand Island dressing" +83115000,"YOGURT DRESSING","Yogurt dressing" +83200100,"SALAD DRESSING, LIGHT, NFS","Salad dressing, light, NFS" +83201000,"BLUE OR ROQUEFORT CHEESE DRESSING, LIGHT","Blue or roquefort cheese dressing, light" +83201400,"COLESLAW DRESSING, LIGHT","Coleslaw dressing, light" +83202020,"FRENCH OR CATALINA DRESSING, LIGHT","French or Catalina dressing, light" +83203000,"CAESAR DRESSING, LIGHT","Caesar dressing, light" +83204000,"MAYONNAISE, LIGHT","Mayonnaise, light" +83204030,"MAYONNAISE, REGULAR, WITH OLIVE OIL","Mayonnaise, reduced fat, with olive oil" +83204050,"MAYONNAISE-TYPE SALAD DRESSING, LIGHT","Mayonnaise-type salad dressing, light" +83204500,"HONEY MUSTARD DRESSING, LIGHT","Honey mustard dressing, light" +83205450,"ITALIAN DRESSING, LIGHT","Italian dressing, light" +83206000,"RUSSIAN DRESSING, LIGHT","Russian dressing, light" +83206500,"SESAME DRESSING, LIGHT","Sesame dressing, light" +83207000,"THOUSAND ISLAND DRESSING, LIGHT","Thousand Island dressing, light" +83208500,"KOREAN DRESSING OR MARINADE","Korean dressing or marinade" +83210100,"CREAMY DRESSING, LIGHT","Creamy dressing, light" +83300100,"BLUE OR ROQUEFORT CHEESE DRESSING, FAT FREE","Blue or roquefort cheese dressing, fat free" +83300200,"CAESAR DRESSING, FAT FREE","Caesar dressing, fat free" +83300300,"CREAMY DRESSING, FAT FREE","Creamy dressing, fat free" +83300400,"FRENCH OR CATALINA DRESSING, FAT FREE","French or Catalina dressing, fat free" +83300500,"HONEY MUSTARD DRESSING, FAT FREE","Honey mustard dressing, fat free" +83300600,"ITALIAN DRESSING, FAT FREE","Italian dressing, fat free" +83300700,"MAYONNAISE, FAT FREE","Mayonnaise, fat free" +83300800,"RUSSIAN DRESSING, FAT FREE","Russian dressing, fat free" +83300900,"SALAD DRESSING, FAT FREE, NFS","Salad dressing, fat free, NFS" +83301000,"THOUSAND ISLAND DRESSING, FAT FREE","Thousand Island dressing, fat free" +91101000,"SUGAR, NFS","Sugar, NFS" +91101010,"SUGAR, WHITE, GRANULATED OR LUMP","Sugar, white, granulated or lump" +91101020,"SUGAR, WHITE, CONFECTIONER'S, POWDERED","Sugar, white, confectioner's, powdered" +91102010,"SUGAR, BROWN","Sugar, brown" +91103010,"SUGAR, MAPLE","Sugar, maple" +91104100,"SUGAR, CINNAMON","Sugar, cinnamon" +91104200,"SUGAR, RAW","Sugar, raw" +91105010,"FRUCTOSE SWEETENER, SUGAR SUBSTITUTE, DRY POWDER","Fructose sweetener, sugar substitute, dry powder" +91106000,"SUGAR SUBSTITUTE, SUGAR-ASPARTAME BLEND, DRY PWD","Sugar substitute, sugar-aspartame blend, dry powder" +91107000,"SUCRALOSE-BASED SWEETENER, SUGAR SUBSTITUTE","Sucralose-based sweetener, sugar substitute" +91108000,"SUGAR SUB, HERBAL EXTRACT SWEETENER, POWDER","Sugar substitute, herbal extract sweetener, powder" +91108010,"SUGAR SUB, HERBAL EXTRACT SWEETENER, LIQUID","Sugar substitute, herbal extract sweetener, liquid" +91109000,"BLUE AGAVE LIQUID SWEETENER, SUGAR SUBSTITUTE","Blue Agave liquid sweetener, sugar substitute" +91200000,"SUGAR SUBSTITUTE, LOW CALORIE, POWDERED, NFS","Sugar substitute, low-calorie, powdered, NFS" +91200020,"SUGAR SUBSTITUTE, SACCHARIN-BASED, DRY POWDER","Sugar substitute, saccharin-based, dry powder" +91200030,"BROWN SUGAR SUBSTITUTE, SACCHARIN-BASED, DRY POWDER","Brown sugar substitute, saccharin-based, dry powder" +91200040,"SUGAR SUBSTITUTE, SACCHARIN-BASED, DRY POWDER AND TABLETS","Sugar substitute, saccharin-based, dry powder and tablets" +91200110,"SUGAR SUBSTITUTE, SACCHARIN-BASED, LIQUID","Sugar substitute, saccharin-based, liquid" +91201010,"SUGAR SUBSTITUTE, ASPARTAME-BASED, DRY POWDER","Sugar substitute, aspartame-based, dry powder" +91300010,"SYRUP, NFS","Syrup, NFS" +91300100,"PANCAKE SYRUP, NFS","Pancake syrup, NFS" +91301020,"CANE & CORN PANCAKE SYRUP","Cane and corn pancake syrup" +91301030,"CORN SYRUP, LIGHT OR DARK","Corn syrup, light or dark" +91301040,"BUTTERED BLENDS SYRUP (INCL MRS BUTTERWORTH)","Buttered blends syrup" +91301050,"FRUIT SYRUP","Fruit syrup" +91301060,"MAPLE SYRUP(100% MAPLE)(INCLUDE MAPLE CREAM)","Maple syrup (100% maple)" +91301080,"CHOCOLATE SYRUP, THIN TYPE","Chocolate syrup, thin type" +91301081,"CHOCOLATE SYRUP, THIN TYPE, LIGHT","Chocolate syrup, thin type, light" +91301082,"CHOCOLATE SYRUP, THIN TYPE, SUGAR FREE","Chocolate syrup, thin type, sugar free" +91301090,"SORGHUM SYRUP","Sorghum syrup" +91301100,"SUGAR (WHITE) & WATER SYRUP (INCLUDE SIMPLE SYRUP)","Sugar (white) and water syrup" +91301120,"SUGAR, CARMELIZED","Sugar, carmelized" +91301130,"FRUIT FLAVORED SYRUP USED FOR MILK BEVERAGES","Fruit flavored syrup used for milk beverages" +91301200,"SUGAR (BROWN) & WATER SYRUP","Sugar (brown) and water syrup" +91301250,"MAPLE & CORN &/OR CANE PANCAKE SYRUP BLENDS","Maple and corn and/or cane pancake syrup blends (formerly Corn and maple syrup (2% maple))" +91301510,"SYRUP, PANCAKE, REDUCED CALORIE","Syrup, pancake, reduced calorie" +91302010,"HONEY (INCLUDE PEAR HONEY, RAW HONEY)","Honey" +91303000,"MOLASSES","Molasses" +91303500,"SUGAR, BROWN, LIQUID","Sugar, brown, liquid" +91303750,"CHOCOLATE GRAVY","Chocolate gravy" +91304010,"TOPPING, BUTTERSCOTCH OR CARAMEL","Topping, butterscotch or caramel" +91304020,"TOPPING, CHOCOLATE, THICK, FUDGE TYPE","Topping, chocolate, thick, fudge type" +91304030,"TOPPING, FRUIT","Topping, fruit" +91304040,"TOPPING, MARSHMALLOW","Topping, marshmallow" +91304050,"HARD SAUCE","Hard sauce" +91304060,"TOPPING, NUT (WET)","Topping, nut (wet)" +91304070,"TOPPING, PEANUT BUTTER, THICK FUDGE TYPE","Topping, peanut butter, thick, fudge type" +91304080,"TOPPING, FRUIT, UNSWEETENED","Topping, fruit, unsweetened" +91304090,"TOPPING, CHOC FLAVOR HAZELNUT SPREAD (INCL NUTELLA)","Topping, chocolate flavored hazelnut spread" +91304250,"TOPPING, MILK CHOCOLATE W/ CEREAL","Topping, milk chocolate with cereal" +91304300,"TOPPING, CHOCOLATE, HARD COATING","Topping, chocolate, hard coating" +91305010,"ICING, CHOCOLATE","Icing, chocolate" +91305020,"ICING, WHITE","Icing, white" +91351010,"SYRUP, DIETETIC","Syrup, dietetic" +91351020,"TOPPING, DIETETIC","Topping, dietetic" +91361010,"SWEET & SOUR SAUCE (INCLUDE VIETNAMESE SAUCE)","Sweet and sour sauce" +91361020,"FRUIT SAUCE (INCLUDE ALL FRUITS)","Fruit sauce" +91361040,"DESSERT SAUCE","Dessert sauce" +91361050,"DUCK SAUCE (INCLUDE CHAISNI SAUCE)","Duck sauce" +91361070,"PLUM SAUCE, ASIAN STYLE","Plum sauce, Asian style" +91401000,"JELLY, ALL FLAVORS","Jelly, all flavors" +91402000,"JAM, PRESERVES, ALL FLAVORS","Jam, preserves, all flavors" +91403000,"FRUIT BUTTER, ALL FLAVORS (INCLUDE APPLE BUTTER)","Fruit butter, all flavors" +91404000,"MARMALADE, ALL FLAVORS","Marmalade, all flavors" +91405000,"JELLY, DIETETIC, ALL FLAVORS,SWEETENED W/ ARTIFICIAL SWEETEN","Jelly, dietetic, all flavors, sweetened with artificial sweetener" +91405500,"JELLY, REDUCED SUGAR, ALL FLAVORS","Jelly, reduced sugar, all flavors" +91406000,"JAM, MARMALADES, ARTIFICIALLY SWEETENED","Jams, preserves, marmalades, dietetic, all flavors, sweetened with artificial sweetener" +91406500,"JAM PRESERVES,MARMALADES,SWEET W/ FRUIT JUICE CONC","Jams, preserves, marmalades, sweetened with fruit juice concentrates, all flavors" +91406600,"JAMS,PRESERVES,MARMALADES,LOW SUGAR (ALL FLAVORS)","Jams, preserves, marmalades, low sugar (all flavors)" +91407100,"GUAVA PASTE","Guava paste" +91407120,"SWEET POTATO PASTE","Sweet potato paste" +91407150,"BEAN PASTE, SWEETENED","Bean paste, sweetened" +91408100,"CHINESE PRESERVED SWEET VEGETABLE","Chinese preserved sweet vegetable" +91500200,"GELATIN POWDER, SWEETENED, DRY","Gelatin powder, sweetened, dry" +91501010,"GELATIN DESSERT","Gelatin dessert" +91501015,"GELATIN SNACKS","Gelatin snacks" +91501020,"GELATIN DESSERT W/ FRUIT","Gelatin dessert with fruit" +91501030,"GELATIN DESSERT W/ WHIPPED CREAM","Gelatin dessert with whipped cream" +91501040,"GELATIN DESSERT W/ FRUIT & WHIPPED CREAM","Gelatin dessert with fruit and whipped cream" +91501050,"GELATIN DESSERT W/ CREAM CHEESE","Gelatin dessert with cream cheese" +91501060,"GELATIN DESSERT W/ SOUR CREAM","Gelatin dessert with sour cream" +91501070,"GELATIN DESSERT W/ FRUIT & SOUR CREAM","Gelatin dessert with fruit and sour cream" +91501080,"GELATIN DESSERT W/ FRUIT & CREAM CHEESE","Gelatin dessert with fruit and cream cheese" +91501090,"GELATIN DESSERT W/ FRUIT, VEGETABLES, & NUTS","Gelatin dessert with fruit, vegetable, and nuts" +91501100,"GELATIN SALAD W/ VEGETABLES","Gelatin salad with vegetables" +91501110,"GELATIN DESSERT W/ FRUIT & WHIPPED TOPPING","Gelatin dessert with fruit and whipped topping" +91501120,"GELATIN DESSERT W/ FRUIT & VEGETABLES","Gelatin dessert with fruit and vegetables" +91510100,"GELATIN POWDER, DIETETIC, DRY","Gelatin powder, dietetic, sweetened with low calorie sweetener, dry" +91511010,"GELATIN DESSERT, DIETETIC, W/ LO CAL SWEETENER","Gelatin dessert, dietetic, sweetened with low calorie sweetener" +91511020,"GELATIN DESSERT, DIET, W/ FRUIT, LO CAL SWEETNER","Gelatin dessert, dietetic, with fruit, sweetened with low calorie sweetener" +91511030,"GELATIN DESSERT, DIETETIC, W/ WHIPPED TOPPING","Gelatin dessert, dietetic, with whipped topping, sweetened with low calorie sweetener" +91511050,"GELATIN DESSERT, DIETETIC, W/ CREAM CHEESE","Gelatin dessert, dietetic, with cream cheese, sweetened with low calorie sweetener" +91511060,"GELATIN DESSERT, DIETETIC, W/ SOUR CREAM","Gelatin dessert, dietetic, with sour cream, sweetened with low calorie sweetener" +91511070,"GELATIN DESSERT, DIETETIC, W/ FRUIT & SOUR CREAM","Gelatin dessert, dietetic, with fruit and sour cream, sweetened with low calorie sweetener" +91511080,"GELATIN DESSERT, DIETETIC, W/ FRUIT & CREAM CHEESE","Gelatin dessert, dietetic, with fruit and cream cheese, sweetened with low calorie sweetener" +91511090,"GELATIN DESSERT, DIETETIC, W/ FRUIT & VEGETABLES","Gelatin dessert, dietetic, with fruit and vegetable(s), sweetened with low calorie sweetener" +91511100,"GELATIN DESSERT, DIETETIC, W/ VEGETABLES","Gelatin salad, dietetic, with vegetables, sweetened with low calorie sweetener" +91511110,"GELATIN DESSERT, DIETETIC, W/ FRUIT & WHIP TOPPING","Gelatin dessert, dietetic, with fruit and whipped topping, sweetened with low calorie sweetener" +91512010,"DANISH DESSERT PUDDING","Danish dessert pudding" +91520100,"YOOKAN, JAPANESE DESSERT MADE W/ BEAN PASTE & SUGAR","Yookan (Yokan), a Japanese dessert made with bean paste and sugar" +91550100,"COCONUT CREAM CAKE, P.R. (BIEN ME SABE)","Coconut cream cake, Puerto Rican style (Bien me sabe, ""Tastes good to me"")" +91550300,"PINEAPPLE CUSTARD, P.R. (FLAN DE PINA)","Pineapple custard, Puerto Rican style (Flan de pina)" +91560100,"HAUPIA (COCONUT PUDDING)","Haupia (coconut pudding)" +91580000,"GELATIN,FROZ,WHIPPED,ON STICK(INCL JELLO GLTN POPS)","Gelatin, frozen, whipped, on a stick" +91601000,"ICE, FRUIT","Ice, fruit" +91611000,"ICE POP","Ice pop" +91611050,"ICE POP FILLED W/ ICE CREAM, ALL FLAVOR VARIETIES","Ice pop filled with ice cream, all flavor varieties" +91611100,"ICE POP, SWEETENED W/ LOW CALORIE SWEETENER","Ice pop, sweetened with low calorie sweetener" +91621000,"SNOW CONE","Snow cone" +91700010,"CANDY, NFS","Candy, NFS" +91700500,"M&M'S ALMOND CHOCOLATE CANDIES","M&M's Almond Chocolate Candies" +91701010,"ALMONDS, CHOCOLATE-COVERED","Almonds, chocolate covered" +91701020,"ALMONDS, SUGAR-COATED (INCL JORDAN ALMONDS)","Almonds, sugar-coated" +91701030,"ALMONDS, YOGURT-COVERED","Almonds, yogurt-covered" +91702010,"BUTTERSCOTCH MORSELS","Butterscotch morsels" +91703010,"CARAMEL CANDY, CHOC-FLAVOR ROLL (INCL TOOTSIE ROLL)","Caramel, chocolate-flavored roll" +91703020,"CARAMEL CANDY, NOT CHOCOLATE","Caramel, flavor other than chocolate" +91703030,"CARAMEL CANDY, W/ NUTS","Caramel, with nuts" +91703040,"CARAMEL CANDY, CHOCOLATE COVERED","Caramel candy, chocolate covered" +91703050,"CARAMEL CANDY, W/ NUTS & CEREAL, CHOCOLATE-COVERED","Caramel with nuts and cereal, chocolate covered" +91703060,"CARAMEL CANDY, W/ NUTS, CHOCOLATE-COVERED","Caramel with nuts, chocolate covered" +91703070,"ROLOS CANDY","Rolo" +91703080,"CARAMEL, ALL FLAVORS, SUGAR FREE","Caramel, all flavors, sugar free" +91703150,"TOBLERONE,MILK CHOCOLATE W/ HONEY & ALMOND NOUGAT","Toblerone, milk chocolate with honey and almond nougat" +91703200,"TWIX CARAMEL COOKIE BARS","TWIX Caramel Cookie Bars (formerly TWIX Cookie Bars)" +91703250,"TWIX CHOCOLATE FUDGE COOKIE BARS","TWIX Chocolate Fudge Cookie Bars" +91703300,"TWIX PEANUT BUTTER COOKIE BARS","TWIX Peanut Butter Cookie Bars" +91703400,"WHATCHAMACALLIT CANDY","Whatchamacallit" +91703500,"NUTS, CAROB-COATED","Nuts, carob-coated" +91703600,"ESPRESSO COFFEE BEANS, CHOCOLATE-COVERED","Espresso coffee beans, chocolate-covered" +91705010,"MILK CHOCOLATE CANDY, PLAIN","Milk chocolate candy, plain" +91705020,"MILK CHOCOLATE CANDY, WITH CEREAL","Milk chocolate candy, with cereal" +91705030,"KIT KAT CANDY BAR","Kit Kat" +91705040,"CHOCOLATE, MILK, W/ NUTS, NOT ALMONDS OR PEANUTS","Chocolate, milk, with nuts, not almond or peanuts" +91705050,"MILK CHOCOLATE CANDY, WITH FRUIT AND NUTS","Milk chocolate candy, with fruit and nuts" +91705060,"MILK CHOCOLATE CANDY, WITH ALMONDS","Milk chocolate candy, with almonds" +91705070,"CHOCOLATE, MILK, W/ PEANUTS (INCLUDE MR GOODBAR)","Chocolate, milk, with peanuts" +91705090,"CHOCOLATE CANDY WITH FONDANT AND CARAMEL","Chocolate candy with fondant and caramel" +91705200,"CHOCOLATE, SEMI-SWEET","Chocolate, semi-sweet morsel" +91705300,"CHOCOLATE CANDY, SWEET OR DARK","Chocolate, sweet or dark" +91705310,"CHOCOLATE, SWEET OR DARK, WITH ALMONDS","Chocolate, sweet or dark, with almonds" +91705400,"CHOCOLATE CANDY, WHITE","Chocolate, white" +91705410,"CHOCOLATE CANDY, WHITE, W/ ALMONDS","Chocolate, white, with almonds" +91705420,"CHOCOLATE, WHITE, W/ CEREAL, CANDY","Chocolate, white, with cereal" +91705430,"KIT KAT WHITE","Kit Kat White" +91705500,"MEXICAN CHOCOLATE (TABLET)","Mexican chocolate (tablet)" +91706000,"COCONUT CANDY, CHOCOLATE-COVERED","Coconut candy, chocolate covered" +91706100,"COCONUT CANDY, NO CHOCOLATE COVERING","Coconut candy, no chocolate covering" +91706400,"COCONUT CANDY, P.R. STYLE","Coconut candy, Puerto Rican style" +91707000,"FONDANT CANDY","Fondant" +91707010,"FONDANT CANDY, CHOCOLATE COVERED","Fondant, chocolate covered" +91708000,"FRUIT PEEL, CANDIED","Fruit peel, candied" +91708010,"FRUIT CANDY BAR","Date candy" +91708020,"SOFT FRUIT CONFECTION","Soft fruit confections" +91708030,"FRUIT LEATHER / FRUIT SNACKS CANDY","Fruit leather and fruit snacks candy" +91708040,"FUN FRUITS CREME SUPREMES CANDY","Fun Fruits Creme Supremes" +91708070,"TAMARIND CANDY","Tamarind candy" +91708100,"FRUIT SNACKS CANDY W/ HI VIT C","Fruit snacks candy, with high vitamin C" +91708150,"YOGURT COVERED FRUIT SNACKS CANDY, W/ ADDED VITAMIN C","Yogurt covered fruit snacks candy, with added vitamin C" +91708160,"YOGURT COVERED FRUIT SNACKS CANDY ROLLS, W/ HIGH VITAMIN C","Yogurt covered fruit snacks candy rolls, with high vitamin C" +91709000,"GUMDROPS, CHOCOLATE-COVERED","Gumdrops, chocolate covered" +91713010,"FUDGE, CHOCOLATE, CHOCOLATE-COATED","Fudge, chocolate, chocolate-coated" +91713020,"FUDGE, CHOCOLATE, CHOCOLATE-COATED, W/ NUTS","Fudge, chocolate, chocolate-coated, with nuts" +91713030,"FUDGE, CHOCOLATE","Fudge, chocolate" +91713040,"FUDGE, CHOCOLATE, W/ NUTS","Fudge, chocolate, with nuts" +91713050,"FUDGE, PEANUT BUTTER","Fudge, peanut butter" +91713060,"FUDGE, PEANUT BUTTER, W/ NUTS","Fudge, peanut butter, with nuts" +91713070,"FUDGE, VANILLA","Fudge, vanilla" +91713080,"FUDGE, VANILLA, W/ NUTS","Fudge, vanilla, with nuts" +91713090,"FUDGE, DIVINITY","Fudge, divinity" +91713100,"FUDGE, BROWN SUGAR (PANUCHI)","Fudge, brown sugar (penuche)" +91715000,"FUDGE, CARAMEL AND NUT, CHOCOLATE-COATED CANDY","Fudge, caramel and nut, chocolate-coated candy" +91715100,"SNICKERS CANDY BAR","SNICKERS Bar" +91715200,"BABY RUTH CANDY BAR","Baby Ruth" +91715300,"100 GRAND BAR (INCL $100,000 BAR)","100 GRAND Bar" +91716010,"HALVAH, PLAIN","Halvah, plain" +91716110,"HALVAH, CHOCOLATE-COVERED","Halvah, chocolate covered" +91718000,"HONEY-COMBED HARD CANDY, PEANUT BUTTER","Honey-combed hard candy with peanut butter" +91718050,"HONEY-COMBED CANDY, PEANUT BUTTER, CHOC-COVERED","Honey-combed hard candy with peanut butter, chocolate covered" +91718100,"BUTTERFINGER CANDY BAR","Butterfinger" +91718110,"BUTTERFINGER CRISP","Butterfinger Crisp" +91718200,"JIMMIES (INCLUDE CHOCOLATE-FLAVORED SPRINKLES)","Chocolate-flavored sprinkles" +91718300,"LADOO, ROUND BALL, ASIAN-INDIAN DESSERT","Ladoo, round ball, Asian-Indian dessert" +91721000,"LICORICE CANDY","Licorice" +91723000,"MARSHMALLOW","Marshmallow" +91723010,"MARSHMALLOW, CHOCOLATE-COVERED","Marshmallow, chocolate covered" +91723020,"MARSHMALLOW, CANDY-COATED","Marshmallow, candy-coated" +91723050,"MARSHMALLOW, COCONUT-COATED","Marshmallow, coconut-coated" +91726000,"NOUGAT CANDY, PLAIN","Nougat, plain" +91726110,"NOUGAT CANDY, W/ CARAMEL, CHOCOLATE-COVERED","Nougat, with caramel, chocolate covered" +91726130,"MILKY WAY BAR","MILKY WAY Bar" +91726140,"MILKY WAY MIDNIGHT BAR (FORMERLY MILKY WAY DARK BAR)","MILKY WAY MIDNIGHT Bar (formerly MILKY WAY DARK Bar)" +91726150,"MARS ALMOND BAR (FORMERLY MARS BAR)","MARS Almond Bar (formerly MARS bar)" +91726410,"NOUGAT CANDY, CHOCOLATE-COVERED","Nougat, chocolate covered" +91726420,"3 MUSKETEERS BAR","3 MUSKETEERS Bar" +91726425,"3 MUSKETEERS TRUFFLE CRISP BAR","3 Musketeers Truffle Crisp Bar" +91727010,"NUTS, CHOCOLATE-COVERED, NOT ALMONDS OR PEANUTS","Nuts, chocolate covered, not almonds or peanuts" +91728000,"NUT ROLL, FUDGE OR NOUGAT, CARAMEL & NUTS","Nut roll, fudge or nougat, caramel and nuts" +91728500,"SUGARED PECANS (SUGAR & EGG WHITE COATING)","Sugared pecans (sugar and egg white coating)" +91731000,"PEANUTS, CHOCOLATE-COVERED","Peanuts, chocolate covered" +91731010,"M&M'S PEANUT CANDIES","M&M's Peanut Chocolate Candies" +91731060,"M&M'S PEANUT BUTTER CHOCOLATE CANDIES","M&M's Peanut Butter Chocolate Candies" +91731100,"PEANUTS, SUGAR-COATED","Peanuts, sugar-coated" +91731150,"PEANUTS, YOGURT-COVERED","Peanuts, yogurt covered" +91732000,"PEANUT CANDY BAR","Peanut bar" +91732100,"PLANTERS PEANUT CANDY BAR","Planters Peanut Bar" +91733000,"PEANUT BRITTLE","Peanut brittle" +91733200,"PEANUT BAR, CHOCOLATE COVERED CANDY","Peanut Bar, chocolate covered candy" +91734000,"PEANUT BUTTER CANDY, CHOCOLATE-COVERED","Peanut butter, chocolate covered" +91734100,"REESE'S PEANUT BUTTER CUPS","Reese's Peanut Butter Cup" +91734200,"REESE'S PIECES CANDY","Reese's Pieces" +91734300,"REESE'S STICKS","Reese's Sticks" +91734400,"REESE'S FAST BREAK","Reese's Fast Break" +91734450,"REESE'S CRISPY CRUNCHY BAR","Reese's Crispy Crunchy Bar" +91734500,"PEANUT BUTTER MORSELS CANDY","Peanut butter morsels" +91735000,"PRALINES","Pralines" +91736000,"PINEAPPLE CANDY, P.R. STYLE","Pineapple candy, Puerto Rican style" +91739010,"RAISINS, CHOCOLATE-COVERED","Raisins, chocolate covered" +91739600,"RAISINS, YOGURT-COVERED","Raisins, yogurt covered" +91742010,"SESAME CRUNCH CANDY (SAHADI)","Sesame Crunch (Sahadi)" +91745010,"GUMDROPS","Gumdrops" +91745020,"HARD CANDY","Hard candy" +91745040,"BUTTERSCOTCH HARD CANDY","Butterscotch hard candy" +91745100,"SKITTLES CANDY","Skittles" +91746010,"SUGAR-COATED CHOCOLATE DISCS CANDY","Sugar-coated chocolate discs" +91746100,"M&M'S MILK CHOCOLATE CANDIES","M&M's Milk Chocolate Candies (formerly M&M's Plain Chocolate Candies)" +91746120,"SIXLETS CANDY","Sixlets" +91746150,"EASTER EGG, CANDY-COATED CHOCOLATE","Easter egg, candy coated chocolate" +91746200,"M&M'S PRETZEL CHOCOLATE CANDIES","M&M's Pretzel Chocolate Candies" +91750000,"TAFFY","Taffy" +91760000,"TOFFEE, PLAIN","Toffee, plain" +91760100,"TOFFEE, CHOCOLATE COVERED (INCL HEATH BAR, SKOR)","Toffee, chocolate covered" +91760200,"TOFFEE, CHOCOLATE-COATED, W/ NUTS","Toffee, chocolate-coated, with nuts" +91760500,"TRUFFLES","Truffles" +91760700,"WAX CANDY, LIQUID FILLED","Wax candy, liquid filled" +91770000,"DIETETIC OR LOW CALORIE CANDY, NFS","Dietetic or low calorie candy, NFS" +91770010,"DIETETIC OR LOW CALORIE GUMDROPS","Dietetic or low calorie gumdrops" +91770020,"DIETETIC OR LOW CALORIE HARD CANDY","Dietetic or low calorie hard candy" +91770030,"DIETETIC OR LOW CALORIE CANDY, CHOCOLATE-COVERED","Dietetic or low calorie candy, chocolate covered" +91770050,"MINTS, DIETETIC OR LOW CALORIE","Dietetic or low calorie mints" +91800100,"CHEWING GUM, NFS","Chewing gum, NFS" +91801000,"CHEWING GUM, SUGARED","Chewing gum, sugared" +91802000,"CHEWING GUM, SUGARLESS","Chewing gum, sugarless" +92100000,"COFFEE, NS AS TO TYPE","Coffee, NS as to type" +92100500,"COFFEE, REGULAR, NS GROUND/INSTANT","Coffee, regular, NS as to ground or instant" +92101000,"COFFEE, MADE FROM GROUND, REGULAR","Coffee, made from ground, regular" +92101500,"COFFEE, BREWED, EQUAL PARTS REG & DECAFFEINATED","Coffee, made from ground, equal parts regular and decaffeinated" +92101600,"COFFEE, TURKISH","Coffee, Turkish" +92101610,"COFFEE, ESPRESSO","Coffee, espresso" +92101630,"COFFEE, ESPRESSO, DECAFFEINATED","Coffee, espresso, decaffeinated" +92101640,"COFFEE, MEXICAN, REG, UNSWEETENED (NO MILK)","Coffee, Mexican, regular, unsweetened (no milk; not cafe con leche)" +92101650,"COFFEE, MEXICAN, REG, SWEETENED (NO MILK)","Coffee, Mexican, regular, sweetened (no milk; not cafe con leche)" +92101660,"COFFEE, MEXICAN, DECAF, UNSWEETENED (NO MILK)","Coffee, Mexican, decaffeinated, unsweetened (no milk; not cafe con leche)" +92101670,"COFFEE, MEXICAN, DECAF, SWEETENED (NO MILK)","Coffee, Mexican, decaffeinated, sweetened (no milk; not cafe con leche)" +92101700,"COFFEE, MADE FROM GROUND, REGULAR, FLAVORED","Coffee, made from ground, regular, flavored" +92101800,"COFFEE, CUBAN","Coffee, Cuban" +92101900,"COFFEE, LATTE","Coffee, Latte" +92101910,"COFFEE, LATTE, DECAFFEINATED","Coffee, Latte, decaffeinated" +92101920,"BLENDED COFFEE BEVERAGE, REGULAR, SWEETENED","Blended coffee beverage, made with regular coffee, milk, and ice, sweetened" +92101925,"BLENDED COFFEE BEVERAGE, REG, SWTND, W/ WHP CRM","Blended coffee beverage, made with regular coffee, milk, and ice, sweetened, with whipped cream" +92101930,"BLENDED COFFEE BEVERAGE, DECAF, SWEETENED","Blended coffee beverage, made with decaffeinated coffee, milk, and ice, sweetened" +92101935,"BLENDED COFFEE BEVERAGE, DECAF, SWTND, W/ WHP CRM","Blended coffee beverage, made with decaffeinated coffee, milk, and ice, sweetened, with whipped cream" +92101950,"COFFEE, MOCHA","Coffee, mocha" +92101960,"COFFEE, MOCHA, MADE W/ SOY MILK","Coffee, mocha, made with soy milk" +92103000,"COFFEE, MADE FROM POWDERED INSTANT, REGULAR","Coffee, made from powdered instant, regular" +92104000,"COFFEE, FROM POWDER, 50% LESS CAFFEINE","Coffee, made from powdered instant, 50% less caffeine" +92105000,"COFFEE, LIQUID CONCENTRATE, NOT RECONSTITUTED","Coffee, liquid concentrate" +92105010,"COFFEE, MADE FROM LIQUID CONCENTRATE","Coffee, made from liquid concentrate" +92106000,"COFFEE, ACID NEUTRALIZED, FROM POWDERED INSTANT","Coffee, acid neutralized, from powdered instant" +92111000,"COFFEE, DECAFFEINATED, NS AS TO GROUND OR INSTANT","Coffee, decaffeinated, NS as to ground or instant" +92111010,"COFFEE, DECAFFEINATED, MADE FROM GROUND","Coffee, decaffeinated, made from ground" +92114000,"COFFEE, DECAFFEINATED, MADE FROM POWDERED INSTANT","Coffee, decaffeinated, made from powdered instant" +92121000,"COFFEE, FROM POWDERED MIX,W/WHITENER&SUGAR, INSTANT","Coffee, made from powdered instant mix, with whitener and sugar, instant" +92121010,"COFFEE, FROM POWDER, PRESWEETENED, NO WHITENER","Coffee, made from powdered instant mix, presweetened, no whitener" +92121020,"COFFEE & COCOA (MOCHA), W/ WHITENER, PRESWEETENED","Coffee and cocoa (mocha), made from powdered instant mix, with whitener, presweetened" +92121030,"COFFEE & COCOA, FROM MIX, W/WHITENER, LOW CAL SWEET","Coffee and cocoa (mocha), made from powdered instant mix, with whitener and low calorie sweetener" +92121040,"COFFEE, FROM POWDER, W/ WHITENER & LO CAL SWEETENER","Coffee, made from powdered instant mix, with whitener and low calorie sweetener" +92121050,"COFFEE&COCOA,FROM PWDR,W/WHITE&LOW CAL SWEET,DECAF","Coffee and cocoa (mocha), made from powdered instant mix, with whitener and low calorie sweetener, decaffeinated" +92130000,"COFFEE, REG, PRESWEETENED W/SUGAR, PRE-LIGHTENED","Coffee, regular, presweetened with sugar, pre-lightened" +92130001,"COFFEE, DECAFFEINATED, PRESWEETENED W/ SUGAR, PRE-LIGHTENED","Coffee, decaffeinated, presweetened with sugar, pre-lightened" +92130005,"COFFEE, REGULAR, WITH LOW CALORIE SWEETENER, PRE-LIGHTENED","Coffee, regular, with low-calorie sweetener, pre-lightened" +92130006,"COFFEE, DECAFFEINATED,W/ LOW CALORIE SWEETENER,PRE-LIGHTENED","Coffee, decaffeinated, with low-calorie sweetener, pre-lightened" +92130010,"COFFEE, PRE-LIGHTENED, NO SUGAR","Coffee, pre-lightened, no sugar" +92130020,"COFFEE, PRESWEETENED W/ SUGAR","Coffee, presweetened with sugar" +92150000,"COFFEE & CHICORY, NS AS TO GROUND OR INSTANT","Coffee and chicory, NS as to ground or instant" +92151000,"COFFEE & CHICORY, MADE FROM POWDERED INSTANT","Coffee and chicory, made from powdered instant" +92151100,"COFFEE, DECAFFEINATED, AND CHICORY, FROM INSTANT","Coffee, decaffeinated, and chicory, made from powdered instant" +92152000,"COFFEE & CHICORY, MADE FROM GROUND","Coffee and chicory, made from ground" +92153000,"COFFEE, REGULAR, W/ CEREAL (INCLUDE W/ BARLEY)","Coffee, regular, with cereal" +92153100,"COFFEE, DECAFFEINATED, W/ CEREAL (INCLUDE W/BARLEY)","Coffee, decaffeinated, with cereal" +92161000,"CAPPUCCINO","Cappuccino" +92161005,"CAPPUCCINO, SWEETENED","Cappuccino, sweetened" +92162000,"CAPPUCCINO, DECAFFEINATED","Cappuccino, decaffeinated" +92162005,"CAPPUCCINO, DECAFFEINATED, SWEETENED","Cappuccino, decaffeinated, sweetened" +92191000,"COFFEE, DRY POWDER, NS AS TO REG OR DECAF","Coffee, dry instant powder, NS as to regular or decaffeinated" +92191100,"COFFEE, DRY POWDER, REGULAR","Coffee, dry instant powder, regular" +92191200,"COFFEE, DRY POWDER, DECAFFEINATED","Coffee, dry instant powder, decaffeinated" +92191250,"COFFEE, DRY, ACID NEUTRALIZED (INCLUDE KAVA)","Coffee, dry, acid neutralized" +92191500,"COFFEE & CHICORY, DRY POWDER","Coffee and chicory, dry instant powder" +92191520,"COFFEE, DECAFFEINATED, AND CHICORY, DRY POWDER","Coffee, decaffeinated, and chicory, dry instant powder" +92192000,"COFFEE & COCOA (MOCHA) MIX,W/WHITENER,PRESWEET, DRY","Coffee and cocoa (mocha) mix, dry instant powder with whitener, presweetened" +92192030,"COFFEE & COCOA (MOCHA) MIX,W/WHITENER, LOW CAL, DRY","Coffee and cocoa (mocha) mix, dry instant powder with whitener and low calorie sweetener" +92192040,"COFFEE&COCOA MIX,DRY,W/WHITENER&LOW CAL SWEET,DECAF","Coffee and cocoa (mocha) mix, dry instant powder, with whitener and low calorie sweetener, decaffeinated" +92193000,"COFFEE, DRY MIX, W/ WHITENER & SUGAR","Coffee, dry instant powder, with whitener and sugar" +92193020,"COFFEE, DRY MIX, W/ WHITENER & LOW CAL SWEETENER","Coffee, dry instant powder, with whitener and low calorie sweetener" +92201010,"POSTUM (COFFEE SUBSTITUTE)","Postum" +92202010,"CHICORY (COFFEE SUBSTITUTE)","Chicory" +92203000,"CEREAL, BEVERAGE (INCLUDE PERO, BREAK AWAY)","Cereal beverage" +92203110,"CEREAL BEVERAGE, W/BEET ROOTS,FROM POWDERED INSTANT","Cereal beverage with beet roots, from powdered instant" +92204000,"MATE, SWEETENED BEVERAGE FROM DRIED GREEN LEAVES","Mate, sweetened beverage made from dried green leaves" +92205000,"RICE BEVERAGE (INCL RICE TEA)","Rice beverage" +92291300,"POSTUM, DRY POWDER","Postum, dry powder" +92301000,"TEA, NS AS TO TYPE, UNSWEETENED","Tea, NS as to type, unsweetened" +92301060,"TEA, NS AS TO TYPE, PRESWEETENED W/ SUGAR","Tea, NS as to type, presweetened with sugar" +92301080,"TEA, PRESWEETENED W/ LOW CALORIE SWEETENER","Tea, NS as to type, presweetened with low calorie sweetener" +92301100,"TEA, NS AS TO TYPE, DECAFFEINATED, UNSWEETENED","Tea, NS as to type, decaffeinated, unsweetened" +92301130,"TEA, NS AS TO TYPE, PRESWEETENED, NS AS TO SWEETNER","Tea, NS as to type, presweetened, NS as to sweetener" +92301160,"TEA, DECAFFEINATED, W/ SUGAR, NFS","Tea, NS as to type, decaffeinated, presweetened with sugar" +92301180,"TEA, DECAFFEINATED, LOW CALORIE SWEETENER, NFS","Tea, NS as to type, decaffeinated, presweetened with low calorie sweetener" +92301190,"TEA, PRESWEETENED, NS SWEETENER, DECAFFEINATED","Tea, NS as to type, decaffeinated, presweetened, NS as to sweetener" +92302000,"TEA, LEAF, UNSWEETENED","Tea, leaf, unsweetened" +92302200,"TEA, LEAF, PRESWEETENED W/ SUGAR","Tea, leaf, presweetened with sugar" +92302300,"TEA, LEAF, PRESWEETENED W/ LOW CALORIE SWEETENER","Tea, leaf, presweetened with low calorie sweetener" +92302400,"TEA, LEAF, PRESWEETENED, NS AS TO SWEETENER","Tea, leaf, presweetened, NS as to sweetener" +92302500,"TEA, DECAFFEINATED, UNSWEETENED","Tea, leaf, decaffeinated, unsweetened" +92302600,"TEA, LEAF, DECAFFEINATED, PRESWEETENED W/ SUGAR","Tea, leaf, decaffeinated, presweetened with sugar" +92302700,"TEA, LEAF, DECAFFEINATED, LOW CALORIE SWEETENER","Tea, leaf, decaffeinated, presweetened with low calorie sweetener" +92302800,"TEA, LEAF, DECAFFEINATED, PRESWEETENED, NFS","Tea, leaf, decaffeinated, presweetened, NS as to sweetener" +92304000,"TEA, MADE FROM FROZEN CONCENTRATE, UNSWEETENED","Tea, made from frozen concentrate, unsweetened" +92304700,"TEA, FROM FROZ CONC, DECAF, PRESWEETND, LOW CALORIE","Tea, made from frozen concentrate, decaffeinated, presweetened with low calorie sweetener" +92305000,"TEA, MADE FROM POWDERED INSTANT, PRESWEETENED","Tea, made from powdered instant, presweetened, NS as to sweetener" +92305010,"TEA, MADE FROM POWDERED INSTANT, UNSWEETENED","Tea, made from powdered instant, unsweetened" +92305040,"TEA, MADE FROM POWDERED INSTANT,PRESWEETEND W/SUGAR","Tea, made from powdered instant, presweetened with sugar" +92305050,"TEA, FROM POWDER, DECAFFEINATED, PRESWEET W/ SUGAR","Tea, made from powdered instant, decaffeinated, presweetened with sugar" +92305090,"TEA, MADE FROM POWDERED INSTANT,W/LO CAL SWEETENER","Tea, made from powdered instant, presweetened with low calorie sweetener" +92305110,"TEA, FROM INSTANT, DECAF, PRESWEETENED, LOW CALORIE","Tea, made from powdered instant, decaffeinated, presweetened with low calorie sweetener" +92305180,"TEA ,MADE FROM POWDERED INSTANT, DECAF ,UNSWEET","Tea, made from powdered instant, decaffeinated, unsweetened" +92305800,"TEA, FROM POWDER, DECAFFEINATED, PRESWEETENED","Tea, made from powdered instant, decaffeinated, presweetened, NS as to sweetener" +92306000,"TEA, HERBAL (INCLUDE SASSAFRAS,LICORICE)","Tea, herbal" +92306020,"TEA, HERBAL, PRESWEETENED W/ SUGAR","Tea, herbal, presweetened with sugar" +92306030,"TEA, HERBAL, PRESWEETENED W/ LOW CAL SWEETENER","Tea, herbal, presweetened with low calorie sweetener" +92306040,"TEA, HERBAL, PRESWEETENED, NS AS TO SWEETENER","Tea, herbal, presweetened, NS as to sweetener" +92306050,"TEA, MADE FROM CARAWAY SEEDS","Tea, made from caraway seeds" +92306090,"TEA, HIBISCUS","Tea, hibiscus" +92306100,"CORN BEVERAGE(INCLUDE CORN TEA)","Corn beverage" +92306200,"BEAN BEVERAGE (INCLUDE BEAN TEA)","Bean beverage" +92306610,"TEA, RUSSIAN","Tea, Russian" +92306700,"TEA, CHAMOMILE","Tea, chamomile" +92307000,"TEA, POWDERED INSTANT, UNSWEETENED, DRY","Tea, powdered instant, unsweetened, dry" +92307400,"TEA, POWDERED INSTANT, SWEETENED, NS SWEETENER, DRY","Tea, powdered instant, sweetened, NS as to sweetener, dry" +92307500,"HALF AND HALF BEVERAGE, HALF ICED TEA/HALF LEMONADE","Half and Half beverage, half iced tea and half fruit juice drink (lemonade)" +92307510,"HALF&HALF BEV, HALF ICED TEA/HALF LEMONADE,LOW CAL","Half and Half beverage, half iced tea and half fruit juice drink (lemonade), low calorie" +92400000,"SOFT DRINK, NFS","Soft drink, NFS" +92400100,"SOFT DRINK, NFS, SUGAR-FREE","Soft drink, NFS, sugar-free" +92410110,"CARBONATED WATER,SWEETEND(INCL TONIC,QUININE WATER)","Carbonated water, sweetened" +92410210,"CARBONATED WATER, UNSWEETENED (INCL CLUB SODA)","Carbonated water, unsweetened" +92410250,"CARBONATED WATER, SWEETENED, WITH LOW-CALORIE OR NO-CALORIE","Carbonated water, sweetened, with low-calorie or no-calorie sweetener" +92410310,"SOFT DRINK, COLA-TYPE","Soft drink, cola-type" +92410315,"SOFT DRINK, COLA TYPE, REDUCED SUGAR","Soft drink, cola type, reduced sugar" +92410320,"SOFT DRINK, COLA-TYPE, SUGAR-FREE","Soft drink, cola-type, sugar-free" +92410330,"SOFT DRINK, COLA-TYPE, W/ HIGHER CAFFEINE (INCL JOLT)","Soft drink, cola-type, with higher caffeine" +92410340,"SOFT DRINK, COLA-TYPE, DECAFFEINATED","Soft drink, cola-type, decaffeinated" +92410350,"SOFT DRINK, COLA-TYPE, DECAFFEINATED, SUGAR-FREE","Soft drink, cola-type, decaffeinated, sugar-free" +92410360,"SOFT DRINK, PEPPER-TYPE (INCL DR. PEPPER, MR. PIBB)","Soft drink, pepper-type" +92410370,"SOFT DRINK, PEPPER-TYPE, SUGAR-FREE","Soft drink, pepper-type, sugar-free" +92410390,"SOFT DRINK, PEPPER-TYPE, DECAFFEINATED","Soft drink, pepper-type, decaffeinated" +92410400,"SOFT DRINK, PEPPER-TYPE, DECAFFEINATED, SUGAR-FREE","Soft drink, pepper-type, decaffeinated, sugar-free" +92410410,"CREAM SODA","Cream soda" +92410420,"CREAM SODA, SUGAR-FREE","Cream soda, sugar-free" +92410510,"SOFT DRINK, FRUIT-FLAVORED, CAFFEINE FREE","Soft drink, fruit-flavored, caffeine free" +92410520,"SOFT DRINK, FRUIT-FLAV, SUGAR-FREE, CAFFEINE FREE","Soft drink, fruit-flavored, sugar free, caffeine free" +92410550,"SOFT DRINK, FRUIT-FLAVORED, W/ CAFFEINE","Soft drink, fruit flavored, caffeine containing" +92410560,"SOFT DRINK, FRUIT-FLAVORED, W/ CAFFEINE, SUGAR-FREE","Soft drink, fruit flavored, caffeine containing, sugar-free" +92410610,"GINGER ALE","Ginger ale" +92410620,"GINGERALE, SUGAR-FREE","Ginger ale, sugar-free" +92410710,"ROOT BEER","Root beer" +92410720,"ROOT BEER, SUGAR-FREE","Root beer, sugar-free" +92410810,"CHOCOLATE-FLAVORED SODA","Chocolate-flavored soda" +92410820,"CHOCOLATE-FLAVORED SODA, SUGAR-FREE","Chocolate-flavored soda, sugar-free" +92411510,"COLA W/ FRUIT OR VANILLA FLAVOR","Cola with fruit or vanilla flavor" +92411520,"COLA W/ CHOCOLATE FLAVOR","Cola with chocolate flavor" +92411610,"COLA W/ FRUIT OR VANILLA FLAVOR, SUGAR-FREE","Cola with fruit or vanilla flavor, sugar-free" +92411620,"COLA W/ CHOC FLAVOR, SUGAR FREE","Cola with chocolate flavor, sugar-free" +92417010,"SOFT DRINK, ALE TYPE (INCLUDE ALE-8)","Soft drink, ale type" +92431000,"CARBONATED JUICE DRINK, NS AS TO TYPE OF JUICE","Carbonated juice drink, NS as to type of juice" +92432000,"CARBONATED CITRUS JUICE DRINK","Carbonated citrus juice drink" +92433000,"CARBONATED NONCITRUS JUICE DRINK","Carbonated noncitrus juice drink" +92510610,"FRUIT JUICE DRINK","Fruit juice drink" +92510650,"TAMARIND DRINK, P.R. (REFRESCO DE TAMARINDO)","Tamarind drink, Puerto Rican (Refresco de tamarindo)" +92510720,"FRUIT PUNCH, MADE W/ FRUIT JUICE & SODA","Fruit punch, made with fruit juice and soda" +92510730,"FRUIT PUNCH, MADE W/ SODA, FRUIT JUICE & SHERBET","Fruit punch, made with soda, fruit juice, and sherbet or ice cream" +92511000,"LEMONADE, FROZEN CONCENTRATE, NOT RECONSTITUTED","Lemonade, frozen concentrate, not reconstituted" +92511010,"FRUIT FLAVORED DRINK (FORMERLY LEMONADE)","Fruit flavored drink (formerly lemonade)" +92511250,"CITRUS FRUIT JUICE DRINK, CONTAINING 40-50% JUICE","Citrus fruit juice drink, containing 40-50% juice" +92512040,"FROZEN DAIQUIRI MIX, CONCENTRATE, NOT RECONSTITUTED","Frozen daiquiri mix, frozen concentrate, not reconstituted" +92512050,"FROZEN DAIQUIRI MIX, FROM FROZ CONC, RECONSTITUTED","Frozen daiquiri mix, from frozen concentrate, reconstituted" +92512090,"PINA COLADA, NONALCOHOLIC","Pina Colada, nonalcoholic" +92512110,"MARGARITA MIX, NONALCOHOLIC","Margarita mix, nonalcoholic" +92513000,"FRUIT FLAVORED FROZEN DRINK","Fruit flavored frozen drink" +92530410,"FRUIT FLAVORED DRINK, WITH HIGH VITAMIN C","Fruit flavored drink, with high vitamin C" +92530510,"CRANBERRY JUICE DRINK OR COCKTAIL, W/ HIGH VIT C","Cranberry juice drink or cocktail, with high vitamin C" +92530610,"FRUIT JUICE DRINK, WITH HIGH VITAMIN C","Fruit juice drink, with high vitamin C" +92530950,"VEGETABLE & FRUIT JUICE DRINK, W/ HI VIT C","Vegetable and fruit juice drink, with high vitamin C" +92531030,"FRUIT JUICE DRINK, W/ VIT B1) & HI VIT C","Fruit juice drink, with thiamin (vitamin B1) and high vitamin C" +92541010,"FRUIT FLAVORED DRINK, MADE FROM POWDERED MIX","Fruit flavored drink, made from powdered mix" +92542000,"FRUIT FLAVORED DRINK, MADE FROM POWDERED MIX, W/ HI VIT C","Fruit flavored drink, made from powdered mix,with high vitamin C" +92550030,"FRUIT JUICE DRINK, LOW CALORIE, W/ HIGH VITAMIN C","Fruit juice drink, low calorie, with high vitamin C" +92550040,"FRUIT JUICE DRINK, LOW CALORIE","Fruit juice drink, low calorie" +92550110,"CRANBERRY JUICE DRINK OR COCKTAIL, LOW CAL, W/ HIGH VIT C","Cranberry juice drink or cocktail, low calorie, with high vitamin C" +92550350,"LIGHT ORANGE JC BEVERAGE, 40-50% JC, LOWER SUGAR & CALORIES","Light orange juice beverage, 40-50% juice, lower sugar and calories, with artificial sweetener" +92550400,"VEGETABLE & FRUIT JUICE DRINK, LOW CAL, W/ HIGH VIT C","Vegetable and fruit juice drink, low calorie, with high vitamin C" +92550405,"VEGETABLE & FRUIT JUICE DRINK, LOW CAL, W/ HIGH VIT C,+E,A","Vegetable and fruit juice drink, low calorie, with high vitamin C plus added vitamin E and vitamin A" +92550610,"FRUIT FLAVORED DRINK, LOW CAL, W/ HIGH VIT C","Fruit flavored drink, low calorie, with high vitamin C" +92550620,"FRUIT FLAVORED DRINK, LOW CALORIE","Fruit flavored drink, low calorie" +92552000,"FRUIT FLAV DRINK, MADE FROM PWDR, LOW CAL, W/ HI VIT C","Fruit flavored drink, made from powdered mix, low calorie, with high vitamin C" +92552010,"FRUIT FLAVORED DRINK, MADE FROM PWDR, LOW CALORIE","Fruit flavored drink, made from powdered mix, low calorie" +92552020,"FRUIT JUICE DRINK, REDUCED SUGAR, W/ VIT B1 & HI VIT C","Fruit juice drink, reduced sugar, with thiamin (vitamin B1) and high vitamin C" +92552030,"FRUIT JUICE DRINK, REDUCED SUGAR, WITH VITAMIN E","Fruit juice drink, reduced sugar, with vitamin E" +92582100,"FRUIT JUICE DRINK, WITH HIGH VITAMIN C, PLUS ADDED CALCIUM","Fruit juice drink, with high vitamin C, plus added calcium" +92582110,"FRUIT JUICE DRINK, W/ VIT B1, HI VIT C + CALCIUM","Fruit juice drink, with thiamin (vitamin B1) and high vitamin C plus calcium" +92610010,"HORCHATA BEVERAGE, MADE W/ ALMONDS","Horchata beverage, made with almonds or other nuts and seeds" +92610110,"COCONUT BEVERAGE, P.R.","Coconut beverage, Puerto Rican" +92611010,"OATMEAL BEVERAGE, P.R.","Oatmeal beverage, Puerto Rican" +92611100,"OATMEAL BEVERAGE W/ MILK","Oatmeal beverage with milk (Atole de avena)" +92611510,"HORCHATA BEVERAGE, MADE W/ RICE","Horchata beverage, made with rice" +92611600,"HORCHATA BEVERAGE, NFS","Horchata beverage, NFS" +92612010,"SUGAR CANE BEVERAGE, P.R.","Sugar cane beverage, Puerto Rican" +92613010,"ATOLE (CORNMEAL BEVERAGE)","Atole (corn meal beverage)" +92613510,"CORN BEV W/ CHOC & MILK(CHAMPURRADO,ATOLE DE CHOC)","Corn beverage with chocolate and milk (Champurrado, Atole de Chocolate)" +92801000,"NONALCOHOLIC WINE","Wine, nonalcoholic" +92802000,"WINE, LIGHT, NONALCOHOLIC","Wine, light, nonalcoholic" +92803000,"NONALCOHOLIC MALT BEVERAGE","Nonalcoholic malt beverage" +92804000,"SHIRLEY TEMPLE","Shirley Temple" +92900100,"TANG, DRY CONCENTRATE","Tang, dry concentrate" +92900110,"FRUIT-FLAV BEVERAGE, DRY CONC, W/ SUGAR, NOT RECONSTITUTED","Fruit-flavored beverage, dry concentrate, with sugar, not reconstituted" +92900200,"FRUIT-FLAV BEV, DRY CONC,LO CAL(INCL CRYSTAL LIGHT)","Fruit-flavored beverage, dry concentrate, low calorie, not reconstituted" +92900300,"FRUIT-FLAV THIRST QUENCH BEV, DRY CONC (GATORADE)","Fruit-flavored thirst quencher beverage, dry concentrate, not reconstituted" +93101000,"BEER","Beer" +93102000,"BEER, LITE","Beer, lite" +93106000,"ALCOHOLIC MALT BEVERAGE, SWEETENED","Alcoholic malt beverage, sweetened" +93201000,"CORDIAL OR LIQUEUR","Cordial or liqueur" +93301000,"COCKTAIL, NFS","Cocktail, NFS" +93301010,"ALEXANDER","Alexander" +93301020,"BACARDI COCKTAIL","Bacardi cocktail" +93301030,"BLOODY MARY","Bloody Mary" +93301031,"CANADIAN CLUB & SODA","Canadian Club and soda" +93301032,"CAPE COD","Cape Cod" +93301040,"DAIQUIRI","Daiquiri" +93301050,"GIMLET","Gimlet" +93301060,"GIN & TONIC","Gin and Tonic" +93301070,"GRASSHOPPER","Grasshopper" +93301080,"HIGH BALL","High ball" +93301085,"KAMIKAZE","Kamikaze" +93301090,"MANHATTAN","Manhattan" +93301100,"MARGARITA","Margarita" +93301110,"MARTINI","Martini" +93301115,"MIMOSA","Mimosa" +93301120,"MINT JULEP","Mint julep" +93301125,"MOJITO","Mojito" +93301130,"OLD FASHIONED","Old fashioned" +93301135,"ROB ROY","Rob Roy" +93301136,"RUSTY NAIL","Rusty Nail" +93301139,"SALTY DOG","Salty Dog" +93301140,"SCREWDRIVER (INCLUDE HARVEY WALLBANGER, SLO-SCREW)","Screwdriver" +93301141,"SEABREEZE","Seabreeze" +93301142,"SEVEN AND SEVEN","Seven and Seven" +93301150,"TOM COLLINS (INCLUDE VODKA COLLINS)","Tom Collins" +93301160,"WHISKEY SOUR(INCL SCOTCH,VODKA,APRICOT,BRANDY SOUR)","Whiskey sour" +93301170,"BOURBON & SODA (INCLUDE SCOTCH & SODA, RUM & SODA)","Bourbon and soda" +93301180,"MIXED DRINKS (FOR RECIPE MODIFICATIONS)","Mixed Drinks (for recipe modifications)" +93301190,"RUM & COLA","Rum and cola" +93301200,"PINA COLADA","Pina Colada" +93301220,"COQUITO, P.R. (COCONUT, RUM)","Coquito, Puerto Rican (coconut, rum)" +93301230,"SLOE GIN FIZZ","Sloe gin fizz" +93301240,"BLACK RUSSIAN","Black Russian" +93301250,"WHITE RUSSIAN","White Russian" +93301270,"FRUIT PUNCH, ALCOHOLIC","Fruit punch, alcoholic" +93301280,"SINGAPORE SLING","Singapore Sling" +93301290,"STINGER","Stinger" +93301300,"GIBSON","Gibson" +93301310,"MAI TAI","Mai Tai" +93301320,"TEQUILA SUNRISE","Tequila Sunrise" +93301330,"GIN RICKEY","Gin Rickey" +93301340,"GOLDEN CADILLAC","Golden Cadillac" +93301360,"LONG ISLAND ICED TEA","Long Island iced tea" +93301370,"FUZZY NAVEL COCKTAIL","Fuzzy Navel" +93301400,"IRISH COFFEE (INCL COFFEE ROYALE)","Irish Coffee" +93301450,"LIQUEUR W/ CREAM","Liqueur with cream" +93301500,"FROZEN DAIQUIRI","Frozen daiquiri" +93301510,"FROZEN MARGARITA","Frozen margarita" +93301550,"EGGNOG, ALCOHOLIC","Eggnog, alcoholic" +93301600,"GIN FIZZ","Gin fizz" +93302000,"RUM, HOT BUTTERED","Rum, hot buttered" +93302100,"ZOMBIE","Zombie" +93401010,"WINE, TABLE, RED","Wine, table, red" +93401020,"WINE, TABLE, WHITE","Wine, table, white" +93401100,"WINE, RICE (INCLUDE SAKI)","Wine, rice" +93401300,"WINE, COOKING (ASSUME COOKED)","Wine, cooking (assume cooked)" +93402000,"WINE, DESSERT (INCLUDE MARSALA, PORT, MADEIRA)","Wine, dessert, sweet" +93403000,"WINE, LIGHT","Wine, light" +93404000,"WINE COOLER","Wine cooler" +93404500,"SANGRIA","Sangria" +93404600,"SANGRIA, PUERTO RICAN STYLE","Sangria, Puerto Rican style" +93405000,"WINE SPRITZER","Wine spritzer" +93406000,"GLUG (INCLUDE GLOGG, GLUHWEIN)","Glug" +93501000,"BRANDY","Brandy" +93502000,"WHISKEY","Whiskey" +93503000,"GIN","Gin" +93504000,"RUM","Rum" +93504100,"RUM COOLER","Rum cooler" +93505000,"VODKA","Vodka" +94000100,"WATER, TAP","Water, tap" +94100100,"WATER, BOTTLED, UNSWEETENED","Water, bottled, unsweetened" +94100200,"WATER, BOTTLED, SWEETENED, WITH LOW OR NO CALORIE SWEETENER","Water, bottled, sweetened, with low or no calorie sweetener" +94100300,"WATER, FRUIT FLAVORED, SWTND, W/ CORN SYRUP & LOWCAL SWTNR","Water, fruit flavored, sweetened, with high fructose corn syrup and low calorie sweetener" +94210100,"PROPEL WATER","Propel Water" +94210200,"GLACEAU WATER","Glaceau Water" +94210300,"SOBE LIFEWATER","SoBe Lifewater" +94220200,"GLACEAU WATER, LOW CALORIE","Glaceau Water, low calorie" +94300100,"WATER, BABY, BOTTLED, UNSWEETENED","Water, baby, bottled, unsweetened" +95101000,"BOOST, NUTRITIONAL DRINK, READY-TO-DRINK","Boost, nutritional drink, ready-to-drink" +95101010,"BOOST PLUS, NUTRITIONAL DRINK, READY-TO-DRINK","Boost Plus, nutritional drink, ready-to-drink" +95102000,"CARNATION INSTANT BREAKFAST, NUTRITIONAL DRINK, REGULAR, RTD","Carnation Instant Breakfast, nutritional drink, regular, ready-to-drink" +95102010,"CARNATION INSTANT BREAKFAST, NUTRITIONAL DRINK, SUGAR FREE,","Carnation Instant Breakfast, nutritional drink, sugar free, ready-to-drink" +95103000,"ENSURE, NUTRITIONAL SHAKE, READY-TO-DRINK","Ensure, nutritional shake, ready-to-drink" +95103010,"ENSURE PLUS, NUTRITIONAL SHAKE, READY-TO-DRINK","Ensure Plus, nutritional shake, ready-to-drink" +95104000,"GLUCERNA, NUTRITIONAL SHAKE, READY-TO-DRINK","Glucerna, nutritional shake, ready-to-drink" +95105000,"KELLOGG'S SPECIAL K PROTEIN SHAKE","Kellogg's Special K Protein Shake" +95106000,"MUSCLE MILK, READY-TO-DRINK","Muscle Milk, ready-to-drink" +95106010,"MUSCLE MILK, LIGHT, READY-TO-DRINK","Muscle Milk, light, ready-to-drink" +95110000,"SLIM FAST SHAKE, MEAL REPLACEMENT, REGULAR, READY-TO-DRINK","Slim Fast Shake, meal replacement, regular, ready-to-drink" +95110010,"SLIM FAST SHAKE, MEAL REPLACEMENT, SUGAR FREE, RTD","Slim Fast Shake, meal replacement, sugar free, ready-to-drink" +95110020,"SLIM FAST SHAKE, MEAL REPLACEMENT, HIGH PROTEIN, RTD","Slim Fast Shake, meal replacement, high protein, ready-to-drink" +95120000,"NUTRITIONAL DRINK OR MEAL REPLACEMENT, READY-TO-DRINK, NFS","Nutritional drink or meal replacement, ready-to-drink, NFS" +95120010,"NUTRITIONAL DRINK OR MEAL REPLACEMENT, HIGH PROTEIN, RTD","Nutritional drink or meal replacement, high protein, ready-to-drink, NFS" +95120020,"NUTRITIONAL DRINK OR MEAL REPLACEMENT, HI PROT, LIGHT, RTD","Nutritional drink or meal replacement, high protein, light, ready-to-drink, NFS" +95120050,"NUTRITIONAL DRINK OR MEAL REPLACEMENT, LIQUID, SOY-BASED","Nutritional drink or meal replacement, liquid, soy-based" +95201000,"CARNATION INSTANT BREAKFAST, NUTRITIONAL DRINK MIX, REG,PDR","Carnation Instant Breakfast, nutritional drink mix, regular, powder" +95201010,"CARNATION INSTANT BREAKFAST, NUTR DRINK MIX, SUGAR FREE,PDR","Carnation Instant Breakfast, nutritional drink mix, sugar free, powder" +95201200,"EAS WHEY PROTEIN POWDER","EAS Whey Protein Powder" +95201300,"EAS SOY PROTEIN POWDER","EAS Soy Protein Powder" +95201500,"HERBALIFE, NUTRITIONAL SHAKE MIX, HIGH PROTEIN, POWDER","Herbalife, nutritional shake mix, high protein, powder" +95201600,"ISOPURE PROTEIN POWDER","Isopure protein powder" +95201700,"KELLOGG'S SPECIAL K20 PROTEIN WATER MIX","Kellogg's Special K20 Protein Water Mix" +95202000,"MUSCLE MILK, REGULAR, POWDER","Muscle Milk, regular, powder" +95202010,"MUSCLE MILK, LIGHT, POWDER","Muscle Milk, light, powder" +95210000,"SLIM FAST SHAKE MIX, POWDER","Slim Fast Shake Mix, powder" +95210010,"SLIM FAST SHAKE MIX, SUGAR FREE, POWDER","Slim Fast Shake Mix, sugar free, powder" +95210020,"SLIM FAST SHAKE MIX, HIGH PROTEIN, POWDER","Slim Fast Shake Mix, high protein, powder" +95220000,"NUTRITIONAL DRINK MIX OR MEAL REPLACEMENT, POWDER, NFS","Nutritional drink mix or meal replacement, powder, NFS" +95220010,"NUTRITIONAL DRINK MIX OR MEAL REPLACEMENT, HIGH PRO, PDR,NFS","Nutritional drink mix or meal replacement, high protein, powder, NFS" +95230000,"PROTEIN POWDER, WHEY BASED, NFS","Protein powder, whey based, NFS" +95230010,"PROTEIN POWDER, SOY BASED, NFS","Protein powder, soy based, NFS" +95230020,"PROTEIN POWDER, LIGHT, NFS","Protein powder, light, NFS" +95230030,"PROTEIN POWDER, NFS","Protein powder, NFS" +95310200,"FULL THROTTLE ENERGY DRINK","Full Throttle Energy Drink" +95310400,"MONSTER ENERGY DRINK","Monster Energy Drink" +95310500,"MOUNTAIN DEW AMP ENERGY DRINK","Mountain Dew AMP Energy Drink" +95310550,"NO FEAR ENERGY DRINK","No Fear Energy Drink" +95310555,"NO FEAR MOTHERLOAD ENERGY DRINK","No Fear Motherload Energy Drink" +95310560,"NOS ENERGY DRINK","NOS Energy Drink" +95310600,"RED BULL ENERGY DRINK","Red Bull Energy Drink" +95310700,"ROCKSTAR ENERGY DRINK","Rockstar Energy Drink" +95310750,"SOBE ENERGIZE ENERGY JUICE DRINK","SoBe Energize Energy Juice Drink" +95310800,"VAULT ENERGY DRINK","Vault Energy Drink" +95311000,"ENERGY DRINK","Energy Drink" +95312400,"MONSTER ENERGY DRINK, LO CARB","Monster Energy Drink, Lo Carb" +95312500,"MOUNTAIN DEW AMP ENERGY DRINK, SUGAR-FREE","Mountain Dew AMP Energy Drink, sugar-free" +95312550,"NO FEAR ENERGY DRINK, SUGAR-FREE","No Fear Energy Drink, sugar-free" +95312555,"NOS ENERGY DRINK, SUGAR-FREE","NOS Energy Drink, sugar-free" +95312560,"CRANBERRY JUICE ENERGY DRINK, HI VIT C & B, W/LOW CAL SWTNR","Ocean Spray Cran-Energy Cranberry Energy Juice Drink" +95312600,"RED BULL ENERGY DRINK, SUGAR-FREE","Red Bull Energy Drink, sugar-free" +95312700,"ROCKSTAR ENERGY DRINK, SUGAR-FREE","Rockstar Energy Drink, sugar-free" +95312800,"VAULT ZERO ENERGY DRINK","Vault Zero Energy Drink" +95312900,"XS ENERGY DRINK","XS Energy Drink" +95312905,"XS GOLD PLUS ENERGY DRINK","XS Gold Plus Energy Drink" +95320200,"GATORADE THIRST QUENCHER SPORTS DRINK","Gatorade Thirst Quencher sports drink" +95320500,"POWERADE SPORTS DRINK","Powerade sports drink" +95321000,"FRUIT-FLAVORED THIRST QUENCHER BEVERAGE","Fruit-flavored thirst quencher beverage" +95322200,"GATORADE G2 THIRST QUENCHER SPORTS DRINK, LOW CALORIE","Gatorade G2 Thirst Quencher sports drink, low calorie" +95322500,"POWERADE ZERO SPORTS DRINK, LOW CALORIE","Powerade Zero sports drink, low calorie" +95323000,"FRUIT-FLAV SPORTS DRINK OR THIRST QUENCHER BEVERAGE, LOW CAL","Fruit-flavored sports drink or thirst quencher beverage, low calorie" +95330100,"FLUID REPLACEMENT, ELECTROLYTE SOLUTION","Fluid replacement, electrolyte solution" +95330500,"FLUID REPLACEMENT, 5% GLUCOSE IN WATER","Fluid replacement, 5% glucose in water" +95341000,"FUZE SLENDERIZE FORTIFIED LOW CALORIE FRUIT JUICE BEVERAGE","FUZE Slenderize fortified low calorie fruit juice beverage" +95342000,"MONAVIE ACAI BLEND BEVERAGE","MonaVie acai blend beverage" diff --git a/pandas/io/tests/data/SSHSV1_A.XPT b/pandas/io/tests/data/SSHSV1_A.XPT new file mode 100644 index 0000000000000..8d954ce1882cd Binary files /dev/null and b/pandas/io/tests/data/SSHSV1_A.XPT differ diff --git a/pandas/io/tests/data/SSHSV1_A.csv b/pandas/io/tests/data/SSHSV1_A.csv new file mode 100644 index 0000000000000..d34efe4b895f7 --- /dev/null +++ b/pandas/io/tests/data/SSHSV1_A.csv @@ -0,0 +1,1427 @@ +"SEQN","SSXHE1" +3,2 +8,1 +9,2 +22,1 +23,2 +30,1 +39,2 +49,1 +67,1 +74,2 +75,2 +76,1 +78,2 +109,1 +110,1 +128,2 +139,2 +140,1 +144,1 +154,2 +159,2 +180,2 +182,1 +185,2 +202,1 +203,1 +212,2 +214,1 +224,2 +226,2 +227,2 +231,2 +246,2 +251,2 +252,2 +278,2 +299,1 +306,2 +311,2 +336,1 +338,2 +343,1 +347,2 +348,2 +349,2 +356,2 +362,1 +378,1 +379,2 +384,1 +390,2 +394,1 +404,1 +418,2 +423,1 +433,2 +435,2 +445,2 +449,2 +450,2 +482,2 +485,2 +487,2 +490,2 +500,2 +501,1 +502,2 +518,1 +520,1 +525,2 +538,2 +556,2 +565,2 +589,2 +599,2 +601,2 +604,1 +609,1 +617,2 +619,2 +624,1 +625,2 +629,2 +635,2 +637,2 +649,2 +659,1 +664,2 +673,1 +679,2 +696,1 +700,1 +704,2 +707,2 +715,1 +721,1 +724,2 +726,2 +735,2 +745,2 +752,1 +759,1 +760,2 +766,2 +767,1 +771,2 +772,1 +777,1 +791,2 +795,1 +796,1 +814,2 +837,2 +845,2 +860,1 +872,1 +890,2 +900,1 +904,1 +912,1 +913,1 +916,2 +922,2 +927,1 +934,2 +938,2 +947,2 +951,2 +952,2 +967,2 +973,2 +985,2 +997,2 +1006,2 +1008,2 +1012,1 +1015,1 +1017,1 +1036,2 +1037,2 +1039,2 +1069,1 +1073,2 +1078,1 +1080,2 +1081,1 +1086,1 +1091,2 +1103,2 +1126,2 +1136,2 +1142,2 +1145,2 +1157,2 +1162,1 +1172,1 +1174,1 +1200,2 +1206,2 +1218,2 +1223,2 +1224,1 +1225,2 +1228,1 +1235,2 +1258,1 +1261,2 +1265,2 +1269,2 +1271,2 +1272,1 +1300,1 +1310,2 +1311,2 +1319,2 +1321,1 +1324,1 +1334,2 +1337,1 +1341,1 +1345,1 +1347,1 +1350,2 +1359,2 +1360,2 +1371,1 +1376,1 +1380,2 +1390,2 +1395,2 +1396,2 +1415,1 +1420,2 +1426,2 +1435,2 +1446,1 +1454,1 +1456,2 +1460,2 +1485,1 +1490,1 +1496,1 +1504,1 +1519,1 +1521,1 +1522,2 +1523,1 +1530,2 +1556,1 +1559,1 +1560,1 +1562,1 +1569,1 +1572,2 +1610,2 +1611,2 +1632,2 +1640,2 +1649,2 +1653,1 +1654,1 +1656,2 +1657,1 +1664,1 +1670,2 +1688,2 +1699,1 +1708,2 +1709,2 +1710,2 +1724,2 +1740,1 +1745,2 +1747,1 +1753,1 +1769,2 +1771,2 +1797,1 +1811,1 +1812,2 +1820,2 +1833,2 +1836,1 +1842,1 +1843,1 +1844,2 +1857,1 +1863,1 +1872,2 +1881,1 +1890,1 +1893,1 +1900,2 +1915,1 +1926,2 +1927,2 +1937,2 +1940,2 +1953,2 +1954,1 +1961,1 +1965,2 +2001,1 +2011,2 +2012,2 +2028,2 +2032,2 +2033,1 +2042,1 +2044,2 +2048,1 +2090,2 +2093,1 +2099,1 +2100,2 +2123,2 +2125,2 +2128,1 +2136,1 +2147,2 +2148,2 +2154,2 +2155,1 +2157,2 +2158,1 +2183,1 +2192,1 +2202,1 +2206,1 +2208,2 +2211,1 +2218,1 +2227,2 +2266,1 +2274,2 +2279,1 +2284,2 +2285,1 +2286,2 +2288,1 +2289,2 +2295,2 +2299,1 +2306,1 +2309,1 +2310,1 +2313,2 +2316,1 +2341,1 +2368,2 +2369,1 +2374,1 +2387,1 +2394,2 +2403,2 +2408,2 +2409,1 +2410,1 +2411,2 +2415,2 +2430,2 +2431,2 +2452,2 +2453,2 +2511,2 +2513,2 +2516,1 +2537,1 +2538,2 +2545,2 +2547,1 +2554,2 +2559,2 +2562,2 +2568,1 +2580,2 +2584,1 +2587,2 +2592,1 +2593,2 +2600,1 +2607,2 +2623,1 +2624,2 +2626,2 +2632,2 +2637,2 +2639,1 +2647,1 +2664,1 +2677,2 +2690,2 +2707,1 +2715,2 +2717,1 +2724,2 +2728,2 +2737,1 +2751,1 +2760,1 +2767,2 +2773,2 +2776,2 +2779,2 +2781,2 +2785,2 +2786,1 +2829,2 +2832,1 +2833,2 +2836,1 +2840,2 +2842,2 +2853,1 +2856,2 +2867,2 +2874,2 +2875,2 +2876,2 +2878,1 +2879,2 +2891,2 +2903,1 +2916,2 +2918,2 +2943,2 +2960,2 +2963,2 +2974,1 +2975,2 +2976,1 +2981,2 +2982,1 +2985,1 +2989,1 +3001,1 +3003,1 +3004,2 +3007,2 +3017,2 +3019,2 +3022,2 +3023,2 +3025,2 +3027,2 +3030,1 +3031,2 +3041,2 +3046,2 +3050,1 +3052,1 +3056,1 +3060,2 +3061,1 +3071,2 +3078,1 +3079,1 +3084,2 +3086,1 +3088,2 +3090,2 +3092,2 +3103,2 +3111,1 +3125,1 +3131,1 +3138,2 +3151,1 +3159,1 +3177,2 +3178,1 +3186,2 +3188,2 +3189,2 +3201,1 +3203,2 +3207,2 +3211,2 +3217,1 +3241,2 +3248,1 +3253,2 +3267,2 +3286,1 +3288,1 +3290,1 +3295,2 +3306,2 +3315,2 +3320,1 +3322,1 +3335,1 +3340,2 +3351,1 +3352,1 +3369,2 +3373,1 +3378,2 +3383,1 +3384,1 +3390,2 +3391,2 +3392,2 +3394,2 +3396,1 +3414,1 +3416,1 +3422,2 +3424,2 +3427,2 +3435,2 +3447,2 +3465,2 +3467,2 +3471,1 +3475,2 +3483,1 +3495,2 +3497,2 +3503,2 +3507,2 +3511,2 +3512,2 +3520,2 +3527,2 +3529,2 +3533,2 +3542,1 +3550,2 +3555,2 +3560,2 +3582,1 +3589,2 +3608,1 +3616,1 +3622,2 +3623,1 +3629,2 +3641,1 +3642,2 +3643,1 +3650,2 +3651,1 +3657,2 +3665,2 +3667,1 +3669,1 +3673,2 +3674,2 +3698,2 +3703,2 +3706,2 +3723,2 +3728,2 +3733,2 +3734,1 +3738,1 +3754,1 +3764,2 +3766,1 +3768,2 +3772,1 +3776,2 +3779,2 +3784,1 +3788,2 +3789,2 +3812,1 +3813,1 +3828,2 +3831,1 +3832,2 +3833,2 +3834,1 +3837,1 +3842,2 +3844,2 +3846,2 +3847,2 +3853,2 +3869,2 +3872,1 +3875,2 +3876,2 +3877,2 +3906,2 +3922,2 +3928,2 +3933,1 +3938,1 +3947,1 +3948,2 +3962,1 +3969,2 +3970,2 +3994,2 +4001,2 +4004,2 +4024,1 +4039,2 +4040,2 +4041,2 +4043,2 +4055,1 +4068,2 +4073,2 +4077,2 +4086,1 +4091,1 +4098,1 +4099,2 +4105,1 +4118,2 +4121,2 +4124,1 +4129,2 +4135,2 +4152,2 +4154,2 +4166,2 +4177,1 +4179,2 +4186,1 +4188,2 +4189,1 +4200,2 +4204,1 +4224,1 +4226,2 +4228,1 +4233,2 +4235,1 +4237,1 +4243,1 +4247,2 +4251,2 +4256,1 +4279,2 +4294,2 +4304,2 +4306,1 +4315,1 +4321,2 +4325,1 +4335,2 +4347,2 +4360,1 +4383,2 +4392,2 +4414,1 +4416,1 +4417,2 +4424,2 +4427,2 +4428,2 +4436,2 +4437,1 +4471,2 +4474,2 +4475,2 +4485,1 +4487,1 +4496,2 +4499,2 +4509,1 +4515,1 +4519,2 +4520,1 +4522,1 +4541,1 +4544,2 +4546,1 +4568,2 +4573,2 +4575,1 +4576,1 +4578,1 +4580,1 +4585,2 +4588,2 +4595,2 +4599,2 +4603,1 +4606,1 +4607,1 +4609,2 +4612,2 +4613,1 +4617,2 +4622,1 +4649,1 +4651,2 +4656,1 +4659,2 +4668,2 +4670,2 +4671,2 +4672,2 +4673,2 +4686,2 +4687,2 +4694,1 +4724,1 +4733,1 +4737,1 +4738,2 +4756,2 +4759,2 +4763,2 +4770,1 +4773,2 +4790,2 +4808,1 +4811,2 +4814,2 +4818,2 +4832,2 +4836,1 +4837,2 +4857,1 +4870,2 +4871,2 +4873,1 +4881,2 +4884,1 +4886,2 +4887,2 +4889,1 +4890,1 +4904,1 +4906,1 +4913,2 +4920,1 +4923,2 +4930,2 +4943,1 +4944,2 +4949,1 +4950,2 +4953,2 +4973,1 +4975,1 +4980,2 +4981,2 +4984,1 +5004,2 +5005,2 +5014,2 +5017,1 +5038,1 +5058,1 +5061,1 +5087,1 +5097,1 +5098,1 +5099,1 +5106,2 +5117,1 +5132,1 +5138,1 +5140,2 +5156,1 +5163,2 +5169,2 +5174,1 +5178,1 +5179,2 +5183,2 +5189,1 +5190,1 +5194,2 +5196,2 +5200,2 +5228,1 +5252,2 +5258,1 +5268,2 +5270,1 +5272,2 +5286,2 +5287,2 +5289,1 +5290,2 +5293,1 +5304,1 +5312,2 +5318,2 +5337,3 +5345,1 +5349,2 +5351,1 +5356,2 +5360,1 +5366,2 +5367,1 +5368,2 +5372,2 +5373,1 +5382,1 +5387,2 +5388,1 +5389,2 +5391,2 +5392,2 +5398,1 +5412,1 +5425,1 +5427,1 +5430,2 +5435,2 +5439,1 +5444,1 +5446,1 +5453,1 +5462,1 +5471,2 +5473,2 +5485,1 +5486,2 +5491,1 +5495,2 +5497,2 +5500,1 +5502,2 +5507,1 +5513,2 +5518,2 +5523,2 +5530,1 +5534,2 +5536,2 +5540,1 +5550,2 +5551,2 +5558,1 +5566,2 +5574,1 +5584,2 +5594,1 +5607,2 +5609,1 +5611,2 +5617,2 +5618,2 +5619,1 +5628,1 +5638,1 +5640,1 +5661,1 +5663,2 +5668,2 +5670,2 +5677,2 +5688,2 +5693,1 +5698,1 +5711,1 +5723,2 +5729,1 +5739,1 +5748,1 +5751,2 +5756,2 +5770,1 +5771,2 +5796,2 +5800,1 +5804,2 +5812,2 +5817,1 +5821,2 +5823,1 +5840,1 +5847,1 +5850,1 +5887,2 +5899,2 +5900,1 +5917,2 +5928,2 +5940,2 +5948,2 +5951,2 +5955,2 +5956,1 +5957,1 +5959,2 +5971,2 +5973,2 +5974,2 +5975,2 +5978,2 +5990,1 +5999,2 +6007,2 +6012,2 +6013,2 +6014,1 +6024,2 +6026,2 +6028,2 +6035,1 +6038,2 +6042,1 +6048,1 +6052,1 +6055,2 +6056,1 +6059,1 +6060,1 +6062,1 +6076,1 +6084,2 +6091,2 +6100,1 +6103,1 +6108,2 +6113,1 +6128,1 +6134,2 +6150,2 +6172,2 +6186,2 +6187,1 +6191,1 +6192,2 +6202,2 +6207,1 +6225,2 +6229,2 +6230,1 +6235,2 +6239,2 +6241,1 +6252,2 +6257,2 +6269,1 +6276,1 +6282,2 +6284,2 +6286,2 +6288,1 +6295,1 +6301,1 +6307,2 +6322,2 +6324,1 +6333,1 +6346,1 +6350,2 +6357,1 +6366,1 +6370,1 +6380,2 +6381,1 +6389,1 +6391,2 +6392,2 +6399,2 +6405,1 +6409,2 +6410,2 +6411,2 +6421,2 +6425,2 +6427,2 +6443,2 +6474,1 +6475,1 +6490,2 +6492,2 +6500,2 +6501,2 +6502,1 +6504,2 +6505,2 +6506,1 +6528,2 +6544,2 +6554,2 +6555,2 +6560,2 +6563,1 +6576,1 +6580,1 +6582,1 +6589,2 +6606,2 +6607,2 +6609,1 +6615,1 +6620,1 +6632,1 +6635,1 +6638,1 +6647,2 +6651,2 +6652,2 +6654,2 +6657,1 +6659,1 +6660,1 +6685,2 +6691,2 +6695,2 +6699,2 +6719,2 +6722,2 +6725,1 +6729,1 +6746,1 +6748,1 +6759,1 +6762,2 +6770,1 +6778,2 +6782,1 +6784,2 +6785,1 +6787,2 +6793,1 +6794,2 +6798,2 +6806,1 +6817,2 +6828,2 +6831,2 +6833,1 +6834,1 +6842,1 +6843,2 +6848,1 +6860,1 +6868,2 +6876,1 +6880,2 +6881,2 +6887,1 +6893,1 +6900,2 +6901,2 +6909,1 +6911,2 +6919,1 +6920,1 +6921,1 +6924,2 +6925,1 +6930,2 +6932,1 +6945,1 +6947,1 +6961,2 +6964,1 +6970,1 +6977,2 +6984,2 +6986,2 +6997,2 +7003,2 +7004,2 +7006,2 +7009,2 +7015,2 +7023,1 +7028,2 +7033,2 +7041,2 +7046,2 +7052,1 +7070,1 +7081,2 +7094,1 +7104,2 +7110,2 +7113,1 +7115,2 +7122,1 +7128,1 +7129,1 +7131,1 +7135,2 +7137,1 +7138,1 +7141,1 +7150,1 +7153,2 +7155,2 +7157,2 +7158,2 +7164,2 +7181,2 +7189,1 +7194,2 +7209,1 +7215,2 +7239,1 +7242,1 +7245,2 +7253,2 +7255,1 +7260,2 +7280,1 +7289,2 +7292,2 +7303,1 +7305,2 +7317,1 +7323,2 +7327,1 +7343,1 +7361,1 +7368,2 +7402,2 +7405,1 +7415,2 +7417,2 +7423,1 +7445,1 +7446,1 +7455,2 +7463,2 +7467,2 +7475,1 +7481,1 +7500,2 +7503,1 +7507,1 +7510,2 +7527,2 +7528,2 +7543,1 +7551,2 +7559,2 +7564,2 +7569,2 +7573,1 +7579,2 +7584,1 +7588,2 +7591,1 +7595,1 +7610,1 +7612,1 +7629,1 +7642,1 +7648,2 +7653,2 +7679,2 +7690,2 +7693,2 +7700,2 +7702,2 +7703,1 +7705,2 +7709,2 +7719,1 +7737,2 +7745,1 +7754,1 +7770,2 +7772,2 +7783,1 +7785,2 +7786,1 +7789,1 +7793,1 +7799,2 +7800,2 +7817,2 +7818,2 +7832,1 +7852,1 +7854,2 +7879,1 +7880,2 +7881,1 +7882,1 +7889,2 +7895,1 +7902,2 +7908,2 +7914,2 +7916,2 +7920,1 +7921,2 +7924,1 +7930,1 +7931,2 +7943,1 +7976,2 +7978,2 +8024,1 +8025,2 +8032,1 +8054,1 +8058,1 +8066,1 +8069,2 +8070,1 +8072,2 +8082,1 +8087,2 +8089,1 +8098,1 +8111,2 +8126,1 +8135,2 +8136,1 +8141,2 +8144,2 +8146,2 +8166,2 +8191,2 +8198,1 +8210,2 +8212,2 +8228,1 +8253,1 +8254,2 +8256,2 +8272,1 +8274,2 +8280,1 +8283,2 +8292,1 +8300,2 +8305,2 +8306,1 +8316,2 +8320,1 +8324,2 +8332,1 +8342,1 +8344,1 +8346,2 +8364,1 +8370,1 +8371,1 +8374,2 +8380,1 +8383,2 +8386,2 +8393,2 +8398,1 +8410,2 +8415,2 +8420,2 +8433,2 +8435,2 +8436,1 +8438,2 +8439,1 +8456,1 +8463,1 +8479,1 +8480,1 +8493,2 +8502,2 +8503,2 +8505,2 +8506,2 +8515,1 +8517,2 +8520,2 +8530,2 +8543,2 +8550,1 +8560,2 +8571,1 +8576,2 +8582,2 +8583,2 +8590,1 +8591,2 +8592,2 +8594,2 +8599,2 +8621,1 +8623,1 +8627,1 +8635,2 +8636,2 +8640,1 +8647,1 +8648,2 +8662,2 +8675,2 +8679,2 +8680,1 +8685,2 +8686,2 +8691,2 +8692,1 +8696,1 +8699,1 +8700,2 +8722,2 +8735,2 +8758,2 +8766,1 +8770,1 +8789,2 +8790,2 +8791,2 +8805,2 +8809,2 +8812,1 +8826,2 +8843,1 +8845,1 +8847,1 +8853,2 +8873,2 +8890,1 +8933,1 +8935,1 +8963,1 +8977,2 +8981,2 +8982,1 +8983,2 +8987,1 +8988,1 +8989,1 +9017,2 +9026,2 +9034,2 +9038,2 +9041,1 +9045,2 +9049,1 +9057,1 +9058,2 +9060,2 +9076,1 +9080,2 +9083,1 +9084,2 +9085,2 +9088,2 +9089,2 +9093,1 +9094,1 +9098,1 +9100,2 +9107,1 +9109,1 +9111,2 +9114,2 +9120,2 +9134,2 +9135,2 +9137,1 +9138,2 +9143,1 +9151,2 +9160,2 +9164,1 +9166,2 +9167,1 +9174,1 +9184,1 +9189,2 +9205,2 +9224,1 +9236,2 +9249,2 +9255,1 +9261,2 +9265,1 +9266,1 +9269,2 +9271,1 +9283,2 +9284,2 +9287,2 +9294,1 +9305,1 +9307,2 +9315,2 +9317,2 +9320,2 +9336,1 +9337,2 +9345,2 +9362,2 +9365,2 +9385,2 +9387,2 +9393,1 +9398,2 +9404,1 +9406,2 +9419,2 +9437,2 +9448,1 +9461,2 +9476,1 +9491,2 +9524,2 +9529,2 +9545,2 +9555,1 +9562,1 +9565,2 +9576,2 +9578,2 +9586,1 +9588,2 +9593,1 +9596,2 +9601,1 +9631,2 +9632,2 +9634,1 +9635,1 +9654,2 +9659,2 +9673,2 +9680,2 +9688,1 +9698,1 +9700,2 +9702,1 +9705,2 +9708,2 +9713,2 +9721,1 +9724,2 +9734,2 +9743,1 +9758,1 +9759,2 +9777,2 +9782,2 +9788,1 +9789,1 +9795,2 +9800,1 +9801,2 +9827,1 +9830,2 +9831,2 +9839,1 +9841,2 +9848,1 +9856,1 +9858,1 +9859,2 +9867,2 +9870,1 +9880,1 +9885,1 +9887,2 +9899,2 +9900,2 +9901,2 +9914,2 +9918,1 +9927,1 +9928,1 +9933,2 +9939,2 +9945,2 +9964,2 diff --git a/pandas/io/tests/data/blank.xls b/pandas/io/tests/data/blank.xls new file mode 100755 index 0000000000000..952c76f045e8a Binary files /dev/null and b/pandas/io/tests/data/blank.xls differ diff --git a/pandas/io/tests/data/blank.xlsx b/pandas/io/tests/data/blank.xlsx new file mode 100755 index 0000000000000..73f6ba6d29af3 Binary files /dev/null and b/pandas/io/tests/data/blank.xlsx differ diff --git a/pandas/io/tests/data/blank_with_header.xls b/pandas/io/tests/data/blank_with_header.xls new file mode 100755 index 0000000000000..a2e6350808147 Binary files /dev/null and b/pandas/io/tests/data/blank_with_header.xls differ diff --git a/pandas/io/tests/data/blank_with_header.xlsx b/pandas/io/tests/data/blank_with_header.xlsx new file mode 100755 index 0000000000000..7b30edb13be2c Binary files /dev/null and b/pandas/io/tests/data/blank_with_header.xlsx differ diff --git a/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_2.7.10.msgpack b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_2.7.10.msgpack new file mode 100644 index 0000000000000..1e128f42a37a6 Binary files /dev/null and b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_2.7.10.msgpack differ diff --git a/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_3.4.3.msgpack b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_3.4.3.msgpack new file mode 100644 index 0000000000000..156905faece90 Binary files /dev/null and b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_AMD64_windows_3.4.3.msgpack differ diff --git a/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_darwin_2.7.10.msgpack b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_darwin_2.7.10.msgpack new file mode 100644 index 0000000000000..6bf1b9b9afaaa Binary files /dev/null and b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_darwin_2.7.10.msgpack differ diff --git a/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_2.7.10.msgpack b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_2.7.10.msgpack new file mode 100644 index 0000000000000..6bf1b9b9afaaa Binary files /dev/null and b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_2.7.10.msgpack differ diff --git a/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_3.4.3.msgpack b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_3.4.3.msgpack new file mode 100644 index 0000000000000..6607570797846 Binary files /dev/null and b/pandas/io/tests/data/legacy_msgpack/0.16.2/0.16.2_x86_64_linux_3.4.3.msgpack differ diff --git a/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_2.7.10.pickle b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_2.7.10.pickle new file mode 100644 index 0000000000000..a2a3ffa044013 Binary files /dev/null and b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_2.7.10.pickle differ diff --git a/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_3.4.3.pickle b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_3.4.3.pickle new file mode 100644 index 0000000000000..6b8fdaa21badc Binary files /dev/null and b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_3.4.3.pickle differ diff --git a/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_2.7.10.pickle b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_2.7.10.pickle new file mode 100644 index 0000000000000..60101c2f1e95e Binary files /dev/null and b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_2.7.10.pickle differ diff --git a/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_2.7.10.pickle b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_2.7.10.pickle new file mode 100644 index 0000000000000..60101c2f1e95e Binary files /dev/null and b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_2.7.10.pickle differ diff --git a/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_3.4.3.pickle b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_3.4.3.pickle new file mode 100644 index 0000000000000..6d5451f96e20d Binary files /dev/null and b/pandas/io/tests/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_3.4.3.pickle differ diff --git a/pandas/io/tests/data/salary.table.gz b/pandas/io/tests/data/salary.table.gz new file mode 100644 index 0000000000000..629de9703d345 Binary files /dev/null and b/pandas/io/tests/data/salary.table.gz differ diff --git a/pandas/io/tests/data/stata14_118.dta b/pandas/io/tests/data/stata14_118.dta new file mode 100644 index 0000000000000..1fc65f1a6e988 Binary files /dev/null and b/pandas/io/tests/data/stata14_118.dta differ diff --git a/pandas/io/tests/generate_legacy_pickles.py b/pandas/io/tests/generate_legacy_pickles.py deleted file mode 100644 index e1cf541fe6195..0000000000000 --- a/pandas/io/tests/generate_legacy_pickles.py +++ /dev/null @@ -1,169 +0,0 @@ -""" self-contained to write legacy pickle files """ -from __future__ import print_function - - -def _create_sp_series(): - - import numpy as np - from pandas import SparseSeries - - nan = np.nan - - # nan-based - arr = np.arange(15, dtype=np.float64) - arr[7:12] = nan - arr[-1:] = nan - - bseries = SparseSeries(arr, kind='block') - bseries.name = 'bseries' - return bseries - -def _create_sp_tsseries(): - - import numpy as np - from pandas import bdate_range, SparseTimeSeries - - nan = np.nan - - # nan-based - arr = np.arange(15, dtype=np.float64) - arr[7:12] = nan - arr[-1:] = nan - - date_index = bdate_range('1/1/2011', periods=len(arr)) - bseries = SparseTimeSeries(arr, index=date_index, kind='block') - bseries.name = 'btsseries' - return bseries - -def _create_sp_frame(): - import numpy as np - from pandas import bdate_range, SparseDataFrame - - nan = np.nan - - data = {'A': [nan, nan, nan, 0, 1, 2, 3, 4, 5, 6], - 'B': [0, 1, 2, nan, nan, nan, 3, 4, 5, 6], - 'C': np.arange(10).astype(np.int64), - 'D': [0, 1, 2, 3, 4, 5, nan, nan, nan, nan]} - - dates = bdate_range('1/1/2011', periods=10) - return SparseDataFrame(data, index=dates) - -def create_data(): - """ create the pickle data """ - - from distutils.version import LooseVersion - import numpy as np - import pandas - from pandas import (Series,TimeSeries,DataFrame,Panel, - SparseSeries,SparseTimeSeries,SparseDataFrame,SparsePanel, - Index,MultiIndex,PeriodIndex, - date_range,period_range,bdate_range,Timestamp,Categorical) - nan = np.nan - - data = { - 'A': [0., 1., 2., 3., np.nan], - 'B': [0, 1, 0, 1, 0], - 'C': ['foo1', 'foo2', 'foo3', 'foo4', 'foo5'], - 'D': date_range('1/1/2009', periods=5), - 'E' : [0., 1, Timestamp('20100101'),'foo',2.], - } - - index = dict(int = Index(np.arange(10)), - date = date_range('20130101',periods=10), - period = period_range('2013-01-01', freq='M', periods=10)) - - mi = dict(reg2 = MultiIndex.from_tuples(tuple(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], - ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']])), - names=['first', 'second'])) - series = dict(float = Series(data['A']), - int = Series(data['B']), - mixed = Series(data['E']), - ts = TimeSeries(np.arange(10).astype(np.int64),index=date_range('20130101',periods=10)), - mi = Series(np.arange(5).astype(np.float64),index=MultiIndex.from_tuples(tuple(zip(*[[1,1,2,2,2], - [3,4,3,4,5]])), - names=['one','two'])), - dup=Series(np.arange(5).astype(np.float64), index=['A', 'B', 'C', 'D', 'A']), - cat=Series(Categorical(['foo', 'bar', 'baz']))) - - frame = dict(float = DataFrame(dict(A = series['float'], B = series['float'] + 1)), - int = DataFrame(dict(A = series['int'] , B = series['int'] + 1)), - mixed = DataFrame(dict([ (k,data[k]) for k in ['A','B','C','D']])), - mi = DataFrame(dict(A = np.arange(5).astype(np.float64), B = np.arange(5).astype(np.int64)), - index=MultiIndex.from_tuples(tuple(zip(*[['bar','bar','baz','baz','baz'], - ['one','two','one','two','three']])), - names=['first','second'])), - dup=DataFrame(np.arange(15).reshape(5, 3).astype(np.float64), - columns=['A', 'B', 'A']), - cat_onecol=DataFrame(dict(A=Categorical(['foo', 'bar']))), - cat_and_float=DataFrame(dict(A=Categorical(['foo', 'bar', 'baz']), - B=np.arange(3).astype(np.int64))), - ) - panel = dict(float = Panel(dict(ItemA = frame['float'], ItemB = frame['float']+1)), - dup = Panel(np.arange(30).reshape(3, 5, 2).astype(np.float64), - items=['A', 'B', 'A'])) - - if LooseVersion(pandas.__version__) >= '0.14.1': - # Pre-0.14.1 versions generated non-unpicklable mixed-type frames and - # panels if their columns/items were non-unique. - mixed_dup_df = DataFrame(data) - mixed_dup_df.columns = list("ABCDA") - - mixed_dup_panel = Panel(dict(ItemA=frame['float'], ItemB=frame['int'])) - mixed_dup_panel.items = ['ItemA', 'ItemA'] - - frame['mixed_dup'] = mixed_dup_df - panel['mixed_dup'] = mixed_dup_panel - - return dict( series = series, - frame = frame, - panel = panel, - index = index, - mi = mi, - sp_series = dict(float = _create_sp_series(), - ts = _create_sp_tsseries()), - sp_frame = dict(float = _create_sp_frame()) - ) - -def write_legacy_pickles(): - - # force our cwd to be the first searched - import sys - sys.path.insert(0,'.') - - import os, os.path - import numpy as np - import pandas - import pandas.util.testing as tm - import platform as pl - - # make sure we are < 0.13 compat (in py3) - try: - from pandas.compat import zip, cPickle as pickle - except: - import pickle - - sys_version = version = pandas.__version__ - if len(sys.argv) < 2: - exit("{0} ".format(sys.argv[0])) - - version = str(sys.argv[1]) - output_dir = str(sys.argv[2]) - - print("This script generates a pickle file for the current arch, system, and python version") - print(" system version: {0}".format(sys_version)) - print(" output version: {0}".format(version)) - print(" output dir : {0}".format(output_dir)) - - # construct a reasonable platform name - f = '_'.join([ str(version), str(pl.machine()), str(pl.system().lower()), str(pl.python_version()) ]) - pth = '{0}.pickle'.format(f) - - fh = open(os.path.join(output_dir,pth),'wb') - pickle.dump(create_data(),fh,pickle.HIGHEST_PROTOCOL) - fh.close() - - print("created pickle file: %s" % pth) - -if __name__ == '__main__': - write_legacy_pickles() diff --git a/pandas/io/tests/generate_legacy_storage_files.py b/pandas/io/tests/generate_legacy_storage_files.py new file mode 100644 index 0000000000000..686efde8402d1 --- /dev/null +++ b/pandas/io/tests/generate_legacy_storage_files.py @@ -0,0 +1,206 @@ +""" self-contained to write legacy storage (pickle/msgpack) files """ +from __future__ import print_function +from distutils.version import LooseVersion +from pandas import (Series, TimeSeries, DataFrame, Panel, + SparseSeries, SparseTimeSeries, SparseDataFrame, SparsePanel, + Index, MultiIndex, PeriodIndex, bdate_range, to_msgpack, + date_range, period_range, bdate_range, Timestamp, Categorical) +import os +import sys +import numpy as np +import pandas +import pandas.util.testing as tm +import platform as pl + + +def _create_sp_series(): + nan = np.nan + + # nan-based + arr = np.arange(15, dtype=np.float64) + arr[7:12] = nan + arr[-1:] = nan + + bseries = SparseSeries(arr, kind='block') + bseries.name = 'bseries' + return bseries + + +def _create_sp_tsseries(): + nan = np.nan + + # nan-based + arr = np.arange(15, dtype=np.float64) + arr[7:12] = nan + arr[-1:] = nan + + date_index = bdate_range('1/1/2011', periods=len(arr)) + bseries = SparseTimeSeries(arr, index=date_index, kind='block') + bseries.name = 'btsseries' + return bseries + + +def _create_sp_frame(): + nan = np.nan + + data = {'A': [nan, nan, nan, 0, 1, 2, 3, 4, 5, 6], + 'B': [0, 1, 2, nan, nan, nan, 3, 4, 5, 6], + 'C': np.arange(10).astype(np.int64), + 'D': [0, 1, 2, 3, 4, 5, nan, nan, nan, nan]} + + dates = bdate_range('1/1/2011', periods=10) + return SparseDataFrame(data, index=dates) + + +def create_data(): + """ create the pickle/msgpack data """ + + data = { + 'A': [0., 1., 2., 3., np.nan], + 'B': [0, 1, 0, 1, 0], + 'C': ['foo1', 'foo2', 'foo3', 'foo4', 'foo5'], + 'D': date_range('1/1/2009', periods=5), + 'E': [0., 1, Timestamp('20100101'), 'foo', 2.] + } + + index = dict(int=Index(np.arange(10)), + date=date_range('20130101', periods=10), + period=period_range('2013-01-01', freq='M', periods=10)) + + mi = dict(reg2=MultiIndex.from_tuples(tuple(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], + ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']])), + names=['first', 'second'])) + series = dict(float=Series(data['A']), + int=Series(data['B']), + mixed=Series(data['E']), + ts=TimeSeries(np.arange(10).astype(np.int64), index=date_range('20130101',periods=10)), + mi=Series(np.arange(5).astype(np.float64), + index=MultiIndex.from_tuples(tuple(zip(*[[1, 1, 2, 2, 2], [3, 4, 3, 4, 5]])), + names=['one', 'two'])), + dup=Series(np.arange(5).astype(np.float64), index=['A', 'B', 'C', 'D', 'A']), + cat=Series(Categorical(['foo', 'bar', 'baz'])), + per=Series([Period('2000Q1')] * 5)) + + mixed_dup_df = DataFrame(data) + mixed_dup_df.columns = list("ABCDA") + frame = dict(float=DataFrame(dict(A=series['float'], B=series['float'] + 1)), + int=DataFrame(dict(A=series['int'], B=series['int'] + 1)), + mixed=DataFrame(dict([(k, data[k]) for k in ['A', 'B', 'C', 'D']])), + mi=DataFrame(dict(A=np.arange(5).astype(np.float64), B=np.arange(5).astype(np.int64)), + index=MultiIndex.from_tuples(tuple(zip(*[['bar', 'bar', 'baz', 'baz', 'baz'], + ['one', 'two', 'one', 'two', 'three']])), + names=['first', 'second'])), + dup=DataFrame(np.arange(15).reshape(5, 3).astype(np.float64), + columns=['A', 'B', 'A']), + cat_onecol=DataFrame(dict(A=Categorical(['foo', 'bar']))), + cat_and_float=DataFrame(dict(A=Categorical(['foo', 'bar', 'baz']), + B=np.arange(3).astype(np.int64))), + mixed_dup=mixed_dup_df) + + mixed_dup_panel = Panel(dict(ItemA=frame['float'], ItemB=frame['int'])) + mixed_dup_panel.items = ['ItemA', 'ItemA'] + panel = dict(float=Panel(dict(ItemA=frame['float'], ItemB=frame['float'] + 1)), + dup=Panel(np.arange(30).reshape(3, 5, 2).astype(np.float64), + items=['A', 'B', 'A']), + mixed_dup=mixed_dup_panel) + + return dict(series=series, + frame=frame, + panel=panel, + index=index, + mi=mi, + sp_series=dict(float=_create_sp_series(), + ts=_create_sp_tsseries()), + sp_frame=dict(float=_create_sp_frame())) + + +def create_pickle_data(): + data = create_data() + + # Pre-0.14.1 versions generated non-unpicklable mixed-type frames and + # panels if their columns/items were non-unique. + if LooseVersion(pandas.__version__) < '0.14.1': + del data['frame']['mixed_dup'] + del data['panel']['mixed_dup'] + return data + + +def create_msgpack_data(): + data = create_data() + if LooseVersion(pandas.__version__) < '0.17.0': + del data['frame']['mixed_dup'] + del data['panel']['mixed_dup'] + del data['frame']['dup'] + del data['panel']['dup'] + # Not supported + del data['sp_series'] + del data['sp_frame'] + del data['series']['cat'] + del data['frame']['cat_onecol'] + del data['frame']['cat_and_float'] + return data + + +def platform_name(): + return '_'.join([str(pandas.__version__), str(pl.machine()), str(pl.system().lower()), str(pl.python_version())]) + + +def write_legacy_pickles(output_dir): + + # make sure we are < 0.13 compat (in py3) + try: + from pandas.compat import zip, cPickle as pickle + except: + import pickle + + version = pandas.__version__ + + print("This script generates a storage file for the current arch, system, and python version") + print(" pandas version: {0}".format(version)) + print(" output dir : {0}".format(output_dir)) + print(" storage format: pickle") + + pth = '{0}.pickle'.format(platform_name()) + + fh = open(os.path.join(output_dir, pth), 'wb') + pickle.dump(create_pickle_data(), fh, pickle.HIGHEST_PROTOCOL) + fh.close() + + print("created pickle file: %s" % pth) + + +def write_legacy_msgpack(output_dir): + + version = pandas.__version__ + + print("This script generates a storage file for the current arch, system, and python version") + print(" pandas version: {0}".format(version)) + print(" output dir : {0}".format(output_dir)) + print(" storage format: msgpack") + + pth = '{0}.msgpack'.format(platform_name()) + to_msgpack(os.path.join(output_dir, pth), create_msgpack_data()) + + print("created msgpack file: %s" % pth) + + +def write_legacy_file(): + # force our cwd to be the first searched + sys.path.insert(0, '.') + + if len(sys.argv) != 3: + exit("Specify output directory and storage type: generate_legacy_storage_files.py ") + + output_dir = str(sys.argv[1]) + storage_type = str(sys.argv[2]) + + if storage_type == 'pickle': + write_legacy_pickles(output_dir=output_dir) + elif storage_type == 'msgpack': + write_legacy_msgpack(output_dir=output_dir) + else: + exit("storage_type must be one of {'pickle', 'msgpack'}") + + +if __name__ == '__main__': + write_legacy_file() diff --git a/pandas/io/tests/test_common.py b/pandas/io/tests/test_common.py index fe163cc13c5da..34e7c94b64bcb 100644 --- a/pandas/io/tests/test_common.py +++ b/pandas/io/tests/test_common.py @@ -29,12 +29,12 @@ def test_expand_user_normal_path(self): def test_get_filepath_or_buffer_with_path(self): filename = '~/sometest' - filepath_or_buffer, _ = common.get_filepath_or_buffer(filename) + filepath_or_buffer, _, _ = common.get_filepath_or_buffer(filename) self.assertNotEqual(filepath_or_buffer, filename) self.assertNotIn('~', filepath_or_buffer) self.assertEqual(os.path.expanduser(filename), filepath_or_buffer) def test_get_filepath_or_buffer_with_buffer(self): input_buffer = StringIO() - filepath_or_buffer, _ = common.get_filepath_or_buffer(input_buffer) + filepath_or_buffer, _, _ = common.get_filepath_or_buffer(input_buffer) self.assertEqual(filepath_or_buffer, input_buffer) diff --git a/pandas/io/tests/test_cparser.py b/pandas/io/tests/test_cparser.py index 93d55c654de90..ceb845073e2c3 100644 --- a/pandas/io/tests/test_cparser.py +++ b/pandas/io/tests/test_cparser.py @@ -186,6 +186,30 @@ def test_header_not_enough_lines(self): '1,2,3\n' '4,5,6') + reader = TextReader(StringIO(data), delimiter=',', header=2) + header = reader.header + expected = [['a', 'b', 'c']] + self.assertEqual(header, expected) + + recs = reader.read() + expected = {0 : [1, 4], 1 : [2, 5], 2 : [3, 6]} + assert_array_dicts_equal(expected, recs) + + # not enough rows + self.assertRaises(parser.CParserError, TextReader, StringIO(data), + delimiter=',', header=5, as_recarray=True) + + def test_header_not_enough_lines_as_recarray(self): + + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64, only when all tests are run") + + data = ('skip this\n' + 'skip this\n' + 'a,b,c\n' + '1,2,3\n' + '4,5,6') + reader = TextReader(StringIO(data), delimiter=',', header=2, as_recarray=True) header = reader.header @@ -246,6 +270,21 @@ def _make_reader(**kwds): self.assertTrue((result[0] == ex_values).all()) self.assertEqual(result[1].dtype, 'S4') + def test_numpy_string_dtype_as_recarray(self): + data = """\ +a,1 +aa,2 +aaa,3 +aaaa,4 +aaaaa,5""" + + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64, only when all tests are run") + + def _make_reader(**kwds): + return TextReader(StringIO(data), delimiter=',', header=None, + **kwds) + reader = _make_reader(dtype='S4', as_recarray=True) result = reader.read() self.assertEqual(result['0'].dtype, 'S4') diff --git a/pandas/io/tests/test_data.py b/pandas/io/tests/test_data.py index 63ed26ea7d931..96bac2c45340b 100644 --- a/pandas/io/tests/test_data.py +++ b/pandas/io/tests/test_data.py @@ -14,7 +14,6 @@ from pandas.util.testing import (assert_series_equal, assert_produces_warning, network, assert_frame_equal) import pandas.util.testing as tm -from numpy.testing import assert_array_equal if compat.PY3: from urllib.error import HTTPError @@ -292,13 +291,11 @@ def setUpClass(cls): # aapl has monthlies cls.aapl = web.Options('aapl', 'yahoo') - today = datetime.today() - cls.year = today.year - cls.month = today.month + 1 - if cls.month > 12: - cls.year = cls.year + 1 - cls.month = 1 - cls.expiry = datetime(cls.year, cls.month, 1) + d = (Timestamp.today() + pd.offsets.MonthBegin(1)).normalize() + cls.year = d.year + cls.month = d.month + cls.expiry = d + cls.expiry2 = d + pd.offsets.MonthBegin(1) cls.dirpath = tm.get_data_path() cls.html1 = os.path.join(cls.dirpath, 'yahoo_options1.html') cls.html2 = os.path.join(cls.dirpath, 'yahoo_options2.html') @@ -326,7 +323,7 @@ def test_get_options_data(self): def test_get_near_stock_price(self): try: options = self.aapl.get_near_stock_price(call=True, put=True, - expiry=self.expiry) + expiry=[self.expiry,self.expiry2]) except RemoteDataError as e: raise nose.SkipTest(e) self.assertTrue(len(options) > 1) @@ -497,10 +494,7 @@ def test_fred(self): end = datetime(2013, 1, 27) received = web.DataReader("GDP", "fred", start, end)['GDP'].tail(1)[0] - - # < 7/30/14 16535 was returned - #self.assertEqual(int(received), 16535) - self.assertEqual(int(received), 16502) + self.assertTrue(int(received) > 10000) self.assertRaises(Exception, web.DataReader, "NON EXISTENT SERIES", 'fred', start, end) @@ -533,7 +527,7 @@ def test_fred_part2(self): [848.3], [933.3]] result = web.get_data_fred("A09024USA144NNBR", start="1915").ix[:5] - assert_array_equal(result.values, np.array(expected)) + tm.assert_numpy_array_equal(result.values, np.array(expected)) @network def test_invalid_series(self): diff --git a/pandas/io/tests/test_excel.py b/pandas/io/tests/test_excel.py index 768aa40696cbc..26f4d65978fa0 100644 --- a/pandas/io/tests/test_excel.py +++ b/pandas/io/tests/test_excel.py @@ -1,6 +1,6 @@ # pylint: disable=E1101 -from pandas.compat import u, range, map, openpyxl_compat +from pandas.compat import u, range, map, openpyxl_compat, BytesIO, iteritems from datetime import datetime, date, time import sys import os @@ -424,27 +424,27 @@ def test_reader_converters(self): for path in (xls_path, xlsx_path): actual = read_excel(path, 'Sheet1', converters=converters) tm.assert_frame_equal(actual, expected) - + def test_reading_all_sheets(self): # Test reading all sheetnames by setting sheetname to None, # Ensure a dict is returned. # See PR #9450 - + _skip_if_no_xlrd() - + dfs = read_excel(self.multisheet,sheetname=None) expected_keys = ['Alpha','Beta','Charlie'] tm.assert_contains_all(expected_keys,dfs.keys()) def test_reading_multiple_specific_sheets(self): - # Test reading specific sheetnames by specifying a mixed list + # Test reading specific sheetnames by specifying a mixed list # of integers and strings, and confirm that duplicated sheet # references (positions/names) are removed properly. - + # Ensure a dict is returned # See PR #9450 _skip_if_no_xlrd() - + #Explicitly request duplicates. Only the set should be returned. expected_keys = [2,'Charlie','Charlie'] dfs = read_excel(self.multisheet,sheetname=expected_keys) @@ -455,28 +455,28 @@ def test_reading_multiple_specific_sheets(self): def test_creating_and_reading_multiple_sheets(self): # Test reading multiple sheets, from a runtime created excel file # with multiple sheets. - # See PR #9450 - + # See PR #9450 + _skip_if_no_xlrd() _skip_if_no_xlwt() - + def tdf(sheetname): d, i = [11,22,33], [1,2,3] return DataFrame(d,i,columns=[sheetname]) - + sheets = ['AAA','BBB','CCC'] - + dfs = [tdf(s) for s in sheets] dfs = dict(zip(sheets,dfs)) - + with ensure_clean('.xlsx') as pth: with ExcelWriter(pth) as ew: - for sheetname, df in dfs.iteritems(): + for sheetname, df in iteritems(dfs): df.to_excel(ew,sheetname) dfs_returned = pd.read_excel(pth,sheetname=sheets) for s in sheets: tm.assert_frame_equal(dfs[s],dfs_returned[s]) - + def test_reader_seconds(self): # Test reading times with and without milliseconds. GH5945. _skip_if_no_xlrd() @@ -520,6 +520,29 @@ def test_reader_seconds(self): actual = read_excel(epoch_1904, 'Sheet1') tm.assert_frame_equal(actual, expected) + # GH6403 + def test_read_excel_blank(self): + _skip_if_no_xlrd() + + blank = os.path.join(self.dirpath, 'blank.xls') + actual = read_excel(blank, 'Sheet1') + tm.assert_frame_equal(actual, DataFrame()) + + blank = os.path.join(self.dirpath, 'blank.xlsx') + actual = read_excel(blank, 'Sheet1') + tm.assert_frame_equal(actual, DataFrame()) + + def test_read_excel_blank_with_header(self): + _skip_if_no_xlrd() + + expected = DataFrame(columns=['col_1', 'col_2']) + blank = os.path.join(self.dirpath, 'blank_with_header.xls') + actual = read_excel(blank, 'Sheet1') + tm.assert_frame_equal(actual, expected) + + blank = os.path.join(self.dirpath, 'blank_with_header.xlsx') + actual = read_excel(blank, 'Sheet1') + tm.assert_frame_equal(actual, expected) class ExcelWriterBase(SharedItems): # Base class for test cases to run with different Excel writers. @@ -1218,6 +1241,30 @@ def test_datetimes(self): tm.assert_series_equal(write_frame['A'], read_frame['A']) + # GH7074 + def test_bytes_io(self): + bio = BytesIO() + df = DataFrame(np.random.randn(10, 2)) + writer = ExcelWriter(bio) + df.to_excel(writer) + writer.save() + bio.seek(0) + reread_df = pd.read_excel(bio) + tm.assert_frame_equal(df, reread_df) + + # GH8188 + def test_write_lists_dict(self): + df = pd.DataFrame({'mixed': ['a', ['b', 'c'], {'d': 'e', 'f': 2}], + 'numeric': [1, 2, 3.0], + 'str': ['apple', 'banana', 'cherry']}) + expected = df.copy() + expected.mixed = expected.mixed.apply(str) + expected.numeric = expected.numeric.astype('int64') + with ensure_clean(self.ext) as path: + df.to_excel(path, 'Sheet1') + read = read_excel(path, 'Sheet1', header=0) + tm.assert_frame_equal(read, expected) + def raise_wrapper(major_ver): def versioned_raise_wrapper(orig_method): @functools.wraps(orig_method) @@ -1512,6 +1559,7 @@ class XlsxWriterTests_NoMerge(ExcelWriterBase, tm.TestCase): class ExcelWriterEngineTests(tm.TestCase): + def test_ExcelWriter_dispatch(self): with tm.assertRaisesRegexp(ValueError, 'No engine'): ExcelWriter('nothing') @@ -1527,12 +1575,12 @@ def test_ExcelWriter_dispatch(self): with ensure_clean('.xlsx') as path: writer = ExcelWriter(path) - tm.assert_isinstance(writer, writer_klass) + tm.assertIsInstance(writer, writer_klass) _skip_if_no_xlwt() with ensure_clean('.xls') as path: writer = ExcelWriter(path) - tm.assert_isinstance(writer, _XlwtWriter) + tm.assertIsInstance(writer, _XlwtWriter) def test_register_writer(self): # some awkward mocking to test out dispatch and such actually works @@ -1560,7 +1608,7 @@ def check_called(func): register_writer(DummyClass) writer = ExcelWriter('something.test') - tm.assert_isinstance(writer, DummyClass) + tm.assertIsInstance(writer, DummyClass) df = tm.makeCustomDataframe(1, 1) panel = tm.makePanel() func = lambda: df.to_excel('something.test') diff --git a/pandas/io/tests/test_html.py b/pandas/io/tests/test_html.py index c162bd7c50f5a..9093df9f0bf62 100644 --- a/pandas/io/tests/test_html.py +++ b/pandas/io/tests/test_html.py @@ -159,12 +159,12 @@ def test_spam_with_types(self): def test_spam_no_match(self): dfs = self.read_html(self.spam_data) for df in dfs: - tm.assert_isinstance(df, DataFrame) + tm.assertIsInstance(df, DataFrame) def test_banklist_no_match(self): dfs = self.read_html(self.banklist_data, attrs={'id': 'table'}) for df in dfs: - tm.assert_isinstance(df, DataFrame) + tm.assertIsInstance(df, DataFrame) def test_spam_header(self): df = self.read_html(self.spam_data, '.*Water.*', header=1)[0] @@ -307,9 +307,9 @@ def test_file_url(self): url = self.banklist_data dfs = self.read_html(file_path_to_url(url), 'First', attrs={'id': 'table'}) - tm.assert_isinstance(dfs, list) + tm.assertIsInstance(dfs, list) for df in dfs: - tm.assert_isinstance(df, DataFrame) + tm.assertIsInstance(df, DataFrame) @slow def test_invalid_table_attrs(self): @@ -325,34 +325,34 @@ def _bank_data(self, *args, **kwargs): @slow def test_multiindex_header(self): df = self._bank_data(header=[0, 1])[0] - tm.assert_isinstance(df.columns, MultiIndex) + tm.assertIsInstance(df.columns, MultiIndex) @slow def test_multiindex_index(self): df = self._bank_data(index_col=[0, 1])[0] - tm.assert_isinstance(df.index, MultiIndex) + tm.assertIsInstance(df.index, MultiIndex) @slow def test_multiindex_header_index(self): df = self._bank_data(header=[0, 1], index_col=[0, 1])[0] - tm.assert_isinstance(df.columns, MultiIndex) - tm.assert_isinstance(df.index, MultiIndex) + tm.assertIsInstance(df.columns, MultiIndex) + tm.assertIsInstance(df.index, MultiIndex) @slow def test_multiindex_header_skiprows_tuples(self): df = self._bank_data(header=[0, 1], skiprows=1, tupleize_cols=True)[0] - tm.assert_isinstance(df.columns, Index) + tm.assertIsInstance(df.columns, Index) @slow def test_multiindex_header_skiprows(self): df = self._bank_data(header=[0, 1], skiprows=1)[0] - tm.assert_isinstance(df.columns, MultiIndex) + tm.assertIsInstance(df.columns, MultiIndex) @slow def test_multiindex_header_index_skiprows(self): df = self._bank_data(header=[0, 1], index_col=[0, 1], skiprows=1)[0] - tm.assert_isinstance(df.index, MultiIndex) - tm.assert_isinstance(df.columns, MultiIndex) + tm.assertIsInstance(df.index, MultiIndex) + tm.assertIsInstance(df.columns, MultiIndex) @slow def test_regex_idempotency(self): @@ -360,9 +360,9 @@ def test_regex_idempotency(self): dfs = self.read_html(file_path_to_url(url), match=re.compile(re.compile('Florida')), attrs={'id': 'table'}) - tm.assert_isinstance(dfs, list) + tm.assertIsInstance(dfs, list) for df in dfs: - tm.assert_isinstance(df, DataFrame) + tm.assertIsInstance(df, DataFrame) def test_negative_skiprows(self): with tm.assertRaisesRegexp(ValueError, @@ -426,10 +426,10 @@ def test_empty_tables(self): res1 = self.read_html(StringIO(data1)) res2 = self.read_html(StringIO(data2)) assert_framelist_equal(res1, res2) - + def test_tfoot_read(self): """ - Make sure that read_html reads tfoot, containing td or th. + Make sure that read_html reads tfoot, containing td or th. Ignores empty tfoot """ data_template = ''' @@ -452,10 +452,10 @@ def test_tfoot_read(self): data1 = data_template.format(footer = "") data2 = data_template.format(footer ="") - + d1 = {'A': ['bodyA'], 'B': ['bodyB']} d2 = {'A': ['bodyA', 'footA'], 'B': ['bodyB', 'footB']} - + tm.assert_frame_equal(self.read_html(data1)[0], DataFrame(d1)) tm.assert_frame_equal(self.read_html(data2)[0], DataFrame(d2)) @@ -540,9 +540,11 @@ def try_remove_ws(x): 'Hamilton Bank, NA', 'The Citizens Savings Bank'] dfnew = df.applymap(try_remove_ws).replace(old, new) gtnew = ground_truth.applymap(try_remove_ws) - converted = dfnew.convert_objects(convert_numeric=True) - tm.assert_frame_equal(converted.convert_objects(convert_dates='coerce'), - gtnew) + converted = dfnew.convert_objects(datetime=True, numeric=True) + date_cols = ['Closing Date','Updated Date'] + converted[date_cols] = converted[date_cols].convert_objects(datetime=True, + coerce=True) + tm.assert_frame_equal(converted,gtnew) @slow def test_gold_canyon(self): @@ -721,8 +723,8 @@ def test_data_fail(self): def test_works_on_valid_markup(self): filename = os.path.join(DATA_PATH, 'valid_markup.html') dfs = self.read_html(filename, index_col=0) - tm.assert_isinstance(dfs, list) - tm.assert_isinstance(dfs[0], DataFrame) + tm.assertIsInstance(dfs, list) + tm.assertIsInstance(dfs[0], DataFrame) @slow def test_fallback_success(self): diff --git a/pandas/io/tests/test_json/test_pandas.py b/pandas/io/tests/test_json/test_pandas.py index c145c717df4c4..66c2bbde0b3f8 100644 --- a/pandas/io/tests/test_json/test_pandas.py +++ b/pandas/io/tests/test_json/test_pandas.py @@ -178,7 +178,10 @@ def _check_orient(df, orient, dtype=None, numpy=False, self.assertTrue(df.columns.equals(unser.columns)) elif orient == "values": # index and cols are not captured in this orientation - assert_almost_equal(df.values, unser.values) + if numpy is True and df.shape == (0, 0): + assert unser.shape[0] == 0 + else: + assert_almost_equal(df.values, unser.values) elif orient == "split": # index and col labels might not be strings unser.index = [str(i) for i in unser.index] @@ -670,15 +673,20 @@ def test_doc_example(self): def test_misc_example(self): # parsing unordered input fails - result = read_json('[{"a": 1, "b": 2}, {"b":2, "a" :1}]',numpy=True) - expected = DataFrame([[1,2],[1,2]],columns=['a','b']) - with tm.assertRaisesRegexp(AssertionError, - '\[index\] left \[.+\], right \[.+\]'): + result = read_json('[{"a": 1, "b": 2}, {"b":2, "a" :1}]', numpy=True) + expected = DataFrame([[1,2], [1,2]], columns=['a', 'b']) + + error_msg = """DataFrame\\.index are different + +DataFrame\\.index values are different \\(100\\.0 %\\) +\\[left\\]: Index\\(\\[u?'a', u?'b'\\], dtype='object'\\) +\\[right\\]: Int64Index\\(\\[0, 1\\], dtype='int64'\\)""" + with tm.assertRaisesRegexp(AssertionError, error_msg): assert_frame_equal(result, expected) result = read_json('[{"a": 1, "b": 2}, {"b":2, "a" :1}]') - expected = DataFrame([[1,2],[1,2]],columns=['a','b']) - assert_frame_equal(result,expected) + expected = DataFrame([[1,2], [1,2]], columns=['a','b']) + assert_frame_equal(result, expected) @network def test_round_trip_exception_(self): @@ -739,3 +747,9 @@ def my_handler_raises(obj): raise TypeError("raisin") self.assertRaises(TypeError, DataFrame({'a': [1, 2, object()]}).to_json, default_handler=my_handler_raises) + + +if __name__ == '__main__': + import nose + nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', + '--pdb-failure', '-s'], exit=False) \ No newline at end of file diff --git a/pandas/io/tests/test_json/test_ujson.py b/pandas/io/tests/test_json/test_ujson.py index fcd5515419537..af0a1da830c83 100644 --- a/pandas/io/tests/test_json/test_ujson.py +++ b/pandas/io/tests/test_json/test_ujson.py @@ -21,8 +21,7 @@ import pandas.compat as compat import numpy as np -from numpy.testing import (assert_array_equal, - assert_array_almost_equal_nulp, +from numpy.testing import (assert_array_almost_equal_nulp, assert_approx_equal) import pytz import dateutil @@ -36,7 +35,7 @@ def _skip_if_python_ver(skip_major, skip_minor=None): raise nose.SkipTest("skipping Python version %d.%d" % (major, minor)) -json_unicode = (json.dumps if sys.version_info[0] >= 3 +json_unicode = (json.dumps if compat.PY3 else partial(json.dumps, encoding="utf-8")) class UltraJSONTests(TestCase): @@ -114,6 +113,9 @@ def test_decimalDecodeTestPrecise(self): self.assertEqual(sut, decoded) def test_encodeDoubleTinyExponential(self): + if compat.is_platform_windows() and not compat.PY3: + raise nose.SkipTest("buggy on win-64 for py2") + num = 1e-40 self.assertEqual(num, ujson.decode(ujson.encode(num))) num = 1e-100 @@ -163,7 +165,7 @@ def test_encodeArrayOfNestedArrays(self): #self.assertEqual(output, json.dumps(input)) self.assertEqual(input, ujson.decode(output)) input = np.array(input) - assert_array_equal(input, ujson.decode(output, numpy=True, dtype=input.dtype)) + tm.assert_numpy_array_equal(input, ujson.decode(output, numpy=True, dtype=input.dtype)) def test_encodeArrayOfDoubles(self): input = [ 31337.31337, 31337.31337, 31337.31337, 31337.31337] * 10 @@ -171,7 +173,7 @@ def test_encodeArrayOfDoubles(self): self.assertEqual(input, json.loads(output)) #self.assertEqual(output, json.dumps(input)) self.assertEqual(input, ujson.decode(output)) - assert_array_equal(np.array(input), ujson.decode(output, numpy=True)) + tm.assert_numpy_array_equal(np.array(input), ujson.decode(output, numpy=True)) def test_doublePrecisionTest(self): input = 30.012345678901234 @@ -268,7 +270,7 @@ def test_encodeArrayInArray(self): self.assertEqual(input, json.loads(output)) self.assertEqual(output, json.dumps(input)) self.assertEqual(input, ujson.decode(output)) - assert_array_equal(np.array(input), ujson.decode(output, numpy=True)) + tm.assert_numpy_array_equal(np.array(input), ujson.decode(output, numpy=True)) pass def test_encodeIntConversion(self): @@ -304,7 +306,7 @@ def test_encodeListConversion(self): output = ujson.encode(input) self.assertEqual(input, json.loads(output)) self.assertEqual(input, ujson.decode(output)) - assert_array_equal(np.array(input), ujson.decode(output, numpy=True)) + tm.assert_numpy_array_equal(np.array(input), ujson.decode(output, numpy=True)) pass def test_encodeDictConversion(self): @@ -673,8 +675,8 @@ def test_encodeListLongConversion(self): output = ujson.encode(input) self.assertEqual(input, json.loads(output)) self.assertEqual(input, ujson.decode(output)) - assert_array_equal(np.array(input), ujson.decode(output, numpy=True, - dtype=np.int64)) + tm.assert_numpy_array_equal(np.array(input), ujson.decode(output, numpy=True, + dtype=np.int64)) pass def test_encodeLongConversion(self): @@ -752,7 +754,7 @@ def test_loadFile(self): f = StringIO("[1,2,3,4]") self.assertEqual([1, 2, 3, 4], ujson.load(f)) f = StringIO("[1,2,3,4]") - assert_array_equal(np.array([1, 2, 3, 4]), ujson.load(f, numpy=True)) + tm.assert_numpy_array_equal(np.array([1, 2, 3, 4]), ujson.load(f, numpy=True)) def test_loadFileLikeObject(self): class filelike: @@ -765,7 +767,7 @@ def read(self): f = filelike() self.assertEqual([1, 2, 3, 4], ujson.load(f)) f = filelike() - assert_array_equal(np.array([1, 2, 3, 4]), ujson.load(f, numpy=True)) + tm.assert_numpy_array_equal(np.array([1, 2, 3, 4]), ujson.load(f, numpy=True)) def test_loadFileArgsError(self): try: @@ -903,7 +905,7 @@ def testBoolArray(self): inpt = np.array([True, False, True, True, False, True, False , False], dtype=np.bool) outp = np.array(ujson.decode(ujson.encode(inpt)), dtype=np.bool) - assert_array_equal(inpt, outp) + tm.assert_numpy_array_equal(inpt, outp) def testInt(self): num = np.int(2562010) @@ -940,7 +942,7 @@ def testIntArray(self): for dtype in dtypes: inpt = arr.astype(dtype) outp = np.array(ujson.decode(ujson.encode(inpt)), dtype=dtype) - assert_array_equal(inpt, outp) + tm.assert_numpy_array_equal(inpt, outp) def testIntMax(self): num = np.int(np.iinfo(np.int).max) @@ -1005,26 +1007,26 @@ def testArrays(self): arr = np.arange(100); arr = arr.reshape((10, 10)) - assert_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) - assert_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) + tm.assert_numpy_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) + tm.assert_numpy_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) arr = arr.reshape((5, 5, 4)) - assert_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) - assert_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) + tm.assert_numpy_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) + tm.assert_numpy_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) arr = arr.reshape((100, 1)) - assert_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) - assert_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) + tm.assert_numpy_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) + tm.assert_numpy_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) arr = np.arange(96); arr = arr.reshape((2, 2, 2, 2, 3, 2)) - assert_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) - assert_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) + tm.assert_numpy_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) + tm.assert_numpy_array_equal(ujson.decode(ujson.encode(arr), numpy=True), arr) l = ['a', list(), dict(), dict(), list(), 42, 97.8, ['a', 'b'], {'key': 'val'}] arr = np.array(l) - assert_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) + tm.assert_numpy_array_equal(np.array(ujson.decode(ujson.encode(arr))), arr) arr = np.arange(100.202, 200.202, 1, dtype=np.float32); arr = arr.reshape((5, 5, 4)) @@ -1129,22 +1131,20 @@ def testArrayNumpyLabelled(self): self.assertTrue(output[1] is None) self.assertTrue((np.array([u('a')]) == output[2]).all()) - # py3 is non-determinstic on the ordering...... - if not compat.PY3: - input = [{'a': 42, 'b':31}, {'a': 24, 'c': 99}, {'a': 2.4, 'b': 78}] - output = ujson.loads(ujson.dumps(input), numpy=True, labelled=True) - expectedvals = np.array([42, 31, 24, 99, 2.4, 78], dtype=int).reshape((3,2)) - self.assertTrue((expectedvals == output[0]).all()) - self.assertTrue(output[1] is None) - self.assertTrue((np.array([u('a'), 'b']) == output[2]).all()) - + # Write out the dump explicitly so there is no dependency on iteration order GH10837 + input_dumps = '[{"a": 42, "b":31}, {"a": 24, "c": 99}, {"a": 2.4, "b": 78}]' + output = ujson.loads(input_dumps, numpy=True, labelled=True) + expectedvals = np.array([42, 31, 24, 99, 2.4, 78], dtype=int).reshape((3, 2)) + self.assertTrue((expectedvals == output[0]).all()) + self.assertTrue(output[1] is None) + self.assertTrue((np.array([u('a'), 'b']) == output[2]).all()) - input = {1: {'a': 42, 'b':31}, 2: {'a': 24, 'c': 99}, 3: {'a': 2.4, 'b': 78}} - output = ujson.loads(ujson.dumps(input), numpy=True, labelled=True) - expectedvals = np.array([42, 31, 24, 99, 2.4, 78], dtype=int).reshape((3,2)) - self.assertTrue((expectedvals == output[0]).all()) - self.assertTrue((np.array(['1','2','3']) == output[1]).all()) - self.assertTrue((np.array(['a', 'b']) == output[2]).all()) + input_dumps = '{"1": {"a": 42, "b":31}, "2": {"a": 24, "c": 99}, "3": {"a": 2.4, "b": 78}}' + output = ujson.loads(input_dumps, numpy=True, labelled=True) + expectedvals = np.array([42, 31, 24, 99, 2.4, 78], dtype=int).reshape((3, 2)) + self.assertTrue((expectedvals == output[0]).all()) + self.assertTrue((np.array(['1', '2', '3']) == output[1]).all()) + self.assertTrue((np.array(['a', 'b']) == output[2]).all()) class PandasJSONTests(TestCase): @@ -1155,19 +1155,19 @@ def testDataFrame(self): # column indexed outp = DataFrame(ujson.decode(ujson.encode(df))) self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) - assert_array_equal(df.index, outp.index) + tm.assert_numpy_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.index, outp.index) dec = _clean_dict(ujson.decode(ujson.encode(df, orient="split"))) outp = DataFrame(**dec) self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) - assert_array_equal(df.index, outp.index) + tm.assert_numpy_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.index, outp.index) outp = DataFrame(ujson.decode(ujson.encode(df, orient="records"))) outp.index = df.index self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.columns, outp.columns) outp = DataFrame(ujson.decode(ujson.encode(df, orient="values"))) outp.index = df.index @@ -1175,8 +1175,8 @@ def testDataFrame(self): outp = DataFrame(ujson.decode(ujson.encode(df, orient="index"))) self.assertTrue((df.transpose() == outp).values.all()) - assert_array_equal(df.transpose().columns, outp.columns) - assert_array_equal(df.transpose().index, outp.index) + tm.assert_numpy_array_equal(df.transpose().columns, outp.columns) + tm.assert_numpy_array_equal(df.transpose().index, outp.index) def testDataFrameNumpy(self): df = DataFrame([[1,2,3], [4,5,6]], index=['a', 'b'], columns=['x', 'y', 'z']) @@ -1184,20 +1184,20 @@ def testDataFrameNumpy(self): # column indexed outp = DataFrame(ujson.decode(ujson.encode(df), numpy=True)) self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) - assert_array_equal(df.index, outp.index) + tm.assert_numpy_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.index, outp.index) dec = _clean_dict(ujson.decode(ujson.encode(df, orient="split"), numpy=True)) outp = DataFrame(**dec) self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) - assert_array_equal(df.index, outp.index) + tm.assert_numpy_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.index, outp.index) outp = DataFrame(ujson.decode(ujson.encode(df, orient="index"), numpy=True)) self.assertTrue((df.transpose() == outp).values.all()) - assert_array_equal(df.transpose().columns, outp.columns) - assert_array_equal(df.transpose().index, outp.index) + tm.assert_numpy_array_equal(df.transpose().columns, outp.columns) + tm.assert_numpy_array_equal(df.transpose().index, outp.index) def testDataFrameNested(self): df = DataFrame([[1,2,3], [4,5,6]], index=['a', 'b'], columns=['x', 'y', 'z']) @@ -1230,18 +1230,18 @@ def testDataFrameNumpyLabelled(self): # column indexed outp = DataFrame(*ujson.decode(ujson.encode(df), numpy=True, labelled=True)) self.assertTrue((df.T == outp).values.all()) - assert_array_equal(df.T.columns, outp.columns) - assert_array_equal(df.T.index, outp.index) + tm.assert_numpy_array_equal(df.T.columns, outp.columns) + tm.assert_numpy_array_equal(df.T.index, outp.index) outp = DataFrame(*ujson.decode(ujson.encode(df, orient="records"), numpy=True, labelled=True)) outp.index = df.index self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.columns, outp.columns) outp = DataFrame(*ujson.decode(ujson.encode(df, orient="index"), numpy=True, labelled=True)) self.assertTrue((df == outp).values.all()) - assert_array_equal(df.columns, outp.columns) - assert_array_equal(df.index, outp.index) + tm.assert_numpy_array_equal(df.columns, outp.columns) + tm.assert_numpy_array_equal(df.index, outp.index) def testSeries(self): s = Series([10, 20, 30, 40, 50, 60], name="series", index=[6,7,8,9,10,15]) diff --git a/pandas/io/tests/test_packers.py b/pandas/io/tests/test_packers.py index 92e0d7ba1a338..1267821086d61 100644 --- a/pandas/io/tests/test_packers.py +++ b/pandas/io/tests/test_packers.py @@ -1,5 +1,6 @@ import nose +import os import datetime import numpy as np import sys @@ -11,7 +12,7 @@ date_range, period_range, Index, SparseSeries, SparseDataFrame, SparsePanel) import pandas.util.testing as tm -from pandas.util.testing import ensure_clean +from pandas.util.testing import ensure_clean, assert_index_equal from pandas.tests.test_series import assert_series_equal from pandas.tests.test_frame import assert_frame_equal from pandas.tests.test_panel import assert_panel_equal @@ -39,6 +40,8 @@ def check_arbitrary(a, b): assert_frame_equal(a, b) elif isinstance(a, Series): assert_series_equal(a, b) + elif isinstance(a, Index): + assert_index_equal(a, b) else: assert(a == b) @@ -51,9 +54,9 @@ def setUp(self): def tearDown(self): pass - def encode_decode(self, x, **kwargs): + def encode_decode(self, x, compress=None, **kwargs): with ensure_clean(self.path) as p: - to_msgpack(p, x, **kwargs) + to_msgpack(p, x, compress=compress, **kwargs) return read_msgpack(p, **kwargs) class TestAPI(TestPackers): @@ -93,6 +96,17 @@ def test_iterator_with_string_io(self): for i, result in enumerate(read_msgpack(s,iterator=True)): tm.assert_frame_equal(result,dfs[i]) + def test_invalid_arg(self): + #GH10369 + class A(object): + def __init__(self): + self.read = 0 + + tm.assertRaises(ValueError, read_msgpack, path_or_buf=None) + tm.assertRaises(ValueError, read_msgpack, path_or_buf={}) + tm.assertRaises(ValueError, read_msgpack, path_or_buf=A()) + + class TestNumpy(TestPackers): def test_numpy_scalar_float(self): @@ -385,6 +399,24 @@ def tests_datetimeindex_freq_issue(self): result = self.encode_decode(df) assert_frame_equal(result, df) + def test_dataframe_duplicate_column_names(self): + + # GH 9618 + expected_1 = DataFrame(columns=['a', 'a']) + expected_2 = DataFrame(columns=[1]*100) + expected_2.loc[0] = np.random.randn(100) + expected_3 = DataFrame(columns=[1, 1]) + expected_3.loc[0] = ['abc', np.nan] + + result_1 = self.encode_decode(expected_1) + result_2 = self.encode_decode(expected_2) + result_3 = self.encode_decode(expected_3) + + assert_frame_equal(result_1, expected_1) + assert_frame_equal(result_2, expected_2) + assert_frame_equal(result_3, expected_3) + + class TestSparse(TestPackers): def _check_roundtrip(self, obj, comparator, **kwargs): @@ -485,6 +517,100 @@ def test_compression_blosc(self): assert_frame_equal(self.frame[k], i_rec[k]) +class TestEncoding(TestPackers): + def setUp(self): + super(TestEncoding, self).setUp() + data = { + 'A': [compat.u('\u2019')] * 1000, + 'B': np.arange(1000, dtype=np.int32), + 'C': list(100 * 'abcdefghij'), + 'D': date_range(datetime.datetime(2015, 4, 1), periods=1000), + 'E': [datetime.timedelta(days=x) for x in range(1000)], + 'G': [400] * 1000 + } + self.frame = { + 'float': DataFrame(dict((k, data[k]) for k in ['A', 'A'])), + 'int': DataFrame(dict((k, data[k]) for k in ['B', 'B'])), + 'mixed': DataFrame(data), + } + self.utf_encodings = ['utf8', 'utf16', 'utf32'] + + def test_utf(self): + # GH10581 + for encoding in self.utf_encodings: + for frame in compat.itervalues(self.frame): + result = self.encode_decode(frame, encoding=encoding) + assert_frame_equal(result, frame) + + +class TestMsgpack(): + """ + How to add msgpack tests: + + 1. Install pandas version intended to output the msgpack. +TestPackers + 2. Execute "generate_legacy_storage_files.py" to create the msgpack. + $ python generate_legacy_storage_files.py msgpack + + 3. Move the created pickle to "data/legacy_msgpack/" directory. + + NOTE: TestMsgpack can't be a subclass of tm.Testcase to use test generator. + http://stackoverflow.com/questions/6689537/nose-test-generators-inside-class + """ + def setUp(self): + from pandas.io.tests.generate_legacy_storage_files import ( + create_msgpack_data, create_data) + self.data = create_msgpack_data() + self.all_data = create_data() + self.path = u('__%s__.msgpack' % tm.rands(10)) + self.minimum_structure = {'series': ['float', 'int', 'mixed', 'ts', 'mi', 'dup'], + 'frame': ['float', 'int', 'mixed', 'mi'], + 'panel': ['float'], + 'index': ['int', 'date', 'period'], + 'mi': ['reg2']} + + def check_min_structure(self, data): + for typ, v in self.minimum_structure.items(): + assert typ in data, '"{0}" not found in unpacked data'.format(typ) + for kind in v: + assert kind in data[typ], '"{0}" not found in data["{1}"]'.format(kind, typ) + + def compare(self, vf): + data = read_msgpack(vf) + self.check_min_structure(data) + for typ, dv in data.items(): + assert typ in self.all_data, 'unpacked data contains extra key "{0}"'.format(typ) + for dt, result in dv.items(): + assert dt in self.all_data[typ], 'data["{0}"] contains extra key "{1}"'.format(typ, dt) + try: + expected = self.data[typ][dt] + except KeyError: + continue + check_arbitrary(result, expected) + + return data + + def read_msgpacks(self, version): + + pth = tm.get_data_path('legacy_msgpack/{0}'.format(str(version))) + n = 0 + for f in os.listdir(pth): + vf = os.path.join(pth, f) + self.compare(vf) + n += 1 + assert n > 0, 'Msgpack files are not tested' + + def test_msgpack(self): + msgpack_path = tm.get_data_path('legacy_msgpack') + n = 0 + for v in os.listdir(msgpack_path): + pth = os.path.join(msgpack_path, v) + if os.path.isdir(pth): + yield self.read_msgpacks, v + n += 1 + assert n > 0, 'Msgpack files are not tested' + + if __name__ == '__main__': import nose nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], diff --git a/pandas/io/tests/test_parsers.py b/pandas/io/tests/test_parsers.py index 4c040252ee3cb..ed261edad4f20 100755 --- a/pandas/io/tests/test_parsers.py +++ b/pandas/io/tests/test_parsers.py @@ -33,7 +33,6 @@ import pandas.tseries.tools as tools from numpy.testing.decorators import slow -from numpy.testing import assert_array_equal import pandas.parser @@ -163,7 +162,7 @@ def test_empty_string(self): def test_read_csv(self): if not compat.PY3: - if 'win' in sys.platform: + if compat.is_platform_windows(): prefix = u("file:///") else: prefix = u("file://") @@ -276,7 +275,7 @@ def test_squeeze(self): expected = Series([1, 2, 3], name=1, index=idx) result = self.read_table(StringIO(data), sep=',', index_col=0, header=None, squeeze=True) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_series_equal(result, expected) def test_squeeze_no_view(self): @@ -747,7 +746,7 @@ def test_default_na_values(self): _NA_VALUES = set(['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A','N/A', 'NA', '#NA', 'NULL', 'NaN', 'nan', '-NaN', '-nan', '#N/A N/A','']) - assert_array_equal (_NA_VALUES, parsers._NA_VALUES) + self.assertEqual(_NA_VALUES, parsers._NA_VALUES) nv = len(_NA_VALUES) def f(i, v): if i == 0: @@ -1016,7 +1015,7 @@ def test_parse_dates_column_list(self): expected['aux_date'] = to_datetime(expected['aux_date'], dayfirst=True) expected['aux_date'] = lmap(Timestamp, expected['aux_date']) - tm.assert_isinstance(expected['aux_date'][0], datetime) + tm.assertIsInstance(expected['aux_date'][0], datetime) df = self.read_csv(StringIO(data), sep=";", index_col=lrange(4), parse_dates=[0, 5], dayfirst=True) @@ -1117,7 +1116,7 @@ def test_read_csv_infer_compression(self): def test_read_table_unicode(self): fin = BytesIO(u('\u0141aski, Jan;1').encode('utf-8')) df1 = read_table(fin, sep=";", encoding="utf-8", header=None) - tm.assert_isinstance(df1[0].values[0], compat.text_type) + tm.assertIsInstance(df1[0].values[0], compat.text_type) def test_read_table_wrong_num_columns(self): # too few! @@ -1300,7 +1299,7 @@ def test_iterator(self): treader = self.read_table(StringIO(self.data1), sep=',', index_col=0, iterator=True) - tm.assert_isinstance(treader, TextFileReader) + tm.assertIsInstance(treader, TextFileReader) # stopping iteration when on chunksize is specified, GH 3967 data = """A,B,C @@ -1601,7 +1600,7 @@ def test_converters(self): expected = self.read_csv(StringIO(data)) expected['D'] = expected['D'].map(parse_date) - tm.assert_isinstance(result['D'][0], (datetime, Timestamp)) + tm.assertIsInstance(result['D'][0], (datetime, Timestamp)) tm.assert_frame_equal(result, expected) tm.assert_frame_equal(result2, expected) @@ -2301,6 +2300,81 @@ def test_empty_with_index(self): expected = DataFrame([], columns=['y'], index=Index([], name='x')) tm.assert_frame_equal(result, expected) + def test_emtpy_with_multiindex(self): + # GH 10467 + data = 'x,y,z' + result = self.read_csv(StringIO(data), index_col=['x', 'y']) + expected = DataFrame([], columns=['z'], + index=MultiIndex.from_arrays([[]] * 2, names=['x', 'y'])) + tm.assert_frame_equal(result, expected) + + def test_empty_with_reversed_multiindex(self): + data = 'x,y,z' + result = self.read_csv(StringIO(data), index_col=[1, 0]) + expected = DataFrame([], columns=['z'], + index=MultiIndex.from_arrays([[]] * 2, names=['y', 'x'])) + tm.assert_frame_equal(result, expected) + + def test_empty_index_col_scenarios(self): + data = 'x,y,z' + + # None, no index + index_col, expected = None, DataFrame([], columns=list('xyz')), + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # False, no index + index_col, expected = False, DataFrame([], columns=list('xyz')), + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # int, first column + index_col, expected = 0, DataFrame([], columns=['y', 'z'], index=Index([], name='x')) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # int, not first column + index_col, expected = 1, DataFrame([], columns=['x', 'z'], index=Index([], name='y')) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # str, first column + index_col, expected = 'x', DataFrame([], columns=['y', 'z'], index=Index([], name='x')) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # str, not the first column + index_col, expected = 'y', DataFrame([], columns=['x', 'z'], index=Index([], name='y')) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # list of int + index_col, expected = [0, 1], DataFrame([], columns=['z'], + index=MultiIndex.from_arrays([[]] * 2, names=['x', 'y'])) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # list of str + index_col, expected = ( + ['x', 'y'], + DataFrame([], columns=['z'], index=MultiIndex.from_arrays([[]] * 2, names=['x', 'y'])) + ) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # list of int, reversed sequence + index_col, expected = ( + [1, 0], + DataFrame([], columns=['z'], index=MultiIndex.from_arrays([[]] * 2, names=['y', 'x'])) + ) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + # list of str, reversed sequence + index_col, expected = ( + ['y', 'x'], + DataFrame([], columns=['z'], index=MultiIndex.from_arrays([[]] * 2, names=['y', 'x'])) + ) + tm.assert_frame_equal(self.read_csv(StringIO(data), index_col=index_col), expected) + + def test_empty_with_index_col_false(self): + # GH 10413 + data = 'x,y' + result = self.read_csv(StringIO(data), index_col=False) + expected = DataFrame([], columns=['x', 'y']) + tm.assert_frame_equal(result, expected) + def test_float_parser(self): # GH 9565 data = '45e-1,4.5,45.,inf,-inf' @@ -2341,6 +2415,94 @@ def test_int64_overflow(self): expected = pd.DataFrame([str(x)]) tm.assert_frame_equal(result, expected) + def test_empty_with_nrows_chunksize(self): + # GH 9535 + expected = pd.DataFrame([], columns=['foo', 'bar']) + + result = self.read_csv(StringIO('foo,bar\n'), nrows=10) + tm.assert_frame_equal(result, expected) + + result = next(iter(pd.read_csv(StringIO('foo,bar\n'), chunksize=10))) + tm.assert_frame_equal(result, expected) + + result = pd.read_csv(StringIO('foo,bar\n'), nrows=10, as_recarray=True) + result = pd.DataFrame(result[2], columns=result[1], index=result[0]) + tm.assert_frame_equal(pd.DataFrame.from_records(result), expected) + + result = next(iter(pd.read_csv(StringIO('foo,bar\n'), chunksize=10, as_recarray=True))) + result = pd.DataFrame(result[2], columns=result[1], index=result[0]) + tm.assert_frame_equal(pd.DataFrame.from_records(result), expected) + + def test_eof_states(self): + # GH 10728 and 10548 + + ## With skip_blank_lines = True + expected = pd.DataFrame([[4, 5, 6]], columns=['a', 'b', 'c']) + + # GH 10728 + # WHITESPACE_LINE + data = 'a,b,c\n4,5,6\n ' + result = self.read_csv(StringIO(data)) + tm.assert_frame_equal(result, expected) + + # GH 10548 + # EAT_LINE_COMMENT + data = 'a,b,c\n4,5,6\n#comment' + result = self.read_csv(StringIO(data), comment='#') + tm.assert_frame_equal(result, expected) + + # EAT_CRNL_NOP + data = 'a,b,c\n4,5,6\n\r' + result = self.read_csv(StringIO(data)) + tm.assert_frame_equal(result, expected) + + # EAT_COMMENT + data = 'a,b,c\n4,5,6#comment' + result = self.read_csv(StringIO(data), comment='#') + tm.assert_frame_equal(result, expected) + + # SKIP_LINE + data = 'a,b,c\n4,5,6\nskipme' + result = self.read_csv(StringIO(data), skiprows=[2]) + tm.assert_frame_equal(result, expected) + + ## With skip_blank_lines = False + + # EAT_LINE_COMMENT + data = 'a,b,c\n4,5,6\n#comment' + result = self.read_csv(StringIO(data), comment='#', skip_blank_lines=False) + expected = pd.DataFrame([[4, 5, 6]], columns=['a', 'b', 'c']) + tm.assert_frame_equal(result, expected) + + # IN_FIELD + data = 'a,b,c\n4,5,6\n ' + result = self.read_csv(StringIO(data), skip_blank_lines=False) + expected = pd.DataFrame([['4', 5, 6], [' ', None, None]], columns=['a', 'b', 'c']) + tm.assert_frame_equal(result, expected) + + # EAT_CRNL + data = 'a,b,c\n4,5,6\n\r' + result = self.read_csv(StringIO(data), skip_blank_lines=False) + expected = pd.DataFrame([[4, 5, 6], [None, None, None]], columns=['a', 'b', 'c']) + tm.assert_frame_equal(result, expected) + + ## Should produce exceptions + + # ESCAPED_CHAR + data = "a,b,c\n4,5,6\n\\" + self.assertRaises(Exception, self.read_csv, StringIO(data), escapechar='\\') + + # ESCAPE_IN_QUOTED_FIELD + data = 'a,b,c\n4,5,6\n"\\' + self.assertRaises(Exception, self.read_csv, StringIO(data), escapechar='\\') + + # IN_QUOTED_FIELD + # Python 2.6 won't throw an exception for this case (see http://bugs.python.org/issue16013) + tm._skip_if_python26() + data = 'a,b,c\n4,5,6\n"' + self.assertRaises(Exception, self.read_csv, StringIO(data), escapechar='\\') + + class TestPythonParser(ParserTests, tm.TestCase): def test_negative_skipfooter_raises(self): @@ -2579,6 +2741,25 @@ def test_fwf_regression(self): res = df.loc[:,c] self.assertTrue(len(res)) + def test_fwf_for_uint8(self): + data = """1421302965.213420 PRI=3 PGN=0xef00 DST=0x17 SRC=0x28 04 154 00 00 00 00 00 127 +1421302964.226776 PRI=6 PGN=0xf002 SRC=0x47 243 00 00 255 247 00 00 71""" + df = read_fwf(StringIO(data), + colspecs=[(0,17),(25,26),(33,37),(49,51),(58,62),(63,1000)], + names=['time','pri','pgn','dst','src','data'], + converters={ + 'pgn':lambda x: int(x,16), + 'src':lambda x: int(x,16), + 'dst':lambda x: int(x,16), + 'data':lambda x: len(x.split(' '))}) + + expected = DataFrame([[1421302965.213420,3,61184,23,40,8], + [1421302964.226776,6,61442,None, 71,8]], + columns = ["time", "pri", "pgn", "dst", "src","data"]) + expected["dst"] = expected["dst"].astype(object) + + tm.assert_frame_equal(df, expected) + def test_fwf_compression(self): try: import gzip @@ -2727,7 +2908,7 @@ def test_iterator(self): treader = self.read_table(StringIO(self.data1), sep=',', index_col=0, iterator=True) - tm.assert_isinstance(treader, TextFileReader) + tm.assertIsInstance(treader, TextFileReader) # stopping iteration when on chunksize is specified, GH 3967 data = """A,B,C @@ -2995,6 +3176,7 @@ def test_whitespace_lines(self): df = self.read_csv(StringIO(data)) tm.assert_almost_equal(df.values, expected) + class TestFwfColspaceSniffing(tm.TestCase): def test_full_file(self): # File with all values @@ -3110,6 +3292,9 @@ def read_table(self, *args, **kwds): return read_table(*args, **kwds) def test_compact_ints(self): + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64, only when all tests are run") + data = ('0,1,0,0\n' '1,1,0,0\n' '0,1,0,1') @@ -3421,6 +3606,25 @@ def test_compact_ints(self): '1,1,0,0\n' '0,1,0,1') + result = read_csv(StringIO(data), delimiter=',', header=None, + compact_ints=True) + ex_dtype = np.dtype([(str(i), 'i1') for i in range(4)]) + self.assertEqual(result.to_records(index=False).dtype, ex_dtype) + + result = read_csv(StringIO(data), delimiter=',', header=None, + compact_ints=True, + use_unsigned=True) + ex_dtype = np.dtype([(str(i), 'u1') for i in range(4)]) + self.assertEqual(result.to_records(index=False).dtype, ex_dtype) + + def test_compact_ints_as_recarray(self): + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64, only when all tests are run") + + data = ('0,1,0,0\n' + '1,1,0,0\n' + '0,1,0,1') + result = read_csv(StringIO(data), delimiter=',', header=None, compact_ints=True, as_recarray=True) ex_dtype = np.dtype([(str(i), 'i1') for i in range(4)]) @@ -3460,17 +3664,91 @@ def test_pass_dtype(self): 3,4.5 4,5.5""" + result = self.read_csv(StringIO(data), dtype={'one': 'u1', 1: 'S1'}) + self.assertEqual(result['one'].dtype, 'u1') + self.assertEqual(result['two'].dtype, 'object') + + def test_pass_dtype_as_recarray(self): + data = """\ +one,two +1,2.5 +2,3.5 +3,4.5 +4,5.5""" + + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64, only when all tests are run") + result = self.read_csv(StringIO(data), dtype={'one': 'u1', 1: 'S1'}, as_recarray=True) self.assertEqual(result['one'].dtype, 'u1') self.assertEqual(result['two'].dtype, 'S1') + def test_empty_pass_dtype(self): + data = 'one,two' + result = self.read_csv(StringIO(data), dtype={'one': 'u1'}) + + expected = DataFrame({'one': np.empty(0, dtype='u1'), + 'two': np.empty(0, dtype=np.object)}) + tm.assert_frame_equal(result, expected) + + def test_empty_with_index_pass_dtype(self): + data = 'one,two' + result = self.read_csv(StringIO(data), index_col=['one'], + dtype={'one': 'u1', 1: 'f'}) + + expected = DataFrame({'two': np.empty(0, dtype='f')}, + index=Index([], dtype='u1', name='one')) + tm.assert_frame_equal(result, expected) + + def test_empty_with_multiindex_pass_dtype(self): + data = 'one,two,three' + result = self.read_csv(StringIO(data), index_col=['one', 'two'], + dtype={'one': 'u1', 1: 'f8'}) + + expected = DataFrame({'three': np.empty(0, dtype=np.object)}, index=MultiIndex.from_arrays( + [np.empty(0, dtype='u1'), np.empty(0, dtype='O')], + names=['one', 'two']) + ) + tm.assert_frame_equal(result, expected) + + def test_empty_with_mangled_column_pass_dtype_by_names(self): + data = 'one,one' + result = self.read_csv(StringIO(data), dtype={'one': 'u1', 'one.1': 'f'}) + + expected = DataFrame({'one': np.empty(0, dtype='u1'), 'one.1': np.empty(0, dtype='f')}) + tm.assert_frame_equal(result, expected) + + def test_empty_with_mangled_column_pass_dtype_by_indexes(self): + data = 'one,one' + result = self.read_csv(StringIO(data), dtype={0: 'u1', 1: 'f'}) + + expected = DataFrame({'one': np.empty(0, dtype='u1'), 'one.1': np.empty(0, dtype='f')}) + tm.assert_frame_equal(result, expected) + + def test_empty_with_dup_column_pass_dtype_by_names(self): + data = 'one,one' + result = self.read_csv(StringIO(data), mangle_dupe_cols=False, dtype={'one': 'u1'}) + expected = pd.concat([Series([], name='one', dtype='u1')] * 2, axis=1) + tm.assert_frame_equal(result, expected) + + def test_empty_with_dup_column_pass_dtype_by_indexes(self): + ### FIXME in GH9424 + raise nose.SkipTest("GH 9424; known failure read_csv with duplicate columns") + + data = 'one,one' + result = self.read_csv(StringIO(data), mangle_dupe_cols=False, dtype={0: 'u1', 1: 'f'}) + expected = pd.concat([Series([], name='one', dtype='u1'), + Series([], name='one', dtype='f')], axis=1) + tm.assert_frame_equal(result, expected) + def test_usecols_dtypes(self): data = """\ 1,2,3 4,5,6 7,8,9 10,11,12""" + result = self.read_csv(StringIO(data), usecols=(0, 1, 2), names=('a', 'b', 'c'), header=None, @@ -3927,6 +4205,25 @@ def test_convert_sql_column_decimals(self): assert_same_values_and_dtype(result, expected) +class TestUrlGz(tm.TestCase): + def setUp(self): + dirpath = tm.get_data_path() + localtable = os.path.join(dirpath, 'salary.table') + self.local_table = read_table(localtable) + + @tm.network + def test_url_gz(self): + url = 'https://raw.github.com/pydata/pandas/master/pandas/io/tests/data/salary.table.gz' + url_table = read_table(url, compression="gzip", engine="python") + tm.assert_frame_equal(url_table, self.local_table) + + @tm.network + def test_url_gz_infer(self): + url = ('https://s3.amazonaws.com/pandas-test/salary.table.gz') + url_table = read_table(url, compression="infer", engine="python") + tm.assert_frame_equal(url_table, self.local_table) + + class TestS3(tm.TestCase): def setUp(self): try: @@ -3942,6 +4239,12 @@ def test_parse_public_s3_bucket(self): nt.assert_false(df.empty) tm.assert_frame_equal(pd.read_csv(tm.get_data_path('tips.csv')), df) + # Read public file from bucket with not-public contents + df = pd.read_csv('s3://cant_get_it/tips.csv') + nt.assert_true(isinstance(df, pd.DataFrame)) + nt.assert_false(df.empty) + tm.assert_frame_equal(pd.read_csv(tm.get_data_path('tips.csv')), df) + @tm.network def test_s3_fails(self): import boto @@ -3949,9 +4252,11 @@ def test_s3_fails(self): 'S3ResponseError: 404 Not Found'): pd.read_csv('s3://nyqpug/asdf.csv') + # Receive a permission error when trying to read a private bucket. + # It's irrelevant here that this isn't actually a table. with tm.assertRaisesRegexp(boto.exception.S3ResponseError, - 'S3ResponseError: 403 Forbidden'): - pd.read_csv('s3://cant_get_it/tips.csv') + 'S3ResponseError: 403 Forbidden'): + pd.read_csv('s3://cant_get_it/') def assert_same_values_and_dtype(res, exp): diff --git a/pandas/io/tests/test_pickle.py b/pandas/io/tests/test_pickle.py index d1396463f3b23..e691fac215002 100644 --- a/pandas/io/tests/test_pickle.py +++ b/pandas/io/tests/test_pickle.py @@ -24,8 +24,8 @@ class TestPickle(): 1. Install pandas version intended to output the pickle. - 2. Execute "generate_legacy_pkcles.py" to create the pickle. - $ python generate_legacy_pickles.py + 2. Execute "generate_legacy_storage_files.py" to create the pickle. + $ python generate_legacy_storage_files.py pickle 3. Move the created pickle to "data/legacy_pickle/" directory. @@ -35,8 +35,8 @@ class TestPickle(): _multiprocess_can_split_ = True def setUp(self): - from pandas.io.tests.generate_legacy_pickles import create_data - self.data = create_data() + from pandas.io.tests.generate_legacy_storage_files import create_pickle_data + self.data = create_pickle_data() self.path = u('__%s__.pickle' % tm.rands(10)) def compare_element(self, typ, result, expected): diff --git a/pandas/io/tests/test_pytables.py b/pandas/io/tests/test_pytables.py index 6aaeb6652f2b6..210852d83094f 100644 --- a/pandas/io/tests/test_pytables.py +++ b/pandas/io/tests/test_pytables.py @@ -131,18 +131,18 @@ def compat_assert_produces_warning(w,f): f() -class TestHDFStore(tm.TestCase): +class Base(tm.TestCase): @classmethod def setUpClass(cls): - super(TestHDFStore, cls).setUpClass() + super(Base, cls).setUpClass() # Pytables 3.0.0 deprecates lots of things tm.reset_testing_mode() @classmethod def tearDownClass(cls): - super(TestHDFStore, cls).tearDownClass() + super(Base, cls).tearDownClass() # Pytables 3.0.0 deprecates lots of things tm.set_testing_mode() @@ -155,6 +155,9 @@ def setUp(self): def tearDown(self): pass + +class TestHDFStore(Base): + def test_factory_fun(self): path = create_tempfile(self.path) try: @@ -400,7 +403,7 @@ def test_repr(self): df['datetime1'] = datetime.datetime(2001,1,2,0,0) df['datetime2'] = datetime.datetime(2001,1,3,0,0) df.ix[3:6,['obj1']] = np.nan - df = df.consolidate().convert_objects() + df = df.consolidate().convert_objects(datetime=True) warnings.filterwarnings('ignore', category=PerformanceWarning) store['df'] = df @@ -725,7 +728,7 @@ def test_put_mixed_type(self): df['datetime1'] = datetime.datetime(2001, 1, 2, 0, 0) df['datetime2'] = datetime.datetime(2001, 1, 3, 0, 0) df.ix[3:6, ['obj1']] = np.nan - df = df.consolidate().convert_objects() + df = df.consolidate().convert_objects(datetime=True) with ensure_clean_store(self.path) as store: _maybe_remove(store, 'df') @@ -1037,6 +1040,28 @@ def test_append_all_nans(self): store.append('df2', df[10:], dropna=False) tm.assert_frame_equal(store['df2'], df) + # Test to make sure defaults are to not drop. + # Corresponding to Issue 9382 + df_with_missing = DataFrame({'col1':[0, np.nan, 2], 'col2':[1, np.nan, np.nan]}) + + with ensure_clean_path(self.path) as path: + df_with_missing.to_hdf(path, 'df_with_missing', format = 'table') + reloaded = read_hdf(path, 'df_with_missing') + tm.assert_frame_equal(df_with_missing, reloaded) + + matrix = [[[np.nan, np.nan, np.nan],[1,np.nan,np.nan]], + [[np.nan, np.nan, np.nan], [np.nan,5,6]], + [[np.nan, np.nan, np.nan],[np.nan,3,np.nan]]] + + panel_with_missing = Panel(matrix, items=['Item1', 'Item2','Item3'], + major_axis=[1,2], + minor_axis=['A', 'B', 'C']) + + with ensure_clean_path(self.path) as path: + panel_with_missing.to_hdf(path, 'panel_with_missing', format='table') + reloaded_panel = read_hdf(path, 'panel_with_missing') + tm.assert_panel_equal(panel_with_missing, reloaded_panel) + def test_append_frame_column_oriented(self): with ensure_clean_store(self.path) as store: @@ -1378,7 +1403,7 @@ def check_col(key,name,size): df_dc.ix[7:9, 'string'] = 'bar' df_dc['string2'] = 'cool' df_dc['datetime'] = Timestamp('20010102') - df_dc = df_dc.convert_objects() + df_dc = df_dc.convert_objects(datetime=True) df_dc.ix[3:5, ['A', 'B', 'datetime']] = np.nan _maybe_remove(store, 'df_dc') @@ -1840,7 +1865,7 @@ def test_table_mixed_dtypes(self): df['datetime1'] = datetime.datetime(2001, 1, 2, 0, 0) df['datetime2'] = datetime.datetime(2001, 1, 3, 0, 0) df.ix[3:6, ['obj1']] = np.nan - df = df.consolidate().convert_objects() + df = df.consolidate().convert_objects(datetime=True) with ensure_clean_store(self.path) as store: store.append('df1_mixed', df) @@ -1896,7 +1921,7 @@ def test_unimplemented_dtypes_table_columns(self): df['obj1'] = 'foo' df['obj2'] = 'bar' df['datetime1'] = datetime.date(2001, 1, 2) - df = df.consolidate().convert_objects() + df = df.consolidate().convert_objects(datetime=True) with ensure_clean_store(self.path) as store: # this fails because we have a date in the object block...... @@ -2067,9 +2092,8 @@ def test_store_timezone(self): # GH2852 # issue storing datetime.date with a timezone as it resets when read back in a new timezone - import platform - if platform.system() == "Windows": - raise nose.SkipTest("timezone setting not supported on windows") + # timezone setting not supported on windows + tm._skip_if_windows() import datetime import time @@ -3766,7 +3790,7 @@ def f(): # valid result = store.select_column('df', 'index') tm.assert_almost_equal(result.values, Series(df.index).values) - self.assertIsInstance(result,Series) + self.assertIsInstance(result, Series) # not a data indexable column self.assertRaises( @@ -3806,6 +3830,14 @@ def f(): result = store.select_column('df3', 'string', start=-2, stop=2) tm.assert_almost_equal(result.values, df3['string'].values[-2:2]) + # GH 10392 - make sure column name is preserved + df4 = DataFrame({'A': np.random.randn(10), 'B': 'foo'}) + store.append('df4', df4, data_columns=True) + expected = df4['B'] + result = store.select_column('df4', 'B') + tm.assert_series_equal(result, expected) + + def test_coordinates(self): df = tm.makeTimeDataFrame() @@ -4724,6 +4756,156 @@ def test_invalid_complib(self): columns=list('ABCDE')) with ensure_clean_path(self.path) as path: self.assertRaises(ValueError, df.to_hdf, path, 'df', complib='blosc:zlib') + # GH10443 + def test_read_nokey(self): + df = DataFrame(np.random.rand(4, 5), + index=list('abcd'), + columns=list('ABCDE')) + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df', mode='a') + reread = read_hdf(path) + assert_frame_equal(df, reread) + df.to_hdf(path, 'df2', mode='a') + self.assertRaises(ValueError, read_hdf, path) + + +class TestHDFComplexValues(Base): + # GH10447 + def test_complex_fixed(self): + df = DataFrame(np.random.rand(4, 5).astype(np.complex64), + index=list('abcd'), + columns=list('ABCDE')) + + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + df = DataFrame(np.random.rand(4, 5).astype(np.complex128), + index=list('abcd'), + columns=list('ABCDE')) + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + def test_complex_table(self): + df = DataFrame(np.random.rand(4, 5).astype(np.complex64), + index=list('abcd'), + columns=list('ABCDE')) + + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df', format='table') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + df = DataFrame(np.random.rand(4, 5).astype(np.complex128), + index=list('abcd'), + columns=list('ABCDE')) + + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df', format='table', mode='w') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + def test_complex_mixed_fixed(self): + complex64 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j], dtype=np.complex64) + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j], + dtype=np.complex128) + df = DataFrame({'A': [1, 2, 3, 4], + 'B': ['a', 'b', 'c', 'd'], + 'C': complex64, + 'D': complex128, + 'E': [1.0, 2.0, 3.0, 4.0]}, + index=list('abcd')) + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + def test_complex_mixed_table(self): + complex64 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j], dtype=np.complex64) + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j], + dtype=np.complex128) + df = DataFrame({'A': [1, 2, 3, 4], + 'B': ['a', 'b', 'c', 'd'], + 'C': complex64, + 'D': complex128, + 'E': [1.0, 2.0, 3.0, 4.0]}, + index=list('abcd')) + + with ensure_clean_store(self.path) as store: + store.append('df', df, data_columns=['A', 'B']) + result = store.select('df', where=Term('A>2')) + assert_frame_equal(df.loc[df.A > 2], result) + + with ensure_clean_path(self.path) as path: + df.to_hdf(path, 'df', format='table') + reread = read_hdf(path, 'df') + assert_frame_equal(df, reread) + + def test_complex_across_dimensions_fixed(self): + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j]) + s = Series(complex128, index=list('abcd')) + df = DataFrame({'A': s, 'B': s}) + p = Panel({'One': df, 'Two': df}) + + objs = [s, df, p] + comps = [tm.assert_series_equal, tm.assert_frame_equal, + tm.assert_panel_equal] + for obj, comp in zip(objs, comps): + with ensure_clean_path(self.path) as path: + obj.to_hdf(path, 'obj', format='fixed') + reread = read_hdf(path, 'obj') + comp(obj, reread) + + def test_complex_across_dimensions(self): + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j]) + s = Series(complex128, index=list('abcd')) + df = DataFrame({'A': s, 'B': s}) + p = Panel({'One': df, 'Two': df}) + p4d = pd.Panel4D({'i': p, 'ii': p}) + + objs = [df, p, p4d] + comps = [tm.assert_frame_equal, tm.assert_panel_equal, + tm.assert_panel4d_equal] + for obj, comp in zip(objs, comps): + with ensure_clean_path(self.path) as path: + obj.to_hdf(path, 'obj', format='table') + reread = read_hdf(path, 'obj') + comp(obj, reread) + + def test_complex_indexing_error(self): + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j], + dtype=np.complex128) + df = DataFrame({'A': [1, 2, 3, 4], + 'B': ['a', 'b', 'c', 'd'], + 'C': complex128}, + index=list('abcd')) + with ensure_clean_store(self.path) as store: + self.assertRaises(TypeError, store.append, 'df', df, data_columns=['C']) + + def test_complex_series_error(self): + complex128 = np.array([1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j, 1.0 + 1.0j]) + s = Series(complex128, index=list('abcd')) + + with ensure_clean_path(self.path) as path: + self.assertRaises(TypeError, s.to_hdf, path, 'obj', format='t') + + with ensure_clean_path(self.path) as path: + s.to_hdf(path, 'obj', format='t', index=False) + reread = read_hdf(path, 'obj') + tm.assert_series_equal(s, reread) + + def test_complex_append(self): + df = DataFrame({'a': np.random.randn(100).astype(np.complex128), + 'b': np.random.randn(100)}) + + with ensure_clean_store(self.path) as store: + store.append('df', df, data_columns=['b']) + store.append('df', df) + result = store.select('df') + assert_frame_equal(pd.concat([df, df], 0), result) def _test_sort(obj): if isinstance(obj, DataFrame): diff --git a/pandas/io/tests/test_sas.py b/pandas/io/tests/test_sas.py new file mode 100644 index 0000000000000..0e08252fdce97 --- /dev/null +++ b/pandas/io/tests/test_sas.py @@ -0,0 +1,112 @@ +import pandas as pd +import pandas.util.testing as tm +from pandas import compat +from pandas.io.sas import XportReader, read_sas +import numpy as np +import os + +# CSV versions of test XPT files were obtained using the R foreign library + +# Numbers in a SAS xport file are always float64, so need to convert +# before making comparisons. +def numeric_as_float(data): + for v in data.columns: + if data[v].dtype is np.dtype('int64'): + data[v] = data[v].astype(np.float64) + + +class TestXport(tm.TestCase): + + def setUp(self): + self.dirpath = tm.get_data_path() + self.file01 = os.path.join(self.dirpath, "DEMO_G.XPT") + self.file02 = os.path.join(self.dirpath, "SSHSV1_A.XPT") + self.file03 = os.path.join(self.dirpath, "DRXFCD_G.XPT") + + + def test1(self): + # Tests with DEMO_G.XPT (all numeric file) + + # Compare to this + data_csv = pd.read_csv(self.file01.replace(".XPT", ".csv")) + numeric_as_float(data_csv) + + # Read full file + data = XportReader(self.file01).read() + tm.assert_frame_equal(data, data_csv) + + # Test incremental read with `read` method. + reader = XportReader(self.file01) + data = reader.read(10) + tm.assert_frame_equal(data, data_csv.iloc[0:10, :]) + + # Test incremental read with `get_chunk` method. + reader = XportReader(self.file01, chunksize=10) + data = reader.get_chunk() + tm.assert_frame_equal(data, data_csv.iloc[0:10, :]) + + # Read full file with `read_sas` method + data = read_sas(self.file01) + tm.assert_frame_equal(data, data_csv) + + + def test1_index(self): + # Tests with DEMO_G.XPT using index (all numeric file) + + # Compare to this + data_csv = pd.read_csv(self.file01.replace(".XPT", ".csv")) + data_csv = data_csv.set_index("SEQN") + numeric_as_float(data_csv) + + # Read full file + data = XportReader(self.file01, index="SEQN").read() + tm.assert_frame_equal(data, data_csv) + + # Test incremental read with `read` method. + reader = XportReader(self.file01, index="SEQN") + data = reader.read(10) + tm.assert_frame_equal(data, data_csv.iloc[0:10, :]) + + # Test incremental read with `get_chunk` method. + reader = XportReader(self.file01, index="SEQN", chunksize=10) + data = reader.get_chunk() + tm.assert_frame_equal(data, data_csv.iloc[0:10, :]) + + + def test1_incremental(self): + # Test with DEMO_G.XPT, reading full file incrementally + + data_csv = pd.read_csv(self.file01.replace(".XPT", ".csv")) + data_csv = data_csv.set_index("SEQN") + numeric_as_float(data_csv) + + reader = XportReader(self.file01, index="SEQN", chunksize=1000) + + all_data = [x for x in reader] + data = pd.concat(all_data, axis=0) + + tm.assert_frame_equal(data, data_csv) + + + def test2(self): + # Test with SSHSV1_A.XPT + + # Compare to this + data_csv = pd.read_csv(self.file02.replace(".XPT", ".csv")) + numeric_as_float(data_csv) + + data = XportReader(self.file02).read() + tm.assert_frame_equal(data, data_csv) + + + def test3(self): + # Test with DRXFCD_G.XPT (contains text and numeric variables) + + # Compare to this + data_csv = pd.read_csv(self.file03.replace(".XPT", ".csv")) + + data = XportReader(self.file03).read() + tm.assert_frame_equal(data, data_csv) + + data = read_sas(self.file03) + tm.assert_frame_equal(data, data_csv) diff --git a/pandas/io/tests/test_sql.py b/pandas/io/tests/test_sql.py index 33ea63ba41f1f..619de8d6bad3b 100644 --- a/pandas/io/tests/test_sql.py +++ b/pandas/io/tests/test_sql.py @@ -9,7 +9,8 @@ - `TestSQLiteFallbackApi`: test the public API with a sqlite DBAPI connection - Tests for the different SQL flavors (flavor specific type conversions) - Tests for the sqlalchemy mode: `_TestSQLAlchemy` is the base class with - common methods, the different tested flavors (sqlite3, MySQL, PostgreSQL) + common methods, `_TestSQLAlchemyConn` tests the API with a SQLAlchemy + Connection object. The different tested flavors (sqlite3, MySQL, PostgreSQL) derive from the base class - Tests for the fallback mode (`TestSQLiteFallback` and `TestMySQLLegacy`) @@ -43,6 +44,8 @@ import sqlalchemy import sqlalchemy.schema import sqlalchemy.sql.sqltypes as sqltypes + from sqlalchemy.ext import declarative + from sqlalchemy.orm import session as sa_session SQLALCHEMY_INSTALLED = True except ImportError: SQLALCHEMY_INSTALLED = False @@ -158,19 +161,74 @@ SELECT * FROM iris WHERE "Name"=%(name)s AND "SepalLength"=%(length)s """ + }, + 'create_view': { + 'sqlite': """ + CREATE VIEW iris_view AS + SELECT * FROM iris + """ } } +class MixInBase(object): + def tearDown(self): + for tbl in self._get_all_tables(): + self.drop_table(tbl) + self._close_conn() + + +class MySQLMixIn(MixInBase): + def drop_table(self, table_name): + cur = self.conn.cursor() + cur.execute("DROP TABLE IF EXISTS %s" % sql._get_valid_mysql_name(table_name)) + self.conn.commit() + + def _get_all_tables(self): + cur = self.conn.cursor() + cur.execute('SHOW TABLES') + return [table[0] for table in cur.fetchall()] + + def _close_conn(self): + from pymysql.err import Error + try: + self.conn.close() + except Error: + pass + + +class SQLiteMixIn(MixInBase): + def drop_table(self, table_name): + self.conn.execute("DROP TABLE IF EXISTS %s" % sql._get_valid_sqlite_name(table_name)) + self.conn.commit() + + def _get_all_tables(self): + c = self.conn.execute("SELECT name FROM sqlite_master WHERE type='table'") + return [table[0] for table in c.fetchall()] + + def _close_conn(self): + self.conn.close() + + +class SQLAlchemyMixIn(MixInBase): + def drop_table(self, table_name): + sql.SQLDatabase(self.conn).drop_table(table_name) + + def _get_all_tables(self): + meta = sqlalchemy.schema.MetaData(bind=self.conn) + meta.reflect() + table_list = meta.tables.keys() + return table_list + + def _close_conn(self): + pass + class PandasSQLTest(unittest.TestCase): """ Base class with common private methods for SQLAlchemy and fallback cases. """ - def drop_table(self, table_name): - self._get_exec().execute("DROP TABLE IF EXISTS %s" % table_name) - def _get_exec(self): if hasattr(self.conn, 'execute'): return self.conn @@ -192,6 +250,10 @@ def _load_iris_data(self): for row in r: self._get_exec().execute(ins, row) + def _load_iris_view(self): + self.drop_table('iris_view') + self._get_exec().execute(SQL_STRINGS['create_view'][self.flavor]) + def _check_iris_loaded_frame(self, iris_frame): pytype = iris_frame.dtypes[0].type row = iris_frame.iloc[0] @@ -430,6 +492,7 @@ class _TestSQLApi(PandasSQLTest): def setUp(self): self.conn = self.connect() self._load_iris_data() + self._load_iris_view() self._load_test1_data() self._load_test2_data() self._load_test3_data() @@ -440,6 +503,11 @@ def test_read_sql_iris(self): "SELECT * FROM iris", self.conn) self._check_iris_loaded_frame(iris_frame) + def test_read_sql_view(self): + iris_frame = sql.read_sql_query( + "SELECT * FROM iris_view", self.conn) + self._check_iris_loaded_frame(iris_frame) + def test_legacy_read_frame(self): with tm.assert_produces_warning(FutureWarning): iris_frame = sql.read_frame( @@ -703,6 +771,19 @@ def test_get_schema_dtypes(self): self.assertTrue('CREATE' in create_sql) self.assertTrue('INTEGER' in create_sql) + def test_get_schema_keys(self): + frame = DataFrame({'Col1':[1.1,1.2], 'Col2':[2.1,2.2]}) + create_sql = sql.get_schema(frame, 'test', 'sqlite', + con=self.conn, keys='Col1') + constraint_sentence = 'CONSTRAINT test_pk PRIMARY KEY ("Col1")' + self.assertTrue(constraint_sentence in create_sql) + + # multiple columns as key (GH10385) + create_sql = sql.get_schema(self.test_frame1, 'test', 'sqlite', + con=self.conn, keys=['A', 'B']) + constraint_sentence = 'CONSTRAINT test_pk PRIMARY KEY ("A", "B")' + self.assertTrue(constraint_sentence in create_sql) + def test_chunksize_read(self): df = DataFrame(np.random.randn(22, 5), columns=list('abcde')) df.to_sql('test_chunksize', self.conn, index=False) @@ -752,7 +833,7 @@ def test_categorical(self): tm.assert_frame_equal(res, df) -class TestSQLApi(_TestSQLApi): +class TestSQLApi(SQLAlchemyMixIn, _TestSQLApi): """ Test the public API as it would be used directly @@ -853,8 +934,51 @@ def test_sqlalchemy_type_mapping(self): table = sql.SQLTable("test_type", db, frame=df) self.assertTrue(isinstance(table.table.c['time'].type, sqltypes.DateTime)) + def test_to_sql_read_sql_with_database_uri(self): -class TestSQLiteFallbackApi(_TestSQLApi): + # Test read_sql and .to_sql method with a database URI (GH10654) + test_frame1 = self.test_frame1 + #db_uri = 'sqlite:///:memory:' # raises sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "iris": syntax error [SQL: 'iris'] + with tm.ensure_clean() as name: + db_uri = 'sqlite:///' + name + table = 'iris' + test_frame1.to_sql(table, db_uri, if_exists='replace', index=False) + test_frame2 = sql.read_sql(table, db_uri) + test_frame3 = sql.read_sql_table(table, db_uri) + query = 'SELECT * FROM iris' + test_frame4 = sql.read_sql_query(query, db_uri) + tm.assert_frame_equal(test_frame1, test_frame2) + tm.assert_frame_equal(test_frame1, test_frame3) + tm.assert_frame_equal(test_frame1, test_frame4) + + +class _EngineToConnMixin(object): + """ + A mixin that causes setup_connect to create a conn rather than an engine. + """ + + def setUp(self): + super(_EngineToConnMixin, self).setUp() + engine = self.conn + conn = engine.connect() + self.__tx = conn.begin() + self.pandasSQL = sql.SQLDatabase(conn) + self.__engine = engine + self.conn = conn + + def tearDown(self): + self.__tx.rollback() + self.conn.close() + self.conn = self.__engine + self.pandasSQL = sql.SQLDatabase(self.__engine) + super(_EngineToConnMixin, self).tearDown() + + +class TestSQLApiConn(_EngineToConnMixin, TestSQLApi): + pass + + +class TestSQLiteFallbackApi(SQLiteMixIn, _TestSQLApi): """ Test the public sqlite connection fallback API @@ -937,7 +1061,7 @@ def test_sqlite_type_mapping(self): #--- Database flavor specific tests -class _TestSQLAlchemy(PandasSQLTest): +class _TestSQLAlchemy(SQLAlchemyMixIn, PandasSQLTest): """ Base class for testing the sqlalchemy backend. @@ -990,9 +1114,6 @@ def setup_connect(self): except sqlalchemy.exc.OperationalError: raise nose.SkipTest("Can't connect to {0} server".format(self.flavor)) - def tearDown(self): - raise NotImplementedError() - def test_aread_sql(self): self._read_sql_iris() @@ -1166,7 +1287,7 @@ def test_datetime_NaT(self): result = sql.read_sql_query('SELECT * FROM test_datetime', self.conn) if self.flavor == 'sqlite': self.assertTrue(isinstance(result.loc[0, 'A'], string_types)) - result['A'] = to_datetime(result['A'], coerce=True) + result['A'] = to_datetime(result['A'], errors='coerce') tm.assert_frame_equal(result, df) else: tm.assert_frame_equal(result, df) @@ -1346,9 +1467,58 @@ def test_double_precision(self): self.assertTrue(isinstance(col_dict['i32'].type, sqltypes.Integer)) self.assertTrue(isinstance(col_dict['i64'].type, sqltypes.BigInteger)) + def test_connectable_issue_example(self): + # This tests the example raised in issue + # https://github.com/pydata/pandas/issues/10104 + + def foo(connection): + query = 'SELECT test_foo_data FROM test_foo_data' + return sql.read_sql_query(query, con=connection) + + def bar(connection, data): + data.to_sql(name='test_foo_data', con=connection, if_exists='append') + + def main(connectable): + with connectable.connect() as conn: + with conn.begin(): + foo_data = conn.run_callable(foo) + conn.run_callable(bar, foo_data) + + DataFrame({'test_foo_data': [0, 1, 2]}).to_sql('test_foo_data', self.conn) + main(self.conn) + + def test_temporary_table(self): + test_data = u'Hello, World!' + expected = DataFrame({'spam': [test_data]}) + Base = declarative.declarative_base() + + class Temporary(Base): + __tablename__ = 'temp_test' + __table_args__ = {'prefixes': ['TEMPORARY']} + id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) + spam = sqlalchemy.Column(sqlalchemy.Unicode(30), nullable=False) + + Session = sa_session.sessionmaker(bind=self.conn) + session = Session() + with session.transaction: + conn = session.connection() + Temporary.__table__.create(conn) + session.add(Temporary(spam=test_data)) + session.flush() + df = sql.read_sql_query( + sql=sqlalchemy.select([Temporary.spam]), + con=conn, + ) + + tm.assert_frame_equal(df, expected) -class TestSQLiteAlchemy(_TestSQLAlchemy): +class _TestSQLAlchemyConn(_EngineToConnMixin, _TestSQLAlchemy): + def test_transactions(self): + raise nose.SkipTest("Nested transactions rollbacks don't work with Pandas") + + +class _TestSQLiteAlchemy(object): """ Test the sqlalchemy backend against an in-memory sqlite database. @@ -1364,10 +1534,6 @@ def setup_driver(cls): # sqlite3 is built-in cls.driver = None - def tearDown(self): - # in memory so tables should not be removed explicitly - pass - def test_default_type_conversion(self): df = sql.read_sql_table("types_test_data", self.conn) @@ -1404,7 +1570,7 @@ def test_bigint_warning(self): self.assertEqual(len(w), 0, "Warning triggered for other table") -class TestMySQLAlchemy(_TestSQLAlchemy): +class _TestMySQLAlchemy(object): """ Test the sqlalchemy backend against an MySQL database. @@ -1424,11 +1590,6 @@ def setup_driver(cls): except ImportError: raise nose.SkipTest('pymysql not installed') - def tearDown(self): - c = self.conn.execute('SHOW TABLES') - for table in c.fetchall(): - self.conn.execute('DROP TABLE %s' % table[0]) - def test_default_type_conversion(self): df = sql.read_sql_table("types_test_data", self.conn) @@ -1478,7 +1639,7 @@ def test_read_procedure(self): tm.assert_frame_equal(df, res2) -class TestPostgreSQLAlchemy(_TestSQLAlchemy): +class _TestPostgreSQLAlchemy(object): """ Test the sqlalchemy backend against an PostgreSQL database. @@ -1498,13 +1659,6 @@ def setup_driver(cls): except ImportError: raise nose.SkipTest('psycopg2 not installed') - def tearDown(self): - c = self.conn.execute( - "SELECT table_name FROM information_schema.tables" - " WHERE table_schema = 'public'") - for table in c.fetchall(): - self.conn.execute("DROP TABLE %s" % table[0]) - def test_schema_support(self): # only test this for postgresql (schema's not supported in mysql/sqlite) df = DataFrame({'col1':[1, 2], 'col2':[0.1, 0.2], 'col3':['a', 'n']}) @@ -1550,15 +1704,18 @@ def test_schema_support(self): ## specifying schema in user-provided meta - engine2 = self.connect() - meta = sqlalchemy.MetaData(engine2, schema='other') - pdsql = sql.SQLDatabase(engine2, meta=meta) - pdsql.to_sql(df, 'test_schema_other2', index=False) - pdsql.to_sql(df, 'test_schema_other2', index=False, if_exists='replace') - pdsql.to_sql(df, 'test_schema_other2', index=False, if_exists='append') - res1 = sql.read_sql_table('test_schema_other2', self.conn, schema='other') - res2 = pdsql.read_table('test_schema_other2') - tm.assert_frame_equal(res1, res2) + # The schema won't be applied on another Connection + # because of transactional schemas + if isinstance(self.conn, sqlalchemy.engine.Engine): + engine2 = self.connect() + meta = sqlalchemy.MetaData(engine2, schema='other') + pdsql = sql.SQLDatabase(engine2, meta=meta) + pdsql.to_sql(df, 'test_schema_other2', index=False) + pdsql.to_sql(df, 'test_schema_other2', index=False, if_exists='replace') + pdsql.to_sql(df, 'test_schema_other2', index=False, if_exists='append') + res1 = sql.read_sql_table('test_schema_other2', self.conn, schema='other') + res2 = pdsql.read_table('test_schema_other2') + tm.assert_frame_equal(res1, res2) def test_datetime_with_time_zone(self): # Test to see if we read the date column with timezones that @@ -1574,10 +1731,35 @@ def test_datetime_with_time_zone(self): # "2000-06-01 00:00:00-07:00" should convert to "2000-06-01 07:00:00" self.assertEqual(df.DateColWithTz[1], Timestamp('2000-06-01 07:00:00')) + +class TestMySQLAlchemy(_TestMySQLAlchemy, _TestSQLAlchemy): + pass + + +class TestMySQLAlchemyConn(_TestMySQLAlchemy, _TestSQLAlchemyConn): + pass + + +class TestPostgreSQLAlchemy(_TestPostgreSQLAlchemy, _TestSQLAlchemy): + pass + + +class TestPostgreSQLAlchemyConn(_TestPostgreSQLAlchemy, _TestSQLAlchemyConn): + pass + + +class TestSQLiteAlchemy(_TestSQLiteAlchemy, _TestSQLAlchemy): + pass + + +class TestSQLiteAlchemyConn(_TestSQLiteAlchemy, _TestSQLAlchemyConn): + pass + + #------------------------------------------------------------------------------ #--- Test Sqlite / MySQL fallback -class TestSQLiteFallback(PandasSQLTest): +class TestSQLiteFallback(SQLiteMixIn, PandasSQLTest): """ Test the fallback mode against an in-memory sqlite database. @@ -1588,11 +1770,6 @@ class TestSQLiteFallback(PandasSQLTest): def connect(cls): return sqlite3.connect(':memory:') - def drop_table(self, table_name): - cur = self.conn.cursor() - cur.execute("DROP TABLE IF EXISTS %s" % table_name) - self.conn.commit() - def setUp(self): self.conn = self.connect() self.pandasSQL = sql.SQLiteDatabase(self.conn, 'sqlite') @@ -1739,7 +1916,7 @@ def test_illegal_names(self): for ndx, weird_name in enumerate(['test_weird_name]','test_weird_name[', 'test_weird_name`','test_weird_name"', 'test_weird_name\'', '_b.test_weird_name_01-30', '"_b.test_weird_name_01-30"', - '12345','12345blah']): + '99beginswithnumber', '12345']): df.to_sql(weird_name, self.conn, flavor=self.flavor) sql.table_exists(weird_name, self.conn) @@ -1749,7 +1926,7 @@ def test_illegal_names(self): sql.table_exists(c_tbl, self.conn) -class TestMySQLLegacy(TestSQLiteFallback): +class TestMySQLLegacy(MySQLMixIn, TestSQLiteFallback): """ Test the legacy mode against a MySQL database. @@ -1778,11 +1955,6 @@ def setup_driver(cls): def connect(cls): return cls.driver.connect(host='127.0.0.1', user='root', passwd='', db='pandas_nosetest') - def drop_table(self, table_name): - cur = self.conn.cursor() - cur.execute("DROP TABLE IF EXISTS %s" % table_name) - self.conn.commit() - def _count_rows(self, table_name): cur = self._get_exec() cur.execute( @@ -1801,14 +1973,6 @@ def setUp(self): self._load_iris_data() self._load_test1_data() - def tearDown(self): - c = self.conn.cursor() - c.execute('SHOW TABLES') - for table in c.fetchall(): - c.execute('DROP TABLE %s' % table[0]) - self.conn.commit() - self.conn.close() - def test_a_deprecation(self): with tm.assert_produces_warning(FutureWarning): sql.to_sql(self.test_frame1, 'test_frame1', self.conn, @@ -1846,14 +2010,10 @@ def test_illegal_names(self): for ndx, ok_name in enumerate(['99beginswithnumber','12345']): df.to_sql(ok_name, self.conn, flavor=self.flavor, index=False, if_exists='replace') - self.conn.cursor().execute("DROP TABLE `%s`" % ok_name) - self.conn.commit() df2 = DataFrame([[1, 2], [3, 4]], columns=['a', ok_name]) - c_tbl = 'test_ok_col_name%d'%ndx - df2.to_sql(c_tbl, self.conn, flavor=self.flavor, index=False, - if_exists='replace') - self.conn.cursor().execute("DROP TABLE `%s`" % c_tbl) - self.conn.commit() + + df2.to_sql('test_ok_col_name', self.conn, flavor=self.flavor, index=False, + if_exists='replace') # For MySQL, these should raise ValueError for ndx, illegal_name in enumerate(['test_illegal_name]','test_illegal_name[', @@ -1862,8 +2022,7 @@ def test_illegal_names(self): flavor=self.flavor, index=False) df2 = DataFrame([[1, 2], [3, 4]], columns=['a', illegal_name]) - c_tbl = 'test_illegal_col_name%d'%ndx - self.assertRaises(ValueError, df2.to_sql, c_tbl, + self.assertRaises(ValueError, df2.to_sql, 'test_illegal_col_name%d'%ndx, self.conn, flavor=self.flavor, index=False) @@ -1905,10 +2064,10 @@ def _skip_if_no_pymysql(): raise nose.SkipTest('pymysql not installed, skipping') -class TestXSQLite(tm.TestCase): +class TestXSQLite(SQLiteMixIn, tm.TestCase): def setUp(self): - self.db = sqlite3.connect(':memory:') + self.conn = sqlite3.connect(':memory:') def test_basic(self): frame = tm.makeTimeDataFrame() @@ -1919,34 +2078,34 @@ def test_write_row_by_row(self): frame = tm.makeTimeDataFrame() frame.ix[0, 0] = np.nan create_sql = sql.get_schema(frame, 'test', 'sqlite') - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(create_sql) - cur = self.db.cursor() + cur = self.conn.cursor() ins = "INSERT INTO test VALUES (%s, %s, %s, %s)" for idx, row in frame.iterrows(): fmt_sql = format_query(ins, *row) sql.tquery(fmt_sql, cur=cur) - self.db.commit() + self.conn.commit() - result = sql.read_frame("select * from test", con=self.db) + result = sql.read_frame("select * from test", con=self.conn) result.index = frame.index tm.assert_frame_equal(result, frame) def test_execute(self): frame = tm.makeTimeDataFrame() create_sql = sql.get_schema(frame, 'test', 'sqlite') - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(create_sql) ins = "INSERT INTO test VALUES (?, ?, ?, ?)" row = frame.ix[0] - sql.execute(ins, self.db, params=tuple(row)) - self.db.commit() + sql.execute(ins, self.conn, params=tuple(row)) + self.conn.commit() - result = sql.read_frame("select * from test", self.db) + result = sql.read_frame("select * from test", self.conn) result.index = frame.index[:1] tm.assert_frame_equal(result, frame[:1]) @@ -1962,8 +2121,8 @@ def test_schema(self): frame = tm.makeTimeDataFrame() create_sql = sql.get_schema(frame, 'test', 'sqlite', keys=['A', 'B'],) lines = create_sql.splitlines() - self.assertTrue('PRIMARY KEY ("A","B")' in create_sql) - cur = self.db.cursor() + self.assertTrue('PRIMARY KEY ("A", "B")' in create_sql) + cur = self.conn.cursor() cur.execute(create_sql) def test_execute_fail(self): @@ -1976,17 +2135,17 @@ def test_execute_fail(self): PRIMARY KEY (a, b) ); """ - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(create_sql) - sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.db) - sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.db) + sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn) + sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.conn) try: sys.stdout = StringIO() self.assertRaises(Exception, sql.execute, 'INSERT INTO test VALUES("foo", "bar", 7)', - self.db) + self.conn) finally: sys.stdout = sys.__stdout__ @@ -2000,24 +2159,27 @@ def test_execute_closed_connection(self): PRIMARY KEY (a, b) ); """ - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(create_sql) - sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.db) - self.db.close() + sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn) + self.conn.close() try: sys.stdout = StringIO() self.assertRaises(Exception, sql.tquery, "select * from test", - con=self.db) + con=self.conn) finally: sys.stdout = sys.__stdout__ + # Initialize connection again (needed for tearDown) + self.setUp() + def test_na_roundtrip(self): pass def _check_roundtrip(self, frame): - sql.write_frame(frame, name='test_table', con=self.db) - result = sql.read_frame("select * from test_table", self.db) + sql.write_frame(frame, name='test_table', con=self.conn) + result = sql.read_frame("select * from test_table", self.conn) # HACK! Change this once indexes are handled properly. result.index = frame.index @@ -2028,8 +2190,8 @@ def _check_roundtrip(self, frame): frame['txt'] = ['a'] * len(frame) frame2 = frame.copy() frame2['Idx'] = Index(lrange(len(frame2))) + 10 - sql.write_frame(frame2, name='test_table2', con=self.db) - result = sql.read_frame("select * from test_table2", self.db, + sql.write_frame(frame2, name='test_table2', con=self.conn) + result = sql.read_frame("select * from test_table2", self.conn, index_col='Idx') expected = frame.copy() expected.index = Index(lrange(len(frame2))) + 10 @@ -2038,8 +2200,8 @@ def _check_roundtrip(self, frame): def test_tquery(self): frame = tm.makeTimeDataFrame() - sql.write_frame(frame, name='test_table', con=self.db) - result = sql.tquery("select A from test_table", self.db) + sql.write_frame(frame, name='test_table', con=self.conn) + result = sql.tquery("select A from test_table", self.conn) expected = Series(frame.A.values, frame.index) # not to have name result = Series(result, frame.index) tm.assert_series_equal(result, expected) @@ -2047,27 +2209,27 @@ def test_tquery(self): try: sys.stdout = StringIO() self.assertRaises(sql.DatabaseError, sql.tquery, - 'select * from blah', con=self.db) + 'select * from blah', con=self.conn) self.assertRaises(sql.DatabaseError, sql.tquery, - 'select * from blah', con=self.db, retry=True) + 'select * from blah', con=self.conn, retry=True) finally: sys.stdout = sys.__stdout__ def test_uquery(self): frame = tm.makeTimeDataFrame() - sql.write_frame(frame, name='test_table', con=self.db) + sql.write_frame(frame, name='test_table', con=self.conn) stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)' - self.assertEqual(sql.uquery(stmt, con=self.db), 1) + self.assertEqual(sql.uquery(stmt, con=self.conn), 1) try: sys.stdout = StringIO() self.assertRaises(sql.DatabaseError, sql.tquery, - 'insert into blah values (1)', con=self.db) + 'insert into blah values (1)', con=self.conn) self.assertRaises(sql.DatabaseError, sql.tquery, - 'insert into blah values (1)', con=self.db, + 'insert into blah values (1)', con=self.conn, retry=True) finally: sys.stdout = sys.__stdout__ @@ -2076,16 +2238,16 @@ def test_keyword_as_column_names(self): ''' ''' df = DataFrame({'From':np.ones(5)}) - sql.write_frame(df, con = self.db, name = 'testkeywords') + sql.write_frame(df, con = self.conn, name = 'testkeywords') def test_onecolumn_of_integer(self): # GH 3628 # a column_of_integers dataframe should transfer well to sql mono_df=DataFrame([1 , 2], columns=['c0']) - sql.write_frame(mono_df, con = self.db, name = 'mono_df') + sql.write_frame(mono_df, con = self.conn, name = 'mono_df') # computing the sum via sql - con_x=self.db + con_x=self.conn the_sum=sum([my_c0[0] for my_c0 in con_x.execute("select * from mono_df")]) # it should not fail, and gives 3 ( Issue #3628 ) self.assertEqual(the_sum , 3) @@ -2104,56 +2266,53 @@ def clean_up(test_table_to_drop): Drops tables created from individual tests so no dependencies arise from sequential tests """ - if sql.table_exists(test_table_to_drop, self.db, flavor='sqlite'): - cur = self.db.cursor() - cur.execute("DROP TABLE %s" % test_table_to_drop) - cur.close() + self.drop_table(test_table_to_drop) # test if invalid value for if_exists raises appropriate error self.assertRaises(ValueError, sql.write_frame, frame=df_if_exists_1, - con=self.db, + con=self.conn, name=table_name, flavor='sqlite', if_exists='notvalidvalue') clean_up(table_name) # test if_exists='fail' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='sqlite', if_exists='fail') self.assertRaises(ValueError, sql.write_frame, frame=df_if_exists_1, - con=self.db, + con=self.conn, name=table_name, flavor='sqlite', if_exists='fail') # test if_exists='replace' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='sqlite', if_exists='replace') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B')]) - sql.write_frame(frame=df_if_exists_2, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name, flavor='sqlite', if_exists='replace') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(3, 'C'), (4, 'D'), (5, 'E')]) clean_up(table_name) # test if_exists='append' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='sqlite', if_exists='fail') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B')]) - sql.write_frame(frame=df_if_exists_2, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name, flavor='sqlite', if_exists='append') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')]) clean_up(table_name) -class TestXMySQL(tm.TestCase): +class TestXMySQL(MySQLMixIn, tm.TestCase): @classmethod def setUpClass(cls): @@ -2190,14 +2349,14 @@ def setUp(self): try: # Try Travis defaults. # No real user should allow root access with a blank password. - self.db = pymysql.connect(host='localhost', user='root', passwd='', + self.conn = pymysql.connect(host='localhost', user='root', passwd='', db='pandas_nosetest') except: pass else: return try: - self.db = pymysql.connect(read_default_group='pandas') + self.conn = pymysql.connect(read_default_group='pandas') except pymysql.ProgrammingError as e: raise nose.SkipTest( "Create a group of connection parameters under the heading " @@ -2210,12 +2369,6 @@ def setUp(self): "[pandas] in your system's mysql default file, " "typically located at ~/.my.cnf or /etc/.my.cnf. ") - def tearDown(self): - from pymysql.err import Error - try: - self.db.close() - except Error: - pass def test_basic(self): _skip_if_no_pymysql() @@ -2229,7 +2382,7 @@ def test_write_row_by_row(self): frame.ix[0, 0] = np.nan drop_sql = "DROP TABLE IF EXISTS test" create_sql = sql.get_schema(frame, 'test', 'mysql') - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(drop_sql) cur.execute(create_sql) ins = "INSERT INTO test VALUES (%s, %s, %s, %s)" @@ -2237,9 +2390,9 @@ def test_write_row_by_row(self): fmt_sql = format_query(ins, *row) sql.tquery(fmt_sql, cur=cur) - self.db.commit() + self.conn.commit() - result = sql.read_frame("select * from test", con=self.db) + result = sql.read_frame("select * from test", con=self.conn) result.index = frame.index tm.assert_frame_equal(result, frame) @@ -2248,7 +2401,7 @@ def test_execute(self): frame = tm.makeTimeDataFrame() drop_sql = "DROP TABLE IF EXISTS test" create_sql = sql.get_schema(frame, 'test', 'mysql') - cur = self.db.cursor() + cur = self.conn.cursor() with warnings.catch_warnings(): warnings.filterwarnings("ignore", "Unknown table.*") cur.execute(drop_sql) @@ -2256,10 +2409,10 @@ def test_execute(self): ins = "INSERT INTO test VALUES (%s, %s, %s, %s)" row = frame.ix[0].values.tolist() - sql.execute(ins, self.db, params=tuple(row)) - self.db.commit() + sql.execute(ins, self.conn, params=tuple(row)) + self.conn.commit() - result = sql.read_frame("select * from test", self.db) + result = sql.read_frame("select * from test", self.conn) result.index = frame.index[:1] tm.assert_frame_equal(result, frame[:1]) @@ -2277,8 +2430,8 @@ def test_schema(self): drop_sql = "DROP TABLE IF EXISTS test" create_sql = sql.get_schema(frame, 'test', 'mysql', keys=['A', 'B'],) lines = create_sql.splitlines() - self.assertTrue('PRIMARY KEY (`A`,`B`)' in create_sql) - cur = self.db.cursor() + self.assertTrue('PRIMARY KEY (`A`, `B`)' in create_sql) + cur = self.conn.cursor() cur.execute(drop_sql) cur.execute(create_sql) @@ -2294,18 +2447,18 @@ def test_execute_fail(self): PRIMARY KEY (a(5), b(5)) ); """ - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(drop_sql) cur.execute(create_sql) - sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.db) - sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.db) + sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn) + sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.conn) try: sys.stdout = StringIO() self.assertRaises(Exception, sql.execute, 'INSERT INTO test VALUES("foo", "bar", 7)', - self.db) + self.conn) finally: sys.stdout = sys.__stdout__ @@ -2321,19 +2474,23 @@ def test_execute_closed_connection(self): PRIMARY KEY (a(5), b(5)) ); """ - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(drop_sql) cur.execute(create_sql) - sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.db) - self.db.close() + sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn) + self.conn.close() try: sys.stdout = StringIO() self.assertRaises(Exception, sql.tquery, "select * from test", - con=self.db) + con=self.conn) finally: sys.stdout = sys.__stdout__ + # Initialize connection again (needed for tearDown) + self.setUp() + + def test_na_roundtrip(self): _skip_if_no_pymysql() pass @@ -2341,12 +2498,12 @@ def test_na_roundtrip(self): def _check_roundtrip(self, frame): _skip_if_no_pymysql() drop_sql = "DROP TABLE IF EXISTS test_table" - cur = self.db.cursor() + cur = self.conn.cursor() with warnings.catch_warnings(): warnings.filterwarnings("ignore", "Unknown table.*") cur.execute(drop_sql) - sql.write_frame(frame, name='test_table', con=self.db, flavor='mysql') - result = sql.read_frame("select * from test_table", self.db) + sql.write_frame(frame, name='test_table', con=self.conn, flavor='mysql') + result = sql.read_frame("select * from test_table", self.conn) # HACK! Change this once indexes are handled properly. result.index = frame.index @@ -2360,12 +2517,12 @@ def _check_roundtrip(self, frame): index = Index(lrange(len(frame2))) + 10 frame2['Idx'] = index drop_sql = "DROP TABLE IF EXISTS test_table2" - cur = self.db.cursor() + cur = self.conn.cursor() with warnings.catch_warnings(): warnings.filterwarnings("ignore", "Unknown table.*") cur.execute(drop_sql) - sql.write_frame(frame2, name='test_table2', con=self.db, flavor='mysql') - result = sql.read_frame("select * from test_table2", self.db, + sql.write_frame(frame2, name='test_table2', con=self.conn, flavor='mysql') + result = sql.read_frame("select * from test_table2", self.conn, index_col='Idx') expected = frame.copy() @@ -2381,10 +2538,10 @@ def test_tquery(self): raise nose.SkipTest("no pymysql") frame = tm.makeTimeDataFrame() drop_sql = "DROP TABLE IF EXISTS test_table" - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(drop_sql) - sql.write_frame(frame, name='test_table', con=self.db, flavor='mysql') - result = sql.tquery("select A from test_table", self.db) + sql.write_frame(frame, name='test_table', con=self.conn, flavor='mysql') + result = sql.tquery("select A from test_table", self.conn) expected = Series(frame.A.values, frame.index) # not to have name result = Series(result, frame.index) tm.assert_series_equal(result, expected) @@ -2392,10 +2549,10 @@ def test_tquery(self): try: sys.stdout = StringIO() self.assertRaises(sql.DatabaseError, sql.tquery, - 'select * from blah', con=self.db) + 'select * from blah', con=self.conn) self.assertRaises(sql.DatabaseError, sql.tquery, - 'select * from blah', con=self.db, retry=True) + 'select * from blah', con=self.conn, retry=True) finally: sys.stdout = sys.__stdout__ @@ -2406,20 +2563,20 @@ def test_uquery(self): raise nose.SkipTest("no pymysql") frame = tm.makeTimeDataFrame() drop_sql = "DROP TABLE IF EXISTS test_table" - cur = self.db.cursor() + cur = self.conn.cursor() cur.execute(drop_sql) - sql.write_frame(frame, name='test_table', con=self.db, flavor='mysql') + sql.write_frame(frame, name='test_table', con=self.conn, flavor='mysql') stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)' - self.assertEqual(sql.uquery(stmt, con=self.db), 1) + self.assertEqual(sql.uquery(stmt, con=self.conn), 1) try: sys.stdout = StringIO() self.assertRaises(sql.DatabaseError, sql.tquery, - 'insert into blah values (1)', con=self.db) + 'insert into blah values (1)', con=self.conn) self.assertRaises(sql.DatabaseError, sql.tquery, - 'insert into blah values (1)', con=self.db, + 'insert into blah values (1)', con=self.conn, retry=True) finally: sys.stdout = sys.__stdout__ @@ -2429,7 +2586,7 @@ def test_keyword_as_column_names(self): ''' _skip_if_no_pymysql() df = DataFrame({'From':np.ones(5)}) - sql.write_frame(df, con = self.db, name = 'testkeywords', + sql.write_frame(df, con = self.conn, name = 'testkeywords', if_exists='replace', flavor='mysql') def test_if_exists(self): @@ -2444,51 +2601,48 @@ def clean_up(test_table_to_drop): Drops tables created from individual tests so no dependencies arise from sequential tests """ - if sql.table_exists(test_table_to_drop, self.db, flavor='mysql'): - cur = self.db.cursor() - cur.execute("DROP TABLE %s" % test_table_to_drop) - cur.close() + self.drop_table(test_table_to_drop) # test if invalid value for if_exists raises appropriate error self.assertRaises(ValueError, sql.write_frame, frame=df_if_exists_1, - con=self.db, + con=self.conn, name=table_name, flavor='mysql', if_exists='notvalidvalue') clean_up(table_name) # test if_exists='fail' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='mysql', if_exists='fail') self.assertRaises(ValueError, sql.write_frame, frame=df_if_exists_1, - con=self.db, + con=self.conn, name=table_name, flavor='mysql', if_exists='fail') # test if_exists='replace' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='mysql', if_exists='replace') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B')]) - sql.write_frame(frame=df_if_exists_2, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name, flavor='mysql', if_exists='replace') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(3, 'C'), (4, 'D'), (5, 'E')]) clean_up(table_name) # test if_exists='append' - sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name, flavor='mysql', if_exists='fail') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B')]) - sql.write_frame(frame=df_if_exists_2, con=self.db, name=table_name, + sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name, flavor='mysql', if_exists='append') - self.assertEqual(sql.tquery(sql_select, con=self.db), + self.assertEqual(sql.tquery(sql_select, con=self.conn), [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')]) clean_up(table_name) diff --git a/pandas/io/tests/test_stata.py b/pandas/io/tests/test_stata.py index 97bbfb0edf92c..5b934bad38bd3 100644 --- a/pandas/io/tests/test_stata.py +++ b/pandas/io/tests/test_stata.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # pylint: disable=E1101 from datetime import datetime @@ -22,6 +23,7 @@ from pandas.tslib import NaT from pandas import compat + class TestStata(tm.TestCase): def setUp(self): @@ -77,6 +79,8 @@ def setUp(self): self.dta21_117 = os.path.join(self.dirpath, 'stata12_117.dta') + self.dta22_118 = os.path.join(self.dirpath, 'stata14_118.dta') + def read_dta(self, file): # Legacy default reader configuration return read_stata(file, convert_dates=True) @@ -180,9 +184,9 @@ def test_read_dta2(self): # buggy test because of the NaT comparison on certain platforms # Format 113 test fails since it does not support tc and tC formats # tm.assert_frame_equal(parsed_113, expected) - tm.assert_frame_equal(parsed_114, expected) - tm.assert_frame_equal(parsed_115, expected) - tm.assert_frame_equal(parsed_117, expected) + tm.assert_frame_equal(parsed_114, expected, check_datetimelike_compat=True) + tm.assert_frame_equal(parsed_115, expected, check_datetimelike_compat=True) + tm.assert_frame_equal(parsed_117, expected, check_datetimelike_compat=True) def test_read_dta3(self): parsed_113 = self.read_dta(self.dta3_113) @@ -244,6 +248,36 @@ def test_read_dta12(self): tm.assert_frame_equal(parsed_117, expected, check_dtype=False) + + def test_read_dta18(self): + parsed_118 = self.read_dta(self.dta22_118) + parsed_118["Bytes"] = parsed_118["Bytes"].astype('O') + expected = DataFrame.from_records( + [['Cat', 'Bogota', u'Bogotá', 1, 1.0, u'option b Ünicode', 1.0], + ['Dog', 'Boston', u'Uzunköprü', np.nan, np.nan, np.nan, np.nan], + ['Plane', 'Rome', u'Tromsø', 0, 0.0, 'option a', 0.0], + ['Potato', 'Tokyo', u'Elâzığ', -4, 4.0, 4, 4], + ['', '', '', 0, 0.3332999, 'option a', 1/3.] + ], + columns=['Things', 'Cities', 'Unicode_Cities_Strl', 'Ints', 'Floats', 'Bytes', 'Longs']) + expected["Floats"] = expected["Floats"].astype(np.float32) + for col in parsed_118.columns: + tm.assert_almost_equal(parsed_118[col], expected[col]) + + rdr = StataReader(self.dta22_118) + vl = rdr.variable_labels() + vl_expected = {u'Unicode_Cities_Strl': u'Here are some strls with Ünicode chars', + u'Longs': u'long data', + u'Things': u'Here are some things', + u'Bytes': u'byte data', + u'Ints': u'int data', + u'Cities': u'Here are some cities', + u'Floats': u'float data'} + tm.assert_dict_equal(vl, vl_expected) + + self.assertEqual(rdr.data_label, u'This is a Ünicode data label') + + def test_read_write_dta5(self): original = DataFrame([(np.nan, np.nan, np.nan, np.nan, np.nan)], columns=['float_miss', 'double_miss', 'byte_miss', @@ -383,9 +417,9 @@ def test_read_write_reread_dta14(self): expected = self.read_csv(self.csv14) cols = ['byte_', 'int_', 'long_', 'float_', 'double_'] for col in cols: - expected[col] = expected[col].convert_objects(convert_numeric=True) + expected[col] = expected[col].convert_objects(datetime=True, numeric=True) expected['float_'] = expected['float_'].astype(np.float32) - expected['date_td'] = pd.to_datetime(expected['date_td'], coerce=True) + expected['date_td'] = pd.to_datetime(expected['date_td'], errors='coerce') parsed_113 = self.read_dta(self.dta14_113) parsed_113.index.name = 'index' @@ -430,20 +464,19 @@ def test_timestamp_and_label(self): data_label = 'This is a data file.' with tm.ensure_clean() as path: original.to_stata(path, time_stamp=time_stamp, data_label=data_label) - reader = StataReader(path) - parsed_time_stamp = dt.datetime.strptime(reader.time_stamp, ('%d %b %Y %H:%M')) - assert parsed_time_stamp == time_stamp - assert reader.data_label == data_label + + with StataReader(path) as reader: + parsed_time_stamp = dt.datetime.strptime(reader.time_stamp, ('%d %b %Y %H:%M')) + assert parsed_time_stamp == time_stamp + assert reader.data_label == data_label def test_numeric_column_names(self): original = DataFrame(np.reshape(np.arange(25.0), (5, 5))) original.index.name = 'index' with tm.ensure_clean() as path: # should get a warning for that format. - with warnings.catch_warnings(record=True) as w: - tm.assert_produces_warning(original.to_stata(path), InvalidColumnName) - # should produce a single warning - tm.assert_equal(len(w), 1) + with tm.assert_produces_warning(InvalidColumnName): + original.to_stata(path) written_and_read_again = self.read_dta(path) written_and_read_again = written_and_read_again.set_index('index') @@ -495,11 +528,8 @@ def test_large_value_conversion(self): original = DataFrame({'s0': s0, 's1': s1, 's2': s2, 's3': s3}) original.index.name = 'index' with tm.ensure_clean() as path: - with warnings.catch_warnings(record=True) as w: - tm.assert_produces_warning(original.to_stata(path), - PossiblePrecisionLoss) - # should produce a single warning - tm.assert_equal(len(w), 1) + with tm.assert_produces_warning(PossiblePrecisionLoss): + original.to_stata(path) written_and_read_again = self.read_dta(path) modified = original.copy() @@ -513,10 +543,8 @@ def test_dates_invalid_column(self): original = DataFrame([datetime(2006, 11, 19, 23, 13, 20)]) original.index.name = 'index' with tm.ensure_clean() as path: - with warnings.catch_warnings(record=True) as w: - tm.assert_produces_warning(original.to_stata(path, {0: 'tc'}), - InvalidColumnName) - tm.assert_equal(len(w), 1) + with tm.assert_produces_warning(InvalidColumnName): + original.to_stata(path, {0: 'tc'}) written_and_read_again = self.read_dta(path) modified = original.copy() @@ -599,13 +627,14 @@ def test_minimal_size_col(self): original = DataFrame(s) with tm.ensure_clean() as path: original.to_stata(path, write_index=False) - sr = StataReader(path) - typlist = sr.typlist - variables = sr.varlist - formats = sr.fmtlist - for variable, fmt, typ in zip(variables, formats, typlist): - self.assertTrue(int(variable[1:]) == int(fmt[1:-1])) - self.assertTrue(int(variable[1:]) == typ) + + with StataReader(path) as sr: + typlist = sr.typlist + variables = sr.varlist + formats = sr.fmtlist + for variable, fmt, typ in zip(variables, formats, typlist): + self.assertTrue(int(variable[1:]) == int(fmt[1:-1])) + self.assertTrue(int(variable[1:]) == typ) def test_excessively_long_string(self): str_lens = (1, 244, 500) @@ -684,6 +713,7 @@ def test_big_dates(self): expected.append([NaT] * 7) columns = ['date_tc', 'date_td', 'date_tw', 'date_tm', 'date_tq', 'date_th', 'date_ty'] + # Fixes for weekly, quarterly,half,year expected[2][2] = datetime(9999,12,24) expected[2][3] = datetime(9999,12,1) @@ -696,11 +726,10 @@ def test_big_dates(self): expected[5][5] = expected[5][6] = datetime(1678,1,1) expected = DataFrame(expected, columns=columns, dtype=np.object) - parsed_115 = read_stata(self.dta18_115) parsed_117 = read_stata(self.dta18_117) - tm.assert_frame_equal(expected, parsed_115) - tm.assert_frame_equal(expected, parsed_117) + tm.assert_frame_equal(expected, parsed_115, check_datetimelike_compat=True) + tm.assert_frame_equal(expected, parsed_117, check_datetimelike_compat=True) date_conversion = dict((c, c[-2:]) for c in columns) #{c : c[-2:] for c in columns} @@ -709,7 +738,8 @@ def test_big_dates(self): expected.to_stata(path, date_conversion) written_and_read_again = self.read_dta(path) tm.assert_frame_equal(written_and_read_again.set_index('index'), - expected) + expected, + check_datetimelike_compat=True) def test_dtype_conversion(self): expected = self.read_csv(self.csv15) @@ -752,6 +782,14 @@ def test_drop_column(self): columns=columns) tm.assert_frame_equal(expected, dropped) + + # See PR 10757 + columns = ['int_', 'long_', 'byte_'] + expected = expected[columns] + reordered = read_stata(self.dta15_117, convert_dates=True, + columns=columns) + tm.assert_frame_equal(expected, reordered) + with tm.assertRaises(ValueError): columns = ['byte_', 'byte_'] read_stata(self.dta15_117, convert_dates=True, columns=columns) @@ -912,7 +950,8 @@ def test_read_chunks_117(self): warnings.simplefilter("always") parsed = read_stata(fname, convert_categoricals=convert_categoricals, convert_dates=convert_dates) - itr = read_stata(fname, iterator=True) + itr = read_stata(fname, iterator=True, convert_categoricals=convert_categoricals, + convert_dates=convert_dates) pos = 0 for j in range(5): @@ -923,12 +962,10 @@ def test_read_chunks_117(self): except StopIteration: break from_frame = parsed.iloc[pos:pos+chunksize, :] - try: - tm.assert_frame_equal(from_frame, chunk, check_dtype=False) - except AssertionError: - # datetime.datetime and pandas.tslib.Timestamp may hold - # equivalent values but fail assert_frame_equal - assert(all([x == y for x, y in zip(from_frame, chunk)])) + tm.assert_frame_equal(from_frame, + chunk, + check_dtype=False, + check_datetimelike_compat=True) pos += chunksize @@ -966,13 +1003,15 @@ def test_read_chunks_115(self): for convert_categoricals in False, True: for convert_dates in False, True: + # Read the whole file with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") parsed = read_stata(fname, convert_categoricals=convert_categoricals, convert_dates=convert_dates) - itr = read_stata(fname, iterator=True, - convert_categoricals=convert_categoricals) + # Compare to what we get when reading by chunk + itr = read_stata(fname, iterator=True, convert_dates=convert_dates, + convert_categoricals=convert_categoricals) pos = 0 for j in range(5): with warnings.catch_warnings(record=True) as w: @@ -982,12 +1021,10 @@ def test_read_chunks_115(self): except StopIteration: break from_frame = parsed.iloc[pos:pos+chunksize, :] - try: - tm.assert_frame_equal(from_frame, chunk, check_dtype=False) - except AssertionError: - # datetime.datetime and pandas.tslib.Timestamp may hold - # equivalent values but fail assert_frame_equal - assert(all([x == y for x, y in zip(from_frame, chunk)])) + tm.assert_frame_equal(from_frame, + chunk, + check_dtype=False, + check_datetimelike_compat=True) pos += chunksize @@ -1011,4 +1048,3 @@ def test_read_chunks_columns(self): if __name__ == '__main__': nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], exit=False) - diff --git a/pandas/io/wb.py b/pandas/io/wb.py index 7a9443c4b9ac6..fba4c72a51376 100644 --- a/pandas/io/wb.py +++ b/pandas/io/wb.py @@ -155,7 +155,7 @@ def download(country=['MX', 'CA', 'US'], indicator=['NY.GDP.MKTP.CD', 'NY.GNS.IC out = reduce(lambda x, y: x.merge(y, how='outer'), data) out = out.drop('iso_code', axis=1) out = out.set_index(['country', 'year']) - out = out.convert_objects(convert_numeric=True) + out = out.convert_objects(datetime=True, numeric=True) return out else: msg = "No indicators returned data." diff --git a/pandas/lib.pyx b/pandas/lib.pyx index cc4c43494176e..07f0c89535a77 100644 --- a/pandas/lib.pyx +++ b/pandas/lib.pyx @@ -21,6 +21,7 @@ from cpython cimport (PyDict_New, PyDict_GetItem, PyDict_SetItem, PyTuple_SetItem, PyTuple_New, PyObject_SetAttrString, + PyObject_RichCompareBool, PyBytes_GET_SIZE, PyUnicode_GET_SIZE) @@ -156,6 +157,31 @@ def ismember(ndarray arr, set values): return result.view(np.bool_) +def ismember_int64(ndarray[int64_t] arr, set values): + ''' + Checks whether + + Parameters + ---------- + arr : ndarray of int64 + values : set + + Returns + ------- + ismember : ndarray (boolean dtype) + ''' + cdef: + Py_ssize_t i, n + ndarray[uint8_t] result + int64_t v + + n = len(arr) + result = np.empty(n, dtype=np.uint8) + for i in range(n): + result[i] = arr[i] in values + + return result.view(np.bool_) + #---------------------------------------------------------------------- # datetime / io related @@ -347,19 +373,19 @@ def isnullobj2d_old(ndarray[object, ndim=2] arr): result[i, j] = 1 return result.view(np.bool_) -def list_to_object_array(list obj): + +@cython.wraparound(False) +@cython.boundscheck(False) +cpdef ndarray[object] list_to_object_array(list obj): ''' - Convert list to object ndarray. Seriously can't believe I had to write this + Convert list to object ndarray. Seriously can\'t believe I had to write this function ''' cdef: - Py_ssize_t i, n - ndarray[object] arr - - n = len(obj) - arr = np.empty(n, dtype=object) + Py_ssize_t i, n = len(obj) + ndarray[object] arr = np.empty(n, dtype=object) - for i from 0 <= i < n: + for i in range(n): arr[i] = obj[i] return arr @@ -607,17 +633,42 @@ def convert_timestamps(ndarray values): return out -def maybe_indices_to_slice(ndarray[int64_t] indices): + +def maybe_indices_to_slice(ndarray[int64_t] indices, int max_len): cdef: Py_ssize_t i, n = len(indices) + int k, vstart, vlast, v + + if n == 0: + return slice(0, 0) - if not n or indices[0] < 0: + vstart = indices[0] + if vstart < 0 or max_len <= vstart: return indices - for i in range(1, n): - if indices[i] - indices[i - 1] != 1: - return indices - return slice(indices[0], indices[n - 1] + 1) + if n == 1: + return slice(vstart, vstart + 1) + + vlast = indices[n - 1] + if vlast < 0 or max_len <= vlast: + return indices + + k = indices[1] - indices[0] + if k == 0: + return indices + else: + for i in range(2, n): + v = indices[i] + if v - indices[i - 1] != k: + return indices + + if k > 0: + return slice(vstart, vlast + 1, k) + else: + if vlast == 0: + return slice(vstart, None, k) + else: + return slice(vstart, vlast - 1, k) def maybe_booleans_to_slice(ndarray[uint8_t] mask): @@ -656,6 +707,7 @@ def scalar_compare(ndarray[object] values, object val, object op): cdef: Py_ssize_t i, n = len(values) ndarray[uint8_t, cast=True] result + bint isnull_val int flag object x @@ -675,12 +727,15 @@ def scalar_compare(ndarray[object] values, object val, object op): raise ValueError('Unrecognized operator') result = np.empty(n, dtype=bool).view(np.uint8) + isnull_val = _checknull(val) if flag == cpython.Py_NE: for i in range(n): x = values[i] if _checknull(x): result[i] = True + elif isnull_val: + result[i] = True else: try: result[i] = cpython.PyObject_RichCompareBool(x, val, flag) @@ -691,6 +746,8 @@ def scalar_compare(ndarray[object] values, object val, object op): x = values[i] if _checknull(x): result[i] = False + elif isnull_val: + result[i] = False else: try: result[i] = cpython.PyObject_RichCompareBool(x, val, flag) @@ -702,33 +759,32 @@ def scalar_compare(ndarray[object] values, object val, object op): x = values[i] if _checknull(x): result[i] = False + elif isnull_val: + result[i] = False else: result[i] = cpython.PyObject_RichCompareBool(x, val, flag) return result.view(bool) + @cython.wraparound(False) @cython.boundscheck(False) -def array_equivalent_object(ndarray[object] left, ndarray[object] right): +cpdef bint array_equivalent_object(object[:] left, object[:] right): """ perform an element by element comparion on 1-d object arrays taking into account nan positions """ - cdef Py_ssize_t i, n - cdef object x, y + cdef: + Py_ssize_t i, n = left.shape[0] + object x, y - n = len(left) - for i from 0 <= i < n: + for i in range(n): x = left[i] y = right[i] # we are either not equal or both nan # I think None == None will be true here - if cpython.PyObject_RichCompareBool(x, y, cpython.Py_EQ): - continue - elif _checknull(x) and _checknull(y): - continue - else: + if not (PyObject_RichCompareBool(x, y, cpython.Py_EQ) or + _checknull(x) and _checknull(y)): return False - return True @@ -1292,35 +1348,47 @@ def fast_zip_fillna(list ndarrays, fill_value=pandas_null): return result -def duplicated(ndarray[object] values, take_last=False): + +def duplicated(ndarray[object] values, object keep='first'): cdef: Py_ssize_t i, n - set seen = set() + dict seen = dict() object row n = len(values) cdef ndarray[uint8_t] result = np.zeros(n, dtype=np.uint8) - if take_last: + if keep == 'last': for i from n > i >= 0: row = values[i] - if row in seen: result[i] = 1 else: - seen.add(row) + seen[row] = i result[i] = 0 - else: + elif keep == 'first': for i from 0 <= i < n: row = values[i] if row in seen: result[i] = 1 else: - seen.add(row) + seen[row] = i result[i] = 0 + elif keep is False: + for i from 0 <= i < n: + row = values[i] + if row in seen: + result[i] = 1 + result[seen[row]] = 1 + else: + seen[row] = i + result[i] = 0 + else: + raise ValueError('keep must be either "first", "last" or False') return result.view(np.bool_) + def generate_slices(ndarray[int64_t] labels, Py_ssize_t ngroups): cdef: Py_ssize_t i, group_size, n, start diff --git a/pandas/msgpack.pyx b/pandas/msgpack.pyx deleted file mode 100644 index 625ac55ee832c..0000000000000 --- a/pandas/msgpack.pyx +++ /dev/null @@ -1,669 +0,0 @@ -# coding: utf-8 -#cython: embedsignature=True -#cython: profile=False - -from cpython cimport * -cdef extern from "Python.h": - ctypedef char* const_char_ptr "const char*" - ctypedef char* const_void_ptr "const void*" - ctypedef struct PyObject - cdef int PyObject_AsReadBuffer(object o, const_void_ptr* buff, Py_ssize_t* buf_len) except -1 - -from libc.stdlib cimport * -from libc.string cimport * -from libc.limits cimport * - -import cython -import numpy as np -from numpy cimport * - -class UnpackException(IOError): - pass - - -class BufferFull(UnpackException): - pass - - -class OutOfData(UnpackException): - pass - - -class UnpackValueError(UnpackException, ValueError): - pass - - -class ExtraData(ValueError): - def __init__(self, unpacked, extra): - self.unpacked = unpacked - self.extra = extra - - def __str__(self): - return "unpack(b) recieved extra data." - -class PackException(IOError): - pass - -class PackValueError(PackException, ValueError): - pass - -cdef extern from "msgpack/unpack.h": - ctypedef struct msgpack_user: - bint use_list - PyObject* object_hook - bint has_pairs_hook # call object_hook with k-v pairs - PyObject* list_hook - char *encoding - char *unicode_errors - - ctypedef struct template_context: - msgpack_user user - PyObject* obj - size_t count - unsigned int ct - PyObject* key - - ctypedef int (*execute_fn)(template_context* ctx, const_char_ptr data, - size_t len, size_t* off) except? -1 - execute_fn template_construct - execute_fn template_skip - execute_fn read_array_header - execute_fn read_map_header - void template_init(template_context* ctx) - object template_data(template_context* ctx) - -cdef extern from "msgpack/pack.h": - struct msgpack_packer: - char* buf - size_t length - size_t buf_size - - int msgpack_pack_int(msgpack_packer* pk, int d) - int msgpack_pack_nil(msgpack_packer* pk) - int msgpack_pack_true(msgpack_packer* pk) - int msgpack_pack_false(msgpack_packer* pk) - int msgpack_pack_long(msgpack_packer* pk, long d) - int msgpack_pack_long_long(msgpack_packer* pk, long long d) - int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d) - int msgpack_pack_float(msgpack_packer* pk, float d) - int msgpack_pack_double(msgpack_packer* pk, double d) - int msgpack_pack_array(msgpack_packer* pk, size_t l) - int msgpack_pack_map(msgpack_packer* pk, size_t l) - int msgpack_pack_raw(msgpack_packer* pk, size_t l) - int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l) - -cdef int DEFAULT_RECURSE_LIMIT=511 - - - -cdef class Packer(object): - """MessagePack Packer - - usage: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - - Packer's constructor has some keyword arguments: - - * *defaut* - Convert user type to builtin type that Packer supports. - See also simplejson's document. - * *encoding* - Convert unicode to bytes with this encoding. (default: 'utf-8') - * *unicode_errors* - Error handler for encoding unicode. (default: 'strict') - * *use_single_float* - Use single precision float type for float. (default: False) - * *autoreset* - Reset buffer after each pack and return its content as `bytes`. (default: True). - If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. - """ - cdef msgpack_packer pk - cdef object _default - cdef object _bencoding - cdef object _berrors - cdef char *encoding - cdef char *unicode_errors - cdef bool use_float - cdef bint autoreset - - def __cinit__(self): - cdef int buf_size = 1024*1024 - self.pk.buf = malloc(buf_size); - if self.pk.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.pk.buf_size = buf_size - self.pk.length = 0 - - def __init__(self, default=None, encoding='utf-8', unicode_errors='strict', - use_single_float=False, bint autoreset=1): - self.use_float = use_single_float - self.autoreset = autoreset - if default is not None: - if not PyCallable_Check(default): - raise TypeError("default must be a callable.") - self._default = default - if encoding is None: - self.encoding = NULL - self.unicode_errors = NULL - else: - if isinstance(encoding, unicode): - self._bencoding = encoding.encode('ascii') - else: - self._bencoding = encoding - self.encoding = PyBytes_AsString(self._bencoding) - if isinstance(unicode_errors, unicode): - self._berrors = unicode_errors.encode('ascii') - else: - self._berrors = unicode_errors - self.unicode_errors = PyBytes_AsString(self._berrors) - - def __dealloc__(self): - free(self.pk.buf); - - @cython.boundscheck(False) - @cython.wraparound(False) - cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: - cdef long long llval - cdef unsigned long long ullval - cdef long longval - cdef float fval - cdef double dval - cdef char* rawval - cdef int ret - cdef dict d - cdef object dtype - - cdef int n,i - - if nest_limit < 0: - raise PackValueError("recursion limit exceeded.") - - if o is None: - ret = msgpack_pack_nil(&self.pk) - elif isinstance(o, bool): - if o: - ret = msgpack_pack_true(&self.pk) - else: - ret = msgpack_pack_false(&self.pk) - elif PyLong_Check(o): - if o > 0: - ullval = o - ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - else: - llval = o - ret = msgpack_pack_long_long(&self.pk, llval) - elif PyInt_Check(o): - longval = o - ret = msgpack_pack_long(&self.pk, longval) - elif PyFloat_Check(o): - if self.use_float: - fval = o - ret = msgpack_pack_float(&self.pk, fval) - else: - dval = o - ret = msgpack_pack_double(&self.pk, dval) - elif PyBytes_Check(o): - rawval = o - ret = msgpack_pack_raw(&self.pk, len(o)) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, rawval, len(o)) - elif PyUnicode_Check(o): - if not self.encoding: - raise TypeError("Can't encode unicode string: no encoding is specified") - o = PyUnicode_AsEncodedString(o, self.encoding, self.unicode_errors) - rawval = o - ret = msgpack_pack_raw(&self.pk, len(o)) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, rawval, len(o)) - elif PyDict_CheckExact(o): - d = o - ret = msgpack_pack_map(&self.pk, len(d)) - if ret == 0: - for k, v in d.iteritems(): - ret = self._pack(k, nest_limit-1) - if ret != 0: break - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif PyDict_Check(o): - ret = msgpack_pack_map(&self.pk, len(o)) - if ret == 0: - for k, v in o.items(): - ret = self._pack(k, nest_limit-1) - if ret != 0: break - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif PyTuple_Check(o) or PyList_Check(o): - ret = msgpack_pack_array(&self.pk, len(o)) - if ret == 0: - for v in o: - ret = self._pack(v, nest_limit-1) - if ret != 0: break - - elif self._default: - o = self._default(o) - ret = self._pack(o, nest_limit-1) - else: - raise TypeError("can't serialize %r" % (o,)) - return ret - - cpdef pack(self, object obj): - cdef int ret - ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - if ret == -1: - raise MemoryError - elif ret: # should not happen. - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_array_header(self, size_t size): - cdef int ret = msgpack_pack_array(&self.pk, size) - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_map_header(self, size_t size): - cdef int ret = msgpack_pack_map(&self.pk, size) - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def pack_map_pairs(self, object pairs): - """ - Pack *pairs* as msgpack map type. - - *pairs* should sequence of pair. - (`len(pairs)` and `for k, v in *pairs*:` should be supported.) - """ - cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) - if ret == 0: - for k, v in pairs: - ret = self._pack(k) - if ret != 0: break - ret = self._pack(v) - if ret != 0: break - if ret == -1: - raise MemoryError - elif ret: # should not happen - raise TypeError - if self.autoreset: - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - def reset(self): - """Clear internal buffer.""" - self.pk.length = 0 - - def bytes(self): - """Return buffer content.""" - return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - - - cdef inline pack_pair(self, object k, object v, int nest_limit): - ret = self._pack(k, nest_limit-1) - if ret != 0: raise PackException("cannot pack : %s" % k) - ret = self._pack(v, nest_limit-1) - if ret != 0: raise PackException("cannot pack : %s" % v) - return ret - -def pack(object o, object stream, default=None, encoding='utf-8', unicode_errors='strict'): - """ - pack an object `o` and write it to stream).""" - packer = Packer(default=default, encoding=encoding, unicode_errors=unicode_errors) - stream.write(packer.pack(o)) - -def packb(object o, default=None, encoding='utf-8', unicode_errors='strict', use_single_float=False): - """ - pack o and return packed bytes.""" - packer = Packer(default=default, encoding=encoding, unicode_errors=unicode_errors, - use_single_float=use_single_float) - return packer.pack(o) - - -cdef inline init_ctx(template_context *ctx, - object object_hook, object object_pairs_hook, object list_hook, - bint use_list, char* encoding, char* unicode_errors): - template_init(ctx) - ctx.user.use_list = use_list - ctx.user.object_hook = ctx.user.list_hook = NULL - - if object_hook is not None and object_pairs_hook is not None: - raise ValueError("object_pairs_hook and object_hook are mutually exclusive.") - - if object_hook is not None: - if not PyCallable_Check(object_hook): - raise TypeError("object_hook must be a callable.") - ctx.user.object_hook = object_hook - - if object_pairs_hook is None: - ctx.user.has_pairs_hook = False - else: - if not PyCallable_Check(object_pairs_hook): - raise TypeError("object_pairs_hook must be a callable.") - ctx.user.object_hook = object_pairs_hook - ctx.user.has_pairs_hook = True - - if list_hook is not None: - if not PyCallable_Check(list_hook): - raise TypeError("list_hook must be a callable.") - ctx.user.list_hook = list_hook - - ctx.user.encoding = encoding - ctx.user.unicode_errors = unicode_errors - -def unpackb(object packed, object object_hook=None, object list_hook=None, - bint use_list=1, encoding=None, unicode_errors="strict", - object_pairs_hook=None, - ): - """Unpack packed_bytes to object. Returns an unpacked object. - - Raises `ValueError` when `packed` contains extra bytes. - """ - cdef template_context ctx - cdef size_t off = 0 - cdef int ret - - cdef char* buf - cdef Py_ssize_t buf_len - cdef char* cenc = NULL - cdef char* cerr = NULL - - PyObject_AsReadBuffer(packed, &buf, &buf_len) - - if encoding is not None: - if isinstance(encoding, unicode): - encoding = encoding.encode('ascii') - cenc = PyBytes_AsString(encoding) - - if unicode_errors is not None: - if isinstance(unicode_errors, unicode): - unicode_errors = unicode_errors.encode('ascii') - cerr = PyBytes_AsString(unicode_errors) - - init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr) - ret = template_construct(&ctx, buf, buf_len, &off) - if ret == 1: - obj = template_data(&ctx) - if off < buf_len: - raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) - return obj - elif ret < 0: - raise ValueError("Unpack failed: error = %d" % (ret,)) - else: - raise UnpackValueError - - -def unpack(object stream, object object_hook=None, object list_hook=None, - bint use_list=1, encoding=None, unicode_errors="strict", - object_pairs_hook=None, - ): - """Unpack an object from `stream`. - - Raises `ValueError` when `stream` has extra bytes. - """ - return unpackb(stream.read(), use_list=use_list, - object_hook=object_hook, object_pairs_hook=object_pairs_hook, list_hook=list_hook, - encoding=encoding, unicode_errors=unicode_errors, - ) - - -cdef class Unpacker(object): - """ - Streaming unpacker. - - `file_like` is a file-like object having `.read(n)` method. - When `Unpacker` initialized with `file_like`, unpacker reads serialized data - from it and `.feed()` method is not usable. - - `read_size` is used as `file_like.read(read_size)`. - (default: min(1024**2, max_buffer_size)) - - If `use_list` is true (default), msgpack list is deserialized to Python list. - Otherwise, it is deserialized to Python tuple. - - `object_hook` is same to simplejson. If it is not None, it should be callable - and Unpacker calls it with a dict argument after deserializing a map. - - `object_pairs_hook` is same to simplejson. If it is not None, it should be callable - and Unpacker calls it with a list of key-value pairs after deserializing a map. - - `encoding` is encoding used for decoding msgpack bytes. If it is None (default), - msgpack bytes is deserialized to Python bytes. - - `unicode_errors` is used for decoding bytes. - - `max_buffer_size` limits size of data waiting unpacked. - 0 means system's INT_MAX (default). - Raises `BufferFull` exception when it is insufficient. - You shoud set this parameter when unpacking data from untrasted source. - - example of streaming deserialize from file-like object:: - - unpacker = Unpacker(file_like) - for o in unpacker: - do_something(o) - - example of streaming deserialize from socket:: - - unpacker = Unpacker() - while 1: - buf = sock.recv(1024**2) - if not buf: - break - unpacker.feed(buf) - for o in unpacker: - do_something(o) - """ - cdef template_context ctx - cdef char* buf - cdef size_t buf_size, buf_head, buf_tail - cdef object file_like - cdef object file_like_read - cdef Py_ssize_t read_size - cdef object object_hook - cdef object encoding, unicode_errors - cdef size_t max_buffer_size - - def __cinit__(self): - self.buf = NULL - - def __dealloc__(self): - free(self.buf) - self.buf = NULL - - def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=1, - object object_hook=None, object object_pairs_hook=None, object list_hook=None, - encoding=None, unicode_errors='strict', int max_buffer_size=0, - ): - cdef char *cenc=NULL, *cerr=NULL - - self.file_like = file_like - if file_like: - self.file_like_read = file_like.read - if not PyCallable_Check(self.file_like_read): - raise ValueError("`file_like.read` must be a callable.") - if not max_buffer_size: - max_buffer_size = INT_MAX - if read_size > max_buffer_size: - raise ValueError("read_size should be less or equal to max_buffer_size") - if not read_size: - read_size = min(max_buffer_size, 1024**2) - self.max_buffer_size = max_buffer_size - self.read_size = read_size - self.buf = malloc(read_size) - if self.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.buf_size = read_size - self.buf_head = 0 - self.buf_tail = 0 - - if encoding is not None: - if isinstance(encoding, unicode): - encoding = encoding.encode('ascii') - self.encoding = encoding - cenc = PyBytes_AsString(encoding) - - if unicode_errors is not None: - if isinstance(unicode_errors, unicode): - unicode_errors = unicode_errors.encode('ascii') - self.unicode_errors = unicode_errors - cerr = PyBytes_AsString(unicode_errors) - - init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr) - - def feed(self, object next_bytes): - """Append `next_bytes` to internal buffer.""" - cdef char* buf - cdef Py_ssize_t buf_len - if self.file_like is not None: - raise TypeError( - "unpacker.feed() is not be able to use with `file_like`.") - PyObject_AsReadBuffer(next_bytes, &buf, &buf_len) - self.append_buffer(buf, buf_len) - - cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): - cdef: - char* buf = self.buf - char* new_buf - size_t head = self.buf_head - size_t tail = self.buf_tail - size_t buf_size = self.buf_size - size_t new_size - - if tail + _buf_len > buf_size: - if ((tail - head) + _buf_len) <= buf_size: - # move to front. - memmove(buf, buf + head, tail - head) - tail -= head - head = 0 - else: - # expand buffer. - new_size = (tail-head) + _buf_len - if new_size > self.max_buffer_size: - raise BufferFull - new_size = min(new_size*2, self.max_buffer_size) - new_buf = malloc(new_size) - if new_buf == NULL: - # self.buf still holds old buffer and will be freed during - # obj destruction - raise MemoryError("Unable to enlarge internal buffer.") - memcpy(new_buf, buf + head, tail - head) - free(buf) - - buf = new_buf - buf_size = new_size - tail -= head - head = 0 - - memcpy(buf + tail, (_buf), _buf_len) - self.buf = buf - self.buf_head = head - self.buf_size = buf_size - self.buf_tail = tail + _buf_len - - cdef read_from_file(self): - next_bytes = self.file_like_read( - min(self.read_size, - self.max_buffer_size - (self.buf_tail - self.buf_head) - )) - if next_bytes: - self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) - else: - self.file_like = None - - cdef object _unpack(self, execute_fn execute, object write_bytes, bint iter=0): - cdef int ret - cdef object obj - cdef size_t prev_head - while 1: - prev_head = self.buf_head - ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - if write_bytes is not None: - write_bytes(PyBytes_FromStringAndSize(self.buf + prev_head, self.buf_head - prev_head)) - - if ret == 1: - obj = template_data(&self.ctx) - template_init(&self.ctx) - return obj - elif ret == 0: - if self.file_like is not None: - self.read_from_file() - continue - if iter: - raise StopIteration("No more data to unpack.") - else: - raise OutOfData("No more data to unpack.") - else: - raise ValueError("Unpack failed: error = %d" % (ret,)) - - def read_bytes(self, Py_ssize_t nbytes): - """read a specified number of raw bytes from the stream""" - cdef size_t nread - nread = min(self.buf_tail - self.buf_head, nbytes) - ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) - self.buf_head += nread - if len(ret) < nbytes and self.file_like is not None: - ret += self.file_like.read(nbytes - len(ret)) - return ret - - def unpack(self, object write_bytes=None): - """ - unpack one object - - If write_bytes is not None, it will be called with parts of the raw - message as it is unpacked. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(template_construct, write_bytes) - - def skip(self, object write_bytes=None): - """ - read and ignore one object, returning None - - If write_bytes is not None, it will be called with parts of the raw - message as it is unpacked. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(template_skip, write_bytes) - - def read_array_header(self, object write_bytes=None): - """assuming the next object is an array, return its size n, such that - the next n unpack() calls will iterate over its contents. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(read_array_header, write_bytes) - - def read_map_header(self, object write_bytes=None): - """assuming the next object is a map, return its size n, such that the - next n * 2 unpack() calls will iterate over its key-value pairs. - - Raises `OutOfData` when there are no more bytes to unpack. - """ - return self._unpack(read_map_header, write_bytes) - - def __iter__(self): - return self - - def __next__(self): - return self._unpack(template_construct, None, 1) - - # for debug. - #def _buf(self): - # return PyString_FromStringAndSize(self.buf, self.buf_tail) - - #def _off(self): - # return self.buf_head diff --git a/pandas/msgpack/__init__.py b/pandas/msgpack/__init__.py new file mode 100644 index 0000000000000..bf0e2853ae131 --- /dev/null +++ b/pandas/msgpack/__init__.py @@ -0,0 +1,49 @@ +# coding: utf-8 +from pandas.msgpack._version import version +from pandas.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +from pandas.msgpack._packer import Packer +from pandas.msgpack._unpacker import unpack, unpackb, Unpacker + + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/pandas/msgpack/_packer.pyx b/pandas/msgpack/_packer.pyx new file mode 100644 index 0000000000000..5004b9e8e7262 --- /dev/null +++ b/pandas/msgpack/_packer.pyx @@ -0,0 +1,294 @@ +# coding: utf-8 +#cython: embedsignature=True + +from cpython cimport * +from libc.stdlib cimport * +from libc.string cimport * +from libc.limits cimport * + +from pandas.msgpack.exceptions import PackValueError +from pandas.msgpack import ExtType + + +cdef extern from "../src/msgpack/pack.h": + struct msgpack_packer: + char* buf + size_t length + size_t buf_size + bint use_bin_type + + int msgpack_pack_int(msgpack_packer* pk, int d) + int msgpack_pack_nil(msgpack_packer* pk) + int msgpack_pack_true(msgpack_packer* pk) + int msgpack_pack_false(msgpack_packer* pk) + int msgpack_pack_long(msgpack_packer* pk, long d) + int msgpack_pack_long_long(msgpack_packer* pk, long long d) + int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d) + int msgpack_pack_float(msgpack_packer* pk, float d) + int msgpack_pack_double(msgpack_packer* pk, double d) + int msgpack_pack_array(msgpack_packer* pk, size_t l) + int msgpack_pack_map(msgpack_packer* pk, size_t l) + int msgpack_pack_raw(msgpack_packer* pk, size_t l) + int msgpack_pack_bin(msgpack_packer* pk, size_t l) + int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l) + int msgpack_pack_ext(msgpack_packer* pk, char typecode, size_t l) + +cdef int DEFAULT_RECURSE_LIMIT=511 + + +cdef class Packer(object): + """ + MessagePack Packer + + usage:: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + :param str encoding: + Convert unicode to bytes with this encoding. (default: 'utf-8') + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + :param bool use_single_float: + Use single precision float type for float. (default: False) + :param bool autoreset: + Reset buffer after each pack and return it's content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enable str8 type for unicode. + """ + cdef msgpack_packer pk + cdef object _default + cdef object _bencoding + cdef object _berrors + cdef char *encoding + cdef char *unicode_errors + cdef bool use_float + cdef bint autoreset + + def __cinit__(self): + cdef int buf_size = 1024*1024 + self.pk.buf = malloc(buf_size); + if self.pk.buf == NULL: + raise MemoryError("Unable to allocate internal buffer.") + self.pk.buf_size = buf_size + self.pk.length = 0 + + def __init__(self, default=None, encoding='utf-8', unicode_errors='strict', + use_single_float=False, bint autoreset=1, bint use_bin_type=0): + """ + """ + self.use_float = use_single_float + self.autoreset = autoreset + self.pk.use_bin_type = use_bin_type + if default is not None: + if not PyCallable_Check(default): + raise TypeError("default must be a callable.") + self._default = default + if encoding is None: + self.encoding = NULL + self.unicode_errors = NULL + else: + if isinstance(encoding, unicode): + self._bencoding = encoding.encode('ascii') + else: + self._bencoding = encoding + self.encoding = PyBytes_AsString(self._bencoding) + if isinstance(unicode_errors, unicode): + self._berrors = unicode_errors.encode('ascii') + else: + self._berrors = unicode_errors + self.unicode_errors = PyBytes_AsString(self._berrors) + + def __dealloc__(self): + free(self.pk.buf); + + cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: + cdef long long llval + cdef unsigned long long ullval + cdef long longval + cdef float fval + cdef double dval + cdef char* rawval + cdef int ret + cdef dict d + cdef size_t L + cdef int default_used = 0 + + if nest_limit < 0: + raise PackValueError("recursion limit exceeded.") + + while True: + if o is None: + ret = msgpack_pack_nil(&self.pk) + elif isinstance(o, bool): + if o: + ret = msgpack_pack_true(&self.pk) + else: + ret = msgpack_pack_false(&self.pk) + elif PyLong_Check(o): + # PyInt_Check(long) is True for Python 3. + # Sow we should test long before int. + if o > 0: + ullval = o + ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) + else: + llval = o + ret = msgpack_pack_long_long(&self.pk, llval) + elif PyInt_Check(o): + longval = o + ret = msgpack_pack_long(&self.pk, longval) + elif PyFloat_Check(o): + if self.use_float: + fval = o + ret = msgpack_pack_float(&self.pk, fval) + else: + dval = o + ret = msgpack_pack_double(&self.pk, dval) + elif PyBytes_Check(o): + L = len(o) + if L > (2**32)-1: + raise ValueError("bytes is too large") + rawval = o + ret = msgpack_pack_bin(&self.pk, L) + if ret == 0: + ret = msgpack_pack_raw_body(&self.pk, rawval, L) + elif PyUnicode_Check(o): + if not self.encoding: + raise TypeError("Can't encode unicode string: no encoding is specified") + o = PyUnicode_AsEncodedString(o, self.encoding, self.unicode_errors) + L = len(o) + if L > (2**32)-1: + raise ValueError("dict is too large") + rawval = o + ret = msgpack_pack_raw(&self.pk, len(o)) + if ret == 0: + ret = msgpack_pack_raw_body(&self.pk, rawval, len(o)) + elif PyDict_CheckExact(o): + d = o + L = len(d) + if L > (2**32)-1: + raise ValueError("dict is too large") + ret = msgpack_pack_map(&self.pk, L) + if ret == 0: + for k, v in d.iteritems(): + ret = self._pack(k, nest_limit-1) + if ret != 0: break + ret = self._pack(v, nest_limit-1) + if ret != 0: break + elif PyDict_Check(o): + L = len(o) + if L > (2**32)-1: + raise ValueError("dict is too large") + ret = msgpack_pack_map(&self.pk, L) + if ret == 0: + for k, v in o.items(): + ret = self._pack(k, nest_limit-1) + if ret != 0: break + ret = self._pack(v, nest_limit-1) + if ret != 0: break + elif isinstance(o, ExtType): + # This should be before Tuple because ExtType is namedtuple. + longval = o.code + rawval = o.data + L = len(o.data) + if L > (2**32)-1: + raise ValueError("EXT data is too large") + ret = msgpack_pack_ext(&self.pk, longval, L) + ret = msgpack_pack_raw_body(&self.pk, rawval, L) + elif PyTuple_Check(o) or PyList_Check(o): + L = len(o) + if L > (2**32)-1: + raise ValueError("list is too large") + ret = msgpack_pack_array(&self.pk, L) + if ret == 0: + for v in o: + ret = self._pack(v, nest_limit-1) + if ret != 0: break + elif not default_used and self._default: + o = self._default(o) + default_used = 1 + continue + else: + raise TypeError("can't serialize %r" % (o,)) + return ret + + cpdef pack(self, object obj): + cdef int ret + ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) + if ret == -1: + raise MemoryError + elif ret: # should not happen. + raise TypeError + if self.autoreset: + buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) + self.pk.length = 0 + return buf + + def pack_ext_type(self, typecode, data): + msgpack_pack_ext(&self.pk, typecode, len(data)) + msgpack_pack_raw_body(&self.pk, data, len(data)) + + def pack_array_header(self, size_t size): + if size > (2**32-1): + raise ValueError + cdef int ret = msgpack_pack_array(&self.pk, size) + if ret == -1: + raise MemoryError + elif ret: # should not happen + raise TypeError + if self.autoreset: + buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) + self.pk.length = 0 + return buf + + def pack_map_header(self, size_t size): + if size > (2**32-1): + raise ValueError + cdef int ret = msgpack_pack_map(&self.pk, size) + if ret == -1: + raise MemoryError + elif ret: # should not happen + raise TypeError + if self.autoreset: + buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) + self.pk.length = 0 + return buf + + def pack_map_pairs(self, object pairs): + """ + Pack *pairs* as msgpack map type. + + *pairs* should sequence of pair. + (`len(pairs)` and `for k, v in pairs:` should be supported.) + """ + cdef int ret = msgpack_pack_map(&self.pk, len(pairs)) + if ret == 0: + for k, v in pairs: + ret = self._pack(k) + if ret != 0: break + ret = self._pack(v) + if ret != 0: break + if ret == -1: + raise MemoryError + elif ret: # should not happen + raise TypeError + if self.autoreset: + buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) + self.pk.length = 0 + return buf + + def reset(self): + """Clear internal buffer.""" + self.pk.length = 0 + + def bytes(self): + """Return buffer content.""" + return PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) diff --git a/pandas/msgpack/_unpacker.pyx b/pandas/msgpack/_unpacker.pyx new file mode 100644 index 0000000000000..f68bf3369427c --- /dev/null +++ b/pandas/msgpack/_unpacker.pyx @@ -0,0 +1,466 @@ +# coding: utf-8 +#cython: embedsignature=True + +from cpython cimport * +cdef extern from "Python.h": + ctypedef struct PyObject + cdef int PyObject_AsReadBuffer(object o, const void** buff, Py_ssize_t* buf_len) except -1 + +from libc.stdlib cimport * +from libc.string cimport * +from libc.limits cimport * + +from pandas.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + ExtraData, + ) +from pandas.msgpack import ExtType + + +cdef extern from "../src/msgpack/unpack.h": + ctypedef struct msgpack_user: + bint use_list + PyObject* object_hook + bint has_pairs_hook # call object_hook with k-v pairs + PyObject* list_hook + PyObject* ext_hook + char *encoding + char *unicode_errors + Py_ssize_t max_str_len + Py_ssize_t max_bin_len + Py_ssize_t max_array_len + Py_ssize_t max_map_len + Py_ssize_t max_ext_len + + ctypedef struct unpack_context: + msgpack_user user + PyObject* obj + size_t count + + ctypedef int (*execute_fn)(unpack_context* ctx, const char* data, + size_t len, size_t* off) except? -1 + execute_fn unpack_construct + execute_fn unpack_skip + execute_fn read_array_header + execute_fn read_map_header + void unpack_init(unpack_context* ctx) + object unpack_data(unpack_context* ctx) + +cdef inline init_ctx(unpack_context *ctx, + object object_hook, object object_pairs_hook, + object list_hook, object ext_hook, + bint use_list, char* encoding, char* unicode_errors, + Py_ssize_t max_str_len, Py_ssize_t max_bin_len, + Py_ssize_t max_array_len, Py_ssize_t max_map_len, + Py_ssize_t max_ext_len): + unpack_init(ctx) + ctx.user.use_list = use_list + ctx.user.object_hook = ctx.user.list_hook = NULL + ctx.user.max_str_len = max_str_len + ctx.user.max_bin_len = max_bin_len + ctx.user.max_array_len = max_array_len + ctx.user.max_map_len = max_map_len + ctx.user.max_ext_len = max_ext_len + + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually exclusive.") + + if object_hook is not None: + if not PyCallable_Check(object_hook): + raise TypeError("object_hook must be a callable.") + ctx.user.object_hook = object_hook + + if object_pairs_hook is None: + ctx.user.has_pairs_hook = False + else: + if not PyCallable_Check(object_pairs_hook): + raise TypeError("object_pairs_hook must be a callable.") + ctx.user.object_hook = object_pairs_hook + ctx.user.has_pairs_hook = True + + if list_hook is not None: + if not PyCallable_Check(list_hook): + raise TypeError("list_hook must be a callable.") + ctx.user.list_hook = list_hook + + if ext_hook is not None: + if not PyCallable_Check(ext_hook): + raise TypeError("ext_hook must be a callable.") + ctx.user.ext_hook = ext_hook + + ctx.user.encoding = encoding + ctx.user.unicode_errors = unicode_errors + +def default_read_extended_type(typecode, data): + raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode) + +def unpackb(object packed, object object_hook=None, object list_hook=None, + bint use_list=1, encoding=None, unicode_errors="strict", + object_pairs_hook=None, ext_hook=ExtType, + Py_ssize_t max_str_len=2147483647, # 2**32-1 + Py_ssize_t max_bin_len=2147483647, + Py_ssize_t max_array_len=2147483647, + Py_ssize_t max_map_len=2147483647, + Py_ssize_t max_ext_len=2147483647): + """ + Unpack packed_bytes to object. Returns an unpacked object. + + Raises `ValueError` when `packed` contains extra bytes. + + See :class:`Unpacker` for options. + """ + cdef unpack_context ctx + cdef size_t off = 0 + cdef int ret + + cdef char* buf + cdef Py_ssize_t buf_len + cdef char* cenc = NULL + cdef char* cerr = NULL + + PyObject_AsReadBuffer(packed, &buf, &buf_len) + + if encoding is not None: + if isinstance(encoding, unicode): + encoding = encoding.encode('ascii') + cenc = PyBytes_AsString(encoding) + + if unicode_errors is not None: + if isinstance(unicode_errors, unicode): + unicode_errors = unicode_errors.encode('ascii') + cerr = PyBytes_AsString(unicode_errors) + + init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, ext_hook, + use_list, cenc, cerr, + max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len) + ret = unpack_construct(&ctx, buf, buf_len, &off) + if ret == 1: + obj = unpack_data(&ctx) + if off < buf_len: + raise ExtraData(obj, PyBytes_FromStringAndSize(buf+off, buf_len-off)) + return obj + else: + raise UnpackValueError("Unpack failed: error = %d" % (ret,)) + + +def unpack(object stream, object object_hook=None, object list_hook=None, + bint use_list=1, encoding=None, unicode_errors="strict", + object_pairs_hook=None, + ): + """ + Unpack an object from `stream`. + + Raises `ValueError` when `stream` has extra bytes. + + See :class:`Unpacker` for options. + """ + return unpackb(stream.read(), use_list=use_list, + object_hook=object_hook, object_pairs_hook=object_pairs_hook, list_hook=list_hook, + encoding=encoding, unicode_errors=unicode_errors, + ) + + +cdef class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(1024**2, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You shoud set this parameter when unpacking data from untrasted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker() + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + cdef unpack_context ctx + cdef char* buf + cdef size_t buf_size, buf_head, buf_tail + cdef object file_like + cdef object file_like_read + cdef Py_ssize_t read_size + # To maintain refcnt. + cdef object object_hook, object_pairs_hook, list_hook, ext_hook + cdef object encoding, unicode_errors + cdef size_t max_buffer_size + + def __cinit__(self): + self.buf = NULL + + def __dealloc__(self): + free(self.buf) + self.buf = NULL + + def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=1, + object object_hook=None, object object_pairs_hook=None, object list_hook=None, + encoding=None, unicode_errors='strict', int max_buffer_size=0, + object ext_hook=ExtType, + Py_ssize_t max_str_len=2147483647, # 2**32-1 + Py_ssize_t max_bin_len=2147483647, + Py_ssize_t max_array_len=2147483647, + Py_ssize_t max_map_len=2147483647, + Py_ssize_t max_ext_len=2147483647): + cdef char *cenc=NULL, + cdef char *cerr=NULL + + self.object_hook = object_hook + self.object_pairs_hook = object_pairs_hook + self.list_hook = list_hook + self.ext_hook = ext_hook + + self.file_like = file_like + if file_like: + self.file_like_read = file_like.read + if not PyCallable_Check(self.file_like_read): + raise TypeError("`file_like.read` must be a callable.") + if not max_buffer_size: + max_buffer_size = INT_MAX + if read_size > max_buffer_size: + raise ValueError("read_size should be less or equal to max_buffer_size") + if not read_size: + read_size = min(max_buffer_size, 1024**2) + self.max_buffer_size = max_buffer_size + self.read_size = read_size + self.buf = malloc(read_size) + if self.buf == NULL: + raise MemoryError("Unable to allocate internal buffer.") + self.buf_size = read_size + self.buf_head = 0 + self.buf_tail = 0 + + if encoding is not None: + if isinstance(encoding, unicode): + self.encoding = encoding.encode('ascii') + elif isinstance(encoding, bytes): + self.encoding = encoding + else: + raise TypeError("encoding should be bytes or unicode") + cenc = PyBytes_AsString(self.encoding) + + if unicode_errors is not None: + if isinstance(unicode_errors, unicode): + self.unicode_errors = unicode_errors.encode('ascii') + elif isinstance(unicode_errors, bytes): + self.unicode_errors = unicode_errors + else: + raise TypeError("unicode_errors should be bytes or unicode") + cerr = PyBytes_AsString(self.unicode_errors) + + init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, + ext_hook, use_list, cenc, cerr, + max_str_len, max_bin_len, max_array_len, + max_map_len, max_ext_len) + + def feed(self, object next_bytes): + """Append `next_bytes` to internal buffer.""" + cdef Py_buffer pybuff + if self.file_like is not None: + raise AssertionError( + "unpacker.feed() is not be able to use with `file_like`.") + PyObject_GetBuffer(next_bytes, &pybuff, PyBUF_SIMPLE) + try: + self.append_buffer(pybuff.buf, pybuff.len) + finally: + PyBuffer_Release(&pybuff) + + cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): + cdef: + char* buf = self.buf + char* new_buf + size_t head = self.buf_head + size_t tail = self.buf_tail + size_t buf_size = self.buf_size + size_t new_size + + if tail + _buf_len > buf_size: + if ((tail - head) + _buf_len) <= buf_size: + # move to front. + memmove(buf, buf + head, tail - head) + tail -= head + head = 0 + else: + # expand buffer. + new_size = (tail-head) + _buf_len + if new_size > self.max_buffer_size: + raise BufferFull + new_size = min(new_size*2, self.max_buffer_size) + new_buf = malloc(new_size) + if new_buf == NULL: + # self.buf still holds old buffer and will be freed during + # obj destruction + raise MemoryError("Unable to enlarge internal buffer.") + memcpy(new_buf, buf + head, tail - head) + free(buf) + + buf = new_buf + buf_size = new_size + tail -= head + head = 0 + + memcpy(buf + tail, (_buf), _buf_len) + self.buf = buf + self.buf_head = head + self.buf_size = buf_size + self.buf_tail = tail + _buf_len + + cdef read_from_file(self): + next_bytes = self.file_like_read( + min(self.read_size, + self.max_buffer_size - (self.buf_tail - self.buf_head) + )) + if next_bytes: + self.append_buffer(PyBytes_AsString(next_bytes), PyBytes_Size(next_bytes)) + else: + self.file_like = None + + cdef object _unpack(self, execute_fn execute, object write_bytes, bint iter=0): + cdef int ret + cdef object obj + cdef size_t prev_head + + if self.buf_head >= self.buf_tail and self.file_like is not None: + self.read_from_file() + + while 1: + prev_head = self.buf_head + if prev_head >= self.buf_tail: + if iter: + raise StopIteration("No more data to unpack.") + else: + raise OutOfData("No more data to unpack.") + + ret = execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) + if write_bytes is not None: + write_bytes(PyBytes_FromStringAndSize(self.buf + prev_head, self.buf_head - prev_head)) + + if ret == 1: + obj = unpack_data(&self.ctx) + unpack_init(&self.ctx) + return obj + elif ret == 0: + if self.file_like is not None: + self.read_from_file() + continue + if iter: + raise StopIteration("No more data to unpack.") + else: + raise OutOfData("No more data to unpack.") + else: + raise ValueError("Unpack failed: error = %d" % (ret,)) + + def read_bytes(self, Py_ssize_t nbytes): + """Read a specified number of raw bytes from the stream""" + cdef size_t nread + nread = min(self.buf_tail - self.buf_head, nbytes) + ret = PyBytes_FromStringAndSize(self.buf + self.buf_head, nread) + self.buf_head += nread + if len(ret) < nbytes and self.file_like is not None: + ret += self.file_like.read(nbytes - len(ret)) + return ret + + def unpack(self, object write_bytes=None): + """Unpack one object + + If write_bytes is not None, it will be called with parts of the raw + message as it is unpacked. + + Raises `OutOfData` when there are no more bytes to unpack. + """ + return self._unpack(unpack_construct, write_bytes) + + def skip(self, object write_bytes=None): + """Read and ignore one object, returning None + + If write_bytes is not None, it will be called with parts of the raw + message as it is unpacked. + + Raises `OutOfData` when there are no more bytes to unpack. + """ + return self._unpack(unpack_skip, write_bytes) + + def read_array_header(self, object write_bytes=None): + """assuming the next object is an array, return its size n, such that + the next n unpack() calls will iterate over its contents. + + Raises `OutOfData` when there are no more bytes to unpack. + """ + return self._unpack(read_array_header, write_bytes) + + def read_map_header(self, object write_bytes=None): + """assuming the next object is a map, return its size n, such that the + next n * 2 unpack() calls will iterate over its key-value pairs. + + Raises `OutOfData` when there are no more bytes to unpack. + """ + return self._unpack(read_map_header, write_bytes) + + def __iter__(self): + return self + + def __next__(self): + return self._unpack(unpack_construct, None, 1) + + # for debug. + #def _buf(self): + # return PyString_FromStringAndSize(self.buf, self.buf_tail) + + #def _off(self): + # return self.buf_head diff --git a/pandas/msgpack/_version.py b/pandas/msgpack/_version.py new file mode 100644 index 0000000000000..2c1c96c0759a1 --- /dev/null +++ b/pandas/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 4, 6) diff --git a/pandas/msgpack/exceptions.py b/pandas/msgpack/exceptions.py new file mode 100644 index 0000000000000..f7678f135bd26 --- /dev/null +++ b/pandas/msgpack/exceptions.py @@ -0,0 +1,29 @@ +class UnpackException(Exception): + pass + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + pass + + +class ExtraData(ValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + +class PackException(Exception): + pass + +class PackValueError(PackException, ValueError): + pass diff --git a/pandas/parser.pyx b/pandas/parser.pyx index b28e0587264d4..5baef2e4f0225 100644 --- a/pandas/parser.pyx +++ b/pandas/parser.pyx @@ -1074,7 +1074,8 @@ cdef class TextReader: na_filter, na_hashset) if user_dtype and na_count is not None: if na_count > 0: - raise Exception('Integer column has NA values') + raise Exception("Integer column has NA values in " + "column {column}".format(column=i)) if result is not None and dtype[1:] != 'i8': result = result.astype(dtype) diff --git a/pandas/sparse/tests/test_array.py b/pandas/sparse/tests/test_array.py index 5227bb23ad616..4ffc0b98ebc71 100644 --- a/pandas/sparse/tests/test_array.py +++ b/pandas/sparse/tests/test_array.py @@ -129,19 +129,19 @@ def _check_op(op, first, second): res = op(first, second) exp = SparseArray(op(first.values, second.values), fill_value=first.fill_value) - tm.assert_isinstance(res, SparseArray) + tm.assertIsInstance(res, SparseArray) assert_almost_equal(res.values, exp.values) res2 = op(first, second.values) - tm.assert_isinstance(res2, SparseArray) + tm.assertIsInstance(res2, SparseArray) assert_sp_array_equal(res, res2) res3 = op(first.values, second) - tm.assert_isinstance(res3, SparseArray) + tm.assertIsInstance(res3, SparseArray) assert_sp_array_equal(res, res3) res4 = op(first, 4) - tm.assert_isinstance(res4, SparseArray) + tm.assertIsInstance(res4, SparseArray) # ignore this if the actual op raises (e.g. pow) try: diff --git a/pandas/sparse/tests/test_libsparse.py b/pandas/sparse/tests/test_libsparse.py index cd68d264e6bf9..7f9e61571ebfc 100644 --- a/pandas/sparse/tests/test_libsparse.py +++ b/pandas/sparse/tests/test_libsparse.py @@ -8,7 +8,7 @@ import pandas.util.testing as tm from pandas.core.sparse import SparseSeries -from pandas import DataFrame +from pandas import DataFrame, compat from pandas._sparse import IntIndex, BlockIndex import pandas._sparse as splib @@ -230,6 +230,8 @@ def _check_case(xloc, xlen, yloc, ylen, eloc, elen): _check_length_exc(xindex.to_int_index(), longer_index.to_int_index()) + if compat.is_platform_windows(): + raise nose.SkipTest("segfaults on win-64 when all tests are run") check_cases(_check_case) @@ -287,7 +289,7 @@ def _check_case(xloc, xlen, yloc, ylen, eloc, elen): # see if survive the round trip xbindex = xindex.to_int_index().to_block_index() ybindex = yindex.to_int_index().to_block_index() - tm.assert_isinstance(xbindex, BlockIndex) + tm.assertIsInstance(xbindex, BlockIndex) self.assertTrue(xbindex.equals(xindex)) self.assertTrue(ybindex.equals(yindex)) check_cases(_check_case) diff --git a/pandas/sparse/tests/test_sparse.py b/pandas/sparse/tests/test_sparse.py index b506758355228..103f3992f950a 100644 --- a/pandas/sparse/tests/test_sparse.py +++ b/pandas/sparse/tests/test_sparse.py @@ -13,7 +13,7 @@ from pandas.util.testing import (assert_almost_equal, assert_series_equal, assert_frame_equal, assert_panel_equal, assertRaisesRegexp, - assert_array_equal, assert_attr_equal) + assert_numpy_array_equal, assert_attr_equal) from numpy.testing import assert_equal from pandas import Series, DataFrame, bdate_range, Panel, MultiIndex @@ -230,9 +230,9 @@ def test_to_dense_preserve_name(self): def test_constructor(self): # test setup guys self.assertTrue(np.isnan(self.bseries.fill_value)) - tm.assert_isinstance(self.bseries.sp_index, BlockIndex) + tm.assertIsInstance(self.bseries.sp_index, BlockIndex) self.assertTrue(np.isnan(self.iseries.fill_value)) - tm.assert_isinstance(self.iseries.sp_index, IntIndex) + tm.assertIsInstance(self.iseries.sp_index, IntIndex) self.assertEqual(self.zbseries.fill_value, 0) assert_equal(self.zbseries.values.values, @@ -258,7 +258,7 @@ def _check_const(sparse, name): # Sparse time series works date_index = bdate_range('1/1/2000', periods=len(self.bseries)) s5 = SparseSeries(self.bseries, index=date_index) - tm.assert_isinstance(s5, SparseTimeSeries) + tm.assertIsInstance(s5, SparseTimeSeries) # pass Series bseries2 = SparseSeries(self.bseries.to_dense()) @@ -404,13 +404,13 @@ def test_set_value(self): def test_getitem_slice(self): idx = self.bseries.index res = self.bseries[::2] - tm.assert_isinstance(res, SparseSeries) + tm.assertIsInstance(res, SparseSeries) expected = self.bseries.reindex(idx[::2]) assert_sp_series_equal(res, expected) res = self.bseries[:5] - tm.assert_isinstance(res, SparseSeries) + tm.assertIsInstance(res, SparseSeries) assert_sp_series_equal(res, self.bseries.reindex(idx[:5])) res = self.bseries[5:] @@ -575,7 +575,7 @@ def _compare_with_series(sps, new_index): reindexed = self.bseries.reindex(self.bseries.index, copy=False) reindexed.sp_values[:] = 1. - np.testing.assert_array_equal(self.bseries.sp_values, 1.) + tm.assert_numpy_array_equal(self.bseries.sp_values, np.repeat(1., 10)) def test_sparse_reindex(self): length = 10 @@ -756,13 +756,13 @@ def test_shift(self): def test_cumsum(self): result = self.bseries.cumsum() expected = self.bseries.to_dense().cumsum() - tm.assert_isinstance(result, SparseSeries) + tm.assertIsInstance(result, SparseSeries) self.assertEqual(result.name, self.bseries.name) assert_series_equal(result.to_dense(), expected) result = self.zbseries.cumsum() expected = self.zbseries.to_dense().cumsum() - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) assert_series_equal(result, expected) def test_combine_first(self): @@ -899,7 +899,7 @@ def _check_results_to_coo(results, check): (A, il, jl) = results (A_result, il_result, jl_result) = check # convert to dense and compare - assert_array_equal(A.todense(), A_result.todense()) + assert_numpy_array_equal(A.todense(), A_result.todense()) # or compare directly as difference of sparse # assert(abs(A - A_result).max() < 1e-12) # max is failing in python # 2.6 @@ -957,7 +957,7 @@ def test_as_matrix(self): def test_copy(self): cp = self.frame.copy() - tm.assert_isinstance(cp, SparseDataFrame) + tm.assertIsInstance(cp, SparseDataFrame) assert_sp_frame_equal(cp, self.frame) # as of v0.15.0 @@ -966,9 +966,9 @@ def test_copy(self): def test_constructor(self): for col, series in compat.iteritems(self.frame): - tm.assert_isinstance(series, SparseSeries) + tm.assertIsInstance(series, SparseSeries) - tm.assert_isinstance(self.iframe['A'].sp_index, IntIndex) + tm.assertIsInstance(self.iframe['A'].sp_index, IntIndex) # constructed zframe from matrix above self.assertEqual(self.zframe['A'].fill_value, 0) @@ -978,7 +978,7 @@ def test_constructor(self): # construct no data sdf = SparseDataFrame(columns=np.arange(10), index=np.arange(10)) for col, series in compat.iteritems(sdf): - tm.assert_isinstance(series, SparseSeries) + tm.assertIsInstance(series, SparseSeries) # construct from nested dict data = {} @@ -1047,9 +1047,9 @@ def test_constructor_from_series(self): # GH 2873 x = Series(np.random.randn(10000), name='a') x = x.to_sparse(fill_value=0) - tm.assert_isinstance(x, SparseSeries) + tm.assertIsInstance(x, SparseSeries) df = SparseDataFrame(x) - tm.assert_isinstance(df, SparseDataFrame) + tm.assertIsInstance(df, SparseDataFrame) x = Series(np.random.randn(10000), name='a') y = Series(np.random.randn(10000), name='b') @@ -1098,13 +1098,13 @@ def test_dense_to_sparse(self): df = DataFrame({'A': [nan, nan, nan, 1, 2], 'B': [1, 2, nan, nan, nan]}) sdf = df.to_sparse() - tm.assert_isinstance(sdf, SparseDataFrame) + tm.assertIsInstance(sdf, SparseDataFrame) self.assertTrue(np.isnan(sdf.default_fill_value)) - tm.assert_isinstance(sdf['A'].sp_index, BlockIndex) + tm.assertIsInstance(sdf['A'].sp_index, BlockIndex) tm.assert_frame_equal(sdf.to_dense(), df) sdf = df.to_sparse(kind='integer') - tm.assert_isinstance(sdf['A'].sp_index, IntIndex) + tm.assertIsInstance(sdf['A'].sp_index, IntIndex) df = DataFrame({'A': [0, 0, 0, 1, 2], 'B': [1, 2, 0, 0, 0]}, dtype=float) @@ -1172,7 +1172,7 @@ def _compare_to_dense(a, b, da, db, op): if isinstance(a, DataFrame) and isinstance(db, DataFrame): mixed_result = op(a, db) - tm.assert_isinstance(mixed_result, SparseDataFrame) + tm.assertIsInstance(mixed_result, SparseDataFrame) assert_sp_frame_equal(mixed_result, sparse_result, exact_indices=False) @@ -1220,7 +1220,7 @@ def test_op_corners(self): self.assertTrue(empty.empty) foo = self.frame + self.empty - tm.assert_isinstance(foo.index, DatetimeIndex) + tm.assertIsInstance(foo.index, DatetimeIndex) assert_frame_equal(foo, self.frame * np.nan) foo = self.empty + self.frame @@ -1240,8 +1240,10 @@ def test_getitem(self): self.assertRaises(Exception, sdf.__getitem__, ['a', 'd']) def test_icol(self): + # 10711 deprecated + # 2227 - result = self.frame.icol(0) + result = self.frame.iloc[:, 0] self.assertTrue(isinstance(result, SparseSeries)) assert_sp_series_equal(result, self.frame['A']) @@ -1249,7 +1251,7 @@ def test_icol(self): data = {'A': [0, 1]} iframe = SparseDataFrame(data, default_kind='integer') self.assertEqual(type(iframe['A'].sp_index), - type(iframe.icol(0).sp_index)) + type(iframe.iloc[:, 0].sp_index)) def test_set_value(self): @@ -1304,7 +1306,7 @@ def _check_frame(frame): # insert SparseSeries frame['E'] = frame['A'] - tm.assert_isinstance(frame['E'], SparseSeries) + tm.assertIsInstance(frame['E'], SparseSeries) assert_sp_series_equal(frame['E'], frame['A'], check_names=False) # insert SparseSeries differently-indexed @@ -1318,7 +1320,7 @@ def _check_frame(frame): # insert Series frame['F'] = frame['A'].to_dense() - tm.assert_isinstance(frame['F'], SparseSeries) + tm.assertIsInstance(frame['F'], SparseSeries) assert_sp_series_equal(frame['F'], frame['A'], check_names=False) # insert Series differently-indexed @@ -1331,7 +1333,7 @@ def _check_frame(frame): # insert ndarray frame['H'] = np.random.randn(N) - tm.assert_isinstance(frame['H'], SparseSeries) + tm.assertIsInstance(frame['H'], SparseSeries) to_sparsify = np.random.randn(N) to_sparsify[N // 2:] = frame.default_fill_value @@ -1407,7 +1409,7 @@ def test_append(self): def test_apply(self): applied = self.frame.apply(np.sqrt) - tm.assert_isinstance(applied, SparseDataFrame) + tm.assertIsInstance(applied, SparseDataFrame) assert_almost_equal(applied.values, np.sqrt(self.frame.values)) applied = self.fill_frame.apply(np.sqrt) @@ -1415,7 +1417,7 @@ def test_apply(self): # agg / broadcast broadcasted = self.frame.apply(np.sum, broadcast=True) - tm.assert_isinstance(broadcasted, SparseDataFrame) + tm.assertIsInstance(broadcasted, SparseDataFrame) assert_frame_equal(broadcasted.to_dense(), self.frame.to_dense().apply(np.sum, broadcast=True)) @@ -1443,7 +1445,7 @@ def test_apply_nonuq(self): def test_applymap(self): # just test that it works result = self.frame.applymap(lambda x: x * 2) - tm.assert_isinstance(result, SparseDataFrame) + tm.assertIsInstance(result, SparseDataFrame) def test_astype(self): self.assertRaises(Exception, self.frame.astype, np.int64) @@ -1635,7 +1637,7 @@ def test_count(self): def test_cumsum(self): result = self.frame.cumsum() expected = self.frame.to_dense().cumsum() - tm.assert_isinstance(result, SparseDataFrame) + tm.assertIsInstance(result, SparseDataFrame) assert_frame_equal(result.to_dense(), expected) def _check_all(self, check_func): @@ -1794,9 +1796,9 @@ def test_from_dict(self): def test_pickle(self): def _test_roundtrip(panel): result = self.round_trip_pickle(panel) - tm.assert_isinstance(result.items, Index) - tm.assert_isinstance(result.major_axis, Index) - tm.assert_isinstance(result.minor_axis, Index) + tm.assertIsInstance(result.items, Index) + tm.assertIsInstance(result.major_axis, Index) + tm.assertIsInstance(result.minor_axis, Index) assert_sp_panel_equal(panel, result) _test_roundtrip(self.panel) @@ -1804,7 +1806,7 @@ def _test_roundtrip(panel): def test_dense_to_sparse(self): wp = Panel.from_dict(self.data_dict) dwp = wp.to_sparse() - tm.assert_isinstance(dwp['ItemA']['A'], SparseSeries) + tm.assertIsInstance(dwp['ItemA']['A'], SparseSeries) def test_to_dense(self): dwp = self.panel.to_dense() diff --git a/pandas/src/datetime/np_datetime_strings.c b/pandas/src/datetime/np_datetime_strings.c index 44363fd930510..f7835971ed0b7 100644 --- a/pandas/src/datetime/np_datetime_strings.c +++ b/pandas/src/datetime/np_datetime_strings.c @@ -117,6 +117,7 @@ get_localtime(NPY_TIME_T *ts, struct tm *tms) return -1; } +#if 0 /* * Wraps `gmtime` functionality for multiple platforms. This * converts a time value to a time structure in UTC. @@ -161,6 +162,7 @@ get_gmtime(NPY_TIME_T *ts, struct tm *tms) "to a UTC time", func_name); return -1; } +#endif /* * Converts a datetimestruct in UTC to a datetimestruct in local time, @@ -1144,7 +1146,7 @@ make_iso_8601_datetime(pandas_datetimestruct *dts, char *outstr, int outlen, #ifdef _WIN32 tmplen = _snprintf(substr, sublen, "%04" NPY_INT64_FMT, dts->year); #else - tmplen = snprintf(substr, sublen, "%04" NPY_INT64_FMT, (long long)dts->year); + tmplen = snprintf(substr, sublen, "%04" NPY_INT64_FMT, dts->year); #endif /* If it ran out of space or there isn't space for the NULL terminator */ if (tmplen < 0 || tmplen > sublen) { diff --git a/pandas/src/generate_code.py b/pandas/src/generate_code.py index 598cdff30e4f7..29a991a9acfd3 100644 --- a/pandas/src/generate_code.py +++ b/pandas/src/generate_code.py @@ -1,12 +1,24 @@ +""" +This file generates `generated.pyx` which is then included in `../algos.pyx` +during building. To regenerate `generated.pyx`, just run: + + `python generate_code.py`. + +""" + from __future__ import print_function -# we only need to be able to run this file on 2.7 -# don't introduce a pandas/pandas.compat import -# or we get a bootstrapping problem -from StringIO import StringIO +import os +from pandas.compat import StringIO import numpy as np _int64_max = np.iinfo(np.int64).max +warning_to_new_contributors = """ +# DO NOT EDIT THIS FILE: This file was autogenerated from generate_code.py, so +# please edit that file and then run `python2 generate_code.py` to re-generate +# this file. +""" + header = """ cimport numpy as np cimport cython @@ -23,6 +35,9 @@ from cpython cimport PyFloat_Check cimport cpython +cdef extern from "numpy/npy_math.h": + double NAN "NPY_NAN" + import numpy as np isnan = np.isnan @@ -70,29 +85,31 @@ return arr.asobject else: return np.array(arr, dtype=np.object_) - """ -take_1d_template = """@cython.wraparound(False) -def take_1d_%(name)s_%(dest)s(ndarray[%(c_type_in)s] values, - ndarray[int64_t] indexer, - ndarray[%(c_type_out)s] out, +take_1d_template = """ +@cython.wraparound(False) +@cython.boundscheck(False) +def take_1d_%(name)s_%(dest)s(%(c_type_in)s[:] values, + int64_t[:] indexer, + %(c_type_out)s[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx %(c_type_out)s fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = %(preval)svalues[idx]%(postval)s + %(nogil)s + %(tab)sfor i from 0 <= i < n: + %(tab)s idx = indexer[i] + %(tab)s if idx == -1: + %(tab)s out[i] = fv + %(tab)s else: + %(tab)s out[i] = %(preval)svalues[idx]%(postval)s """ inner_take_2d_axis0_template = """\ @@ -134,7 +151,6 @@ def take_1d_%(name)s_%(dest)s(ndarray[%(c_type_in)s] values, else: for j from 0 <= j < k: out[i, j] = %(preval)svalues[idx, j]%(postval)s - """ take_2d_axis0_template = """\ @@ -241,7 +257,6 @@ def take_2d_multi_%(name)s_%(dest)s(ndarray[%(c_type_in)s, ndim=2] values, out[i, j] = fv else: out[i, j] = %(preval)svalues[idx, idx1[j]]%(postval)s - """ @@ -332,7 +347,6 @@ def backfill_%(name)s(ndarray[%(c_type)s] old, ndarray[%(c_type)s] new, cur = prev return indexer - """ @@ -396,7 +410,6 @@ def pad_%(name)s(ndarray[%(c_type)s] old, ndarray[%(c_type)s] new, cur = next return indexer - """ pad_1d_template = """@cython.boundscheck(False) @@ -431,7 +444,6 @@ def pad_inplace_%(name)s(ndarray[%(c_type)s] values, else: fill_count = 0 val = values[i] - """ pad_2d_template = """@cython.boundscheck(False) @@ -592,12 +604,11 @@ def is_monotonic_%(name)s(ndarray[%(c_type)s] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n %(c_type)s prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -606,33 +617,40 @@ def is_monotonic_%(name)s(ndarray[%(c_type)s] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None - - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique + return False, False + + %(nogil)s + %(tab)sprev = arr[0] + %(tab)sfor i in range(1, n): + %(tab)s cur = arr[i] + %(tab)s if timelike and cur == iNaT: + %(tab)s is_monotonic_inc = 0 + %(tab)s is_monotonic_dec = 0 + %(tab)s break + %(tab)s if cur < prev: + %(tab)s is_monotonic_inc = 0 + %(tab)s elif cur > prev: + %(tab)s is_monotonic_dec = 0 + %(tab)s elif cur == prev: + %(tab)s pass # is_unique = 0 + %(tab)s else: + %(tab)s # cur or prev is NaN + %(tab)s is_monotonic_inc = 0 + %(tab)s is_monotonic_dec = 0 + %(tab)s break + %(tab)s if not is_monotonic_inc and not is_monotonic_dec: + %(tab)s is_monotonic_inc = 0 + %(tab)s is_monotonic_dec = 0 + %(tab)s break + %(tab)s prev = cur + return is_monotonic_inc, is_monotonic_dec """ map_indices_template = """@cython.wraparound(False) @@ -656,7 +674,6 @@ def is_monotonic_%(name)s(ndarray[%(c_type)s] arr, bint timelike): result[index[i]] = i return result - """ groupby_template = """@cython.wraparound(False) @@ -686,11 +703,10 @@ def groupby_%(name)s(ndarray[%(c_type)s] index, ndarray labels): result[key] = [idx] return result - """ group_last_template = """@cython.wraparound(False) -@cython.wraparound(False) +@cython.boundscheck(False) def group_last_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -699,7 +715,7 @@ def group_last_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -712,30 +728,31 @@ def group_last_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + resx[lab, j] = val - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = resx[i, j] + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = resx[i, j] """ group_last_bin_template = """@cython.wraparound(False) -@cython.wraparound(False) +@cython.boundscheck(False) def group_last_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -751,6 +768,8 @@ def group_last_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -758,30 +777,31 @@ def group_last_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] - - # not nan - if val == val: - nobs[b, j] += 1 - resx[b, j] = val - - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = resx[i, j] + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = resx[i, j] """ -group_nth_bin_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_nth_bin_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_nth_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -797,6 +817,8 @@ def group_nth_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bin) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -804,31 +826,32 @@ def group_nth_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - if nobs[b, j] == rank: - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + if nobs[b, j] == rank: + resx[b, j] = val - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = resx[i, j] + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = resx[i, j] """ -group_nth_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_nth_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_nth_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -837,7 +860,7 @@ def group_nth_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -850,31 +873,32 @@ def group_nth_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - if nobs[lab, j] == rank: - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + if nobs[lab, j] == rank: + resx[lab, j] = val - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = resx[i, j] + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = resx[i, j] """ -group_add_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_add_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_add_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -883,7 +907,7 @@ def group_add_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] sumx, nobs @@ -895,44 +919,50 @@ def group_add_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: - # not nan - if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + if K > 1: - counts[lab] += 1 - val = values[i, 0] + for i in range(N): + lab = labels[i] + if lab < 0: + continue - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val + counts[lab] += 1 + for j in range(K): + val = values[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + + else: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] + + # not nan + if val == val: + nobs[lab, 0] += 1 + sumx[lab, 0] += val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] """ -group_add_bin_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_add_bin_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_add_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(dest_type2)s, ndim=2] values, @@ -948,49 +978,54 @@ def group_add_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, nobs = np.zeros_like(out) sumx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: - # not nan - if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - val = values[i, 0] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] + counts[b] += 1 + val = values[i, 0] + + # not nan + if val == val: + nobs[b, 0] += 1 + sumx[b, 0] += val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] """ -group_prod_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_prod_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_prod_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -999,7 +1034,7 @@ def group_prod_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] prodx, nobs @@ -1011,44 +1046,45 @@ def group_prod_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - prodx[lab, j] *= val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + # not nan + if val == val: + nobs[lab, j] += 1 + prodx[lab, j] *= val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - val = values[i, 0] + counts[lab] += 1 + val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - prodx[lab, 0] *= val + # not nan + if val == val: + nobs[lab, 0] += 1 + prodx[lab, 0] *= val - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] """ -group_prod_bin_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_prod_bin_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_prod_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(dest_type2)s, ndim=2] values, @@ -1064,70 +1100,75 @@ def group_prod_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, nobs = np.zeros_like(out) prodx = np.ones_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - if val == val: - nobs[b, j] += 1 - prodx[b, j] *= val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + counts[b] += 1 + for j in range(K): + val = values[i, j] - counts[b] += 1 - val = values[i, 0] + # not nan + if val == val: + nobs[b, j] += 1 + prodx[b, j] *= val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - if val == val: - nobs[b, 0] += 1 - prodx[b, 0] *= val + counts[b] += 1 + val = values[i, 0] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] + # not nan + if val == val: + nobs[b, 0] += 1 + prodx[b, 0] *= val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] """ group_var_template = """@cython.wraparound(False) @cython.boundscheck(False) +@cython.cdivision(True) def group_var_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(dest_type2)s, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab - %(dest_type2)s val, ct - ndarray[%(dest_type2)s, ndim=2] nobs, sumx, sumxx + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) + %(dest_type2)s val, ct, oldmean + ndarray[%(dest_type2)s, ndim=2] nobs, mean if not len(values) == len(labels): raise AssertionError("len(index) != len(labels)") nobs = np.zeros_like(out) - sumx = np.zeros_like(out) - sumxx = np.zeros_like(out) + mean = np.zeros_like(out) N, K = ( values).shape - if K > 1: - for i in range(N): + out[:, :] = 0.0 + with nogil: + for i in range(N): lab = labels[i] if lab < 0: continue @@ -1140,32 +1181,18 @@ def group_var_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, # not nan if val == val: nobs[lab, j] += 1 - sumx[lab, j] += val - sumxx[lab, j] += val * val - else: - for i in range(N): + oldmean = mean[lab, j] + mean[lab, j] += (val - oldmean) / nobs[lab, j] + out[lab, j] += (val - mean[lab, j]) * (val - oldmean) - lab = labels[i] - if lab < 0: - continue + for i in range(ncounts): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] /= (ct - 1) - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val - sumxx[lab, 0] += val * val - - - for i in range(len(counts)): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) """ group_var_bin_template = """@cython.wraparound(False) @@ -1184,6 +1211,8 @@ def group_var_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, sumx = np.zeros_like(out) sumxx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -1191,44 +1220,45 @@ def group_var_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 + counts[b] += 1 - for j in range(K): - val = values[i, j] + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + sumxx[b, j] += val * val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - sumxx[b, j] += val * val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + sumx[b, 0] += val + sumxx[b, 0] += val * val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val - sumxx[b, 0] += val * val - - for i in range(ngroups): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) + for i in range(ngroups): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / + (ct * ct - ct)) """ group_count_template = """@cython.boundscheck(False) @@ -1241,36 +1271,36 @@ def group_count_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] %(c_type)s val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") - - for i in range(N): - lab = labels[i] - if lab < 0: - continue + raise AssertionError("len(index) != len(labels)") - counts[lab] += 1 - for j in range(K): - val = values[i, j] - # not nan - nobs[lab, j] += val == val and val != iNaT + %(nogil)s + %(tab)sfor i in range(N): + %(tab)s lab = labels[i] + %(tab)s if lab < 0: + %(tab)s continue - for i in range(len(counts)): - for j in range(K): - out[i, j] = nobs[i, j] + %(tab)s counts[lab] += 1 + %(tab)s for j in range(K): + %(tab)s val = values[i, j] + %(tab)s # not nan + %(tab)s nobs[lab, j] += val == val and val != iNaT + %(tab)sfor i in range(ncounts): + %(tab)s for j in range(K): + %(tab)s out[i, j] = nobs[i, j] """ -group_count_bin_template = """@cython.boundscheck(False) -@cython.wraparound(False) +group_count_bin_template = """@cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(c_type)s, ndim=2] values, @@ -1285,25 +1315,27 @@ def group_count_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] + %(nogil)s + %(tab)sfor i in range(N): + %(tab)s while b < ngroups - 1 and i >= bins[b]: + %(tab)s b += 1 - # not nan - nobs[b, j] += val == val and val != iNaT - - for i in range(ngroups): - for j in range(K): - out[i, j] = nobs[i, j] + %(tab)s counts[b] += 1 + %(tab)s for j in range(K): + %(tab)s val = values[i, j] + %(tab)s # not nan + %(tab)s nobs[b, j] += val == val and val != iNaT + %(tab)sfor i in range(ngroups): + %(tab)s for j in range(K): + %(tab)s out[i, j] = nobs[i, j] """ + # add passing bin edges, instead of labels @@ -1329,6 +1361,8 @@ def group_min_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, minx = np.empty_like(out) minx.fill(%(inf_val)s) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -1336,41 +1370,42 @@ def group_min_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val < minx[b, j]: + minx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val < minx[b, j]: - minx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + if val < minx[b, 0]: + minx[b, 0] = val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - if val < minx[b, 0]: - minx[b, 0] = val - - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = minx[i, j] + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = minx[i, j] """ group_max_template = """@cython.wraparound(False) @@ -1383,7 +1418,7 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] maxx, nobs @@ -1397,42 +1432,43 @@ def group_max_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val > maxx[lab, j]: + maxx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val > maxx[lab, j]: - maxx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + if val > maxx[lab, 0]: + maxx[lab, 0] = val - counts[lab] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[lab, 0] += 1 - if val > maxx[lab, 0]: - maxx[lab, 0] = val - - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = maxx[i, j] + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = maxx[i, j] """ group_max_bin_template = """@cython.wraparound(False) @@ -1453,6 +1489,8 @@ def group_max_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, maxx = np.empty_like(out) maxx.fill(-%(inf_val)s) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -1460,41 +1498,42 @@ def group_max_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val > maxx[b, j]: + maxx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val > maxx[b, j]: - maxx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + if val > maxx[b, 0]: + maxx[b, 0] = val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - if val > maxx[b, 0]: - maxx[b, 0] = val - - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = maxx[i, j] + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = maxx[i, j] """ @@ -1508,7 +1547,7 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] minx, nobs @@ -1522,42 +1561,43 @@ def group_min_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val < minx[lab, j]: + minx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val < minx[lab, j]: - minx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + if val < minx[lab, 0]: + minx[lab, 0] = val - counts[lab] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[lab, 0] += 1 - if val < minx[lab, 0]: - minx[lab, 0] = val - - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = %(nan_val)s - else: - out[i, j] = minx[i, j] + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = %(nan_val)s + else: + out[i, j] = minx[i, j] """ @@ -1568,7 +1608,7 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[%(dest_type2)s, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) %(dest_type2)s val, count ndarray[%(dest_type2)s, ndim=2] sumx, nobs @@ -1580,42 +1620,44 @@ def group_mean_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + sumx[lab, 0] += val - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val - - for i in range(len(counts)): - for j in range(K): - count = nobs[i, j] - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count + for i in range(ncounts): + for j in range(K): + count = nobs[i, j] + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count """ group_mean_bin_template = """ +@cython.boundscheck(False) def group_mean_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, ndarray[int64_t] counts, ndarray[%(dest_type2)s, ndim=2] values, @@ -1629,45 +1671,48 @@ def group_mean_bin_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, sumx = np.zeros_like(out) N, K = ( values).shape + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + sumx[b, 0] += val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val - - for i in range(ngroups): - for j in range(K): - count = nobs[i, j] - if count == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count + for i in range(ngroups): + for j in range(K): + count = nobs[i, j] + if count == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count """ group_ohlc_template = """@cython.wraparound(False) @@ -1682,9 +1727,11 @@ def group_ohlc_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, cdef: Py_ssize_t i, j, N, K, ngroups, b %(dest_type2)s val, count - %(dest_type2)s vopen, vhigh, vlow, vclose, NA + %(dest_type2)s vopen, vhigh, vlow, vclose bint got_first = 0 + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -1695,55 +1742,55 @@ def group_ohlc_%(name)s(ndarray[%(dest_type2)s, ndim=2] out, if out.shape[1] != 4: raise ValueError('Output array must have 4 columns') - NA = np.nan - b = 0 if K > 1: raise NotImplementedError("Argument 'values' must have only " "one dimension") else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose - b += 1 - got_first = 0 - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - if not got_first: - got_first = 1 - vopen = val - vlow = val - vhigh = val - else: - if val < vlow: + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose + b += 1 + got_first = 0 + + counts[b] += 1 + val = values[i, 0] + + # not nan + if val == val: + if not got_first: + got_first = 1 + vopen = val vlow = val - if val > vhigh: vhigh = val - vclose = val - - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose + else: + if val < vlow: + vlow = val + if val > vhigh: + vhigh = val + vclose = val + + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose """ arrmap_template = """@cython.wraparound(False) @@ -1760,7 +1807,6 @@ def arrmap_%(name)s(ndarray[%(c_type)s] index, object func): result[i] = func(index[i]) return maybe_convert_objects(result) - """ #---------------------------------------------------------------------- @@ -1812,7 +1858,6 @@ def left_join_indexer_unique_%(name)s(ndarray[%(c_type)s] left, indexer[i] = -1 i += 1 return indexer - """ # @cython.wraparound(False) @@ -1919,7 +1964,6 @@ def left_join_indexer_%(name)s(ndarray[%(c_type)s] left, j += 1 return result, lindexer, rindexer - """ @@ -2015,7 +2059,6 @@ def inner_join_indexer_%(name)s(ndarray[%(c_type)s] left, j += 1 return result, lindexer, rindexer - """ @@ -2088,7 +2131,7 @@ def outer_join_indexer_%(name)s(ndarray[%(c_type)s] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] @@ -2147,7 +2190,6 @@ def outer_join_indexer_%(name)s(ndarray[%(c_type)s] left, j += 1 return result, lindexer, rindexer - """ outer_join_template = """@cython.wraparound(False) @@ -2245,7 +2287,6 @@ def outer_join_indexer_%(name)s(ndarray[%(c_type)s] left, count += 1 return result, lindexer, rindexer - """ # ensure_dtype functions @@ -2259,7 +2300,6 @@ def outer_join_indexer_%(name)s(ndarray[%(c_type)s] left, return arr.astype(np.%(dtype)s) else: return np.array(arr, dtype=np.%(dtype)s) - """ ensure_functions = [ @@ -2303,19 +2343,19 @@ def put2d_%(name)s_%(dest_type)s(ndarray[%(c_type)s, ndim=2, cast=True] values, def generate_put_template(template, use_ints=True, use_floats=True, use_objects=False, use_datelikes=False): floats_list = [ - ('float64', 'float64_t', 'float64_t', 'np.float64'), - ('float32', 'float32_t', 'float32_t', 'np.float32'), + ('float64', 'float64_t', 'float64_t', 'np.float64', True), + ('float32', 'float32_t', 'float32_t', 'np.float32', True), ] ints_list = [ - ('int8', 'int8_t', 'float32_t', 'np.float32'), - ('int16', 'int16_t', 'float32_t', 'np.float32'), - ('int32', 'int32_t', 'float64_t', 'np.float64'), - ('int64', 'int64_t', 'float64_t', 'np.float64'), + ('int8', 'int8_t', 'float32_t', 'np.float32', True), + ('int16', 'int16_t', 'float32_t', 'np.float32', True), + ('int32', 'int32_t', 'float64_t', 'np.float64', True), + ('int64', 'int64_t', 'float64_t', 'np.float64', True), ] date_like_list = [ - ('int64', 'int64_t', 'float64_t', 'np.float64'), + ('int64', 'int64_t', 'float64_t', 'np.float64', True), ] - object_list = [('object', 'object', 'object', 'np.object_')] + object_list = [('object', 'object', 'object', 'np.object_', False)] function_list = [] if use_floats: function_list.extend(floats_list) @@ -2327,28 +2367,31 @@ def generate_put_template(template, use_ints=True, use_floats=True, function_list.extend(date_like_list) output = StringIO() - for name, c_type, dest_type, dest_dtype in function_list: + for name, c_type, dest_type, dest_dtype, nogil in function_list: func = template % {'name': name, 'c_type': c_type, 'dest_type': dest_type.replace('_t', ''), 'dest_type2': dest_type, - 'dest_dtype': dest_dtype} + 'dest_dtype': dest_dtype, + 'nogil' : 'with nogil:' if nogil else '', + 'tab' : ' ' if nogil else '' } output.write(func) + output.write("\n") return output.getvalue() def generate_put_min_max_template(template, use_ints=True, use_floats=True, use_objects=False, use_datelikes=False): floats_list = [ - ('float64', 'float64_t', 'nan', 'np.inf'), - ('float32', 'float32_t', 'nan', 'np.inf'), + ('float64', 'float64_t', 'NAN', 'np.inf', True), + ('float32', 'float32_t', 'NAN', 'np.inf', True), ] ints_list = [ - ('int64', 'int64_t', 'iNaT', _int64_max), + ('int64', 'int64_t', 'iNaT', _int64_max, True), ] date_like_list = [ - ('int64', 'int64_t', 'iNaT', _int64_max), + ('int64', 'int64_t', 'iNaT', _int64_max, True), ] - object_list = [('object', 'object', 'nan', 'np.inf')] + object_list = [('object', 'object', 'np.nan', 'np.inf', False)] function_list = [] if use_floats: function_list.extend(floats_list) @@ -2360,27 +2403,30 @@ def generate_put_min_max_template(template, use_ints=True, use_floats=True, function_list.extend(date_like_list) output = StringIO() - for name, dest_type, nan_val, inf_val in function_list: + for name, dest_type, nan_val, inf_val, nogil in function_list: func = template % {'name': name, 'dest_type2': dest_type, 'nan_val': nan_val, - 'inf_val': inf_val} + 'inf_val': inf_val, + 'nogil' : "with nogil:" if nogil else '', + 'tab' : ' ' if nogil else '' } output.write(func) + output.write("\n") return output.getvalue() def generate_put_selection_template(template, use_ints=True, use_floats=True, use_objects=False, use_datelikes=False): floats_list = [ - ('float64', 'float64_t', 'float64_t', 'nan'), - ('float32', 'float32_t', 'float32_t', 'nan'), + ('float64', 'float64_t', 'float64_t', 'NAN', True), + ('float32', 'float32_t', 'float32_t', 'NAN', True), ] ints_list = [ - ('int64', 'int64_t', 'int64_t', 'iNaT'), + ('int64', 'int64_t', 'int64_t', 'iNaT', True), ] date_like_list = [ - ('int64', 'int64_t', 'int64_t', 'iNaT'), + ('int64', 'int64_t', 'int64_t', 'iNaT', True), ] - object_list = [('object', 'object', 'object', 'nan')] + object_list = [('object', 'object', 'object', 'np.nan', False)] function_list = [] if use_floats: function_list.extend(floats_list) @@ -2392,72 +2438,97 @@ def generate_put_selection_template(template, use_ints=True, use_floats=True, function_list.extend(date_like_list) output = StringIO() - for name, c_type, dest_type, nan_val in function_list: + for name, c_type, dest_type, nan_val, nogil in function_list: + + if nogil: + nogil = "with nogil:" + tab = ' ' + else: + nogil = '' + tab = '' + func = template % {'name': name, 'c_type': c_type, 'dest_type2': dest_type, - 'nan_val': nan_val} + 'nan_val': nan_val, + 'nogil' : nogil, + 'tab' : tab } output.write(func) + output.write("\n") return output.getvalue() def generate_take_template(template, exclude=None): - # name, dest, ctypein, ctypeout, preval, postval, cancopy + # name, dest, ctypein, ctypeout, preval, postval, cancopy, nogil function_list = [ - ('bool', 'bool', 'uint8_t', 'uint8_t', '', '', True), + ('bool', 'bool', 'uint8_t', 'uint8_t', '', '', True, True), ('bool', 'object', 'uint8_t', 'object', - 'True if ', ' > 0 else False', False), - ('int8', 'int8', 'int8_t', 'int8_t', '', '', True), - ('int8', 'int32', 'int8_t', 'int32_t', '', '', False), - ('int8', 'int64', 'int8_t', 'int64_t', '', '', False), - ('int8', 'float64', 'int8_t', 'float64_t', '', '', False), - ('int16', 'int16', 'int16_t', 'int16_t', '', '', True), - ('int16', 'int32', 'int16_t', 'int32_t', '', '', False), - ('int16', 'int64', 'int16_t', 'int64_t', '', '', False), - ('int16', 'float64', 'int16_t', 'float64_t', '', '', False), - ('int32', 'int32', 'int32_t', 'int32_t', '', '', True), - ('int32', 'int64', 'int32_t', 'int64_t', '', '', False), - ('int32', 'float64', 'int32_t', 'float64_t', '', '', False), - ('int64', 'int64', 'int64_t', 'int64_t', '', '', True), - ('int64', 'float64', 'int64_t', 'float64_t', '', '', False), - ('float32', 'float32', 'float32_t', 'float32_t', '', '', True), - ('float32', 'float64', 'float32_t', 'float64_t', '', '', False), - ('float64', 'float64', 'float64_t', 'float64_t', '', '', True), - ('object', 'object', 'object', 'object', '', '', False) + 'True if ', ' > 0 else False', False, False), + ('int8', 'int8', 'int8_t', 'int8_t', '', '', True, False), + ('int8', 'int32', 'int8_t', 'int32_t', '', '', False, True), + ('int8', 'int64', 'int8_t', 'int64_t', '', '', False, True), + ('int8', 'float64', 'int8_t', 'float64_t', '', '', False, True), + ('int16', 'int16', 'int16_t', 'int16_t', '', '', True, True), + ('int16', 'int32', 'int16_t', 'int32_t', '', '', False, True), + ('int16', 'int64', 'int16_t', 'int64_t', '', '', False, True), + ('int16', 'float64', 'int16_t', 'float64_t', '', '', False, True), + ('int32', 'int32', 'int32_t', 'int32_t', '', '', True, True), + ('int32', 'int64', 'int32_t', 'int64_t', '', '', False, True), + ('int32', 'float64', 'int32_t', 'float64_t', '', '', False, True), + ('int64', 'int64', 'int64_t', 'int64_t', '', '', True, True), + ('int64', 'float64', 'int64_t', 'float64_t', '', '', False, True), + ('float32', 'float32', 'float32_t', 'float32_t', '', '', True, True), + ('float32', 'float64', 'float32_t', 'float64_t', '', '', False, True), + ('float64', 'float64', 'float64_t', 'float64_t', '', '', True, True), + ('object', 'object', 'object', 'object', '', '', False, False), ] output = StringIO() for (name, dest, c_type_in, c_type_out, - preval, postval, can_copy) in function_list: + preval, postval, can_copy, nogil) in function_list: + if exclude is not None and name in exclude: continue + if nogil: + nogil = "with nogil:" + tab = ' ' + else: + nogil = '' + tab = '' + func = template % {'name': name, 'dest': dest, 'c_type_in': c_type_in, 'c_type_out': c_type_out, 'preval': preval, 'postval': postval, - 'can_copy': 'True' if can_copy else 'False'} + 'can_copy': 'True' if can_copy else 'False', + 'nogil' : nogil, + 'tab' : tab } output.write(func) + output.write("\n") return output.getvalue() def generate_from_template(template, exclude=None): # name, ctype, capable of holding NA function_list = [ - ('float64', 'float64_t', 'np.float64', True), - ('float32', 'float32_t', 'np.float32', True), - ('object', 'object', 'object', True), - ('int32', 'int32_t', 'np.int32', False), - ('int64', 'int64_t', 'np.int64', False), - ('bool', 'uint8_t', 'np.bool', False) + ('float64', 'float64_t', 'np.float64', True, True), + ('float32', 'float32_t', 'np.float32', True, True), + ('object', 'object', 'object', True, False), + ('int32', 'int32_t', 'np.int32', False, True), + ('int64', 'int64_t', 'np.int64', False, True), + ('bool', 'uint8_t', 'np.bool', False, True) ] output = StringIO() - for name, c_type, dtype, can_hold_na in function_list: + for name, c_type, dtype, can_hold_na, nogil in function_list: if exclude is not None and name in exclude: continue func = template % {'name': name, 'c_type': c_type, 'dtype': dtype, - 'raise_on_na': 'False' if can_hold_na else 'True'} + 'raise_on_na': 'False' if can_hold_na else 'True', + 'nogil' : 'with nogil:' if nogil else '', + 'tab' : ' ' if nogil else '' } output.write(func) + output.write("\n") return output.getvalue() put_2d = [diff_2d_template] @@ -2506,8 +2577,14 @@ def generate_from_template(template, exclude=None): take_2d_multi_template] -def generate_take_cython_file(path='generated.pyx'): +def generate_take_cython_file(): + # Put `generated.pyx` in the same directory as this file + directory = os.path.dirname(os.path.realpath(__file__)) + filename = 'generated.pyx' + path = os.path.join(directory, filename) + with open(path, 'w') as f: + print(warning_to_new_contributors, file=f) print(header, file=f) print(generate_ensure_dtypes(), file=f) @@ -2536,13 +2613,7 @@ def generate_take_cython_file(path='generated.pyx'): print(generate_put_selection_template(template, use_ints=True, use_datelikes=True, use_objects=True), - file=f) - - # for template in templates_1d_datetime: - # print >> f, generate_from_template_datetime(template) - - # for template in templates_2d_datetime: - # print >> f, generate_from_template_datetime(template, ndim=2) + file=f) for template in nobool_1d_templates: print(generate_from_template(template, exclude=['bool']), file=f) diff --git a/pandas/src/generated.pyx b/pandas/src/generated.pyx index 428decd4dca10..d4cf7824c8911 100644 --- a/pandas/src/generated.pyx +++ b/pandas/src/generated.pyx @@ -1,4 +1,9 @@ +# DO NOT EDIT THIS FILE: This file was autogenerated from generate_code.py, so +# please edit that file and then run `python2 generate_code.py` to re-generate +# this file. + + cimport numpy as np cimport cython @@ -14,6 +19,9 @@ from cpython cimport (PyDict_New, PyDict_GetItem, PyDict_SetItem, from cpython cimport PyFloat_Check cimport cpython +cdef extern from "numpy/npy_math.h": + double NAN "NPY_NAN" + import numpy as np isnan = np.isnan @@ -63,7 +71,6 @@ cpdef ensure_object(object arr): return np.array(arr, dtype=np.object_) - cpdef ensure_float64(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_FLOAT64: @@ -73,7 +80,6 @@ cpdef ensure_float64(object arr): else: return np.array(arr, dtype=np.float64) - cpdef ensure_float32(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_FLOAT32: @@ -83,7 +89,6 @@ cpdef ensure_float32(object arr): else: return np.array(arr, dtype=np.float32) - cpdef ensure_int8(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_INT8: @@ -93,7 +98,6 @@ cpdef ensure_int8(object arr): else: return np.array(arr, dtype=np.int8) - cpdef ensure_int16(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_INT16: @@ -103,7 +107,6 @@ cpdef ensure_int16(object arr): else: return np.array(arr, dtype=np.int16) - cpdef ensure_int32(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_INT32: @@ -113,7 +116,6 @@ cpdef ensure_int32(object arr): else: return np.array(arr, dtype=np.int32) - cpdef ensure_int64(object arr): if util.is_array(arr): if ( arr).descr.type_num == NPY_INT64: @@ -123,7 +125,6 @@ cpdef ensure_int64(object arr): else: return np.array(arr, dtype=np.int64) - @cython.wraparound(False) @cython.boundscheck(False) cpdef map_indices_float64(ndarray[float64_t] index): @@ -1228,6 +1229,7 @@ def backfill_inplace_float64(ndarray[float64_t] values, else: fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_inplace_float32(ndarray[float32_t] values, @@ -1260,6 +1262,7 @@ def backfill_inplace_float32(ndarray[float32_t] values, else: fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_inplace_object(ndarray[object] values, @@ -1292,6 +1295,7 @@ def backfill_inplace_object(ndarray[object] values, else: fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_inplace_int32(ndarray[int32_t] values, @@ -1324,6 +1328,7 @@ def backfill_inplace_int32(ndarray[int32_t] values, else: fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_inplace_int64(ndarray[int64_t] values, @@ -1356,6 +1361,7 @@ def backfill_inplace_int64(ndarray[int64_t] values, else: fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_inplace_bool(ndarray[uint8_t] values, @@ -1389,6 +1395,7 @@ def backfill_inplace_bool(ndarray[uint8_t] values, fill_count = 0 val = values[i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_float64(ndarray[float64_t, ndim=2] values, @@ -1423,6 +1430,7 @@ def pad_2d_inplace_float64(ndarray[float64_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_float32(ndarray[float32_t, ndim=2] values, @@ -1457,6 +1465,7 @@ def pad_2d_inplace_float32(ndarray[float32_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_object(ndarray[object, ndim=2] values, @@ -1491,6 +1500,7 @@ def pad_2d_inplace_object(ndarray[object, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_int32(ndarray[int32_t, ndim=2] values, @@ -1525,6 +1535,7 @@ def pad_2d_inplace_int32(ndarray[int32_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_int64(ndarray[int64_t, ndim=2] values, @@ -1559,6 +1570,7 @@ def pad_2d_inplace_int64(ndarray[int64_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def pad_2d_inplace_bool(ndarray[uint8_t, ndim=2] values, @@ -1594,6 +1606,7 @@ def pad_2d_inplace_bool(ndarray[uint8_t, ndim=2] values, fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_float64(ndarray[float64_t, ndim=2] values, @@ -1628,6 +1641,7 @@ def backfill_2d_inplace_float64(ndarray[float64_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_float32(ndarray[float32_t, ndim=2] values, @@ -1662,6 +1676,7 @@ def backfill_2d_inplace_float32(ndarray[float32_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_object(ndarray[object, ndim=2] values, @@ -1696,6 +1711,7 @@ def backfill_2d_inplace_object(ndarray[object, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_int32(ndarray[int32_t, ndim=2] values, @@ -1730,6 +1746,7 @@ def backfill_2d_inplace_int32(ndarray[int32_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_int64(ndarray[int64_t, ndim=2] values, @@ -1764,6 +1781,7 @@ def backfill_2d_inplace_int64(ndarray[int64_t, ndim=2] values, else: fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def backfill_2d_inplace_bool(ndarray[uint8_t, ndim=2] values, @@ -1799,18 +1817,18 @@ def backfill_2d_inplace_bool(ndarray[uint8_t, ndim=2] values, fill_count = 0 val = values[j, i] + @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_float64(ndarray[float64_t] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n float64_t prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -1819,45 +1837,52 @@ def is_monotonic_float64(ndarray[float64_t] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + + with nogil: + prev = arr[0] + for i in range(1, n): + cur = arr[i] + if timelike and cur == iNaT: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if cur < prev: + is_monotonic_inc = 0 + elif cur > prev: + is_monotonic_dec = 0 + elif cur == prev: + pass # is_unique = 0 + else: + # cur or prev is NaN + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if not is_monotonic_inc and not is_monotonic_dec: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + prev = cur + return is_monotonic_inc, is_monotonic_dec - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_float32(ndarray[float32_t] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n float32_t prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -1866,45 +1891,52 @@ def is_monotonic_float32(ndarray[float32_t] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + + with nogil: + prev = arr[0] + for i in range(1, n): + cur = arr[i] + if timelike and cur == iNaT: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if cur < prev: + is_monotonic_inc = 0 + elif cur > prev: + is_monotonic_dec = 0 + elif cur == prev: + pass # is_unique = 0 + else: + # cur or prev is NaN + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if not is_monotonic_inc and not is_monotonic_dec: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + prev = cur + return is_monotonic_inc, is_monotonic_dec - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_object(ndarray[object] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n object prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -1913,45 +1945,52 @@ def is_monotonic_object(ndarray[object] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + prev = arr[0] for i in range(1, n): cur = arr[i] if timelike and cur == iNaT: - return False, False, None + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break if cur < prev: is_monotonic_inc = 0 elif cur > prev: is_monotonic_dec = 0 elif cur == prev: - is_unique = 0 + pass # is_unique = 0 else: # cur or prev is NaN - return False, False, None + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique + return is_monotonic_inc, is_monotonic_dec + @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_int32(ndarray[int32_t] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n int32_t prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -1960,45 +1999,52 @@ def is_monotonic_int32(ndarray[int32_t] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + + with nogil: + prev = arr[0] + for i in range(1, n): + cur = arr[i] + if timelike and cur == iNaT: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if cur < prev: + is_monotonic_inc = 0 + elif cur > prev: + is_monotonic_dec = 0 + elif cur == prev: + pass # is_unique = 0 + else: + # cur or prev is NaN + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if not is_monotonic_inc and not is_monotonic_dec: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + prev = cur + return is_monotonic_inc, is_monotonic_dec - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_int64(ndarray[int64_t] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n int64_t prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -2007,45 +2053,52 @@ def is_monotonic_int64(ndarray[int64_t] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + + with nogil: + prev = arr[0] + for i in range(1, n): + cur = arr[i] + if timelike and cur == iNaT: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if cur < prev: + is_monotonic_inc = 0 + elif cur > prev: + is_monotonic_dec = 0 + elif cur == prev: + pass # is_unique = 0 + else: + # cur or prev is NaN + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if not is_monotonic_inc and not is_monotonic_dec: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + prev = cur + return is_monotonic_inc, is_monotonic_dec - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique @cython.boundscheck(False) @cython.wraparound(False) def is_monotonic_bool(ndarray[uint8_t] arr, bint timelike): ''' Returns ------- - is_monotonic_inc, is_monotonic_dec, is_unique + is_monotonic_inc, is_monotonic_dec ''' cdef: Py_ssize_t i, n uint8_t prev, cur - bint is_unique = 1 bint is_monotonic_inc = 1 bint is_monotonic_dec = 1 @@ -2054,33 +2107,41 @@ def is_monotonic_bool(ndarray[uint8_t] arr, bint timelike): if n == 1: if arr[0] != arr[0] or (timelike and arr[0] == iNaT): # single value is NaN - return False, False, True + return False, False else: - return True, True, True + return True, True elif n < 2: - return True, True, True + return True, True if timelike and arr[0] == iNaT: - return False, False, None + return False, False + + with nogil: + prev = arr[0] + for i in range(1, n): + cur = arr[i] + if timelike and cur == iNaT: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if cur < prev: + is_monotonic_inc = 0 + elif cur > prev: + is_monotonic_dec = 0 + elif cur == prev: + pass # is_unique = 0 + else: + # cur or prev is NaN + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + if not is_monotonic_inc and not is_monotonic_dec: + is_monotonic_inc = 0 + is_monotonic_dec = 0 + break + prev = cur + return is_monotonic_inc, is_monotonic_dec - prev = arr[0] - for i in range(1, n): - cur = arr[i] - if timelike and cur == iNaT: - return False, False, None - if cur < prev: - is_monotonic_inc = 0 - elif cur > prev: - is_monotonic_dec = 0 - elif cur == prev: - is_unique = 0 - else: - # cur or prev is NaN - return False, False, None - if not is_monotonic_inc and not is_monotonic_dec: - return False, False, None - prev = cur - return is_monotonic_inc, is_monotonic_dec, is_unique @cython.wraparound(False) @cython.boundscheck(False) @@ -2342,37 +2403,45 @@ def arrmap_bool(ndarray[uint8_t] index, object func): return maybe_convert_objects(result) + @cython.wraparound(False) -def take_1d_bool_bool(ndarray[uint8_t] values, - ndarray[int64_t] indexer, - ndarray[uint8_t] out, +@cython.boundscheck(False) +def take_1d_bool_bool(uint8_t[:] values, + int64_t[:] indexer, + uint8_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx uint8_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_bool_object(ndarray[uint8_t] values, - ndarray[int64_t] indexer, - ndarray[object] out, +@cython.boundscheck(False) +def take_1d_bool_object(uint8_t[:] values, + int64_t[:] indexer, + object[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx object fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value + + for i from 0 <= i < n: idx = indexer[i] if idx == -1: @@ -2380,18 +2449,22 @@ def take_1d_bool_object(ndarray[uint8_t] values, else: out[i] = True if values[idx] > 0 else False + @cython.wraparound(False) -def take_1d_int8_int8(ndarray[int8_t] values, - ndarray[int64_t] indexer, - ndarray[int8_t] out, +@cython.boundscheck(False) +def take_1d_int8_int8(int8_t[:] values, + int64_t[:] indexer, + int8_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int8_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value + + for i from 0 <= i < n: idx = indexer[i] if idx == -1: @@ -2399,303 +2472,367 @@ def take_1d_int8_int8(ndarray[int8_t] values, else: out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int8_int32(ndarray[int8_t] values, - ndarray[int64_t] indexer, - ndarray[int32_t] out, +@cython.boundscheck(False) +def take_1d_int8_int32(int8_t[:] values, + int64_t[:] indexer, + int32_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int32_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int8_int64(ndarray[int8_t] values, - ndarray[int64_t] indexer, - ndarray[int64_t] out, +@cython.boundscheck(False) +def take_1d_int8_int64(int8_t[:] values, + int64_t[:] indexer, + int64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int8_float64(ndarray[int8_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_int8_float64(int8_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int16_int16(ndarray[int16_t] values, - ndarray[int64_t] indexer, - ndarray[int16_t] out, +@cython.boundscheck(False) +def take_1d_int16_int16(int16_t[:] values, + int64_t[:] indexer, + int16_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int16_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int16_int32(ndarray[int16_t] values, - ndarray[int64_t] indexer, - ndarray[int32_t] out, +@cython.boundscheck(False) +def take_1d_int16_int32(int16_t[:] values, + int64_t[:] indexer, + int32_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int32_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int16_int64(ndarray[int16_t] values, - ndarray[int64_t] indexer, - ndarray[int64_t] out, +@cython.boundscheck(False) +def take_1d_int16_int64(int16_t[:] values, + int64_t[:] indexer, + int64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int16_float64(ndarray[int16_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_int16_float64(int16_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int32_int32(ndarray[int32_t] values, - ndarray[int64_t] indexer, - ndarray[int32_t] out, +@cython.boundscheck(False) +def take_1d_int32_int32(int32_t[:] values, + int64_t[:] indexer, + int32_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int32_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int32_int64(ndarray[int32_t] values, - ndarray[int64_t] indexer, - ndarray[int64_t] out, +@cython.boundscheck(False) +def take_1d_int32_int64(int32_t[:] values, + int64_t[:] indexer, + int64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int32_float64(ndarray[int32_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_int32_float64(int32_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] -@cython.wraparound(False) -def take_1d_int64_int64(ndarray[int64_t] values, - ndarray[int64_t] indexer, - ndarray[int64_t] out, + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + + +@cython.wraparound(False) +@cython.boundscheck(False) +def take_1d_int64_int64(int64_t[:] values, + int64_t[:] indexer, + int64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx int64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_int64_float64(ndarray[int64_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_int64_float64(int64_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_float32_float32(ndarray[float32_t] values, - ndarray[int64_t] indexer, - ndarray[float32_t] out, +@cython.boundscheck(False) +def take_1d_float32_float32(float32_t[:] values, + int64_t[:] indexer, + float32_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float32_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_float32_float64(ndarray[float32_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_float32_float64(float32_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_float64_float64(ndarray[float64_t] values, - ndarray[int64_t] indexer, - ndarray[float64_t] out, +@cython.boundscheck(False) +def take_1d_float64_float64(float64_t[:] values, + int64_t[:] indexer, + float64_t[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx float64_t fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value - for i from 0 <= i < n: - idx = indexer[i] - if idx == -1: - out[i] = fv - else: - out[i] = values[idx] + + with nogil: + for i from 0 <= i < n: + idx = indexer[i] + if idx == -1: + out[i] = fv + else: + out[i] = values[idx] + @cython.wraparound(False) -def take_1d_object_object(ndarray[object] values, - ndarray[int64_t] indexer, - ndarray[object] out, +@cython.boundscheck(False) +def take_1d_object_object(object[:] values, + int64_t[:] indexer, + object[:] out, fill_value=np.nan): cdef: Py_ssize_t i, n, idx object fv - n = len(indexer) + n = indexer.shape[0] fv = fill_value + + for i from 0 <= i < n: idx = indexer[i] if idx == -1: @@ -2750,7 +2887,6 @@ cdef inline take_2d_axis0_bool_bool_memview(uint8_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_bool_bool(ndarray[uint8_t, ndim=2] values, @@ -2851,7 +2987,6 @@ cdef inline take_2d_axis0_bool_object_memview(uint8_t[:, :] values, out[i, j] = True if values[idx, j] > 0 else False - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_bool_object(ndarray[uint8_t, ndim=2] values, @@ -2952,7 +3087,6 @@ cdef inline take_2d_axis0_int8_int8_memview(int8_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int8_int8(ndarray[int8_t, ndim=2] values, @@ -3053,7 +3187,6 @@ cdef inline take_2d_axis0_int8_int32_memview(int8_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int8_int32(ndarray[int8_t, ndim=2] values, @@ -3154,7 +3287,6 @@ cdef inline take_2d_axis0_int8_int64_memview(int8_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int8_int64(ndarray[int8_t, ndim=2] values, @@ -3255,7 +3387,6 @@ cdef inline take_2d_axis0_int8_float64_memview(int8_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int8_float64(ndarray[int8_t, ndim=2] values, @@ -3356,7 +3487,6 @@ cdef inline take_2d_axis0_int16_int16_memview(int16_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int16_int16(ndarray[int16_t, ndim=2] values, @@ -3457,7 +3587,6 @@ cdef inline take_2d_axis0_int16_int32_memview(int16_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int16_int32(ndarray[int16_t, ndim=2] values, @@ -3558,7 +3687,6 @@ cdef inline take_2d_axis0_int16_int64_memview(int16_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int16_int64(ndarray[int16_t, ndim=2] values, @@ -3659,7 +3787,6 @@ cdef inline take_2d_axis0_int16_float64_memview(int16_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int16_float64(ndarray[int16_t, ndim=2] values, @@ -3760,7 +3887,6 @@ cdef inline take_2d_axis0_int32_int32_memview(int32_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int32_int32(ndarray[int32_t, ndim=2] values, @@ -3861,7 +3987,6 @@ cdef inline take_2d_axis0_int32_int64_memview(int32_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int32_int64(ndarray[int32_t, ndim=2] values, @@ -3962,7 +4087,6 @@ cdef inline take_2d_axis0_int32_float64_memview(int32_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int32_float64(ndarray[int32_t, ndim=2] values, @@ -4063,7 +4187,6 @@ cdef inline take_2d_axis0_int64_int64_memview(int64_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int64_int64(ndarray[int64_t, ndim=2] values, @@ -4164,7 +4287,6 @@ cdef inline take_2d_axis0_int64_float64_memview(int64_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_int64_float64(ndarray[int64_t, ndim=2] values, @@ -4265,7 +4387,6 @@ cdef inline take_2d_axis0_float32_float32_memview(float32_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_float32_float32(ndarray[float32_t, ndim=2] values, @@ -4366,7 +4487,6 @@ cdef inline take_2d_axis0_float32_float64_memview(float32_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_float32_float64(ndarray[float32_t, ndim=2] values, @@ -4467,7 +4587,6 @@ cdef inline take_2d_axis0_float64_float64_memview(float64_t[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_float64_float64(ndarray[float64_t, ndim=2] values, @@ -4568,7 +4687,6 @@ cdef inline take_2d_axis0_object_object_memview(object[:, :] values, out[i, j] = values[idx, j] - @cython.wraparound(False) @cython.boundscheck(False) def take_2d_axis0_object_object(ndarray[object, ndim=2] values, @@ -4686,6 +4804,7 @@ def take_2d_axis1_bool_bool(ndarray[uint8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_bool_object_memview(uint8_t[:, :] values, @@ -4748,6 +4867,7 @@ def take_2d_axis1_bool_object(ndarray[uint8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = True if values[i, idx] > 0 else False + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int8_int8_memview(int8_t[:, :] values, @@ -4810,6 +4930,7 @@ def take_2d_axis1_int8_int8(ndarray[int8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int8_int32_memview(int8_t[:, :] values, @@ -4872,6 +4993,7 @@ def take_2d_axis1_int8_int32(ndarray[int8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int8_int64_memview(int8_t[:, :] values, @@ -4934,6 +5056,7 @@ def take_2d_axis1_int8_int64(ndarray[int8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int8_float64_memview(int8_t[:, :] values, @@ -4996,6 +5119,7 @@ def take_2d_axis1_int8_float64(ndarray[int8_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int16_int16_memview(int16_t[:, :] values, @@ -5058,6 +5182,7 @@ def take_2d_axis1_int16_int16(ndarray[int16_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int16_int32_memview(int16_t[:, :] values, @@ -5120,6 +5245,7 @@ def take_2d_axis1_int16_int32(ndarray[int16_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int16_int64_memview(int16_t[:, :] values, @@ -5182,6 +5308,7 @@ def take_2d_axis1_int16_int64(ndarray[int16_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int16_float64_memview(int16_t[:, :] values, @@ -5244,6 +5371,7 @@ def take_2d_axis1_int16_float64(ndarray[int16_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int32_int32_memview(int32_t[:, :] values, @@ -5306,6 +5434,7 @@ def take_2d_axis1_int32_int32(ndarray[int32_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int32_int64_memview(int32_t[:, :] values, @@ -5368,6 +5497,7 @@ def take_2d_axis1_int32_int64(ndarray[int32_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int32_float64_memview(int32_t[:, :] values, @@ -5430,6 +5560,7 @@ def take_2d_axis1_int32_float64(ndarray[int32_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int64_int64_memview(int64_t[:, :] values, @@ -5492,6 +5623,7 @@ def take_2d_axis1_int64_int64(ndarray[int64_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_int64_float64_memview(int64_t[:, :] values, @@ -5554,6 +5686,7 @@ def take_2d_axis1_int64_float64(ndarray[int64_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_float32_float32_memview(float32_t[:, :] values, @@ -5616,6 +5749,7 @@ def take_2d_axis1_float32_float32(ndarray[float32_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_float32_float64_memview(float32_t[:, :] values, @@ -5678,6 +5812,7 @@ def take_2d_axis1_float32_float64(ndarray[float32_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_float64_float64_memview(float64_t[:, :] values, @@ -5740,6 +5875,7 @@ def take_2d_axis1_float64_float64(ndarray[float64_t, ndim=2] values, out[i, j] = fv else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) cdef inline take_2d_axis1_object_object_memview(object[:, :] values, @@ -5803,6 +5939,7 @@ def take_2d_axis1_object_object(ndarray[object, ndim=2] values, else: out[i, j] = values[i, idx] + @cython.wraparound(False) @cython.boundscheck(False) def take_2d_multi_bool_bool(ndarray[uint8_t, ndim=2] values, @@ -6379,6 +6516,7 @@ def diff_2d_float64(ndarray[float64_t, ndim=2] arr, for i in range(sx): for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] + @cython.boundscheck(False) @cython.wraparound(False) def diff_2d_float32(ndarray[float32_t, ndim=2] arr, @@ -6422,6 +6560,7 @@ def diff_2d_float32(ndarray[float32_t, ndim=2] arr, for i in range(sx): for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] + @cython.boundscheck(False) @cython.wraparound(False) def diff_2d_int8(ndarray[int8_t, ndim=2] arr, @@ -6465,6 +6604,7 @@ def diff_2d_int8(ndarray[int8_t, ndim=2] arr, for i in range(sx): for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] + @cython.boundscheck(False) @cython.wraparound(False) def diff_2d_int16(ndarray[int16_t, ndim=2] arr, @@ -6508,6 +6648,7 @@ def diff_2d_int16(ndarray[int16_t, ndim=2] arr, for i in range(sx): for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] + @cython.boundscheck(False) @cython.wraparound(False) def diff_2d_int32(ndarray[int32_t, ndim=2] arr, @@ -6551,6 +6692,7 @@ def diff_2d_int32(ndarray[int32_t, ndim=2] arr, for i in range(sx): for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] + @cython.boundscheck(False) @cython.wraparound(False) def diff_2d_int64(ndarray[int64_t, ndim=2] arr, @@ -6595,8 +6737,9 @@ def diff_2d_int64(ndarray[int64_t, ndim=2] arr, for j in range(start, stop): out[i, j] = arr[i, j] - arr[i, j - periods] -@cython.boundscheck(False) + @cython.wraparound(False) +@cython.boundscheck(False) def group_add_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -6605,7 +6748,7 @@ def group_add_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] sumx, nobs @@ -6617,42 +6760,49 @@ def group_add_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + + if K > 1: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + + else: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + sumx[lab, 0] += val - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_add_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -6661,7 +6811,7 @@ def group_add_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] sumx, nobs @@ -6673,43 +6823,50 @@ def group_add_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + + if K > 1: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + + else: + + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + sumx[lab, 0] += val - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_add_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -6725,47 +6882,53 @@ def group_add_bin_float64(ndarray[float64_t, ndim=2] out, nobs = np.zeros_like(out) sumx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: + + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + sumx[b, 0] += val - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_add_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -6781,48 +6944,54 @@ def group_add_bin_float32(ndarray[float32_t, ndim=2] out, nobs = np.zeros_like(out) sumx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: + + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + sumx[b, 0] += val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_prod_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -6831,7 +7000,7 @@ def group_prod_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] prodx, nobs @@ -6843,42 +7012,44 @@ def group_prod_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + prodx[lab, j] *= val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - prodx[lab, j] *= val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + prodx[lab, 0] *= val - # not nan - if val == val: - nobs[lab, 0] += 1 - prodx[lab, 0] *= val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_prod_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -6887,7 +7058,7 @@ def group_prod_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] prodx, nobs @@ -6899,43 +7070,45 @@ def group_prod_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + prodx[lab, j] *= val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - prodx[lab, j] *= val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + prodx[lab, 0] *= val - # not nan - if val == val: - nobs[lab, 0] += 1 - prodx[lab, 0] *= val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_prod_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -6951,47 +7124,52 @@ def group_prod_bin_float64(ndarray[float64_t, ndim=2] out, nobs = np.zeros_like(out) prodx = np.ones_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + prodx[b, j] *= val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - prodx[b, j] *= val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + prodx[b, 0] *= val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - prodx[b, 0] *= val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_prod_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -7007,69 +7185,75 @@ def group_prod_bin_float32(ndarray[float32_t, ndim=2] out, nobs = np.zeros_like(out) prodx = np.ones_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: - counts[b] += 1 - for j in range(K): - val = values[i, j] + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + prodx[b, j] *= val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - prodx[b, j] *= val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + prodx[b, 0] *= val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - prodx[b, 0] *= val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = prodx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = prodx[i, j] @cython.wraparound(False) @cython.boundscheck(False) +@cython.cdivision(True) def group_var_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab - float64_t val, ct - ndarray[float64_t, ndim=2] nobs, sumx, sumxx + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) + float64_t val, ct, oldmean + ndarray[float64_t, ndim=2] nobs, mean if not len(values) == len(labels): raise AssertionError("len(index) != len(labels)") nobs = np.zeros_like(out) - sumx = np.zeros_like(out) - sumxx = np.zeros_like(out) + mean = np.zeros_like(out) N, K = ( values).shape - if K > 1: - for i in range(N): + out[:, :] = 0.0 + with nogil: + for i in range(N): lab = labels[i] if lab < 0: continue @@ -7082,55 +7266,43 @@ def group_var_float64(ndarray[float64_t, ndim=2] out, # not nan if val == val: nobs[lab, j] += 1 - sumx[lab, j] += val - sumxx[lab, j] += val * val - else: - for i in range(N): - - lab = labels[i] - if lab < 0: - continue + oldmean = mean[lab, j] + mean[lab, j] += (val - oldmean) / nobs[lab, j] + out[lab, j] += (val - mean[lab, j]) * (val - oldmean) - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val - sumxx[lab, 0] += val * val + for i in range(ncounts): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] /= (ct - 1) - for i in range(len(counts)): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) @cython.wraparound(False) @cython.boundscheck(False) +@cython.cdivision(True) def group_var_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab - float32_t val, ct - ndarray[float32_t, ndim=2] nobs, sumx, sumxx + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) + float32_t val, ct, oldmean + ndarray[float32_t, ndim=2] nobs, mean if not len(values) == len(labels): raise AssertionError("len(index) != len(labels)") nobs = np.zeros_like(out) - sumx = np.zeros_like(out) - sumxx = np.zeros_like(out) + mean = np.zeros_like(out) N, K = ( values).shape - if K > 1: - for i in range(N): + out[:, :] = 0.0 + with nogil: + for i in range(N): lab = labels[i] if lab < 0: continue @@ -7143,32 +7315,19 @@ def group_var_float32(ndarray[float32_t, ndim=2] out, # not nan if val == val: nobs[lab, j] += 1 - sumx[lab, j] += val - sumxx[lab, j] += val * val - else: - for i in range(N): + oldmean = mean[lab, j] + mean[lab, j] += (val - oldmean) / nobs[lab, j] + out[lab, j] += (val - mean[lab, j]) * (val - oldmean) - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val - sumxx[lab, 0] += val * val + for i in range(ncounts): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] /= (ct - 1) - for i in range(len(counts)): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) @cython.wraparound(False) @cython.boundscheck(False) @@ -7186,6 +7345,8 @@ def group_var_bin_float64(ndarray[float64_t, ndim=2] out, sumx = np.zeros_like(out) sumxx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7193,44 +7354,46 @@ def group_var_bin_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 + counts[b] += 1 - for j in range(K): - val = values[i, j] + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + sumxx[b, j] += val * val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - sumxx[b, j] += val * val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + sumx[b, 0] += val + sumxx[b, 0] += val * val - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val - sumxx[b, 0] += val * val + for i in range(ngroups): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / + (ct * ct - ct)) - for i in range(ngroups): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) @cython.wraparound(False) @cython.boundscheck(False) def group_var_bin_float32(ndarray[float32_t, ndim=2] out, @@ -7247,6 +7410,8 @@ def group_var_bin_float32(ndarray[float32_t, ndim=2] out, sumx = np.zeros_like(out) sumxx = np.zeros_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7254,44 +7419,46 @@ def group_var_bin_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 + counts[b] += 1 - for j in range(K): - val = values[i, j] + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + sumxx[b, j] += val * val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - sumxx[b, j] += val * val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + sumx[b, 0] += val + sumxx[b, 0] += val * val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val - sumxx[b, 0] += val * val + for i in range(ngroups): + for j in range(K): + ct = nobs[i, j] + if ct < 2: + out[i, j] = NAN + else: + out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / + (ct * ct - ct)) - for i in range(ngroups): - for j in range(K): - ct = nobs[i, j] - if ct < 2: - out[i, j] = nan - else: - out[i, j] = ((ct * sumxx[i, j] - sumx[i, j] * sumx[i, j]) / - (ct * ct - ct)) @cython.wraparound(False) @cython.boundscheck(False) @@ -7300,7 +7467,7 @@ def group_mean_float64(ndarray[float64_t, ndim=2] out, ndarray[float64_t, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] sumx, nobs @@ -7312,39 +7479,41 @@ def group_mean_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + sumx[lab, 0] += val - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val + for i in range(ncounts): + for j in range(K): + count = nobs[i, j] + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count - for i in range(len(counts)): - for j in range(K): - count = nobs[i, j] - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count @cython.wraparound(False) @cython.boundscheck(False) def group_mean_float32(ndarray[float32_t, ndim=2] out, @@ -7352,7 +7521,7 @@ def group_mean_float32(ndarray[float32_t, ndim=2] out, ndarray[float32_t, ndim=2] values, ndarray[int64_t] labels): cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] sumx, nobs @@ -7364,41 +7533,44 @@ def group_mean_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + # not nan + if val == val: + nobs[lab, j] += 1 + sumx[lab, j] += val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - sumx[lab, j] += val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + sumx[lab, 0] += val - counts[lab] += 1 - val = values[i, 0] - # not nan - if val == val: - nobs[lab, 0] += 1 - sumx[lab, 0] += val + for i in range(ncounts): + for j in range(K): + count = nobs[i, j] + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count - for i in range(len(counts)): - for j in range(K): - count = nobs[i, j] - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count +@cython.boundscheck(False) def group_mean_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -7412,46 +7584,51 @@ def group_mean_bin_float64(ndarray[float64_t, ndim=2] out, sumx = np.zeros_like(out) N, K = ( values).shape + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + sumx[b, 0] += val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val + for i in range(ngroups): + for j in range(K): + count = nobs[i, j] + if count == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count - for i in range(ngroups): - for j in range(K): - count = nobs[i, j] - if count == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count +@cython.boundscheck(False) def group_mean_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -7465,45 +7642,49 @@ def group_mean_bin_float32(ndarray[float32_t, ndim=2] out, sumx = np.zeros_like(out) N, K = ( values).shape + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + sumx[b, j] += val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - sumx[b, j] += val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + sumx[b, 0] += val - # not nan - if val == val: - nobs[b, 0] += 1 - sumx[b, 0] += val + for i in range(ngroups): + for j in range(K): + count = nobs[i, j] + if count == 0: + out[i, j] = NAN + else: + out[i, j] = sumx[i, j] / count - for i in range(ngroups): - for j in range(K): - count = nobs[i, j] - if count == 0: - out[i, j] = nan - else: - out[i, j] = sumx[i, j] / count @cython.wraparound(False) @cython.boundscheck(False) @@ -7517,9 +7698,11 @@ def group_ohlc_float64(ndarray[float64_t, ndim=2] out, cdef: Py_ssize_t i, j, N, K, ngroups, b float64_t val, count - float64_t vopen, vhigh, vlow, vclose, NA + float64_t vopen, vhigh, vlow, vclose bint got_first = 0 + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7530,55 +7713,56 @@ def group_ohlc_float64(ndarray[float64_t, ndim=2] out, if out.shape[1] != 4: raise ValueError('Output array must have 4 columns') - NA = np.nan - b = 0 if K > 1: raise NotImplementedError("Argument 'values' must have only " "one dimension") else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose - b += 1 - got_first = 0 - counts[b] += 1 - val = values[i, 0] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose + b += 1 + got_first = 0 - # not nan - if val == val: - if not got_first: - got_first = 1 - vopen = val - vlow = val - vhigh = val - else: - if val < vlow: + counts[b] += 1 + val = values[i, 0] + + # not nan + if val == val: + if not got_first: + got_first = 1 + vopen = val vlow = val - if val > vhigh: vhigh = val - vclose = val + else: + if val < vlow: + vlow = val + if val > vhigh: + vhigh = val + vclose = val + + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose @cython.wraparound(False) @cython.boundscheck(False) def group_ohlc_float32(ndarray[float32_t, ndim=2] out, @@ -7591,9 +7775,11 @@ def group_ohlc_float32(ndarray[float32_t, ndim=2] out, cdef: Py_ssize_t i, j, N, K, ngroups, b float32_t val, count - float32_t vopen, vhigh, vlow, vclose, NA + float32_t vopen, vhigh, vlow, vclose bint got_first = 0 + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7604,58 +7790,59 @@ def group_ohlc_float32(ndarray[float32_t, ndim=2] out, if out.shape[1] != 4: raise ValueError('Output array must have 4 columns') - NA = np.nan - b = 0 if K > 1: raise NotImplementedError("Argument 'values' must have only " "one dimension") else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose - b += 1 - got_first = 0 - counts[b] += 1 - val = values[i, 0] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose + b += 1 + got_first = 0 - # not nan - if val == val: - if not got_first: - got_first = 1 - vopen = val - vlow = val - vhigh = val - else: - if val < vlow: + counts[b] += 1 + val = values[i, 0] + + # not nan + if val == val: + if not got_first: + got_first = 1 + vopen = val vlow = val - if val > vhigh: vhigh = val - vclose = val + else: + if val < vlow: + vlow = val + if val > vhigh: + vhigh = val + vclose = val + + if not got_first: + out[b, 0] = NAN + out[b, 1] = NAN + out[b, 2] = NAN + out[b, 3] = NAN + else: + out[b, 0] = vopen + out[b, 1] = vhigh + out[b, 2] = vlow + out[b, 3] = vclose - if not got_first: - out[b, 0] = NA - out[b, 1] = NA - out[b, 2] = NA - out[b, 3] = NA - else: - out[b, 0] = vopen - out[b, 1] = vhigh - out[b, 2] = vlow - out[b, 3] = vclose @cython.wraparound(False) -@cython.wraparound(False) +@cython.boundscheck(False) def group_last_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -7664,7 +7851,7 @@ def group_last_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -7677,28 +7864,30 @@ def group_last_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.wraparound(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_last_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -7707,7 +7896,7 @@ def group_last_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -7720,28 +7909,30 @@ def group_last_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.wraparound(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_last_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -7750,7 +7941,7 @@ def group_last_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) int64_t val, count ndarray[int64_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -7763,29 +7954,31 @@ def group_last_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = resx[i, j] @cython.wraparound(False) -@cython.wraparound(False) +@cython.boundscheck(False) def group_last_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -7801,6 +7994,8 @@ def group_last_bin_float64(ndarray[float64_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7808,28 +8003,30 @@ def group_last_bin_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.wraparound(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_last_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -7845,6 +8042,8 @@ def group_last_bin_float32(ndarray[float32_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7852,28 +8051,30 @@ def group_last_bin_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.wraparound(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_last_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -7889,6 +8090,8 @@ def group_last_bin_int64(ndarray[int64_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -7896,29 +8099,31 @@ def group_last_bin_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -7927,7 +8132,7 @@ def group_nth_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -7940,29 +8145,31 @@ def group_nth_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - if nobs[lab, j] == rank: - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + if nobs[lab, j] == rank: + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -7971,7 +8178,7 @@ def group_nth_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -7984,29 +8191,31 @@ def group_nth_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - if nobs[lab, j] == rank: - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + if nobs[lab, j] == rank: + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -8015,7 +8224,7 @@ def group_nth_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) int64_t val, count ndarray[int64_t, ndim=2] resx ndarray[int64_t, ndim=2] nobs @@ -8028,30 +8237,32 @@ def group_nth_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[lab, j] += 1 - if nobs[lab, j] == rank: - resx[lab, j] = val + # not nan + if val == val: + nobs[lab, j] += 1 + if nobs[lab, j] == rank: + resx[lab, j] = val + + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = resx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -8067,6 +8278,8 @@ def group_nth_bin_float64(ndarray[float64_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bin) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8074,29 +8287,31 @@ def group_nth_bin_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - if nobs[b, j] == rank: - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + if nobs[b, j] == rank: + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -8112,6 +8327,8 @@ def group_nth_bin_float32(ndarray[float32_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bin) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8119,29 +8336,31 @@ def group_nth_bin_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] - # not nan - if val == val: - nobs[b, j] += 1 - if nobs[b, j] == rank: - resx[b, j] = val + # not nan + if val == val: + nobs[b, j] += 1 + if nobs[b, j] == rank: + resx[b, j] = val + + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = resx[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_nth_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -8157,6 +8376,8 @@ def group_nth_bin_int64(ndarray[int64_t, ndim=2] out, nobs = np.zeros_like(out) resx = np.empty_like(out) + if len(bin) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8164,27 +8385,29 @@ def group_nth_bin_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - b = 0 - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] - counts[b] += 1 - for j in range(K): - val = values[i, j] + # not nan + if val == val: + nobs[b, j] += 1 + if nobs[b, j] == rank: + resx[b, j] = val - # not nan - if val == val: - nobs[b, j] += 1 - if nobs[b, j] == rank: - resx[b, j] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = resx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = resx[i, j] @cython.wraparound(False) @cython.boundscheck(False) @@ -8196,7 +8419,7 @@ def group_min_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] minx, nobs @@ -8210,42 +8433,44 @@ def group_min_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val < minx[lab, j]: + minx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val < minx[lab, j]: - minx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + if val < minx[lab, 0]: + minx[lab, 0] = val - counts[lab] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[lab, 0] += 1 - if val < minx[lab, 0]: - minx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = minx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_min_float32(ndarray[float32_t, ndim=2] out, @@ -8256,7 +8481,7 @@ def group_min_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] minx, nobs @@ -8270,42 +8495,44 @@ def group_min_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val < minx[lab, j]: + minx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val < minx[lab, j]: - minx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + if val < minx[lab, 0]: + minx[lab, 0] = val - # not nan - if val == val: - nobs[lab, 0] += 1 - if val < minx[lab, 0]: - minx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = minx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_min_int64(ndarray[int64_t, ndim=2] out, @@ -8316,7 +8543,7 @@ def group_min_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) int64_t val, count ndarray[int64_t, ndim=2] minx, nobs @@ -8330,42 +8557,44 @@ def group_min_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val < minx[lab, j]: + minx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val < minx[lab, j]: - minx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + nobs[lab, 0] += 1 + if val < minx[lab, 0]: + minx[lab, 0] = val - counts[lab] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[lab, 0] += 1 - if val < minx[lab, 0]: - minx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = minx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) @@ -8386,6 +8615,8 @@ def group_min_bin_float64(ndarray[float64_t, ndim=2] out, minx = np.empty_like(out) minx.fill(np.inf) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8393,41 +8624,43 @@ def group_min_bin_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val < minx[b, j]: + minx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val < minx[b, j]: - minx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + if val < minx[b, 0]: + minx[b, 0] = val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - if val < minx[b, 0]: - minx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = minx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_min_bin_float32(ndarray[float32_t, ndim=2] out, @@ -8447,6 +8680,8 @@ def group_min_bin_float32(ndarray[float32_t, ndim=2] out, minx = np.empty_like(out) minx.fill(np.inf) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8454,41 +8689,43 @@ def group_min_bin_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val < minx[b, j]: + minx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val < minx[b, j]: - minx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + if val < minx[b, 0]: + minx[b, 0] = val - # not nan - if val == val: - nobs[b, 0] += 1 - if val < minx[b, 0]: - minx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = minx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_min_bin_int64(ndarray[int64_t, ndim=2] out, @@ -8508,6 +8745,8 @@ def group_min_bin_int64(ndarray[int64_t, ndim=2] out, minx = np.empty_like(out) minx.fill(9223372036854775807) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8515,41 +8754,43 @@ def group_min_bin_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val < minx[b, j]: + minx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val < minx[b, j]: - minx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + if val < minx[b, 0]: + minx[b, 0] = val - # not nan - if val == val: - nobs[b, 0] += 1 - if val < minx[b, 0]: - minx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = minx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = minx[i, j] @cython.wraparound(False) @cython.boundscheck(False) @@ -8561,7 +8802,7 @@ def group_max_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float64_t val, count ndarray[float64_t, ndim=2] maxx, nobs @@ -8575,42 +8816,44 @@ def group_max_float64(ndarray[float64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val > maxx[lab, j]: + maxx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val > maxx[lab, j]: - maxx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + if val > maxx[lab, 0]: + maxx[lab, 0] = val - # not nan - if val == val: - nobs[lab, 0] += 1 - if val > maxx[lab, 0]: - maxx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = maxx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = maxx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_max_float32(ndarray[float32_t, ndim=2] out, @@ -8621,7 +8864,7 @@ def group_max_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) float32_t val, count ndarray[float32_t, ndim=2] maxx, nobs @@ -8635,42 +8878,44 @@ def group_max_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val > maxx[lab, j]: + maxx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val > maxx[lab, j]: - maxx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + if val > maxx[lab, 0]: + maxx[lab, 0] = val - # not nan - if val == val: - nobs[lab, 0] += 1 - if val > maxx[lab, 0]: - maxx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = maxx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = maxx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_max_int64(ndarray[int64_t, ndim=2] out, @@ -8681,7 +8926,7 @@ def group_max_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, N, K, lab + Py_ssize_t i, j, N, K, lab, ncounts = len(counts) int64_t val, count ndarray[int64_t, ndim=2] maxx, nobs @@ -8695,42 +8940,44 @@ def group_max_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - if K > 1: - for i in range(N): - lab = labels[i] - if lab < 0: - continue + with nogil: + if K > 1: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + counts[lab] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[lab, j] += 1 + if val > maxx[lab, j]: + maxx[lab, j] = val + else: + for i in range(N): + lab = labels[i] + if lab < 0: + continue + + counts[lab] += 1 + val = values[i, 0] # not nan if val == val: - nobs[lab, j] += 1 - if val > maxx[lab, j]: - maxx[lab, j] = val - else: - for i in range(N): - lab = labels[i] - if lab < 0: - continue - - counts[lab] += 1 - val = values[i, 0] + nobs[lab, 0] += 1 + if val > maxx[lab, 0]: + maxx[lab, 0] = val - # not nan - if val == val: - nobs[lab, 0] += 1 - if val > maxx[lab, 0]: - maxx[lab, 0] = val + for i in range(ncounts): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = maxx[i, j] - for i in range(len(counts)): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = maxx[i, j] @cython.wraparound(False) @cython.boundscheck(False) @@ -8750,48 +8997,52 @@ def group_max_bin_float64(ndarray[float64_t, ndim=2] out, maxx = np.empty_like(out) maxx.fill(-np.inf) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: ngroups = len(bins) + 1 - N, K = ( values).shape + N, K = ( values).shape + + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + for j in range(K): + val = values[i, j] - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + # not nan + if val == val: + nobs[b, j] += 1 + if val > maxx[b, j]: + maxx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val > maxx[b, j]: - maxx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + if val > maxx[b, 0]: + maxx[b, 0] = val - # not nan - if val == val: - nobs[b, 0] += 1 - if val > maxx[b, 0]: - maxx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = maxx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = maxx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_max_bin_float32(ndarray[float32_t, ndim=2] out, @@ -8810,6 +9061,8 @@ def group_max_bin_float32(ndarray[float32_t, ndim=2] out, maxx = np.empty_like(out) maxx.fill(-np.inf) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8817,41 +9070,43 @@ def group_max_bin_float32(ndarray[float32_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val > maxx[b, j]: + maxx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val > maxx[b, j]: - maxx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + nobs[b, 0] += 1 + if val > maxx[b, 0]: + maxx[b, 0] = val - counts[b] += 1 - val = values[i, 0] - - # not nan - if val == val: - nobs[b, 0] += 1 - if val > maxx[b, 0]: - maxx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = NAN + else: + out[i, j] = maxx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = nan - else: - out[i, j] = maxx[i, j] @cython.wraparound(False) @cython.boundscheck(False) def group_max_bin_int64(ndarray[int64_t, ndim=2] out, @@ -8870,6 +9125,8 @@ def group_max_bin_int64(ndarray[int64_t, ndim=2] out, maxx = np.empty_like(out) maxx.fill(-9223372036854775807) + if len(bins) == 0: + return if bins[len(bins) - 1] == len(values): ngroups = len(bins) else: @@ -8877,41 +9134,43 @@ def group_max_bin_int64(ndarray[int64_t, ndim=2] out, N, K = ( values).shape - b = 0 - if K > 1: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 + with nogil: + b = 0 + if K > 1: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - counts[b] += 1 - for j in range(K): - val = values[i, j] + counts[b] += 1 + for j in range(K): + val = values[i, j] + + # not nan + if val == val: + nobs[b, j] += 1 + if val > maxx[b, j]: + maxx[b, j] = val + else: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 + + counts[b] += 1 + val = values[i, 0] # not nan if val == val: - nobs[b, j] += 1 - if val > maxx[b, j]: - maxx[b, j] = val - else: - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - val = values[i, 0] + nobs[b, 0] += 1 + if val > maxx[b, 0]: + maxx[b, 0] = val - # not nan - if val == val: - nobs[b, 0] += 1 - if val > maxx[b, 0]: - maxx[b, 0] = val + for i in range(ngroups): + for j in range(K): + if nobs[i, j] == 0: + out[i, j] = iNaT + else: + out[i, j] = maxx[i, j] - for i in range(ngroups): - for j in range(K): - if nobs[i, j] == 0: - out[i, j] = iNaT - else: - out[i, j] = maxx[i, j] @cython.boundscheck(False) @cython.wraparound(False) @@ -8923,31 +9182,32 @@ def group_count_float64(ndarray[float64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] float64_t val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") + raise AssertionError("len(index) != len(labels)") - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - # not nan - nobs[lab, j] += val == val and val != iNaT + counts[lab] += 1 + for j in range(K): + val = values[i, j] - for i in range(len(counts)): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[lab, j] += val == val and val != iNaT + for i in range(ncounts): + for j in range(K): + out[i, j] = nobs[i, j] @cython.boundscheck(False) @cython.wraparound(False) @@ -8959,31 +9219,32 @@ def group_count_float32(ndarray[float32_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] float32_t val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") + raise AssertionError("len(index) != len(labels)") - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - # not nan - nobs[lab, j] += val == val and val != iNaT + counts[lab] += 1 + for j in range(K): + val = values[i, j] - for i in range(len(counts)): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[lab, j] += val == val and val != iNaT + for i in range(ncounts): + for j in range(K): + out[i, j] = nobs[i, j] @cython.boundscheck(False) @cython.wraparound(False) @@ -8995,31 +9256,32 @@ def group_count_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] int64_t val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") + raise AssertionError("len(index) != len(labels)") - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - # not nan - nobs[lab, j] += val == val and val != iNaT + counts[lab] += 1 + for j in range(K): + val = values[i, j] - for i in range(len(counts)): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[lab, j] += val == val and val != iNaT + for i in range(ncounts): + for j in range(K): + out[i, j] = nobs[i, j] @cython.boundscheck(False) @cython.wraparound(False) @@ -9031,15 +9293,17 @@ def group_count_object(ndarray[object, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] object val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") + raise AssertionError("len(index) != len(labels)") + + for i in range(N): lab = labels[i] if lab < 0: @@ -9052,11 +9316,10 @@ def group_count_object(ndarray[object, ndim=2] out, # not nan nobs[lab, j] += val == val and val != iNaT - for i in range(len(counts)): + for i in range(ncounts): for j in range(K): out[i, j] = nobs[i, j] - @cython.boundscheck(False) @cython.wraparound(False) def group_count_int64(ndarray[int64_t, ndim=2] out, @@ -9067,35 +9330,36 @@ def group_count_int64(ndarray[int64_t, ndim=2] out, Only aggregates on axis=0 ''' cdef: - Py_ssize_t i, j, lab + Py_ssize_t i, j, lab, ncounts = len(counts) Py_ssize_t N = values.shape[0], K = values.shape[1] int64_t val ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) if len(values) != len(labels): - raise AssertionError("len(index) != len(labels)") + raise AssertionError("len(index) != len(labels)") - for i in range(N): - lab = labels[i] - if lab < 0: - continue - counts[lab] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + lab = labels[i] + if lab < 0: + continue - # not nan - nobs[lab, j] += val == val and val != iNaT + counts[lab] += 1 + for j in range(K): + val = values[i, j] - for i in range(len(counts)): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[lab, j] += val == val and val != iNaT + for i in range(ncounts): + for j in range(K): + out[i, j] = nobs[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float64_t, ndim=2] values, @@ -9110,26 +9374,28 @@ def group_count_bin_float64(ndarray[float64_t, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - nobs[b, j] += val == val and val != iNaT + counts[b] += 1 + for j in range(K): + val = values[i, j] - for i in range(ngroups): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[b, j] += val == val and val != iNaT + for i in range(ngroups): + for j in range(K): + out[i, j] = nobs[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t] counts, ndarray[float32_t, ndim=2] values, @@ -9144,26 +9410,28 @@ def group_count_bin_float32(ndarray[float32_t, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - nobs[b, j] += val == val and val != iNaT + counts[b] += 1 + for j in range(K): + val = values[i, j] - for i in range(ngroups): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[b, j] += val == val and val != iNaT + for i in range(ngroups): + for j in range(K): + out[i, j] = nobs[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -9178,26 +9446,28 @@ def group_count_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - nobs[b, j] += val == val and val != iNaT + counts[b] += 1 + for j in range(K): + val = values[i, j] - for i in range(ngroups): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[b, j] += val == val and val != iNaT + for i in range(ngroups): + for j in range(K): + out[i, j] = nobs[i, j] -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_object(ndarray[object, ndim=2] out, ndarray[int64_t] counts, ndarray[object, ndim=2] values, @@ -9212,8 +9482,11 @@ def group_count_bin_object(ndarray[object, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) + for i in range(N): while b < ngroups - 1 and i >= bins[b]: b += 1 @@ -9229,9 +9502,8 @@ def group_count_bin_object(ndarray[object, ndim=2] out, for j in range(K): out[i, j] = nobs[i, j] - -@cython.boundscheck(False) @cython.wraparound(False) +@cython.boundscheck(False) def group_count_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t] counts, ndarray[int64_t, ndim=2] values, @@ -9246,23 +9518,25 @@ def group_count_bin_int64(ndarray[int64_t, ndim=2] out, ndarray[int64_t, ndim=2] nobs = np.zeros((out.shape[0], out.shape[1]), dtype=np.int64) + if len(bins) == 0: + return ngroups = len(bins) + (bins[len(bins) - 1] != N) - for i in range(N): - while b < ngroups - 1 and i >= bins[b]: - b += 1 - - counts[b] += 1 - for j in range(K): - val = values[i, j] + with nogil: + for i in range(N): + while b < ngroups - 1 and i >= bins[b]: + b += 1 - # not nan - nobs[b, j] += val == val and val != iNaT + counts[b] += 1 + for j in range(K): + val = values[i, j] - for i in range(ngroups): - for j in range(K): - out[i, j] = nobs[i, j] + # not nan + nobs[b, j] += val == val and val != iNaT + for i in range(ngroups): + for j in range(K): + out[i, j] = nobs[i, j] @cython.wraparound(False) @@ -10071,7 +10345,7 @@ def outer_join_indexer_float64(ndarray[float64_t] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] @@ -10200,7 +10474,7 @@ def outer_join_indexer_float32(ndarray[float32_t] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] @@ -10329,7 +10603,7 @@ def outer_join_indexer_object(ndarray[object] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] @@ -10458,7 +10732,7 @@ def outer_join_indexer_int32(ndarray[int32_t] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] @@ -10587,7 +10861,7 @@ def outer_join_indexer_int64(ndarray[int64_t] left, rindexer[j] = j result[j] = right[j] elif nright == 0: - for i in range(nright): + for i in range(nleft): lindexer[i] = i rindexer[i] = -1 result[i] = left[i] diff --git a/pandas/src/headers/math.h b/pandas/src/headers/math.h index 8ccf11d07c3fe..34ad9f24a58f9 100644 --- a/pandas/src/headers/math.h +++ b/pandas/src/headers/math.h @@ -1,7 +1,7 @@ #ifndef _PANDAS_MATH_H_ #define _PANDAS_MATH_H_ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && (_MSC_VER < 1800) #include __inline int signbit(double num) { return _copysign(1.0, num) < 0; } #else diff --git a/pandas/src/headers/stdint.h b/pandas/src/headers/stdint.h index b0fd235adc036..8746bf132d0f7 100644 --- a/pandas/src/headers/stdint.h +++ b/pandas/src/headers/stdint.h @@ -1,7 +1,7 @@ #ifndef _PANDAS_STDINT_H_ #define _PANDAS_STDINT_H_ -#if defined(_MSC_VER) +#if defined(_MSC_VER) && (_MSC_VER < 1900) #include "ms_stdint.h" #else #include diff --git a/pandas/src/khash.pxd b/pandas/src/khash.pxd index a8fd51a62cfbe..b28f43eecfac7 100644 --- a/pandas/src/khash.pxd +++ b/pandas/src/khash.pxd @@ -45,15 +45,15 @@ cdef extern from "khash_python.h": kh_cstr_t *keys size_t *vals - inline kh_str_t* kh_init_str() - inline void kh_destroy_str(kh_str_t*) - inline void kh_clear_str(kh_str_t*) - inline khint_t kh_get_str(kh_str_t*, kh_cstr_t) - inline void kh_resize_str(kh_str_t*, khint_t) - inline khint_t kh_put_str(kh_str_t*, kh_cstr_t, int*) - inline void kh_del_str(kh_str_t*, khint_t) + inline kh_str_t* kh_init_str() nogil + inline void kh_destroy_str(kh_str_t*) nogil + inline void kh_clear_str(kh_str_t*) nogil + inline khint_t kh_get_str(kh_str_t*, kh_cstr_t) nogil + inline void kh_resize_str(kh_str_t*, khint_t) nogil + inline khint_t kh_put_str(kh_str_t*, kh_cstr_t, int*) nogil + inline void kh_del_str(kh_str_t*, khint_t) nogil - bint kh_exist_str(kh_str_t*, khiter_t) + bint kh_exist_str(kh_str_t*, khiter_t) nogil ctypedef struct kh_int64_t: @@ -62,15 +62,15 @@ cdef extern from "khash_python.h": int64_t *keys size_t *vals - inline kh_int64_t* kh_init_int64() - inline void kh_destroy_int64(kh_int64_t*) - inline void kh_clear_int64(kh_int64_t*) - inline khint_t kh_get_int64(kh_int64_t*, int64_t) - inline void kh_resize_int64(kh_int64_t*, khint_t) - inline khint_t kh_put_int64(kh_int64_t*, int64_t, int*) - inline void kh_del_int64(kh_int64_t*, khint_t) + inline kh_int64_t* kh_init_int64() nogil + inline void kh_destroy_int64(kh_int64_t*) nogil + inline void kh_clear_int64(kh_int64_t*) nogil + inline khint_t kh_get_int64(kh_int64_t*, int64_t) nogil + inline void kh_resize_int64(kh_int64_t*, khint_t) nogil + inline khint_t kh_put_int64(kh_int64_t*, int64_t, int*) nogil + inline void kh_del_int64(kh_int64_t*, khint_t) nogil - bint kh_exist_int64(kh_int64_t*, khiter_t) + bint kh_exist_int64(kh_int64_t*, khiter_t) nogil ctypedef struct kh_float64_t: khint_t n_buckets, size, n_occupied, upper_bound @@ -78,15 +78,15 @@ cdef extern from "khash_python.h": float64_t *keys size_t *vals - inline kh_float64_t* kh_init_float64() - inline void kh_destroy_float64(kh_float64_t*) - inline void kh_clear_float64(kh_float64_t*) - inline khint_t kh_get_float64(kh_float64_t*, float64_t) - inline void kh_resize_float64(kh_float64_t*, khint_t) - inline khint_t kh_put_float64(kh_float64_t*, float64_t, int*) - inline void kh_del_float64(kh_float64_t*, khint_t) + inline kh_float64_t* kh_init_float64() nogil + inline void kh_destroy_float64(kh_float64_t*) nogil + inline void kh_clear_float64(kh_float64_t*) nogil + inline khint_t kh_get_float64(kh_float64_t*, float64_t) nogil + inline void kh_resize_float64(kh_float64_t*, khint_t) nogil + inline khint_t kh_put_float64(kh_float64_t*, float64_t, int*) nogil + inline void kh_del_float64(kh_float64_t*, khint_t) nogil - bint kh_exist_float64(kh_float64_t*, khiter_t) + bint kh_exist_float64(kh_float64_t*, khiter_t) nogil ctypedef struct kh_int32_t: khint_t n_buckets, size, n_occupied, upper_bound @@ -94,15 +94,15 @@ cdef extern from "khash_python.h": int32_t *keys size_t *vals - inline kh_int32_t* kh_init_int32() - inline void kh_destroy_int32(kh_int32_t*) - inline void kh_clear_int32(kh_int32_t*) - inline khint_t kh_get_int32(kh_int32_t*, int32_t) - inline void kh_resize_int32(kh_int32_t*, khint_t) - inline khint_t kh_put_int32(kh_int32_t*, int32_t, int*) - inline void kh_del_int32(kh_int32_t*, khint_t) + inline kh_int32_t* kh_init_int32() nogil + inline void kh_destroy_int32(kh_int32_t*) nogil + inline void kh_clear_int32(kh_int32_t*) nogil + inline khint_t kh_get_int32(kh_int32_t*, int32_t) nogil + inline void kh_resize_int32(kh_int32_t*, khint_t) nogil + inline khint_t kh_put_int32(kh_int32_t*, int32_t, int*) nogil + inline void kh_del_int32(kh_int32_t*, khint_t) nogil - bint kh_exist_int32(kh_int32_t*, khiter_t) + bint kh_exist_int32(kh_int32_t*, khiter_t) nogil # sweep factorize @@ -112,13 +112,12 @@ cdef extern from "khash_python.h": kh_cstr_t *keys PyObject **vals - inline kh_strbox_t* kh_init_strbox() - inline void kh_destroy_strbox(kh_strbox_t*) - inline void kh_clear_strbox(kh_strbox_t*) - inline khint_t kh_get_strbox(kh_strbox_t*, kh_cstr_t) - inline void kh_resize_strbox(kh_strbox_t*, khint_t) - inline khint_t kh_put_strbox(kh_strbox_t*, kh_cstr_t, int*) - inline void kh_del_strbox(kh_strbox_t*, khint_t) - - bint kh_exist_strbox(kh_strbox_t*, khiter_t) + inline kh_strbox_t* kh_init_strbox() nogil + inline void kh_destroy_strbox(kh_strbox_t*) nogil + inline void kh_clear_strbox(kh_strbox_t*) nogil + inline khint_t kh_get_strbox(kh_strbox_t*, kh_cstr_t) nogil + inline void kh_resize_strbox(kh_strbox_t*, khint_t) nogil + inline khint_t kh_put_strbox(kh_strbox_t*, kh_cstr_t, int*) nogil + inline void kh_del_strbox(kh_strbox_t*, khint_t) nogil + bint kh_exist_strbox(kh_strbox_t*, khiter_t) nogil diff --git a/pandas/src/msgpack/pack.h b/pandas/src/msgpack/pack.h index bb939d93ebeca..02379c9188424 100644 --- a/pandas/src/msgpack/pack.h +++ b/pandas/src/msgpack/pack.h @@ -26,7 +26,7 @@ extern "C" { #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) && (_MSC_VER < 1900) #define inline __inline #endif @@ -34,18 +34,18 @@ typedef struct msgpack_packer { char *buf; size_t length; size_t buf_size; + bool use_bin_type; } msgpack_packer; typedef struct Packer Packer; -static inline int msgpack_pack_short(msgpack_packer* pk, short d); static inline int msgpack_pack_int(msgpack_packer* pk, int d); static inline int msgpack_pack_long(msgpack_packer* pk, long d); static inline int msgpack_pack_long_long(msgpack_packer* pk, long long d); static inline int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d); static inline int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d); static inline int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d); -static inline int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d); +//static inline int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d); static inline int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d); static inline int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d); @@ -68,8 +68,11 @@ static inline int msgpack_pack_array(msgpack_packer* pk, unsigned int n); static inline int msgpack_pack_map(msgpack_packer* pk, unsigned int n); static inline int msgpack_pack_raw(msgpack_packer* pk, size_t l); +static inline int msgpack_pack_bin(msgpack_packer* pk, size_t l); static inline int msgpack_pack_raw_body(msgpack_packer* pk, const void* b, size_t l); +static inline int msgpack_pack_ext(msgpack_packer* pk, char typecode, size_t l); + static inline int msgpack_pack_write(msgpack_packer* pk, const char *data, size_t l) { char* buf = pk->buf; @@ -90,14 +93,6 @@ static inline int msgpack_pack_write(msgpack_packer* pk, const char *data, size_ return 0; } -#define msgpack_pack_inline_func(name) \ - static inline int msgpack_pack ## name - -#define msgpack_pack_inline_func_cint(name) \ - static inline int msgpack_pack ## name - -#define msgpack_pack_user msgpack_packer* - #define msgpack_pack_append_buffer(user, buf, len) \ return msgpack_pack_write(user, (const char*)buf, len) diff --git a/pandas/src/msgpack/pack_template.h b/pandas/src/msgpack/pack_template.h index 65c959dd8ce63..5d1088f4b7d78 100644 --- a/pandas/src/msgpack/pack_template.h +++ b/pandas/src/msgpack/pack_template.h @@ -28,14 +28,6 @@ #define TAKE8_64(d) ((uint8_t*)&d)[7] #endif -#ifndef msgpack_pack_inline_func -#error msgpack_pack_inline_func template is not defined -#endif - -#ifndef msgpack_pack_user -#error msgpack_pack_user type is not defined -#endif - #ifndef msgpack_pack_append_buffer #error msgpack_pack_append_buffer callback is not defined #endif @@ -47,584 +39,524 @@ #define msgpack_pack_real_uint8(x, d) \ do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ + if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ + } else { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ } while(0) #define msgpack_pack_real_uint16(x, d) \ do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ + if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ + } else if(d < (1<<8)) { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } else { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } \ } while(0) #define msgpack_pack_real_uint32(x, d) \ do { \ - if(d < (1<<8)) { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ + if(d < (1<<8)) { \ + if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ + } else { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ + } else { \ + if(d < (1<<16)) { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else { \ + /* unsigned 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } \ + } \ } while(0) #define msgpack_pack_real_uint64(x, d) \ do { \ - if(d < (1ULL<<8)) { \ - if(d < (1ULL<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1ULL<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else if(d < (1ULL<<32)) { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* unsigned 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ + if(d < (1ULL<<8)) { \ + if(d < (1ULL<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ + } else { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ + } else { \ + if(d < (1ULL<<16)) { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else if(d < (1ULL<<32)) { \ + /* unsigned 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } else { \ + /* unsigned 64 */ \ + unsigned char buf[9]; \ + buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ + msgpack_pack_append_buffer(x, buf, 9); \ + } \ + } \ } while(0) #define msgpack_pack_real_int8(x, d) \ do { \ - if(d < -(1<<5)) { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } \ + if(d < -(1<<5)) { \ + /* signed 8 */ \ + unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } else { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ + } \ } while(0) #define msgpack_pack_real_int16(x, d) \ do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } \ + if(d < -(1<<5)) { \ + if(d < -(1<<7)) { \ + /* signed 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else { \ + /* signed 8 */ \ + unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ + } else if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ + } else { \ + if(d < (1<<8)) { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } else { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } \ + } \ } while(0) #define msgpack_pack_real_int32(x, d) \ do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<15)) { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ + if(d < -(1<<5)) { \ + if(d < -(1<<15)) { \ + /* signed 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } else if(d < -(1<<7)) { \ + /* signed 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else { \ + /* signed 8 */ \ + unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ + } else if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ + } else { \ + if(d < (1<<8)) { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } else if(d < (1<<16)) { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else { \ + /* unsigned 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } \ + } \ } while(0) #define msgpack_pack_real_int64(x, d) \ do { \ - if(d < -(1LL<<5)) { \ - if(d < -(1LL<<15)) { \ - if(d < -(1LL<<31)) { \ - /* signed 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } else { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } else { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - if(d < (1LL<<16)) { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } else { \ - if(d < (1LL<<32)) { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* unsigned 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ - } \ + if(d < -(1LL<<5)) { \ + if(d < -(1LL<<15)) { \ + if(d < -(1LL<<31)) { \ + /* signed 64 */ \ + unsigned char buf[9]; \ + buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \ + msgpack_pack_append_buffer(x, buf, 9); \ + } else { \ + /* signed 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } \ + } else { \ + if(d < -(1<<7)) { \ + /* signed 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } else { \ + /* signed 8 */ \ + unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } \ + } \ + } else if(d < (1<<7)) { \ + /* fixnum */ \ + msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ + } else { \ + if(d < (1LL<<16)) { \ + if(d < (1<<8)) { \ + /* unsigned 8 */ \ + unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ + msgpack_pack_append_buffer(x, buf, 2); \ + } else { \ + /* unsigned 16 */ \ + unsigned char buf[3]; \ + buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ + msgpack_pack_append_buffer(x, buf, 3); \ + } \ + } else { \ + if(d < (1LL<<32)) { \ + /* unsigned 32 */ \ + unsigned char buf[5]; \ + buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ + msgpack_pack_append_buffer(x, buf, 5); \ + } else { \ + /* unsigned 64 */ \ + unsigned char buf[9]; \ + buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ + msgpack_pack_append_buffer(x, buf, 9); \ + } \ + } \ + } \ } while(0) -#ifdef msgpack_pack_inline_func_fixint - -msgpack_pack_inline_func_fixint(_uint8)(msgpack_pack_user x, uint8_t d) -{ - unsigned char buf[2] = {0xcc, TAKE8_8(d)}; - msgpack_pack_append_buffer(x, buf, 2); -} - -msgpack_pack_inline_func_fixint(_uint16)(msgpack_pack_user x, uint16_t d) -{ - unsigned char buf[3]; - buf[0] = 0xcd; _msgpack_store16(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 3); -} - -msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d) -{ - unsigned char buf[5]; - buf[0] = 0xce; _msgpack_store32(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 5); -} - -msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d) -{ - unsigned char buf[9]; - buf[0] = 0xcf; _msgpack_store64(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 9); -} - -msgpack_pack_inline_func_fixint(_int8)(msgpack_pack_user x, int8_t d) +static inline int msgpack_pack_uint8(msgpack_packer* x, uint8_t d) { - unsigned char buf[2] = {0xd0, TAKE8_8(d)}; - msgpack_pack_append_buffer(x, buf, 2); + msgpack_pack_real_uint8(x, d); } -msgpack_pack_inline_func_fixint(_int16)(msgpack_pack_user x, int16_t d) +static inline int msgpack_pack_uint16(msgpack_packer* x, uint16_t d) { - unsigned char buf[3]; - buf[0] = 0xd1; _msgpack_store16(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 3); + msgpack_pack_real_uint16(x, d); } -msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d) +static inline int msgpack_pack_uint32(msgpack_packer* x, uint32_t d) { - unsigned char buf[5]; - buf[0] = 0xd2; _msgpack_store32(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 5); + msgpack_pack_real_uint32(x, d); } -msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d) +static inline int msgpack_pack_uint64(msgpack_packer* x, uint64_t d) { - unsigned char buf[9]; - buf[0] = 0xd3; _msgpack_store64(&buf[1], d); - msgpack_pack_append_buffer(x, buf, 9); + msgpack_pack_real_uint64(x, d); } -#undef msgpack_pack_inline_func_fixint -#endif - - -msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d) +static inline int msgpack_pack_int8(msgpack_packer* x, int8_t d) { - msgpack_pack_real_uint8(x, d); + msgpack_pack_real_int8(x, d); } -msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d) +static inline int msgpack_pack_int16(msgpack_packer* x, int16_t d) { - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_int16(x, d); } -msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d) +static inline int msgpack_pack_int32(msgpack_packer* x, int32_t d) { - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_int32(x, d); } -msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d) +static inline int msgpack_pack_int64(msgpack_packer* x, int64_t d) { - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_int64(x, d); } -msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d) -{ - msgpack_pack_real_int8(x, d); -} -msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d) -{ - msgpack_pack_real_int16(x, d); -} +//#ifdef msgpack_pack_inline_func_cint -msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d) -{ - msgpack_pack_real_int32(x, d); -} - -msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d) -{ - msgpack_pack_real_int64(x, d); -} - - -#ifdef msgpack_pack_inline_func_cint - -msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d) +static inline int msgpack_pack_short(msgpack_packer* x, short d) { #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif SIZEOF_SHORT == 4 - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #elif defined(SHRT_MAX) #if SHRT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif SHRT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #else if(sizeof(short) == 2) { - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); } else if(sizeof(short) == 4) { - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); } else { - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); } #endif } -msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d) +static inline int msgpack_pack_int(msgpack_packer* x, int d) { #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif SIZEOF_INT == 4 - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #elif defined(INT_MAX) #if INT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif INT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #else if(sizeof(int) == 2) { - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); } else if(sizeof(int) == 4) { - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); } else { - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); } #endif } -msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d) +static inline int msgpack_pack_long(msgpack_packer* x, long d) { #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif SIZEOF_LONG == 4 - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #elif defined(LONG_MAX) #if LONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif LONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #else if(sizeof(long) == 2) { - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); } else if(sizeof(long) == 4) { - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); } else { - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); } #endif } -msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d) +static inline int msgpack_pack_long_long(msgpack_packer* x, long long d) { #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif SIZEOF_LONG_LONG == 4 - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #elif defined(LLONG_MAX) #if LLONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); #elif LLONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); #else - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); #endif #else if(sizeof(long long) == 2) { - msgpack_pack_real_int16(x, d); + msgpack_pack_real_int16(x, d); } else if(sizeof(long long) == 4) { - msgpack_pack_real_int32(x, d); + msgpack_pack_real_int32(x, d); } else { - msgpack_pack_real_int64(x, d); + msgpack_pack_real_int64(x, d); } #endif } -msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d) +static inline int msgpack_pack_unsigned_short(msgpack_packer* x, unsigned short d) { #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif SIZEOF_SHORT == 4 - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #elif defined(USHRT_MAX) #if USHRT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif USHRT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #else if(sizeof(unsigned short) == 2) { - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); } else if(sizeof(unsigned short) == 4) { - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); } else { - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); } #endif } -msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d) +static inline int msgpack_pack_unsigned_int(msgpack_packer* x, unsigned int d) { #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif SIZEOF_INT == 4 - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #elif defined(UINT_MAX) #if UINT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif UINT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #else if(sizeof(unsigned int) == 2) { - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); } else if(sizeof(unsigned int) == 4) { - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); } else { - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); } #endif } -msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d) +static inline int msgpack_pack_unsigned_long(msgpack_packer* x, unsigned long d) { #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif SIZEOF_LONG == 4 - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #elif defined(ULONG_MAX) #if ULONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif ULONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #else if(sizeof(unsigned long) == 2) { - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); } else if(sizeof(unsigned long) == 4) { - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); } else { - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); } #endif } -msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d) +static inline int msgpack_pack_unsigned_long_long(msgpack_packer* x, unsigned long long d) { #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif SIZEOF_LONG_LONG == 4 - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #elif defined(ULLONG_MAX) #if ULLONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); #elif ULLONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); #else - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); #endif #else if(sizeof(unsigned long long) == 2) { - msgpack_pack_real_uint16(x, d); + msgpack_pack_real_uint16(x, d); } else if(sizeof(unsigned long long) == 4) { - msgpack_pack_real_uint32(x, d); + msgpack_pack_real_uint32(x, d); } else { - msgpack_pack_real_uint64(x, d); + msgpack_pack_real_uint64(x, d); } #endif } -#undef msgpack_pack_inline_func_cint -#endif +//#undef msgpack_pack_inline_func_cint +//#endif @@ -632,27 +564,27 @@ if(sizeof(unsigned long long) == 2) { * Float */ -msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d) +static inline int msgpack_pack_float(msgpack_packer* x, float d) { - union { float f; uint32_t i; } mem; - mem.f = d; - unsigned char buf[5]; - buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i); - msgpack_pack_append_buffer(x, buf, 5); + union { float f; uint32_t i; } mem; + mem.f = d; + unsigned char buf[5]; + buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i); + msgpack_pack_append_buffer(x, buf, 5); } -msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d) +static inline int msgpack_pack_double(msgpack_packer* x, double d) { - union { double f; uint64_t i; } mem; - mem.f = d; - unsigned char buf[9]; - buf[0] = 0xcb; + union { double f; uint64_t i; } mem; + mem.f = d; + unsigned char buf[9]; + buf[0] = 0xcb; #if defined(__arm__) && !(__ARM_EABI__) // arm-oabi // https://github.com/msgpack/msgpack-perl/pull/1 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); #endif _msgpack_store64(&buf[1], mem.i); - msgpack_pack_append_buffer(x, buf, 9); + msgpack_pack_append_buffer(x, buf, 9); } @@ -660,10 +592,10 @@ msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d) * Nil */ -msgpack_pack_inline_func(_nil)(msgpack_pack_user x) +static inline int msgpack_pack_nil(msgpack_packer* x) { - static const unsigned char d = 0xc0; - msgpack_pack_append_buffer(x, &d, 1); + static const unsigned char d = 0xc0; + msgpack_pack_append_buffer(x, &d, 1); } @@ -671,16 +603,16 @@ msgpack_pack_inline_func(_nil)(msgpack_pack_user x) * Boolean */ -msgpack_pack_inline_func(_true)(msgpack_pack_user x) +static inline int msgpack_pack_true(msgpack_packer* x) { - static const unsigned char d = 0xc3; - msgpack_pack_append_buffer(x, &d, 1); + static const unsigned char d = 0xc3; + msgpack_pack_append_buffer(x, &d, 1); } -msgpack_pack_inline_func(_false)(msgpack_pack_user x) +static inline int msgpack_pack_false(msgpack_packer* x) { - static const unsigned char d = 0xc2; - msgpack_pack_append_buffer(x, &d, 1); + static const unsigned char d = 0xc2; + msgpack_pack_append_buffer(x, &d, 1); } @@ -688,20 +620,20 @@ msgpack_pack_inline_func(_false)(msgpack_pack_user x) * Array */ -msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n) +static inline int msgpack_pack_array(msgpack_packer* x, unsigned int n) { - if(n < 16) { - unsigned char d = 0x90 | n; - msgpack_pack_append_buffer(x, &d, 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n); - msgpack_pack_append_buffer(x, buf, 5); - } + if(n < 16) { + unsigned char d = 0x90 | n; + msgpack_pack_append_buffer(x, &d, 1); + } else if(n < 65536) { + unsigned char buf[3]; + buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n); + msgpack_pack_append_buffer(x, buf, 3); + } else { + unsigned char buf[5]; + buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n); + msgpack_pack_append_buffer(x, buf, 5); + } } @@ -709,20 +641,20 @@ msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n) * Map */ -msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n) +static inline int msgpack_pack_map(msgpack_packer* x, unsigned int n) { - if(n < 16) { - unsigned char d = 0x80 | n; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n); - msgpack_pack_append_buffer(x, buf, 5); - } + if(n < 16) { + unsigned char d = 0x80 | n; + msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); + } else if(n < 65536) { + unsigned char buf[3]; + buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n); + msgpack_pack_append_buffer(x, buf, 3); + } else { + unsigned char buf[5]; + buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n); + msgpack_pack_append_buffer(x, buf, 5); + } } @@ -730,29 +662,112 @@ msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n) * Raw */ -msgpack_pack_inline_func(_raw)(msgpack_pack_user x, size_t l) +static inline int msgpack_pack_raw(msgpack_packer* x, size_t l) +{ + if (l < 32) { + unsigned char d = 0xa0 | (uint8_t)l; + msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); + } else if (x->use_bin_type && l < 256) { // str8 is new format introduced with bin. + unsigned char buf[2] = {0xd9, (uint8_t)l}; + msgpack_pack_append_buffer(x, buf, 2); + } else if (l < 65536) { + unsigned char buf[3]; + buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); + msgpack_pack_append_buffer(x, buf, 3); + } else { + unsigned char buf[5]; + buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); + msgpack_pack_append_buffer(x, buf, 5); + } +} + +/* + * bin + */ +static inline int msgpack_pack_bin(msgpack_packer *x, size_t l) { - if(l < 32) { - unsigned char d = 0xa0 | (uint8_t)l; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if(l < 65536) { - unsigned char buf[3]; - buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); - msgpack_pack_append_buffer(x, buf, 5); - } -} - -msgpack_pack_inline_func(_raw_body)(msgpack_pack_user x, const void* b, size_t l) + if (!x->use_bin_type) { + return msgpack_pack_raw(x, l); + } + if (l < 256) { + unsigned char buf[2] = {0xc4, (unsigned char)l}; + msgpack_pack_append_buffer(x, buf, 2); + } else if (l < 65536) { + unsigned char buf[3] = {0xc5}; + _msgpack_store16(&buf[1], (uint16_t)l); + msgpack_pack_append_buffer(x, buf, 3); + } else { + unsigned char buf[5] = {0xc6}; + _msgpack_store32(&buf[1], (uint32_t)l); + msgpack_pack_append_buffer(x, buf, 5); + } +} + +static inline int msgpack_pack_raw_body(msgpack_packer* x, const void* b, size_t l) { - msgpack_pack_append_buffer(x, (const unsigned char*)b, l); + if (l > 0) msgpack_pack_append_buffer(x, (const unsigned char*)b, l); + return 0; } -#undef msgpack_pack_inline_func -#undef msgpack_pack_user +/* + * Ext + */ +static inline int msgpack_pack_ext(msgpack_packer* x, char typecode, size_t l) +{ + if (l == 1) { + unsigned char buf[2]; + buf[0] = 0xd4; + buf[1] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 2); + } + else if(l == 2) { + unsigned char buf[2]; + buf[0] = 0xd5; + buf[1] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 2); + } + else if(l == 4) { + unsigned char buf[2]; + buf[0] = 0xd6; + buf[1] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 2); + } + else if(l == 8) { + unsigned char buf[2]; + buf[0] = 0xd7; + buf[1] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 2); + } + else if(l == 16) { + unsigned char buf[2]; + buf[0] = 0xd8; + buf[1] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 2); + } + else if(l < 256) { + unsigned char buf[3]; + buf[0] = 0xc7; + buf[1] = l; + buf[2] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 3); + } else if(l < 65536) { + unsigned char buf[4]; + buf[0] = 0xc8; + _msgpack_store16(&buf[1], (uint16_t)l); + buf[3] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 4); + } else { + unsigned char buf[6]; + buf[0] = 0xc9; + _msgpack_store32(&buf[1], (uint32_t)l); + buf[5] = (unsigned char)typecode; + msgpack_pack_append_buffer(x, buf, 6); + } + +} + + + #undef msgpack_pack_append_buffer #undef TAKE8_8 @@ -768,4 +783,3 @@ msgpack_pack_inline_func(_raw_body)(msgpack_pack_user x, const void* b, size_t l #undef msgpack_pack_real_int16 #undef msgpack_pack_real_int32 #undef msgpack_pack_real_int64 - diff --git a/pandas/src/msgpack/sysdep.h b/pandas/src/msgpack/sysdep.h index 4fedbd8ba472f..ed9c1bc0b8031 100644 --- a/pandas/src/msgpack/sysdep.h +++ b/pandas/src/msgpack/sysdep.h @@ -192,4 +192,3 @@ typedef unsigned int _msgpack_atomic_counter_t; #endif /* msgpack/sysdep.h */ - diff --git a/pandas/src/msgpack/unpack.h b/pandas/src/msgpack/unpack.h index 3dc88e5fbded0..5deb7cde0b929 100644 --- a/pandas/src/msgpack/unpack.h +++ b/pandas/src/msgpack/unpack.h @@ -24,35 +24,23 @@ typedef struct unpack_user { PyObject *object_hook; bool has_pairs_hook; PyObject *list_hook; + PyObject *ext_hook; const char *encoding; const char *unicode_errors; + Py_ssize_t max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len; } unpack_user; +typedef PyObject* msgpack_unpack_object; +struct unpack_context; +typedef struct unpack_context unpack_context; +typedef int (*execute_fn)(unpack_context *ctx, const char* data, size_t len, size_t* off); -#define msgpack_unpack_struct(name) \ - struct template ## name - -#define msgpack_unpack_func(ret, name) \ - static inline ret template ## name - -#define msgpack_unpack_callback(name) \ - template_callback ## name - -#define msgpack_unpack_object PyObject* - -#define msgpack_unpack_user unpack_user - -typedef int (*execute_fn)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off); - -struct template_context; -typedef struct template_context template_context; - -static inline msgpack_unpack_object template_callback_root(unpack_user* u) +static inline msgpack_unpack_object unpack_callback_root(unpack_user* u) { return NULL; } -static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_unpack_object* o) +static inline int unpack_callback_uint16(unpack_user* u, uint16_t d, msgpack_unpack_object* o) { PyObject *p = PyInt_FromLong((long)d); if (!p) @@ -60,36 +48,36 @@ static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_u *o = p; return 0; } -static inline int template_callback_uint8(unpack_user* u, uint8_t d, msgpack_unpack_object* o) +static inline int unpack_callback_uint8(unpack_user* u, uint8_t d, msgpack_unpack_object* o) { - return template_callback_uint16(u, d, o); + return unpack_callback_uint16(u, d, o); } -static inline int template_callback_uint32(unpack_user* u, uint32_t d, msgpack_unpack_object* o) +static inline int unpack_callback_uint32(unpack_user* u, uint32_t d, msgpack_unpack_object* o) { - PyObject *p; - if (d > LONG_MAX) { - p = PyLong_FromUnsignedLong((unsigned long)d); - } else { - p = PyInt_FromLong((long)d); - } + PyObject *p = PyInt_FromSize_t((size_t)d); if (!p) return -1; *o = p; return 0; } -static inline int template_callback_uint64(unpack_user* u, uint64_t d, msgpack_unpack_object* o) +static inline int unpack_callback_uint64(unpack_user* u, uint64_t d, msgpack_unpack_object* o) { - PyObject *p = PyLong_FromUnsignedLongLong(d); + PyObject *p; + if (d > LONG_MAX) { + p = PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)d); + } else { + p = PyInt_FromSize_t((size_t)d); + } if (!p) return -1; *o = p; return 0; } -static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_unpack_object* o) +static inline int unpack_callback_int32(unpack_user* u, int32_t d, msgpack_unpack_object* o) { PyObject *p = PyInt_FromLong(d); if (!p) @@ -98,26 +86,29 @@ static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_unp return 0; } -static inline int template_callback_int16(unpack_user* u, int16_t d, msgpack_unpack_object* o) +static inline int unpack_callback_int16(unpack_user* u, int16_t d, msgpack_unpack_object* o) { - return template_callback_int32(u, d, o); + return unpack_callback_int32(u, d, o); } -static inline int template_callback_int8(unpack_user* u, int8_t d, msgpack_unpack_object* o) +static inline int unpack_callback_int8(unpack_user* u, int8_t d, msgpack_unpack_object* o) { - return template_callback_int32(u, d, o); + return unpack_callback_int32(u, d, o); } -static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_unpack_object* o) +static inline int unpack_callback_int64(unpack_user* u, int64_t d, msgpack_unpack_object* o) { - PyObject *p = PyLong_FromLongLong(d); - if (!p) - return -1; + PyObject *p; + if (d > LONG_MAX || d < LONG_MIN) { + p = PyLong_FromLongLong((unsigned PY_LONG_LONG)d); + } else { + p = PyInt_FromLong((long)d); + } *o = p; return 0; } -static inline int template_callback_double(unpack_user* u, double d, msgpack_unpack_object* o) +static inline int unpack_callback_double(unpack_user* u, double d, msgpack_unpack_object* o) { PyObject *p = PyFloat_FromDouble(d); if (!p) @@ -126,22 +117,26 @@ static inline int template_callback_double(unpack_user* u, double d, msgpack_unp return 0; } -static inline int template_callback_float(unpack_user* u, float d, msgpack_unpack_object* o) +static inline int unpack_callback_float(unpack_user* u, float d, msgpack_unpack_object* o) { - return template_callback_double(u, d, o); + return unpack_callback_double(u, d, o); } -static inline int template_callback_nil(unpack_user* u, msgpack_unpack_object* o) +static inline int unpack_callback_nil(unpack_user* u, msgpack_unpack_object* o) { Py_INCREF(Py_None); *o = Py_None; return 0; } -static inline int template_callback_true(unpack_user* u, msgpack_unpack_object* o) +static inline int unpack_callback_true(unpack_user* u, msgpack_unpack_object* o) { Py_INCREF(Py_True); *o = Py_True; return 0; } -static inline int template_callback_false(unpack_user* u, msgpack_unpack_object* o) +static inline int unpack_callback_false(unpack_user* u, msgpack_unpack_object* o) { Py_INCREF(Py_False); *o = Py_False; return 0; } -static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_unpack_object* o) +static inline int unpack_callback_array(unpack_user* u, unsigned int n, msgpack_unpack_object* o) { + if (n > u->max_array_len) { + PyErr_Format(PyExc_ValueError, "%u exceeds max_array_len(%zd)", n, u->max_array_len); + return -1; + } PyObject *p = u->use_list ? PyList_New(n) : PyTuple_New(n); if (!p) @@ -150,7 +145,7 @@ static inline int template_callback_array(unpack_user* u, unsigned int n, msgpac return 0; } -static inline int template_callback_array_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object o) +static inline int unpack_callback_array_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object o) { if (u->use_list) PyList_SET_ITEM(*c, current, o); @@ -159,10 +154,10 @@ static inline int template_callback_array_item(unpack_user* u, unsigned int curr return 0; } -static inline int template_callback_array_end(unpack_user* u, msgpack_unpack_object* c) +static inline int unpack_callback_array_end(unpack_user* u, msgpack_unpack_object* c) { if (u->list_hook) { - PyObject *new_c = PyEval_CallFunction(u->list_hook, "(O)", *c); + PyObject *new_c = PyObject_CallFunctionObjArgs(u->list_hook, *c, NULL); if (!new_c) return -1; Py_DECREF(*c); @@ -171,8 +166,12 @@ static inline int template_callback_array_end(unpack_user* u, msgpack_unpack_obj return 0; } -static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_unpack_object* o) +static inline int unpack_callback_map(unpack_user* u, unsigned int n, msgpack_unpack_object* o) { + if (n > u->max_map_len) { + PyErr_Format(PyExc_ValueError, "%u exceeds max_map_len(%zd)", n, u->max_map_len); + return -1; + } PyObject *p; if (u->has_pairs_hook) { p = PyList_New(n); // Or use tuple? @@ -186,7 +185,7 @@ static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_ return 0; } -static inline int template_callback_map_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object k, msgpack_unpack_object v) +static inline int unpack_callback_map_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object k, msgpack_unpack_object v) { if (u->has_pairs_hook) { msgpack_unpack_object item = PyTuple_Pack(2, k, v); @@ -205,10 +204,10 @@ static inline int template_callback_map_item(unpack_user* u, unsigned int curren return -1; } -static inline int template_callback_map_end(unpack_user* u, msgpack_unpack_object* c) +static inline int unpack_callback_map_end(unpack_user* u, msgpack_unpack_object* c) { if (u->object_hook) { - PyObject *new_c = PyEval_CallFunction(u->object_hook, "(O)", *c); + PyObject *new_c = PyObject_CallFunctionObjArgs(u->object_hook, *c, NULL); if (!new_c) return -1; @@ -218,8 +217,13 @@ static inline int template_callback_map_end(unpack_user* u, msgpack_unpack_objec return 0; } -static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) +static inline int unpack_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) { + if (l > u->max_str_len) { + PyErr_Format(PyExc_ValueError, "%u exceeds max_str_len(%zd)", l, u->max_str_len); + return -1; + } + PyObject *py; if(u->encoding) { py = PyUnicode_Decode(p, l, u->encoding, u->unicode_errors); @@ -232,4 +236,43 @@ static inline int template_callback_raw(unpack_user* u, const char* b, const cha return 0; } +static inline int unpack_callback_bin(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) +{ + if (l > u->max_bin_len) { + PyErr_Format(PyExc_ValueError, "%u exceeds max_bin_len(%zd)", l, u->max_bin_len); + return -1; + } + + PyObject *py = PyBytes_FromStringAndSize(p, l); + if (!py) + return -1; + *o = py; + return 0; +} + +static inline int unpack_callback_ext(unpack_user* u, const char* base, const char* pos, + unsigned int length, msgpack_unpack_object* o) +{ + PyObject *py; + int8_t typecode = (int8_t)*pos++; + if (!u->ext_hook) { + PyErr_SetString(PyExc_AssertionError, "u->ext_hook cannot be NULL"); + return -1; + } + if (length-1 > u->max_ext_len) { + PyErr_Format(PyExc_ValueError, "%u exceeds max_ext_len(%zd)", length, u->max_ext_len); + return -1; + } + // length also includes the typecode, so the actual data is length-1 +#if PY_MAJOR_VERSION == 2 + py = PyObject_CallFunction(u->ext_hook, "(is#)", typecode, pos, length-1); +#else + py = PyObject_CallFunction(u->ext_hook, "(iy#)", typecode, pos, length-1); +#endif + if (!py) + return -1; + *o = py; + return 0; +} + #include "unpack_template.h" diff --git a/pandas/src/msgpack/unpack_define.h b/pandas/src/msgpack/unpack_define.h index 959d3519e7b5c..0dd708d17c3d4 100644 --- a/pandas/src/msgpack/unpack_define.h +++ b/pandas/src/msgpack/unpack_define.h @@ -34,54 +34,57 @@ extern "C" { #endif +// CS is first byte & 0x1f typedef enum { - CS_HEADER = 0x00, // nil - - //CS_ = 0x01, - //CS_ = 0x02, // false - //CS_ = 0x03, // true - - //CS_ = 0x04, - //CS_ = 0x05, - //CS_ = 0x06, - //CS_ = 0x07, - - //CS_ = 0x08, - //CS_ = 0x09, - CS_FLOAT = 0x0a, - CS_DOUBLE = 0x0b, - CS_UINT_8 = 0x0c, - CS_UINT_16 = 0x0d, - CS_UINT_32 = 0x0e, - CS_UINT_64 = 0x0f, - CS_INT_8 = 0x10, - CS_INT_16 = 0x11, - CS_INT_32 = 0x12, - CS_INT_64 = 0x13, - - //CS_ = 0x14, - //CS_ = 0x15, - //CS_BIG_INT_16 = 0x16, - //CS_BIG_INT_32 = 0x17, - //CS_BIG_FLOAT_16 = 0x18, - //CS_BIG_FLOAT_32 = 0x19, - CS_RAW_16 = 0x1a, - CS_RAW_32 = 0x1b, - CS_ARRAY_16 = 0x1c, - CS_ARRAY_32 = 0x1d, - CS_MAP_16 = 0x1e, - CS_MAP_32 = 0x1f, - - //ACS_BIG_INT_VALUE, - //ACS_BIG_FLOAT_VALUE, - ACS_RAW_VALUE, + CS_HEADER = 0x00, // nil + + //CS_ = 0x01, + //CS_ = 0x02, // false + //CS_ = 0x03, // true + + CS_BIN_8 = 0x04, + CS_BIN_16 = 0x05, + CS_BIN_32 = 0x06, + + CS_EXT_8 = 0x07, + CS_EXT_16 = 0x08, + CS_EXT_32 = 0x09, + + CS_FLOAT = 0x0a, + CS_DOUBLE = 0x0b, + CS_UINT_8 = 0x0c, + CS_UINT_16 = 0x0d, + CS_UINT_32 = 0x0e, + CS_UINT_64 = 0x0f, + CS_INT_8 = 0x10, + CS_INT_16 = 0x11, + CS_INT_32 = 0x12, + CS_INT_64 = 0x13, + + //CS_FIXEXT1 = 0x14, + //CS_FIXEXT2 = 0x15, + //CS_FIXEXT4 = 0x16, + //CS_FIXEXT8 = 0x17, + //CS_FIXEXT16 = 0x18, + + CS_RAW_8 = 0x19, + CS_RAW_16 = 0x1a, + CS_RAW_32 = 0x1b, + CS_ARRAY_16 = 0x1c, + CS_ARRAY_32 = 0x1d, + CS_MAP_16 = 0x1e, + CS_MAP_32 = 0x1f, + + ACS_RAW_VALUE, + ACS_BIN_VALUE, + ACS_EXT_VALUE, } msgpack_unpack_state; typedef enum { - CT_ARRAY_ITEM, - CT_MAP_KEY, - CT_MAP_VALUE, + CT_ARRAY_ITEM, + CT_MAP_KEY, + CT_MAP_VALUE, } msgpack_container_type; @@ -90,4 +93,3 @@ typedef enum { #endif #endif /* msgpack/unpack_define.h */ - diff --git a/pandas/src/msgpack/unpack_template.h b/pandas/src/msgpack/unpack_template.h index 83b6918dc6686..d34eceda6ab69 100644 --- a/pandas/src/msgpack/unpack_template.h +++ b/pandas/src/msgpack/unpack_template.h @@ -16,167 +16,142 @@ * limitations under the License. */ -#ifndef msgpack_unpack_func -#error msgpack_unpack_func template is not defined -#endif - -#ifndef msgpack_unpack_callback -#error msgpack_unpack_callback template is not defined -#endif - -#ifndef msgpack_unpack_struct -#error msgpack_unpack_struct template is not defined -#endif - -#ifndef msgpack_unpack_struct_decl -#define msgpack_unpack_struct_decl(name) msgpack_unpack_struct(name) -#endif - -#ifndef msgpack_unpack_object -#error msgpack_unpack_object type is not defined -#endif - -#ifndef msgpack_unpack_user -#error msgpack_unpack_user type is not defined -#endif - #ifndef USE_CASE_RANGE #if !defined(_MSC_VER) #define USE_CASE_RANGE #endif #endif -msgpack_unpack_struct_decl(_stack) { - msgpack_unpack_object obj; - size_t size; - size_t count; - unsigned int ct; - msgpack_unpack_object map_key; -}; - -msgpack_unpack_struct_decl(_context) { - msgpack_unpack_user user; - unsigned int cs; - unsigned int trail; - unsigned int top; - /* - msgpack_unpack_struct(_stack)* stack; - unsigned int stack_size; - msgpack_unpack_struct(_stack) embed_stack[MSGPACK_EMBED_STACK_SIZE]; - */ - msgpack_unpack_struct(_stack) stack[MSGPACK_EMBED_STACK_SIZE]; +typedef struct unpack_stack { + PyObject* obj; + size_t size; + size_t count; + unsigned int ct; + PyObject* map_key; +} unpack_stack; + +struct unpack_context { + unpack_user user; + unsigned int cs; + unsigned int trail; + unsigned int top; + /* + unpack_stack* stack; + unsigned int stack_size; + unpack_stack embed_stack[MSGPACK_EMBED_STACK_SIZE]; + */ + unpack_stack stack[MSGPACK_EMBED_STACK_SIZE]; }; -msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx) +static inline void unpack_init(unpack_context* ctx) { - ctx->cs = CS_HEADER; - ctx->trail = 0; - ctx->top = 0; - /* - ctx->stack = ctx->embed_stack; - ctx->stack_size = MSGPACK_EMBED_STACK_SIZE; - */ - ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user); + ctx->cs = CS_HEADER; + ctx->trail = 0; + ctx->top = 0; + /* + ctx->stack = ctx->embed_stack; + ctx->stack_size = MSGPACK_EMBED_STACK_SIZE; + */ + ctx->stack[0].obj = unpack_callback_root(&ctx->user); } /* -msgpack_unpack_func(void, _destroy)(msgpack_unpack_struct(_context)* ctx) +static inline void unpack_destroy(unpack_context* ctx) { - if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) { - free(ctx->stack); - } + if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) { + free(ctx->stack); + } } */ -msgpack_unpack_func(msgpack_unpack_object, _data)(msgpack_unpack_struct(_context)* ctx) +static inline PyObject* unpack_data(unpack_context* ctx) { - return (ctx)->stack[0].obj; + return (ctx)->stack[0].obj; } template -msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off) +static inline int unpack_execute(unpack_context* ctx, const char* data, size_t len, size_t* off) { - assert(len >= *off); + assert(len >= *off); - const unsigned char* p = (unsigned char*)data + *off; - const unsigned char* const pe = (unsigned char*)data + len; - const void* n = NULL; + const unsigned char* p = (unsigned char*)data + *off; + const unsigned char* const pe = (unsigned char*)data + len; + const void* n = NULL; - unsigned int trail = ctx->trail; - unsigned int cs = ctx->cs; - unsigned int top = ctx->top; - msgpack_unpack_struct(_stack)* stack = ctx->stack; - /* - unsigned int stack_size = ctx->stack_size; - */ - msgpack_unpack_user* user = &ctx->user; + unsigned int trail = ctx->trail; + unsigned int cs = ctx->cs; + unsigned int top = ctx->top; + unpack_stack* stack = ctx->stack; + /* + unsigned int stack_size = ctx->stack_size; + */ + unpack_user* user = &ctx->user; - msgpack_unpack_object obj; - msgpack_unpack_struct(_stack)* c = NULL; + PyObject* obj; + unpack_stack* c = NULL; - int ret; + int ret; #define construct_cb(name) \ - construct && msgpack_unpack_callback(name) + construct && unpack_callback ## name #define push_simple_value(func) \ - if(construct_cb(func)(user, &obj) < 0) { goto _failed; } \ - goto _push + if(construct_cb(func)(user, &obj) < 0) { goto _failed; } \ + goto _push #define push_fixed_value(func, arg) \ - if(construct_cb(func)(user, arg, &obj) < 0) { goto _failed; } \ - goto _push + if(construct_cb(func)(user, arg, &obj) < 0) { goto _failed; } \ + goto _push #define push_variable_value(func, base, pos, len) \ - if(construct_cb(func)(user, \ - (const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \ - goto _push + if(construct_cb(func)(user, \ + (const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \ + goto _push #define again_fixed_trail(_cs, trail_len) \ - trail = trail_len; \ - cs = _cs; \ - goto _fixed_trail_again + trail = trail_len; \ + cs = _cs; \ + goto _fixed_trail_again #define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \ - trail = trail_len; \ - if(trail == 0) { goto ifzero; } \ - cs = _cs; \ - goto _fixed_trail_again + trail = trail_len; \ + if(trail == 0) { goto ifzero; } \ + cs = _cs; \ + goto _fixed_trail_again #define start_container(func, count_, ct_) \ - if(top >= MSGPACK_EMBED_STACK_SIZE) { goto _failed; } /* FIXME */ \ - if(construct_cb(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \ - if((count_) == 0) { obj = stack[top].obj; \ - if (construct_cb(func##_end)(user, &obj) < 0) { goto _failed; } \ - goto _push; } \ - stack[top].ct = ct_; \ - stack[top].size = count_; \ - stack[top].count = 0; \ - ++top; \ - /*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \ - /*printf("stack push %d\n", top);*/ \ - /* FIXME \ - if(top >= stack_size) { \ - if(stack_size == MSGPACK_EMBED_STACK_SIZE) { \ - size_t csize = sizeof(msgpack_unpack_struct(_stack)) * MSGPACK_EMBED_STACK_SIZE; \ - size_t nsize = csize * 2; \ - msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)malloc(nsize); \ - if(tmp == NULL) { goto _failed; } \ - memcpy(tmp, ctx->stack, csize); \ - ctx->stack = stack = tmp; \ - ctx->stack_size = stack_size = MSGPACK_EMBED_STACK_SIZE * 2; \ - } else { \ - size_t nsize = sizeof(msgpack_unpack_struct(_stack)) * ctx->stack_size * 2; \ - msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)realloc(ctx->stack, nsize); \ - if(tmp == NULL) { goto _failed; } \ - ctx->stack = stack = tmp; \ - ctx->stack_size = stack_size = stack_size * 2; \ - } \ - } \ - */ \ - goto _header_again - -#define NEXT_CS(p) \ - ((unsigned int)*p & 0x1f) + if(top >= MSGPACK_EMBED_STACK_SIZE) { goto _failed; } /* FIXME */ \ + if(construct_cb(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \ + if((count_) == 0) { obj = stack[top].obj; \ + if (construct_cb(func##_end)(user, &obj) < 0) { goto _failed; } \ + goto _push; } \ + stack[top].ct = ct_; \ + stack[top].size = count_; \ + stack[top].count = 0; \ + ++top; \ + /*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \ + /*printf("stack push %d\n", top);*/ \ + /* FIXME \ + if(top >= stack_size) { \ + if(stack_size == MSGPACK_EMBED_STACK_SIZE) { \ + size_t csize = sizeof(unpack_stack) * MSGPACK_EMBED_STACK_SIZE; \ + size_t nsize = csize * 2; \ + unpack_stack* tmp = (unpack_stack*)malloc(nsize); \ + if(tmp == NULL) { goto _failed; } \ + memcpy(tmp, ctx->stack, csize); \ + ctx->stack = stack = tmp; \ + ctx->stack_size = stack_size = MSGPACK_EMBED_STACK_SIZE * 2; \ + } else { \ + size_t nsize = sizeof(unpack_stack) * ctx->stack_size * 2; \ + unpack_stack* tmp = (unpack_stack*)realloc(ctx->stack, nsize); \ + if(tmp == NULL) { goto _failed; } \ + ctx->stack = stack = tmp; \ + ctx->stack_size = stack_size = stack_size * 2; \ + } \ + } \ + */ \ + goto _header_again + +#define NEXT_CS(p) ((unsigned int)*p & 0x1f) #ifdef USE_CASE_RANGE #define SWITCH_RANGE_BEGIN switch(*p) { @@ -190,221 +165,235 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c #define SWITCH_RANGE_END } } #endif - if(p == pe) { goto _out; } - do { - switch(cs) { - case CS_HEADER: - SWITCH_RANGE_BEGIN - SWITCH_RANGE(0x00, 0x7f) // Positive Fixnum - push_fixed_value(_uint8, *(uint8_t*)p); - SWITCH_RANGE(0xe0, 0xff) // Negative Fixnum - push_fixed_value(_int8, *(int8_t*)p); - SWITCH_RANGE(0xc0, 0xdf) // Variable - switch(*p) { - case 0xc0: // nil - push_simple_value(_nil); - //case 0xc1: // string - // again_terminal_trail(NEXT_CS(p), p+1); - case 0xc2: // false - push_simple_value(_false); - case 0xc3: // true - push_simple_value(_true); - //case 0xc4: - //case 0xc5: - //case 0xc6: - //case 0xc7: - //case 0xc8: - //case 0xc9: - case 0xca: // float - case 0xcb: // double - case 0xcc: // unsigned int 8 - case 0xcd: // unsigned int 16 - case 0xce: // unsigned int 32 - case 0xcf: // unsigned int 64 - case 0xd0: // signed int 8 - case 0xd1: // signed int 16 - case 0xd2: // signed int 32 - case 0xd3: // signed int 64 - again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03)); - //case 0xd4: - //case 0xd5: - //case 0xd6: // big integer 16 - //case 0xd7: // big integer 32 - //case 0xd8: // big float 16 - //case 0xd9: // big float 32 - case 0xda: // raw 16 - case 0xdb: // raw 32 - case 0xdc: // array 16 - case 0xdd: // array 32 - case 0xde: // map 16 - case 0xdf: // map 32 - again_fixed_trail(NEXT_CS(p), 2 << (((unsigned int)*p) & 0x01)); - default: - goto _failed; - } - SWITCH_RANGE(0xa0, 0xbf) // FixRaw - again_fixed_trail_if_zero(ACS_RAW_VALUE, ((unsigned int)*p & 0x1f), _raw_zero); - SWITCH_RANGE(0x90, 0x9f) // FixArray - start_container(_array, ((unsigned int)*p) & 0x0f, CT_ARRAY_ITEM); - SWITCH_RANGE(0x80, 0x8f) // FixMap - start_container(_map, ((unsigned int)*p) & 0x0f, CT_MAP_KEY); - - SWITCH_RANGE_DEFAULT - goto _failed; - SWITCH_RANGE_END - // end CS_HEADER - - - _fixed_trail_again: - ++p; - - default: - if((size_t)(pe - p) < trail) { goto _out; } - n = p; p += trail - 1; - switch(cs) { - //case CS_ - //case CS_ - case CS_FLOAT: { - union { uint32_t i; float f; } mem; - mem.i = _msgpack_load32(uint32_t,n); - push_fixed_value(_float, mem.f); } - case CS_DOUBLE: { - union { uint64_t i; double f; } mem; - mem.i = _msgpack_load64(uint64_t,n); + if(p == pe) { goto _out; } + do { + switch(cs) { + case CS_HEADER: + SWITCH_RANGE_BEGIN + SWITCH_RANGE(0x00, 0x7f) // Positive Fixnum + push_fixed_value(_uint8, *(uint8_t*)p); + SWITCH_RANGE(0xe0, 0xff) // Negative Fixnum + push_fixed_value(_int8, *(int8_t*)p); + SWITCH_RANGE(0xc0, 0xdf) // Variable + switch(*p) { + case 0xc0: // nil + push_simple_value(_nil); + //case 0xc1: // never used + case 0xc2: // false + push_simple_value(_false); + case 0xc3: // true + push_simple_value(_true); + case 0xc4: // bin 8 + again_fixed_trail(NEXT_CS(p), 1); + case 0xc5: // bin 16 + again_fixed_trail(NEXT_CS(p), 2); + case 0xc6: // bin 32 + again_fixed_trail(NEXT_CS(p), 4); + case 0xc7: // ext 8 + again_fixed_trail(NEXT_CS(p), 1); + case 0xc8: // ext 16 + again_fixed_trail(NEXT_CS(p), 2); + case 0xc9: // ext 32 + again_fixed_trail(NEXT_CS(p), 4); + case 0xca: // float + case 0xcb: // double + case 0xcc: // unsigned int 8 + case 0xcd: // unsigned int 16 + case 0xce: // unsigned int 32 + case 0xcf: // unsigned int 64 + case 0xd0: // signed int 8 + case 0xd1: // signed int 16 + case 0xd2: // signed int 32 + case 0xd3: // signed int 64 + again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03)); + case 0xd4: // fixext 1 + case 0xd5: // fixext 2 + case 0xd6: // fixext 4 + case 0xd7: // fixext 8 + again_fixed_trail_if_zero(ACS_EXT_VALUE, + (1 << (((unsigned int)*p) & 0x03))+1, + _ext_zero); + case 0xd8: // fixext 16 + again_fixed_trail_if_zero(ACS_EXT_VALUE, 16+1, _ext_zero); + case 0xd9: // str 8 + again_fixed_trail(NEXT_CS(p), 1); + case 0xda: // raw 16 + case 0xdb: // raw 32 + case 0xdc: // array 16 + case 0xdd: // array 32 + case 0xde: // map 16 + case 0xdf: // map 32 + again_fixed_trail(NEXT_CS(p), 2 << (((unsigned int)*p) & 0x01)); + default: + goto _failed; + } + SWITCH_RANGE(0xa0, 0xbf) // FixRaw + again_fixed_trail_if_zero(ACS_RAW_VALUE, ((unsigned int)*p & 0x1f), _raw_zero); + SWITCH_RANGE(0x90, 0x9f) // FixArray + start_container(_array, ((unsigned int)*p) & 0x0f, CT_ARRAY_ITEM); + SWITCH_RANGE(0x80, 0x8f) // FixMap + start_container(_map, ((unsigned int)*p) & 0x0f, CT_MAP_KEY); + + SWITCH_RANGE_DEFAULT + goto _failed; + SWITCH_RANGE_END + // end CS_HEADER + + + _fixed_trail_again: + ++p; + + default: + if((size_t)(pe - p) < trail) { goto _out; } + n = p; p += trail - 1; + switch(cs) { + case CS_EXT_8: + again_fixed_trail_if_zero(ACS_EXT_VALUE, *(uint8_t*)n+1, _ext_zero); + case CS_EXT_16: + again_fixed_trail_if_zero(ACS_EXT_VALUE, + _msgpack_load16(uint16_t,n)+1, + _ext_zero); + case CS_EXT_32: + again_fixed_trail_if_zero(ACS_EXT_VALUE, + _msgpack_load32(uint32_t,n)+1, + _ext_zero); + case CS_FLOAT: { + union { uint32_t i; float f; } mem; + mem.i = _msgpack_load32(uint32_t,n); + push_fixed_value(_float, mem.f); } + case CS_DOUBLE: { + union { uint64_t i; double f; } mem; + mem.i = _msgpack_load64(uint64_t,n); #if defined(__arm__) && !(__ARM_EABI__) // arm-oabi // https://github.com/msgpack/msgpack-perl/pull/1 mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); #endif - push_fixed_value(_double, mem.f); } - case CS_UINT_8: - push_fixed_value(_uint8, *(uint8_t*)n); - case CS_UINT_16: - push_fixed_value(_uint16, _msgpack_load16(uint16_t,n)); - case CS_UINT_32: - push_fixed_value(_uint32, _msgpack_load32(uint32_t,n)); - case CS_UINT_64: - push_fixed_value(_uint64, _msgpack_load64(uint64_t,n)); - - case CS_INT_8: - push_fixed_value(_int8, *(int8_t*)n); - case CS_INT_16: - push_fixed_value(_int16, _msgpack_load16(int16_t,n)); - case CS_INT_32: - push_fixed_value(_int32, _msgpack_load32(int32_t,n)); - case CS_INT_64: - push_fixed_value(_int64, _msgpack_load64(int64_t,n)); - - //case CS_ - //case CS_ - //case CS_BIG_INT_16: - // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, _msgpack_load16(uint16_t,n), _big_int_zero); - //case CS_BIG_INT_32: - // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, _msgpack_load32(uint32_t,n), _big_int_zero); - //case ACS_BIG_INT_VALUE: - //_big_int_zero: - // // FIXME - // push_variable_value(_big_int, data, n, trail); - - //case CS_BIG_FLOAT_16: - // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, _msgpack_load16(uint16_t,n), _big_float_zero); - //case CS_BIG_FLOAT_32: - // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, _msgpack_load32(uint32_t,n), _big_float_zero); - //case ACS_BIG_FLOAT_VALUE: - //_big_float_zero: - // // FIXME - // push_variable_value(_big_float, data, n, trail); - - case CS_RAW_16: - again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load16(uint16_t,n), _raw_zero); - case CS_RAW_32: - again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load32(uint32_t,n), _raw_zero); - case ACS_RAW_VALUE: - _raw_zero: - push_variable_value(_raw, data, n, trail); - - case CS_ARRAY_16: - start_container(_array, _msgpack_load16(uint16_t,n), CT_ARRAY_ITEM); - case CS_ARRAY_32: - /* FIXME security guard */ - start_container(_array, _msgpack_load32(uint32_t,n), CT_ARRAY_ITEM); - - case CS_MAP_16: - start_container(_map, _msgpack_load16(uint16_t,n), CT_MAP_KEY); - case CS_MAP_32: - /* FIXME security guard */ - start_container(_map, _msgpack_load32(uint32_t,n), CT_MAP_KEY); - - default: - goto _failed; - } - } + push_fixed_value(_double, mem.f); } + case CS_UINT_8: + push_fixed_value(_uint8, *(uint8_t*)n); + case CS_UINT_16: + push_fixed_value(_uint16, _msgpack_load16(uint16_t,n)); + case CS_UINT_32: + push_fixed_value(_uint32, _msgpack_load32(uint32_t,n)); + case CS_UINT_64: + push_fixed_value(_uint64, _msgpack_load64(uint64_t,n)); + + case CS_INT_8: + push_fixed_value(_int8, *(int8_t*)n); + case CS_INT_16: + push_fixed_value(_int16, _msgpack_load16(int16_t,n)); + case CS_INT_32: + push_fixed_value(_int32, _msgpack_load32(int32_t,n)); + case CS_INT_64: + push_fixed_value(_int64, _msgpack_load64(int64_t,n)); + + case CS_BIN_8: + again_fixed_trail_if_zero(ACS_BIN_VALUE, *(uint8_t*)n, _bin_zero); + case CS_BIN_16: + again_fixed_trail_if_zero(ACS_BIN_VALUE, _msgpack_load16(uint16_t,n), _bin_zero); + case CS_BIN_32: + again_fixed_trail_if_zero(ACS_BIN_VALUE, _msgpack_load32(uint32_t,n), _bin_zero); + case ACS_BIN_VALUE: + _bin_zero: + push_variable_value(_bin, data, n, trail); + + case CS_RAW_8: + again_fixed_trail_if_zero(ACS_RAW_VALUE, *(uint8_t*)n, _raw_zero); + case CS_RAW_16: + again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load16(uint16_t,n), _raw_zero); + case CS_RAW_32: + again_fixed_trail_if_zero(ACS_RAW_VALUE, _msgpack_load32(uint32_t,n), _raw_zero); + case ACS_RAW_VALUE: + _raw_zero: + push_variable_value(_raw, data, n, trail); + + case ACS_EXT_VALUE: + _ext_zero: + push_variable_value(_ext, data, n, trail); + + case CS_ARRAY_16: + start_container(_array, _msgpack_load16(uint16_t,n), CT_ARRAY_ITEM); + case CS_ARRAY_32: + /* FIXME security guard */ + start_container(_array, _msgpack_load32(uint32_t,n), CT_ARRAY_ITEM); + + case CS_MAP_16: + start_container(_map, _msgpack_load16(uint16_t,n), CT_MAP_KEY); + case CS_MAP_32: + /* FIXME security guard */ + start_container(_map, _msgpack_load32(uint32_t,n), CT_MAP_KEY); + + default: + goto _failed; + } + } _push: - if(top == 0) { goto _finish; } - c = &stack[top-1]; - switch(c->ct) { - case CT_ARRAY_ITEM: - if(construct_cb(_array_item)(user, c->count, &c->obj, obj) < 0) { goto _failed; } - if(++c->count == c->size) { - obj = c->obj; - if (construct_cb(_array_end)(user, &obj) < 0) { goto _failed; } - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - goto _header_again; - case CT_MAP_KEY: - c->map_key = obj; - c->ct = CT_MAP_VALUE; - goto _header_again; - case CT_MAP_VALUE: - if(construct_cb(_map_item)(user, c->count, &c->obj, c->map_key, obj) < 0) { goto _failed; } - if(++c->count == c->size) { - obj = c->obj; - if (construct_cb(_map_end)(user, &obj) < 0) { goto _failed; } - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - c->ct = CT_MAP_KEY; - goto _header_again; - - default: - goto _failed; - } + if(top == 0) { goto _finish; } + c = &stack[top-1]; + switch(c->ct) { + case CT_ARRAY_ITEM: + if(construct_cb(_array_item)(user, c->count, &c->obj, obj) < 0) { goto _failed; } + if(++c->count == c->size) { + obj = c->obj; + if (construct_cb(_array_end)(user, &obj) < 0) { goto _failed; } + --top; + /*printf("stack pop %d\n", top);*/ + goto _push; + } + goto _header_again; + case CT_MAP_KEY: + c->map_key = obj; + c->ct = CT_MAP_VALUE; + goto _header_again; + case CT_MAP_VALUE: + if(construct_cb(_map_item)(user, c->count, &c->obj, c->map_key, obj) < 0) { goto _failed; } + if(++c->count == c->size) { + obj = c->obj; + if (construct_cb(_map_end)(user, &obj) < 0) { goto _failed; } + --top; + /*printf("stack pop %d\n", top);*/ + goto _push; + } + c->ct = CT_MAP_KEY; + goto _header_again; + + default: + goto _failed; + } _header_again: - cs = CS_HEADER; - ++p; - } while(p != pe); - goto _out; + cs = CS_HEADER; + ++p; + } while(p != pe); + goto _out; _finish: - if (!construct) - msgpack_unpack_callback(_nil)(user, &obj); - stack[0].obj = obj; - ++p; - ret = 1; - /*printf("-- finish --\n"); */ - goto _end; + if (!construct) + unpack_callback_nil(user, &obj); + stack[0].obj = obj; + ++p; + ret = 1; + /*printf("-- finish --\n"); */ + goto _end; _failed: - /*printf("** FAILED **\n"); */ - ret = -1; - goto _end; + /*printf("** FAILED **\n"); */ + ret = -1; + goto _end; _out: - ret = 0; - goto _end; + ret = 0; + goto _end; _end: - ctx->cs = cs; - ctx->trail = trail; - ctx->top = top; - *off = p - (const unsigned char*)data; + ctx->cs = cs; + ctx->trail = trail; + ctx->top = top; + *off = p - (const unsigned char*)data; - return ret; + return ret; #undef construct_cb } @@ -420,55 +409,55 @@ msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const c #undef start_container template -msgpack_unpack_func(int, _container_header)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off) +static inline int unpack_container_header(unpack_context* ctx, const char* data, size_t len, size_t* off) { - assert(len >= *off); - uint32_t size; - const unsigned char *const p = (unsigned char*)data + *off; + assert(len >= *off); + uint32_t size; + const unsigned char *const p = (unsigned char*)data + *off; #define inc_offset(inc) \ - if (len - *off < inc) \ - return 0; \ - *off += inc; - - switch (*p) { - case var_offset: - inc_offset(3); - size = _msgpack_load16(uint16_t, p + 1); - break; - case var_offset + 1: - inc_offset(5); - size = _msgpack_load32(uint32_t, p + 1); - break; + if (len - *off < inc) \ + return 0; \ + *off += inc; + + switch (*p) { + case var_offset: + inc_offset(3); + size = _msgpack_load16(uint16_t, p + 1); + break; + case var_offset + 1: + inc_offset(5); + size = _msgpack_load32(uint32_t, p + 1); + break; #ifdef USE_CASE_RANGE - case fixed_offset + 0x0 ... fixed_offset + 0xf: + case fixed_offset + 0x0 ... fixed_offset + 0xf: #else - case fixed_offset + 0x0: - case fixed_offset + 0x1: - case fixed_offset + 0x2: - case fixed_offset + 0x3: - case fixed_offset + 0x4: - case fixed_offset + 0x5: - case fixed_offset + 0x6: - case fixed_offset + 0x7: - case fixed_offset + 0x8: - case fixed_offset + 0x9: - case fixed_offset + 0xa: - case fixed_offset + 0xb: - case fixed_offset + 0xc: - case fixed_offset + 0xd: - case fixed_offset + 0xe: - case fixed_offset + 0xf: + case fixed_offset + 0x0: + case fixed_offset + 0x1: + case fixed_offset + 0x2: + case fixed_offset + 0x3: + case fixed_offset + 0x4: + case fixed_offset + 0x5: + case fixed_offset + 0x6: + case fixed_offset + 0x7: + case fixed_offset + 0x8: + case fixed_offset + 0x9: + case fixed_offset + 0xa: + case fixed_offset + 0xb: + case fixed_offset + 0xc: + case fixed_offset + 0xd: + case fixed_offset + 0xe: + case fixed_offset + 0xf: #endif - ++*off; - size = ((unsigned int)*p) & 0x0f; - break; - default: - PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream"); - return -1; + ++*off; + size = ((unsigned int)*p) & 0x0f; + break; + default: + PyErr_SetString(PyExc_ValueError, "Unexpected type header on stream"); + return -1; } - msgpack_unpack_callback(_uint32)(&ctx->user, size, &ctx->stack[0].obj); - return 1; + unpack_callback_uint32(&ctx->user, size, &ctx->stack[0].obj); + return 1; } #undef SWITCH_RANGE_BEGIN @@ -476,17 +465,11 @@ msgpack_unpack_func(int, _container_header)(msgpack_unpack_struct(_context)* ctx #undef SWITCH_RANGE_DEFAULT #undef SWITCH_RANGE_END -static const execute_fn template_construct = &template_execute; -static const execute_fn template_skip = &template_execute; -static const execute_fn read_array_header = &template_container_header<0x90, 0xdc>; -static const execute_fn read_map_header = &template_container_header<0x80, 0xde>; - -#undef msgpack_unpack_func -#undef msgpack_unpack_callback -#undef msgpack_unpack_struct -#undef msgpack_unpack_object -#undef msgpack_unpack_user +static const execute_fn unpack_construct = &unpack_execute; +static const execute_fn unpack_skip = &unpack_execute; +static const execute_fn read_array_header = &unpack_container_header<0x90, 0xdc>; +static const execute_fn read_map_header = &unpack_container_header<0x80, 0xde>; #undef NEXT_CS -/* vim: set ts=4 sw=4 noexpandtab */ +/* vim: set ts=4 sw=4 sts=4 expandtab */ diff --git a/pandas/src/parse_helper.h b/pandas/src/parse_helper.h index 2769f67fcf521..2cb1a7f017c62 100644 --- a/pandas/src/parse_helper.h +++ b/pandas/src/parse_helper.h @@ -6,7 +6,7 @@ static double xstrtod(const char *p, char **q, char decimal, char sci, int to_double(char *item, double *p_value, char sci, char decimal, int *maybe_int) { - char *p_end; + char *p_end = NULL; *p_value = xstrtod(item, &p_end, decimal, sci, 1, maybe_int); diff --git a/pandas/src/parser/tokenizer.c b/pandas/src/parser/tokenizer.c index 3be17f17d6afa..9d81bc9c37b8d 100644 --- a/pandas/src/parser/tokenizer.c +++ b/pandas/src/parser/tokenizer.c @@ -1413,9 +1413,9 @@ int tokenize_whitespace(parser_t *self, size_t line_limit) self->state = EAT_CRNL; break; } else if (IS_WHITESPACE(c)) { - /*if (self->skip_empty_lines) + if (self->skip_empty_lines) self->state = WHITESPACE_LINE; - else*/ + else self->state = EAT_WHITESPACE; break; } else if (c == self->commentchar) { @@ -1643,34 +1643,44 @@ int tokenize_whitespace(parser_t *self, size_t line_limit) static int parser_handle_eof(parser_t *self) { TRACE(("handling eof, datalen: %d, pstate: %d\n", self->datalen, self->state)) - if (self->datalen == 0 && (self->state != START_RECORD)) { - // test cases needed here - // TODO: empty field at end of line - TRACE(("handling eof\n")); - if (self->state == IN_FIELD || self->state == START_FIELD) { - if (end_field(self) < 0) - return -1; - } else if (self->state == QUOTE_IN_QUOTED_FIELD) { - if (end_field(self) < 0) - return -1; - } else if (self->state == IN_QUOTED_FIELD) { - self->error_msg = (char*) malloc(100); - sprintf(self->error_msg, "EOF inside string starting at line %d", - self->file_lines); - return -1; - } + if (self->datalen != 0) + return -1; - if (end_line(self) < 0) + switch (self->state) { + case START_RECORD: + case WHITESPACE_LINE: + case EAT_CRNL_NOP: + case EAT_LINE_COMMENT: + return 0; + + case ESCAPE_IN_QUOTED_FIELD: + case IN_QUOTED_FIELD: + self->error_msg = (char*)malloc(100); + sprintf(self->error_msg, "EOF inside string starting at line %d", + self->file_lines); + return -1; + + case ESCAPED_CHAR: + self->error_msg = (char*)malloc(100); + sprintf(self->error_msg, "EOF following escape character"); + return -1; + + case IN_FIELD: + case START_FIELD: + case QUOTE_IN_QUOTED_FIELD: + if (end_field(self) < 0) return -1; + break; - return 0; - } - else if (self->datalen == 0 && (self->state == START_RECORD)) { - return 0; + default: + break; } - return -1; + if (end_line(self) < 0) + return -1; + else + return 0; } int parser_consume_rows(parser_t *self, size_t nrows) { diff --git a/pandas/src/parser/tokenizer.h b/pandas/src/parser/tokenizer.h index d3777e858b6ca..eef94e0616769 100644 --- a/pandas/src/parser/tokenizer.h +++ b/pandas/src/parser/tokenizer.h @@ -27,11 +27,7 @@ See LICENSE for the license #define ERROR_INVALID_CHARS 3 #define ERROR_MINUS_SIGN 4 -#if defined(_MSC_VER) -#include "../headers/ms_stdint.h" -#else -#include -#endif +#include "../headers/stdint.h" #include "khash.h" diff --git a/pandas/src/period.pyx b/pandas/src/period.pyx index b4a4930e09d68..619d1a87a71e0 100644 --- a/pandas/src/period.pyx +++ b/pandas/src/period.pyx @@ -969,6 +969,14 @@ cdef class Period(object): value = ("%s" % formatted) return value + def __setstate__(self, state): + self.freq=state[1] + self.ordinal=state[2] + + def __reduce__(self): + object_state = None, self.freq, self.ordinal + return (Period, object_state) + def strftime(self, fmt): """ Returns the string representation of the :class:`Period`, depending diff --git a/pandas/src/period_helper.h b/pandas/src/period_helper.h index 19b186afb9fc8..0351321926fa2 100644 --- a/pandas/src/period_helper.h +++ b/pandas/src/period_helper.h @@ -166,5 +166,5 @@ double getAbsTime(int freq, npy_int64 dailyDate, npy_int64 originalDate); char *c_strftime(struct date_info *dinfo, char *fmt); int get_yq(npy_int64 ordinal, int freq, int *quarter, int *year); -void initialize_daytime_conversion_factor_matrix(); +void initialize_daytime_conversion_factor_matrix(void); #endif diff --git a/pandas/src/reduce.pyx b/pandas/src/reduce.pyx index add9a03642bed..09f8e0ab42924 100644 --- a/pandas/src/reduce.pyx +++ b/pandas/src/reduce.pyx @@ -6,6 +6,18 @@ from distutils.version import LooseVersion is_numpy_prior_1_6_2 = LooseVersion(np.__version__) < '1.6.2' +cdef _get_result_array(object obj, + Py_ssize_t size, + Py_ssize_t cnt): + + if isinstance(obj, np.ndarray) \ + or isinstance(obj, list) and len(obj) == cnt \ + or getattr(obj, 'shape', None) == (cnt,): + raise ValueError('function does not reduce') + + return np.empty(size, dtype='O') + + cdef class Reducer: ''' Performs generic reduction operation on a C or Fortran-contiguous ndarray @@ -124,7 +136,9 @@ cdef class Reducer: if hasattr(res,'values'): res = res.values if i == 0: - result = self._get_result_array(res) + result = _get_result_array(res, + self.nresults, + len(self.dummy)) it = PyArray_IterNew(result) PyArray_SETITEM(result, PyArray_ITER_DATA(it), res) @@ -143,17 +157,6 @@ cdef class Reducer: return result - def _get_result_array(self, object res): - try: - assert(not isinstance(res, np.ndarray)) - assert(not (isinstance(res, list) and len(res) == len(self.dummy))) - - result = np.empty(self.nresults, dtype='O') - result[0] = res - except Exception: - raise ValueError('function does not reduce') - return result - cdef class SeriesBinGrouper: ''' @@ -257,8 +260,10 @@ cdef class SeriesBinGrouper: res = self.f(cached_typ) res = _extract_result(res) if not initialized: - result = self._get_result_array(res) initialized = 1 + result = _get_result_array(res, + self.ngroups, + len(self.dummy_arr)) util.assign_value_1d(result, i, res) @@ -277,16 +282,6 @@ cdef class SeriesBinGrouper: return result, counts - def _get_result_array(self, object res): - try: - assert(not isinstance(res, np.ndarray)) - assert(not (isinstance(res, list) and len(res) == len(self.dummy_arr))) - - result = np.empty(self.ngroups, dtype='O') - except Exception: - raise ValueError('function does not reduce') - return result - cdef class SeriesGrouper: ''' @@ -388,8 +383,10 @@ cdef class SeriesGrouper: res = self.f(cached_typ) res = _extract_result(res) if not initialized: - result = self._get_result_array(res) initialized = 1 + result = _get_result_array(res, + self.ngroups, + len(self.dummy_arr)) util.assign_value_1d(result, lab, res) counts[lab] = group_size @@ -410,15 +407,6 @@ cdef class SeriesGrouper: return result, counts - def _get_result_array(self, object res): - try: - assert(not isinstance(res, np.ndarray)) - assert(not (isinstance(res, list) and len(res) == len(self.dummy_arr))) - - result = np.empty(self.ngroups, dtype='O') - except Exception: - raise ValueError('function does not reduce') - return result cdef inline _extract_result(object res): ''' extract the result object, it might be a 0-dim ndarray diff --git a/pandas/src/testing.pyx b/pandas/src/testing.pyx index 4977a80acc936..1abc758559e70 100644 --- a/pandas/src/testing.pyx +++ b/pandas/src/testing.pyx @@ -55,11 +55,39 @@ cpdef assert_dict_equal(a, b, bint compare_keys=True): return True -cpdef assert_almost_equal(a, b, bint check_less_precise=False): +cpdef assert_almost_equal(a, b, bint check_less_precise=False, + obj=None, lobj=None, robj=None): + """Check that left and right objects are almost equal. + + Parameters + ---------- + a : object + b : object + check_less_precise : bool, default False + Specify comparison precision. + 5 digits (False) or 3 digits (True) after decimal points are compared. + obj : str, default None + Specify object name being compared, internally used to show appropriate + assertion message + lobj : str, default None + Specify left object name being compared, internally used to show + appropriate assertion message + robj : str, default None + Specify right object name being compared, internally used to show + appropriate assertion message + """ + cdef: int decimal + double diff = 0.0 Py_ssize_t i, na, nb double fa, fb + bint is_unequal = False + + if lobj is None: + lobj = a + if robj is None: + robj = b if isinstance(a, dict) or isinstance(b, dict): return assert_dict_equal(a, b) @@ -70,33 +98,62 @@ cpdef assert_almost_equal(a, b, bint check_less_precise=False): return True if isiterable(a): - assert isiterable(b), ( - "First object is iterable, second isn't: %r != %r" % (a, b) - ) + + if not isiterable(b): + from pandas.util.testing import raise_assert_detail + if obj is None: + obj = 'Iterable' + msg = "First object is iterable, second isn't" + raise_assert_detail(obj, msg, a, b) + assert has_length(a) and has_length(b), ( "Can't compare objects without length, one or both is invalid: " "(%r, %r)" % (a, b) ) - na, nb = len(a), len(b) - assert na == nb, ( - "Length of two iterators not the same: %r != %r" % (na, nb) - ) if isinstance(a, np.ndarray) and isinstance(b, np.ndarray): + if obj is None: + obj = 'numpy array' + na, nb = a.size, b.size + if a.shape != b.shape: + from pandas.util.testing import raise_assert_detail + raise_assert_detail(obj, '{0} shapes are different'.format(obj), + a.shape, b.shape) try: if np.array_equal(a, b): return True except: pass + else: + if obj is None: + obj = 'Iterable' + na, nb = len(a), len(b) + + if na != nb: + from pandas.util.testing import raise_assert_detail + raise_assert_detail(obj, '{0} length are different'.format(obj), + na, nb) + + for i in xrange(len(a)): + try: + assert_almost_equal(a[i], b[i], check_less_precise) + except AssertionError: + is_unequal = True + diff += 1 - for i in xrange(na): - assert_almost_equal(a[i], b[i], check_less_precise) + if is_unequal: + from pandas.util.testing import raise_assert_detail + msg = '{0} values are different ({1} %)'.format(obj, np.round(diff * 100.0 / na, 5)) + raise_assert_detail(obj, msg, lobj, robj) return True + elif isiterable(b): - assert False, ( - "Second object is iterable, first isn't: %r != %r" % (a, b) - ) + from pandas.util.testing import raise_assert_detail + if obj is None: + obj = 'Iterable' + msg = "Second object is iterable, first isn't" + raise_assert_detail(obj, msg, a, b) if isnull(a): assert isnull(b), ( diff --git a/pandas/stats/moments.py b/pandas/stats/moments.py index 41a768783b1cb..586d507b27493 100644 --- a/pandas/stats/moments.py +++ b/pandas/stats/moments.py @@ -426,7 +426,7 @@ def _process_data_structure(arg, kill_inf=True): values = arg.values elif isinstance(arg, Series): values = arg.values - return_hook = lambda v: Series(v, arg.index) + return_hook = lambda v: Series(v, arg.index, name=arg.name) else: return_hook = lambda v: v values = arg diff --git a/pandas/stats/ols.py b/pandas/stats/ols.py index 9d22068c1612f..d1d74442d8961 100644 --- a/pandas/stats/ols.py +++ b/pandas/stats/ols.py @@ -614,7 +614,8 @@ class MovingOLS(OLS): size of window (for rolling/expanding OLS) min_periods : int Threshold of non-null data points to require. - If None, defaults to size of window. + If None, defaults to size of window for window_type='rolling' and 1 + otherwise intercept : bool True if you want an intercept. nw_lags : None or int @@ -818,7 +819,7 @@ def _calc_betas(self, x, y): betas[i] = math.solve(xx, xy) - mask = -np.isnan(betas).any(axis=1) + mask = ~np.isnan(betas).any(axis=1) have_betas = np.arange(N)[mask] return betas, have_betas, mask diff --git a/pandas/stats/tests/test_moments.py b/pandas/stats/tests/test_moments.py index 445530bc5b00c..bb6cb5a444dd9 100644 --- a/pandas/stats/tests/test_moments.py +++ b/pandas/stats/tests/test_moments.py @@ -539,7 +539,7 @@ def _check_ndarray(self, func, static_comp, window=50, result = func(arr, 20, center=True) expected = func(np.concatenate((arr, np.array([np.NaN] * 9))), 20)[9:] - self.assert_numpy_array_equivalent(result, expected) + self.assert_numpy_array_equal(result, expected) if test_stable: result = func(self.arr + 1e9, window) @@ -574,7 +574,7 @@ def _check_structures(self, func, static_comp, fill_value=None): series_result = func(self.series, 50) - tm.assert_isinstance(series_result, Series) + tm.assertIsInstance(series_result, Series) frame_result = func(self.frame, 50) self.assertEqual(type(frame_result), DataFrame) @@ -725,6 +725,14 @@ def test_ewma_halflife_arg(self): self.assertRaises(Exception, mom.ewma, self.arr, com=9.5, span=20, halflife=50) self.assertRaises(Exception, mom.ewma, self.arr) + def test_moment_preserve_series_name(self): + # GH 10565 + s = Series(np.arange(100), name='foo') + s2 = mom.rolling_mean(s, 30) + s3 = mom.rolling_sum(s, 20) + self.assertEqual(s2.name, 'foo') + self.assertEqual(s3.name, 'foo') + def test_ew_empty_arrays(self): arr = np.array([], dtype=np.float64) @@ -782,7 +790,7 @@ def _check_ew_ndarray(self, func, preserve_nan=False): def _check_ew_structures(self, func): series_result = func(self.series, com=10) - tm.assert_isinstance(series_result, Series) + tm.assertIsInstance(series_result, Series) frame_result = func(self.frame, com=10) self.assertEqual(type(frame_result), DataFrame) @@ -1676,7 +1684,7 @@ def test_pairwise_stats_column_names_order(self): assert_index_equal(result.columns, df.columns) for i, result in enumerate(results): if i > 0: - self.assert_numpy_array_equivalent(result, results[0]) + self.assert_numpy_array_equal(result, results[0]) # DataFrame with itself, pairwise=True for f in [lambda x: mom.expanding_cov(x, pairwise=True), @@ -1693,7 +1701,7 @@ def test_pairwise_stats_column_names_order(self): assert_index_equal(result.minor_axis, df.columns) for i, result in enumerate(results): if i > 0: - self.assert_numpy_array_equivalent(result, results[0]) + self.assert_numpy_array_equal(result, results[0]) # DataFrame with itself, pairwise=False for f in [lambda x: mom.expanding_cov(x, pairwise=False), @@ -1709,7 +1717,7 @@ def test_pairwise_stats_column_names_order(self): assert_index_equal(result.columns, df.columns) for i, result in enumerate(results): if i > 0: - self.assert_numpy_array_equivalent(result, results[0]) + self.assert_numpy_array_equal(result, results[0]) # DataFrame with another DataFrame, pairwise=True for f in [lambda x, y: mom.expanding_cov(x, y, pairwise=True), @@ -1726,7 +1734,7 @@ def test_pairwise_stats_column_names_order(self): assert_index_equal(result.minor_axis, df2.columns) for i, result in enumerate(results): if i > 0: - self.assert_numpy_array_equivalent(result, results[0]) + self.assert_numpy_array_equal(result, results[0]) # DataFrame with another DataFrame, pairwise=False for f in [lambda x, y: mom.expanding_cov(x, y, pairwise=False), @@ -1761,7 +1769,7 @@ def test_pairwise_stats_column_names_order(self): assert_index_equal(result.columns, df.columns) for i, result in enumerate(results): if i > 0: - self.assert_numpy_array_equivalent(result, results[0]) + self.assert_numpy_array_equal(result, results[0]) def test_rolling_skew_edge_cases(self): @@ -1844,7 +1852,7 @@ def _check_expanding_ndarray(self, func, static_comp, has_min_periods=True, def _check_expanding_structures(self, func): series_result = func(self.series) - tm.assert_isinstance(series_result, Series) + tm.assertIsInstance(series_result, Series) frame_result = func(self.frame) self.assertEqual(type(frame_result), DataFrame) diff --git a/pandas/stats/tests/test_ols.py b/pandas/stats/tests/test_ols.py index 5c8d47ec2a82a..60e976f09365b 100644 --- a/pandas/stats/tests/test_ols.py +++ b/pandas/stats/tests/test_ols.py @@ -41,7 +41,7 @@ def _check_repr(obj): def _compare_ols_results(model1, model2): - tm.assert_isinstance(model1, type(model2)) + tm.assertIsInstance(model1, type(model2)) if hasattr(model1, '_window_type'): _compare_moving_ols(model1, model2) @@ -370,7 +370,7 @@ def test_longpanel_series_combo(self): y = lp.pop('ItemA') model = ols(y=y, x=lp, entity_effects=True, window=20) self.assertTrue(notnull(model.beta.values).all()) - tm.assert_isinstance(model, PanelOLS) + tm.assertIsInstance(model, PanelOLS) model.summary def test_series_rhs(self): @@ -394,7 +394,7 @@ def test_various_attributes(self): for attr in series_attrs: value = getattr(model, attr) - tm.assert_isinstance(value, Series) + tm.assertIsInstance(value, Series) # works model._results diff --git a/pandas/tests/test_algos.py b/pandas/tests/test_algos.py index c80cea3ab7a7d..6164b1b4906de 100644 --- a/pandas/tests/test_algos.py +++ b/pandas/tests/test_algos.py @@ -2,14 +2,16 @@ from pandas.compat import range import numpy as np +from numpy.random import RandomState -from pandas.core.api import Series, Categorical +from pandas.core.api import Series, Categorical, CategoricalIndex import pandas as pd import pandas.core.algorithms as algos import pandas.util.testing as tm import pandas.hashtable as hashtable + class TestMatch(tm.TestCase): _multiprocess_can_split_ = True @@ -166,6 +168,38 @@ def _test_vector_resize(htable, uniques, dtype, nvals): _test_vector_resize(tbl(), vect(), dtype, 0) _test_vector_resize(tbl(), vect(), dtype, 10) +class TestIndexer(tm.TestCase): + _multiprocess_can_split_ = True + + def test_outer_join_indexer(self): + typemap = [('int32', algos.algos.outer_join_indexer_int32), + ('int64', algos.algos.outer_join_indexer_int64), + ('float32', algos.algos.outer_join_indexer_float32), + ('float64', algos.algos.outer_join_indexer_float64), + ('object', algos.algos.outer_join_indexer_object)] + + for dtype, indexer in typemap: + left = np.arange(3, dtype = dtype) + right = np.arange(2,5, dtype = dtype) + empty = np.array([], dtype = dtype) + + result, lindexer, rindexer = indexer(left, right) + tm.assertIsInstance(result, np.ndarray) + tm.assertIsInstance(lindexer, np.ndarray) + tm.assertIsInstance(rindexer, np.ndarray) + tm.assert_numpy_array_equal(result, np.arange(5, dtype = dtype)) + tm.assert_numpy_array_equal(lindexer, np.array([0, 1, 2, -1, -1])) + tm.assert_numpy_array_equal(rindexer, np.array([-1, -1, 0, 1, 2])) + + result, lindexer, rindexer = indexer(empty, right) + tm.assert_numpy_array_equal(result, right) + tm.assert_numpy_array_equal(lindexer, np.array([-1, -1, -1])) + tm.assert_numpy_array_equal(rindexer, np.array([0, 1, 2])) + + result, lindexer, rindexer = indexer(left, empty) + tm.assert_numpy_array_equal(result, left) + tm.assert_numpy_array_equal(lindexer, np.array([0, 1, 2])) + tm.assert_numpy_array_equal(rindexer, np.array([-1, -1, -1])) class TestUnique(tm.TestCase): _multiprocess_can_split_ = True @@ -174,13 +208,13 @@ def test_ints(self): arr = np.random.randint(0, 100, size=50) result = algos.unique(arr) - tm.assert_isinstance(result, np.ndarray) + tm.assertIsInstance(result, np.ndarray) def test_objects(self): arr = np.random.randint(0, 100, size=50).astype('O') result = algos.unique(arr) - tm.assert_isinstance(result, np.ndarray) + tm.assertIsInstance(result, np.ndarray) def test_object_refcount_bug(self): lst = ['A', 'B', 'C', 'D', 'E'] @@ -201,6 +235,50 @@ def test_on_index_object(self): tm.assert_almost_equal(result, expected) + def test_datetime64_dtype_array_returned(self): + # GH 9431 + expected = np.array(['2015-01-03T00:00:00.000000000+0000', + '2015-01-01T00:00:00.000000000+0000'], dtype='M8[ns]') + + dt_index = pd.to_datetime(['2015-01-03T00:00:00.000000000+0000', + '2015-01-01T00:00:00.000000000+0000', + '2015-01-01T00:00:00.000000000+0000']) + result = algos.unique(dt_index) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + s = pd.Series(dt_index) + result = algos.unique(s) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + arr = s.values + result = algos.unique(arr) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + + def test_timedelta64_dtype_array_returned(self): + # GH 9431 + expected = np.array([31200, 45678, 10000], dtype='m8[ns]') + + td_index = pd.to_timedelta([31200, 45678, 31200, 10000, 45678]) + result = algos.unique(td_index) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + s = pd.Series(td_index) + result = algos.unique(s) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + arr = s.values + result = algos.unique(arr) + tm.assert_numpy_array_equal(result, expected) + self.assertEqual(result.dtype, expected.dtype) + + + class TestValueCounts(tm.TestCase): _multiprocess_can_split_ = True @@ -211,10 +289,16 @@ def test_value_counts(self): arr = np.random.randn(4) factor = cut(arr, 4) - tm.assert_isinstance(factor, Categorical) - + tm.assertIsInstance(factor, Categorical) result = algos.value_counts(factor) - expected = algos.value_counts(np.asarray(factor)) + cats = ['(-1.194, -0.535]', + '(-0.535, 0.121]', + '(0.121, 0.777]', + '(0.777, 1.433]' + ] + expected_index = CategoricalIndex(cats, cats, ordered=True) + expected = Series([1, 1, 1, 1], + index=expected_index) tm.assert_series_equal(result.sort_index(), expected.sort_index()) def test_value_counts_bins(self): @@ -254,6 +338,57 @@ def test_value_counts_nat(self): tm.assert_series_equal(algos.value_counts(dt), exp_dt) # TODO same for (timedelta) + def test_categorical(self): + s = Series(pd.Categorical(list('aaabbc'))) + result = s.value_counts() + expected = pd.Series([3, 2, 1], index=pd.CategoricalIndex(['a', 'b', 'c'])) + tm.assert_series_equal(result, expected, check_index_type=True) + + # preserve order? + s = s.cat.as_ordered() + result = s.value_counts() + expected.index = expected.index.as_ordered() + tm.assert_series_equal(result, expected, check_index_type=True) + + def test_categorical_nans(self): + s = Series(pd.Categorical(list('aaaaabbbcc'))) # 4,3,2,1 (nan) + s.iloc[1] = np.nan + result = s.value_counts() + expected = pd.Series([4, 3, 2], + index=pd.CategoricalIndex(['a', 'b', 'c'], + categories=['a', 'b', 'c'])) + tm.assert_series_equal(result, expected, check_index_type=True) + result = s.value_counts(dropna=False) + expected = pd.Series([4, 3, 2, 1], index=pd.CategoricalIndex( + ['a', 'b', 'c', np.nan])) + tm.assert_series_equal(result, expected, check_index_type=True) + + # out of order + s = Series(pd.Categorical(list('aaaaabbbcc'), + ordered=True, categories=['b', 'a', 'c'])) + s.iloc[1] = np.nan + result = s.value_counts() + expected = pd.Series([4, 3, 2], + index=pd.CategoricalIndex(['a', 'b', 'c'], + categories=['b', 'a', 'c'], + ordered=True)) + tm.assert_series_equal(result, expected, check_index_type=True) + + result = s.value_counts(dropna=False) + expected = pd.Series([4, 3, 2, 1], index=pd.CategoricalIndex( + ['a', 'b', 'c', np.nan], categories=['b', 'a', 'c'], ordered=True)) + tm.assert_series_equal(result, expected, check_index_type=True) + + def test_categorical_zeroes(self): + # keep the `d` category with 0 + s = Series(pd.Categorical(list('bbbaac'), categories=list('abcd'), + ordered=True)) + result = s.value_counts() + expected = Series([3, 2, 1, 0], index=pd.Categorical( + ['b', 'a', 'c', 'd'], categories=list('abcd'), ordered=True)) + tm.assert_series_equal(result, expected, check_index_type=True) + + def test_dropna(self): # https://github.com/pydata/pandas/issues/9443#issuecomment-73719328 @@ -285,6 +420,125 @@ def test_dropna(self): pd.Series([10.3, 5., 5., None]).value_counts(dropna=False), pd.Series([2, 1, 1], index=[5., 10.3, np.nan])) + +class GroupVarTestMixin(object): + + def test_group_var_generic_1d(self): + prng = RandomState(1234) + + out = (np.nan * np.ones((5, 1))).astype(self.dtype) + counts = np.zeros(5, dtype='int64') + values = 10 * prng.rand(15, 1).astype(self.dtype) + labels = np.tile(np.arange(5), (3, )).astype('int64') + + expected_out = (np.squeeze(values) + .reshape((5, 3), order='F') + .std(axis=1, ddof=1) ** 2)[:, np.newaxis] + expected_counts = counts + 3 + + self.algo(out, counts, values, labels) + np.testing.assert_allclose(out, expected_out, self.rtol) + tm.assert_numpy_array_equal(counts, expected_counts) + + def test_group_var_generic_1d_flat_labels(self): + prng = RandomState(1234) + + out = (np.nan * np.ones((1, 1))).astype(self.dtype) + counts = np.zeros(1, dtype='int64') + values = 10 * prng.rand(5, 1).astype(self.dtype) + labels = np.zeros(5, dtype='int64') + + expected_out = np.array([[values.std(ddof=1) ** 2]]) + expected_counts = counts + 5 + + self.algo(out, counts, values, labels) + + np.testing.assert_allclose(out, expected_out, self.rtol) + tm.assert_numpy_array_equal(counts, expected_counts) + + def test_group_var_generic_2d_all_finite(self): + prng = RandomState(1234) + + out = (np.nan * np.ones((5, 2))).astype(self.dtype) + counts = np.zeros(5, dtype='int64') + values = 10 * prng.rand(10, 2).astype(self.dtype) + labels = np.tile(np.arange(5), (2, )).astype('int64') + + expected_out = np.std( + values.reshape(2, 5, 2), ddof=1, axis=0) ** 2 + expected_counts = counts + 2 + + self.algo(out, counts, values, labels) + np.testing.assert_allclose(out, expected_out, self.rtol) + tm.assert_numpy_array_equal(counts, expected_counts) + + def test_group_var_generic_2d_some_nan(self): + prng = RandomState(1234) + + out = (np.nan * np.ones((5, 2))).astype(self.dtype) + counts = np.zeros(5, dtype='int64') + values = 10 * prng.rand(10, 2).astype(self.dtype) + values[:, 1] = np.nan + labels = np.tile(np.arange(5), (2, )).astype('int64') + + expected_out = np.vstack([ + values[:, 0].reshape(5, 2, order='F').std(ddof=1, axis=1) ** 2, + np.nan * np.ones(5) + ]).T + expected_counts = counts + 2 + + self.algo(out, counts, values, labels) + np.testing.assert_allclose(out, expected_out, self.rtol) + tm.assert_numpy_array_equal(counts, expected_counts) + + def test_group_var_constant(self): + # Regression test from GH 10448. + + out = np.array([[np.nan]], dtype=self.dtype) + counts = np.array([0],dtype='int64') + values = 0.832845131556193 * np.ones((3, 1), dtype=self.dtype) + labels = np.zeros(3, dtype='int64') + + self.algo(out, counts, values, labels) + + self.assertEqual(counts[0], 3) + self.assertTrue(out[0, 0] >= 0) # Python 2.6 has no assertGreaterEqual + tm.assert_almost_equal(out[0, 0], 0.0) + + +class TestGroupVarFloat64(tm.TestCase, GroupVarTestMixin): + __test__ = True + _multiprocess_can_split_ = True + + algo = algos.algos.group_var_float64 + dtype = np.float64 + rtol = 1e-5 + + def test_group_var_large_inputs(self): + + prng = RandomState(1234) + + out = np.array([[np.nan]], dtype=self.dtype) + counts = np.array([0],dtype='int64') + values = (prng.rand(10 ** 6) + 10 ** 12).astype(self.dtype) + values.shape = (10 ** 6, 1) + labels = np.zeros(10 ** 6, dtype='int64') + + self.algo(out, counts, values, labels) + + self.assertEqual(counts[0], 10 ** 6) + tm.assert_almost_equal(out[0, 0], 1.0 / 12, check_less_precise=True) + + +class TestGroupVarFloat32(tm.TestCase, GroupVarTestMixin): + __test__ = True + _multiprocess_can_split_ = True + + algo = algos.algos.group_var_float32 + dtype = np.float32 + rtol = 1e-2 + + def test_quantile(): s = Series(np.random.randn(100)) @@ -300,12 +554,12 @@ def test_unique_label_indices(): left = unique_label_indices(a) right = np.unique(a, return_index=True)[1] - tm.assert_array_equal(left, right) + tm.assert_numpy_array_equal(left, right) a[np.random.choice(len(a), 10)] = -1 left= unique_label_indices(a) right = np.unique(a, return_index=True)[1][1:] - tm.assert_array_equal(left, right) + tm.assert_numpy_array_equal(left, right) if __name__ == '__main__': import nose diff --git a/pandas/tests/test_base.py b/pandas/tests/test_base.py index e9526f9fad1ac..c9e4285d8b684 100644 --- a/pandas/tests/test_base.py +++ b/pandas/tests/test_base.py @@ -8,10 +8,11 @@ from pandas.compat import u, StringIO from pandas.core.base import FrozenList, FrozenNDArray, PandasDelegate from pandas.tseries.base import DatetimeIndexOpsMixin -from pandas.util.testing import assertRaisesRegexp, assert_isinstance +from pandas.util.testing import assertRaisesRegexp, assertIsInstance from pandas.tseries.common import is_datetimelike from pandas import Series, Index, Int64Index, DatetimeIndex, TimedeltaIndex, PeriodIndex, Timedelta import pandas.tslib as tslib +from pandas import _np_version_under1p9 import nose import pandas.util.testing as tm @@ -68,7 +69,7 @@ def test_slicing_maintains_type(self): def check_result(self, result, expected, klass=None): klass = klass or self.klass - assert_isinstance(result, klass) + assertIsInstance(result, klass) self.assertEqual(result, expected) @@ -109,12 +110,12 @@ def setUp(self): def test_shallow_copying(self): original = self.container.copy() - assert_isinstance(self.container.view(), FrozenNDArray) + assertIsInstance(self.container.view(), FrozenNDArray) self.assertFalse(isinstance(self.container.view(np.ndarray), FrozenNDArray)) self.assertIsNot(self.container.view(), self.container) self.assert_numpy_array_equal(self.container, original) # shallow copy should be the same too - assert_isinstance(self.container._shallow_copy(), FrozenNDArray) + assertIsInstance(self.container._shallow_copy(), FrozenNDArray) # setting should not be allowed def testit(container): container[0] = 16 @@ -181,23 +182,24 @@ def f(): class Ops(tm.TestCase): def setUp(self): - self.bool_index = tm.makeBoolIndex(10) - self.int_index = tm.makeIntIndex(10) - self.float_index = tm.makeFloatIndex(10) - self.dt_index = tm.makeDateIndex(10) - self.dt_tz_index = tm.makeDateIndex(10).tz_localize(tz='US/Eastern') - self.period_index = tm.makePeriodIndex(10) - self.string_index = tm.makeStringIndex(10) + self.bool_index = tm.makeBoolIndex(10, name='a') + self.int_index = tm.makeIntIndex(10, name='a') + self.float_index = tm.makeFloatIndex(10, name='a') + self.dt_index = tm.makeDateIndex(10, name='a') + self.dt_tz_index = tm.makeDateIndex(10, name='a').tz_localize(tz='US/Eastern') + self.period_index = tm.makePeriodIndex(10, name='a') + self.string_index = tm.makeStringIndex(10, name='a') + self.unicode_index = tm.makeUnicodeIndex(10, name='a') arr = np.random.randn(10) - self.int_series = Series(arr, index=self.int_index) - self.float_series = Series(arr, index=self.float_index) - self.dt_series = Series(arr, index=self.dt_index) + self.int_series = Series(arr, index=self.int_index, name='a') + self.float_series = Series(arr, index=self.float_index, name='a') + self.dt_series = Series(arr, index=self.dt_index, name='a') self.dt_tz_series = self.dt_tz_index.to_series(keep_tz=True) - self.period_series = Series(arr, index=self.period_index) - self.string_series = Series(arr, index=self.string_index) + self.period_series = Series(arr, index=self.period_index, name='a') + self.string_series = Series(arr, index=self.string_index, name='a') - types = ['bool','int','float','dt', 'dt_tz', 'period','string'] + types = ['bool','int','float','dt', 'dt_tz', 'period','string', 'unicode'] fmts = [ "{0}_{1}".format(t,f) for t in types for f in ['index','series'] ] self.objs = [ getattr(self,f) for f in fmts if getattr(self,f,None) is not None ] @@ -213,9 +215,9 @@ def check_ops_properties(self, props, filter=None, ignore_failures=False): try: if isinstance(o, Series): - expected = Series(getattr(o.index,op),index=o.index) + expected = Series(getattr(o.index,op), index=o.index, name='a') else: - expected = getattr(o,op) + expected = getattr(o, op) except (AttributeError): if ignore_failures: continue @@ -272,6 +274,45 @@ def setUp(self): self.is_valid_objs = [ o for o in self.objs if o._allow_index_ops ] self.not_valid_objs = [ o for o in self.objs if not o._allow_index_ops ] + def test_none_comparison(self): + + # bug brought up by #1079 + # changed from TypeError in 0.17.0 + for o in self.is_valid_objs: + if isinstance(o, Series): + + o[0] = np.nan + + result = o == None + self.assertFalse(result.iat[0]) + self.assertFalse(result.iat[1]) + + result = o != None + self.assertTrue(result.iat[0]) + self.assertTrue(result.iat[1]) + + result = None == o + self.assertFalse(result.iat[0]) + self.assertFalse(result.iat[1]) + + if _np_version_under1p9: + # fails as this tries not __eq__ which + # is not valid for numpy + pass + else: + result = None != o + self.assertTrue(result.iat[0]) + self.assertTrue(result.iat[1]) + + result = None > o + self.assertFalse(result.iat[0]) + self.assertFalse(result.iat[1]) + + result = o < None + self.assertFalse(result.iat[0]) + self.assertFalse(result.iat[1]) + + def test_ndarray_compat_properties(self): for o in self.objs: @@ -361,21 +402,28 @@ def test_value_counts_unique_nunique(self): # create repeated values, 'n'th element is repeated by n+1 times if isinstance(o, PeriodIndex): # freq must be specified because repeat makes freq ambiguous - expected_index = o[::-1] - o = klass(np.repeat(values, range(1, len(o) + 1)), freq=o.freq) + + # resets name from Index + expected_index = pd.Index(o[::-1], name=None) + + # attach name to klass + o = klass(np.repeat(values, range(1, len(o) + 1)), freq=o.freq, name='a') # don't test boolean elif isinstance(o,Index) and o.is_boolean(): continue elif isinstance(o, Index): - expected_index = values[::-1] - o = klass(np.repeat(values, range(1, len(o) + 1))) + expected_index = pd.Index(values[::-1], name=None) + o = klass(np.repeat(values, range(1, len(o) + 1)), name='a') else: - expected_index = values[::-1] + expected_index = pd.Index(values[::-1], name=None) idx = np.repeat(o.index.values, range(1, len(o) + 1)) - o = klass(np.repeat(values, range(1, len(o) + 1)), index=idx) + o = klass(np.repeat(values, range(1, len(o) + 1)), index=idx, name='a') - expected_s = Series(range(10, 0, -1), index=expected_index, dtype='int64') - tm.assert_series_equal(o.value_counts(), expected_s) + expected_s = Series(range(10, 0, -1), index=expected_index, dtype='int64', name='a') + result = o.value_counts() + tm.assert_series_equal(result, expected_s) + self.assertTrue(result.index.name is None) + self.assertEqual(result.name, 'a') result = o.unique() if isinstance(o, (DatetimeIndex, PeriodIndex)): @@ -410,21 +458,34 @@ def test_value_counts_unique_nunique(self): # create repeated values, 'n'th element is repeated by n+1 times if isinstance(o, PeriodIndex): # freq must be specified because repeat makes freq ambiguous - expected_index = o - o = klass(np.repeat(values, range(1, len(o) + 1)), freq=o.freq) + + # resets name from Index + expected_index = pd.Index(o, name=None) + # attach name to klass + o = klass(np.repeat(values, range(1, len(o) + 1)), freq=o.freq, name='a') elif isinstance(o, Index): - expected_index = values - o = klass(np.repeat(values, range(1, len(o) + 1))) + expected_index = pd.Index(values, name=None) + o = klass(np.repeat(values, range(1, len(o) + 1)), name='a') else: - expected_index = values + expected_index = pd.Index(values, name=None) idx = np.repeat(o.index.values, range(1, len(o) + 1)) - o = klass(np.repeat(values, range(1, len(o) + 1)), index=idx) - - expected_s_na = Series(list(range(10, 2, -1)) +[3], index=expected_index[9:0:-1], dtype='int64') - expected_s = Series(list(range(10, 2, -1)), index=expected_index[9:1:-1], dtype='int64') - - tm.assert_series_equal(o.value_counts(dropna=False), expected_s_na) + o = klass(np.repeat(values, range(1, len(o) + 1)), index=idx, name='a') + + expected_s_na = Series(list(range(10, 2, -1)) +[3], + index=expected_index[9:0:-1], + dtype='int64', name='a') + expected_s = Series(list(range(10, 2, -1)), + index=expected_index[9:1:-1], + dtype='int64', name='a') + + result_s_na = o.value_counts(dropna=False) + tm.assert_series_equal(result_s_na, expected_s_na) + self.assertTrue(result_s_na.index.name is None) + self.assertEqual(result_s_na.name, 'a') + result_s = o.value_counts() tm.assert_series_equal(o.value_counts(), expected_s) + self.assertTrue(result_s.index.name is None) + self.assertEqual(result_s.name, 'a') # numpy_array_equal cannot compare arrays includes nan result = o.unique() @@ -508,14 +569,15 @@ def test_value_counts_inferred(self): df = pd.read_fwf(f, widths=[6, 8, 3], names=["person_id", "dt", "food"], parse_dates=["dt"]) - s = klass(df['dt'].copy()) + s = klass(df['dt'].copy(), name='dt') - idx = pd.to_datetime(['2010-01-01 00:00:00Z', '2008-09-09 00:00:00Z', '2009-01-01 00:00:00X']) - expected_s = Series([3, 2, 1], index=idx) + idx = pd.to_datetime(['2010-01-01 00:00:00Z', '2008-09-09 00:00:00Z', + '2009-01-01 00:00:00X']) + expected_s = Series([3, 2, 1], index=idx, name='dt') tm.assert_series_equal(s.value_counts(), expected_s) - expected = np.array(['2010-01-01 00:00:00Z', '2009-01-01 00:00:00Z', '2008-09-09 00:00:00Z'], - dtype='datetime64[ns]') + expected = np.array(['2010-01-01 00:00:00Z', '2009-01-01 00:00:00Z', + '2008-09-09 00:00:00Z'], dtype='datetime64[ns]') if isinstance(s, DatetimeIndex): expected = DatetimeIndex(expected) self.assertTrue(s.unique().equals(expected)) @@ -526,7 +588,7 @@ def test_value_counts_inferred(self): # with NaT s = df['dt'].copy() - s = klass([v for v in s.values] + [pd.NaT]) + s = klass([v for v in s.values] + [pd.NaT], name='dt') result = s.value_counts() self.assertEqual(result.index.dtype, 'datetime64[ns]') @@ -547,10 +609,10 @@ def test_value_counts_inferred(self): # timedelta64[ns] td = df.dt - df.dt + timedelta(1) - td = klass(td) + td = klass(td, name='dt') result = td.value_counts() - expected_s = Series([6], index=[Timedelta('1day')]) + expected_s = Series([6], index=[Timedelta('1day')], name='dt') tm.assert_series_equal(result, expected_s) expected = TimedeltaIndex(['1 days']) @@ -560,9 +622,8 @@ def test_value_counts_inferred(self): self.assert_numpy_array_equal(td.unique(), expected.values) td2 = timedelta(1) + (df.dt - df.dt) - td2 = klass(td2) + td2 = klass(td2, name='dt') result2 = td2.value_counts() - tm.assert_series_equal(result2, expected_s) def test_factorize(self): @@ -629,7 +690,7 @@ def test_duplicated_drop_duplicates(self): # special case if original.is_boolean(): result = original.drop_duplicates() - expected = Index([False,True]) + expected = Index([False,True], name='a') tm.assert_index_equal(result, expected) continue @@ -653,22 +714,44 @@ def test_duplicated_drop_duplicates(self): self.assertTrue(duplicated.dtype == bool) tm.assert_index_equal(idx.drop_duplicates(), original) - last_base = [False] * len(idx) - last_base[3] = True - last_base[5] = True - expected = np.array(last_base) - duplicated = idx.duplicated(take_last=True) + base = [False] * len(idx) + base[3] = True + base[5] = True + expected = np.array(base) + + duplicated = idx.duplicated(keep='last') + tm.assert_numpy_array_equal(duplicated, expected) + self.assertTrue(duplicated.dtype == bool) + result = idx.drop_duplicates(keep='last') + tm.assert_index_equal(result, idx[~expected]) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + duplicated = idx.duplicated(take_last=True) + tm.assert_numpy_array_equal(duplicated, expected) + self.assertTrue(duplicated.dtype == bool) + with tm.assert_produces_warning(FutureWarning): + result = idx.drop_duplicates(take_last=True) + tm.assert_index_equal(result, idx[~expected]) + + base = [False] * len(original) + [True, True] + base[3] = True + base[5] = True + expected = np.array(base) + + duplicated = idx.duplicated(keep=False) tm.assert_numpy_array_equal(duplicated, expected) self.assertTrue(duplicated.dtype == bool) - tm.assert_index_equal(idx.drop_duplicates(take_last=True), - idx[~np.array(last_base)]) + result = idx.drop_duplicates(keep=False) + tm.assert_index_equal(result, idx[~expected]) with tm.assertRaisesRegexp(TypeError, "drop_duplicates\(\) got an unexpected keyword argument"): idx.drop_duplicates(inplace=True) else: - expected = Series([False] * len(original), index=original.index) + expected = Series([False] * len(original), + index=original.index, name='a') tm.assert_series_equal(original.duplicated(), expected) result = original.drop_duplicates() tm.assert_series_equal(result, original) @@ -676,20 +759,36 @@ def test_duplicated_drop_duplicates(self): idx = original.index[list(range(len(original))) + [5, 3]] values = original.values[list(range(len(original))) + [5, 3]] - s = Series(values, index=idx) + s = Series(values, index=idx, name='a') - expected = Series([False] * len(original) + [True, True], index=idx) + expected = Series([False] * len(original) + [True, True], + index=idx, name='a') tm.assert_series_equal(s.duplicated(), expected) tm.assert_series_equal(s.drop_duplicates(), original) - last_base = [False] * len(idx) - last_base[3] = True - last_base[5] = True - expected = Series(last_base, index=idx) - expected - tm.assert_series_equal(s.duplicated(take_last=True), expected) - tm.assert_series_equal(s.drop_duplicates(take_last=True), - s[~np.array(last_base)]) + base = [False] * len(idx) + base[3] = True + base[5] = True + expected = Series(base, index=idx, name='a') + + tm.assert_series_equal(s.duplicated(keep='last'), expected) + tm.assert_series_equal(s.drop_duplicates(keep='last'), + s[~np.array(base)]) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + tm.assert_series_equal(s.duplicated(take_last=True), expected) + with tm.assert_produces_warning(FutureWarning): + tm.assert_series_equal(s.drop_duplicates(take_last=True), + s[~np.array(base)]) + base = [False] * len(original) + [True, True] + base[3] = True + base[5] = True + expected = Series(base, index=idx, name='a') + + tm.assert_series_equal(s.duplicated(keep=False), expected) + tm.assert_series_equal(s.drop_duplicates(keep=False), + s[~np.array(base)]) s.drop_duplicates(inplace=True) tm.assert_series_equal(s, original) diff --git a/pandas/tests/test_categorical.py b/pandas/tests/test_categorical.py index c83ba897125bf..680b370cbca41 100755 --- a/pandas/tests/test_categorical.py +++ b/pandas/tests/test_categorical.py @@ -395,8 +395,8 @@ def f(): self.assertRaises(TypeError, lambda: cat_rev > a) # The following work via '__array_priority__ = 1000' - # works only on numpy >= 1.7.1 and not on PY3.2 - if LooseVersion(np.__version__) > "1.7.1" and not compat.PY3_2: + # works only on numpy >= 1.7.1 + if LooseVersion(np.__version__) > "1.7.1": self.assertRaises(TypeError, lambda: a < cat) self.assertRaises(TypeError, lambda: a < cat_rev) @@ -458,7 +458,8 @@ def test_describe(self): desc = cat.describe() expected = DataFrame.from_dict(dict(counts=[1, 2, 1], freqs=[1/4., 2/4., 1/4.], - categories=[1,2,np.nan] + categories=Categorical([1,2,np.nan], + [1, 2]) ) ).set_index('categories') tm.assert_frame_equal(desc, expected) @@ -492,7 +493,7 @@ def test_print(self): def test_big_print(self): factor = Categorical([0,1,2,0,1,2]*100, ['a', 'b', 'c'], name='cat', fastpath=True) expected = ["[a, b, c, a, b, ..., b, c, a, b, c]", - "Name: cat, Length: 600", + "Length: 600", "Categories (3, object): [a, b, c]"] expected = "\n".join(expected) @@ -501,15 +502,11 @@ def test_big_print(self): self.assertEqual(actual, expected) def test_empty_print(self): - factor = Categorical([], ["a","b","c"], name="cat") - expected = ("[], Name: cat, Categories (3, object): [a, b, c]") - # hack because array_repr changed in numpy > 1.6.x - actual = repr(factor) - self.assertEqual(actual, expected) - factor = Categorical([], ["a","b","c"]) expected = ("[], Categories (3, object): [a, b, c]") + # hack because array_repr changed in numpy > 1.6.x actual = repr(factor) + self.assertEqual(actual, expected) self.assertEqual(expected, actual) factor = Categorical([], ["a","b","c"], ordered=True) @@ -523,9 +520,9 @@ def test_empty_print(self): def test_print_none_width(self): # GH10087 - a = pd.Series(pd.Categorical([1,2,3,4], name="a")) + a = pd.Series(pd.Categorical([1,2,3,4])) exp = u("0 1\n1 2\n2 3\n3 4\n" + - "Name: a, dtype: category\nCategories (4, int64): [1, 2, 3, 4]") + "dtype: category\nCategories (4, int64): [1, 2, 3, 4]") with option_context("display.width", None): self.assertEqual(exp, repr(a)) @@ -962,20 +959,59 @@ def test_min_max(self): self.assertEqual(_max, 1) def test_unique(self): - cat = Categorical(["a","b"]) - exp = np.asarray(["a","b"]) + # categories are reordered based on value when ordered=False + cat = Categorical(["a", "b"]) + exp = np.asarray(["a", "b"]) + res = cat.unique() + self.assert_numpy_array_equal(res, exp) + + cat = Categorical(["a", "b", "a", "a"], categories=["a", "b", "c"]) res = cat.unique() self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, Categorical(exp)) - cat = Categorical(["a","b","a","a"], categories=["a","b","c"]) + cat = Categorical(["c", "a", "b", "a", "a"], categories=["a", "b", "c"]) + exp = np.asarray(["c", "a", "b"]) res = cat.unique() self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, Categorical(exp, categories=['c', 'a', 'b'])) - # unique should not sort - cat = Categorical(["b", "b", np.nan, "a"], categories=["a","b","c"]) + # nan must be removed + cat = Categorical(["b", np.nan, "b", np.nan, "a"], categories=["a", "b", "c"]) res = cat.unique() exp = np.asarray(["b", np.nan, "a"], dtype=object) self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, Categorical(["b", np.nan, "a"], categories=["b", "a"])) + + def test_unique_ordered(self): + # keep categories order when ordered=True + cat = Categorical(['b', 'a', 'b'], categories=['a', 'b'], ordered=True) + res = cat.unique() + exp = np.asarray(['b', 'a']) + exp_cat = Categorical(exp, categories=['a', 'b'], ordered=True) + self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, exp_cat) + + cat = Categorical(['c', 'b', 'a', 'a'], categories=['a', 'b', 'c'], ordered=True) + res = cat.unique() + exp = np.asarray(['c', 'b', 'a']) + exp_cat = Categorical(exp, categories=['a', 'b', 'c'], ordered=True) + self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, exp_cat) + + cat = Categorical(['b', 'a', 'a'], categories=['a', 'b', 'c'], ordered=True) + res = cat.unique() + exp = np.asarray(['b', 'a']) + exp_cat = Categorical(exp, categories=['a', 'b'], ordered=True) + self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, exp_cat) + + cat = Categorical(['b', 'b', np.nan, 'a'], categories=['a', 'b', 'c'], ordered=True) + res = cat.unique() + exp = np.asarray(['b', np.nan, 'a'], dtype=object) + exp_cat = Categorical(exp, categories=['a', 'b'], ordered=True) + self.assert_numpy_array_equal(res, exp) + tm.assert_categorical_equal(res, exp_cat) def test_mode(self): s = Categorical([1,1,2,4,5,5,5], categories=[5,4,3,2,1], ordered=True) @@ -1080,6 +1116,26 @@ def test_set_item_nan(self): exp = np.array([0,1,3,2]) self.assert_numpy_array_equal(cat.codes, exp) + def test_shift(self): + # GH 9416 + cat = pd.Categorical(['a', 'b', 'c', 'd', 'a']) + + # shift forward + sp1 = cat.shift(1) + xp1 = pd.Categorical([np.nan, 'a', 'b', 'c', 'd']) + self.assert_categorical_equal(sp1, xp1) + self.assert_categorical_equal(cat[:-1], sp1[1:]) + + # shift back + sn2 = cat.shift(-2) + xp2 = pd.Categorical(['c', 'd', 'a', np.nan, np.nan], + categories=['a', 'b', 'c', 'd']) + self.assert_categorical_equal(sn2, xp2) + self.assert_categorical_equal(cat[2:], sn2[:-2]) + + # shift by zero + self.assert_categorical_equal(cat, cat.shift(0)) + def test_nbytes(self): cat = pd.Categorical([1,2,3]) exp = cat._codes.nbytes + cat._categories.values.nbytes @@ -1150,6 +1206,13 @@ def test_deprecated_levels(self): self.assertFalse(LooseVersion(pd.__version__) >= '0.18') + def test_removed_names_produces_warning(self): + with tm.assert_produces_warning(UserWarning): + Categorical([0,1], name="a") + + with tm.assert_produces_warning(UserWarning): + Categorical.from_codes([1,2], ["a","b","c"], name="a") + def test_datetime_categorical_comparison(self): dt_cat = pd.Categorical(pd.date_range('2014-01-01', periods=3), ordered=True) self.assert_numpy_array_equal(dt_cat > dt_cat[0], [False, True, True]) @@ -1653,26 +1716,602 @@ def test_describe(self): self.assert_numpy_array_equal(res["cat"].values, res["s"].values) def test_repr(self): - a = pd.Series(pd.Categorical([1,2,3,4], name="a")) + a = pd.Series(pd.Categorical([1,2,3,4])) exp = u("0 1\n1 2\n2 3\n3 4\n" + - "Name: a, dtype: category\nCategories (4, int64): [1, 2, 3, 4]") + "dtype: category\nCategories (4, int64): [1, 2, 3, 4]") self.assertEqual(exp, a.__unicode__()) - a = pd.Series(pd.Categorical(["a","b"] *25, name="a")) + a = pd.Series(pd.Categorical(["a","b"] *25)) exp = u("0 a\n1 b\n" + " ..\n" + "48 a\n49 b\n" + - "Name: a, dtype: category\nCategories (2, object): [a, b]") + "dtype: category\nCategories (2, object): [a, b]") with option_context("display.max_rows", 5): self.assertEqual(exp, repr(a)) levs = list("abcdefghijklmnopqrstuvwxyz") - a = pd.Series(pd.Categorical(["a","b"], name="a", categories=levs, ordered=True)) + a = pd.Series(pd.Categorical(["a","b"], categories=levs, ordered=True)) exp = u("0 a\n1 b\n" + - "Name: a, dtype: category\n" + "dtype: category\n" "Categories (26, object): [a < b < c < d ... w < x < y < z]") self.assertEqual(exp,a.__unicode__()) + def test_categorical_repr(self): + c = pd.Categorical([1, 2 ,3]) + exp = """[1, 2, 3] +Categories (3, int64): [1, 2, 3]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical([1, 2 ,3, 1, 2 ,3], categories=[1, 2, 3]) + exp = """[1, 2, 3, 1, 2, 3] +Categories (3, int64): [1, 2, 3]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical([1, 2, 3, 4, 5] * 10) + exp = """[1, 2, 3, 4, 5, ..., 1, 2, 3, 4, 5] +Length: 50 +Categories (5, int64): [1, 2, 3, 4, 5]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(np.arange(20)) + exp = """[0, 1, 2, 3, 4, ..., 15, 16, 17, 18, 19] +Length: 20 +Categories (20, int64): [0, 1, 2, 3, ..., 16, 17, 18, 19]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_ordered(self): + c = pd.Categorical([1, 2 ,3], ordered=True) + exp = """[1, 2, 3] +Categories (3, int64): [1 < 2 < 3]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical([1, 2 ,3, 1, 2 ,3], categories=[1, 2, 3], ordered=True) + exp = """[1, 2, 3, 1, 2, 3] +Categories (3, int64): [1 < 2 < 3]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical([1, 2, 3, 4, 5] * 10, ordered=True) + exp = """[1, 2, 3, 4, 5, ..., 1, 2, 3, 4, 5] +Length: 50 +Categories (5, int64): [1 < 2 < 3 < 4 < 5]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(np.arange(20), ordered=True) + exp = """[0, 1, 2, 3, 4, ..., 15, 16, 17, 18, 19] +Length: 20 +Categories (20, int64): [0 < 1 < 2 < 3 ... 16 < 17 < 18 < 19]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_datetime(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + c = pd.Categorical(idx) + exp = """[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, + 2011-01-01 12:00:00, 2011-01-01 13:00:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00, 2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, + 2011-01-01 12:00:00, 2011-01-01 13:00:00]""" + self.assertEqual(repr(c), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + c = pd.Categorical(idx) + exp = """[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, + 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00, 2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, + 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_datetime_ordered(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + c = pd.Categorical(idx, ordered=True) + exp = """[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00 < 2011-01-01 10:00:00 < 2011-01-01 11:00:00 < + 2011-01-01 12:00:00 < 2011-01-01 13:00:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00, 2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00 < 2011-01-01 10:00:00 < 2011-01-01 11:00:00 < + 2011-01-01 12:00:00 < 2011-01-01 13:00:00]""" + self.assertEqual(repr(c), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + c = pd.Categorical(idx, ordered=True) + exp = """[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00 < 2011-01-01 10:00:00-05:00 < + 2011-01-01 11:00:00-05:00 < 2011-01-01 12:00:00-05:00 < + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00, 2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00] +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00 < 2011-01-01 10:00:00-05:00 < + 2011-01-01 11:00:00-05:00 < 2011-01-01 12:00:00-05:00 < + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_period(self): + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + c = pd.Categorical(idx) + exp = """[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00] +Categories (5, period): [2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, + 2011-01-01 13:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00, 2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00] +Categories (5, period): [2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, + 2011-01-01 13:00]""" + self.assertEqual(repr(c), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + c = pd.Categorical(idx) + exp = """[2011-01, 2011-02, 2011-03, 2011-04, 2011-05] +Categories (5, period): [2011-01, 2011-02, 2011-03, 2011-04, 2011-05]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[2011-01, 2011-02, 2011-03, 2011-04, 2011-05, 2011-01, 2011-02, 2011-03, 2011-04, 2011-05] +Categories (5, period): [2011-01, 2011-02, 2011-03, 2011-04, 2011-05]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_period_ordered(self): + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + c = pd.Categorical(idx, ordered=True) + exp = """[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00] +Categories (5, period): [2011-01-01 09:00 < 2011-01-01 10:00 < 2011-01-01 11:00 < 2011-01-01 12:00 < + 2011-01-01 13:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00, 2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00] +Categories (5, period): [2011-01-01 09:00 < 2011-01-01 10:00 < 2011-01-01 11:00 < 2011-01-01 12:00 < + 2011-01-01 13:00]""" + self.assertEqual(repr(c), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + c = pd.Categorical(idx, ordered=True) + exp = """[2011-01, 2011-02, 2011-03, 2011-04, 2011-05] +Categories (5, period): [2011-01 < 2011-02 < 2011-03 < 2011-04 < 2011-05]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[2011-01, 2011-02, 2011-03, 2011-04, 2011-05, 2011-01, 2011-02, 2011-03, 2011-04, 2011-05] +Categories (5, period): [2011-01 < 2011-02 < 2011-03 < 2011-04 < 2011-05]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_timedelta(self): + idx = pd.timedelta_range('1 days', periods=5) + c = pd.Categorical(idx) + exp = """[1 days, 2 days, 3 days, 4 days, 5 days] +Categories (5, timedelta64[ns]): [1 days, 2 days, 3 days, 4 days, 5 days]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[1 days, 2 days, 3 days, 4 days, 5 days, 1 days, 2 days, 3 days, 4 days, 5 days] +Categories (5, timedelta64[ns]): [1 days, 2 days, 3 days, 4 days, 5 days]""" + self.assertEqual(repr(c), exp) + + idx = pd.timedelta_range('1 hours', periods=20) + c = pd.Categorical(idx) + exp = """[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, ..., 15 days 01:00:00, 16 days 01:00:00, 17 days 01:00:00, 18 days 01:00:00, 19 days 01:00:00] +Length: 20 +Categories (20, timedelta64[ns]): [0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, + 3 days 01:00:00, ..., 16 days 01:00:00, 17 days 01:00:00, + 18 days 01:00:00, 19 days 01:00:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx) + exp = """[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, ..., 15 days 01:00:00, 16 days 01:00:00, 17 days 01:00:00, 18 days 01:00:00, 19 days 01:00:00] +Length: 40 +Categories (20, timedelta64[ns]): [0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, + 3 days 01:00:00, ..., 16 days 01:00:00, 17 days 01:00:00, + 18 days 01:00:00, 19 days 01:00:00]""" + self.assertEqual(repr(c), exp) + + def test_categorical_repr_timedelta_ordered(self): + idx = pd.timedelta_range('1 days', periods=5) + c = pd.Categorical(idx, ordered=True) + exp = """[1 days, 2 days, 3 days, 4 days, 5 days] +Categories (5, timedelta64[ns]): [1 days < 2 days < 3 days < 4 days < 5 days]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[1 days, 2 days, 3 days, 4 days, 5 days, 1 days, 2 days, 3 days, 4 days, 5 days] +Categories (5, timedelta64[ns]): [1 days < 2 days < 3 days < 4 days < 5 days]""" + self.assertEqual(repr(c), exp) + + idx = pd.timedelta_range('1 hours', periods=20) + c = pd.Categorical(idx, ordered=True) + exp = """[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, ..., 15 days 01:00:00, 16 days 01:00:00, 17 days 01:00:00, 18 days 01:00:00, 19 days 01:00:00] +Length: 20 +Categories (20, timedelta64[ns]): [0 days 01:00:00 < 1 days 01:00:00 < 2 days 01:00:00 < + 3 days 01:00:00 ... 16 days 01:00:00 < 17 days 01:00:00 < + 18 days 01:00:00 < 19 days 01:00:00]""" + self.assertEqual(repr(c), exp) + + c = pd.Categorical(idx.append(idx), categories=idx, ordered=True) + exp = """[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, ..., 15 days 01:00:00, 16 days 01:00:00, 17 days 01:00:00, 18 days 01:00:00, 19 days 01:00:00] +Length: 40 +Categories (20, timedelta64[ns]): [0 days 01:00:00 < 1 days 01:00:00 < 2 days 01:00:00 < + 3 days 01:00:00 ... 16 days 01:00:00 < 17 days 01:00:00 < + 18 days 01:00:00 < 19 days 01:00:00]""" + self.assertEqual(repr(c), exp) + + def test_categorical_series_repr(self): + s = pd.Series(pd.Categorical([1, 2 ,3])) + exp = """0 1 +1 2 +2 3 +dtype: category +Categories (3, int64): [1, 2, 3]""" + self.assertEqual(repr(s), exp) + + s = pd.Series(pd.Categorical(np.arange(10))) + exp = """0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +dtype: category +Categories (10, int64): [0, 1, 2, 3, ..., 6, 7, 8, 9]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_ordered(self): + s = pd.Series(pd.Categorical([1, 2 ,3], ordered=True)) + exp = """0 1 +1 2 +2 3 +dtype: category +Categories (3, int64): [1 < 2 < 3]""" + self.assertEqual(repr(s), exp) + + s = pd.Series(pd.Categorical(np.arange(10), ordered=True)) + exp = """0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +dtype: category +Categories (10, int64): [0 < 1 < 2 < 3 ... 6 < 7 < 8 < 9]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_datetime(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + s = pd.Series(pd.Categorical(idx)) + exp = """0 2011-01-01 09:00:00 +1 2011-01-01 10:00:00 +2 2011-01-01 11:00:00 +3 2011-01-01 12:00:00 +4 2011-01-01 13:00:00 +dtype: category +Categories (5, datetime64[ns]): [2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, + 2011-01-01 12:00:00, 2011-01-01 13:00:00]""" + self.assertEqual(repr(s), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + s = pd.Series(pd.Categorical(idx)) + exp = """0 2011-01-01 09:00:00-05:00 +1 2011-01-01 10:00:00-05:00 +2 2011-01-01 11:00:00-05:00 +3 2011-01-01 12:00:00-05:00 +4 2011-01-01 13:00:00-05:00 +dtype: category +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, + 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_datetime_ordered(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 2011-01-01 09:00:00 +1 2011-01-01 10:00:00 +2 2011-01-01 11:00:00 +3 2011-01-01 12:00:00 +4 2011-01-01 13:00:00 +dtype: category +Categories (5, datetime64[ns]): [2011-01-01 09:00:00 < 2011-01-01 10:00:00 < 2011-01-01 11:00:00 < + 2011-01-01 12:00:00 < 2011-01-01 13:00:00]""" + self.assertEqual(repr(s), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 2011-01-01 09:00:00-05:00 +1 2011-01-01 10:00:00-05:00 +2 2011-01-01 11:00:00-05:00 +3 2011-01-01 12:00:00-05:00 +4 2011-01-01 13:00:00-05:00 +dtype: category +Categories (5, datetime64[ns]): [2011-01-01 09:00:00-05:00 < 2011-01-01 10:00:00-05:00 < + 2011-01-01 11:00:00-05:00 < 2011-01-01 12:00:00-05:00 < + 2011-01-01 13:00:00-05:00]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_period(self): + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + s = pd.Series(pd.Categorical(idx)) + exp = """0 2011-01-01 09:00 +1 2011-01-01 10:00 +2 2011-01-01 11:00 +3 2011-01-01 12:00 +4 2011-01-01 13:00 +dtype: category +Categories (5, period): [2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, + 2011-01-01 13:00]""" + self.assertEqual(repr(s), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + s = pd.Series(pd.Categorical(idx)) + exp = """0 2011-01 +1 2011-02 +2 2011-03 +3 2011-04 +4 2011-05 +dtype: category +Categories (5, period): [2011-01, 2011-02, 2011-03, 2011-04, 2011-05]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_period_ordered(self): + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 2011-01-01 09:00 +1 2011-01-01 10:00 +2 2011-01-01 11:00 +3 2011-01-01 12:00 +4 2011-01-01 13:00 +dtype: category +Categories (5, period): [2011-01-01 09:00 < 2011-01-01 10:00 < 2011-01-01 11:00 < 2011-01-01 12:00 < + 2011-01-01 13:00]""" + self.assertEqual(repr(s), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 2011-01 +1 2011-02 +2 2011-03 +3 2011-04 +4 2011-05 +dtype: category +Categories (5, period): [2011-01 < 2011-02 < 2011-03 < 2011-04 < 2011-05]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_timedelta(self): + idx = pd.timedelta_range('1 days', periods=5) + s = pd.Series(pd.Categorical(idx)) + exp = """0 1 days +1 2 days +2 3 days +3 4 days +4 5 days +dtype: category +Categories (5, timedelta64[ns]): [1 days, 2 days, 3 days, 4 days, 5 days]""" + self.assertEqual(repr(s), exp) + + idx = pd.timedelta_range('1 hours', periods=10) + s = pd.Series(pd.Categorical(idx)) + exp = """0 0 days 01:00:00 +1 1 days 01:00:00 +2 2 days 01:00:00 +3 3 days 01:00:00 +4 4 days 01:00:00 +5 5 days 01:00:00 +6 6 days 01:00:00 +7 7 days 01:00:00 +8 8 days 01:00:00 +9 9 days 01:00:00 +dtype: category +Categories (10, timedelta64[ns]): [0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, + 3 days 01:00:00, ..., 6 days 01:00:00, 7 days 01:00:00, + 8 days 01:00:00, 9 days 01:00:00]""" + self.assertEqual(repr(s), exp) + + def test_categorical_series_repr_timedelta_ordered(self): + idx = pd.timedelta_range('1 days', periods=5) + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 1 days +1 2 days +2 3 days +3 4 days +4 5 days +dtype: category +Categories (5, timedelta64[ns]): [1 days < 2 days < 3 days < 4 days < 5 days]""" + self.assertEqual(repr(s), exp) + + idx = pd.timedelta_range('1 hours', periods=10) + s = pd.Series(pd.Categorical(idx, ordered=True)) + exp = """0 0 days 01:00:00 +1 1 days 01:00:00 +2 2 days 01:00:00 +3 3 days 01:00:00 +4 4 days 01:00:00 +5 5 days 01:00:00 +6 6 days 01:00:00 +7 7 days 01:00:00 +8 8 days 01:00:00 +9 9 days 01:00:00 +dtype: category +Categories (10, timedelta64[ns]): [0 days 01:00:00 < 1 days 01:00:00 < 2 days 01:00:00 < + 3 days 01:00:00 ... 6 days 01:00:00 < 7 days 01:00:00 < + 8 days 01:00:00 < 9 days 01:00:00]""" + self.assertEqual(repr(s), exp) + + def test_categorical_index_repr(self): + idx = pd.CategoricalIndex(pd.Categorical([1, 2 ,3])) + exp = """CategoricalIndex([1, 2, 3], categories=[1, 2, 3], ordered=False, dtype='category')""" + self.assertEqual(repr(idx), exp) + + i = pd.CategoricalIndex(pd.Categorical(np.arange(10))) + exp = """CategoricalIndex([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], categories=[0, 1, 2, 3, 4, 5, 6, 7, ...], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_ordered(self): + i = pd.CategoricalIndex(pd.Categorical([1, 2 ,3], ordered=True)) + exp = """CategoricalIndex([1, 2, 3], categories=[1, 2, 3], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + i = pd.CategoricalIndex(pd.Categorical(np.arange(10), ordered=True)) + exp = """CategoricalIndex([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], categories=[0, 1, 2, 3, 4, 5, 6, 7, ...], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_datetime(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00:00', '2011-01-01 10:00:00', + '2011-01-01 11:00:00', '2011-01-01 12:00:00', + '2011-01-01 13:00:00'], + categories=[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00:00-05:00', '2011-01-01 10:00:00-05:00', + '2011-01-01 11:00:00-05:00', '2011-01-01 12:00:00-05:00', + '2011-01-01 13:00:00-05:00'], + categories=[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_datetime_ordered(self): + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['2011-01-01 09:00:00', '2011-01-01 10:00:00', + '2011-01-01 11:00:00', '2011-01-01 12:00:00', + '2011-01-01 13:00:00'], + categories=[2011-01-01 09:00:00, 2011-01-01 10:00:00, 2011-01-01 11:00:00, 2011-01-01 12:00:00, 2011-01-01 13:00:00], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['2011-01-01 09:00:00-05:00', '2011-01-01 10:00:00-05:00', + '2011-01-01 11:00:00-05:00', '2011-01-01 12:00:00-05:00', + '2011-01-01 13:00:00-05:00'], + categories=[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + i = pd.CategoricalIndex(pd.Categorical(idx.append(idx), ordered=True)) + exp = """CategoricalIndex(['2011-01-01 09:00:00-05:00', '2011-01-01 10:00:00-05:00', + '2011-01-01 11:00:00-05:00', '2011-01-01 12:00:00-05:00', + '2011-01-01 13:00:00-05:00', '2011-01-01 09:00:00-05:00', + '2011-01-01 10:00:00-05:00', '2011-01-01 11:00:00-05:00', + '2011-01-01 12:00:00-05:00', '2011-01-01 13:00:00-05:00'], + categories=[2011-01-01 09:00:00-05:00, 2011-01-01 10:00:00-05:00, 2011-01-01 11:00:00-05:00, 2011-01-01 12:00:00-05:00, 2011-01-01 13:00:00-05:00], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_period(self): + # test all length + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=1) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00'], categories=[2011-01-01 09:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=2) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00', '2011-01-01 10:00'], categories=[2011-01-01 09:00, 2011-01-01 10:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=3) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00'], categories=[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00', + '2011-01-01 12:00', '2011-01-01 13:00'], + categories=[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + i = pd.CategoricalIndex(pd.Categorical(idx.append(idx))) + exp = """CategoricalIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00', + '2011-01-01 12:00', '2011-01-01 13:00', '2011-01-01 09:00', + '2011-01-01 10:00', '2011-01-01 11:00', '2011-01-01 12:00', + '2011-01-01 13:00'], + categories=[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05'], categories=[2011-01, 2011-02, 2011-03, 2011-04, 2011-05], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_period_ordered(self): + idx = pd.period_range('2011-01-01 09:00', freq='H', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00', + '2011-01-01 12:00', '2011-01-01 13:00'], + categories=[2011-01-01 09:00, 2011-01-01 10:00, 2011-01-01 11:00, 2011-01-01 12:00, 2011-01-01 13:00], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.period_range('2011-01', freq='M', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05'], categories=[2011-01, 2011-02, 2011-03, 2011-04, 2011-05], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_timedelta(self): + idx = pd.timedelta_range('1 days', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['1 days', '2 days', '3 days', '4 days', '5 days'], categories=[1 days 00:00:00, 2 days 00:00:00, 3 days 00:00:00, 4 days 00:00:00, 5 days 00:00:00], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.timedelta_range('1 hours', periods=10) + i = pd.CategoricalIndex(pd.Categorical(idx)) + exp = """CategoricalIndex(['0 days 01:00:00', '1 days 01:00:00', '2 days 01:00:00', + '3 days 01:00:00', '4 days 01:00:00', '5 days 01:00:00', + '6 days 01:00:00', '7 days 01:00:00', '8 days 01:00:00', + '9 days 01:00:00'], + categories=[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, 5 days 01:00:00, 6 days 01:00:00, 7 days 01:00:00, ...], ordered=False, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_index_repr_timedelta_ordered(self): + idx = pd.timedelta_range('1 days', periods=5) + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['1 days', '2 days', '3 days', '4 days', '5 days'], categories=[1 days 00:00:00, 2 days 00:00:00, 3 days 00:00:00, 4 days 00:00:00, 5 days 00:00:00], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + idx = pd.timedelta_range('1 hours', periods=10) + i = pd.CategoricalIndex(pd.Categorical(idx, ordered=True)) + exp = """CategoricalIndex(['0 days 01:00:00', '1 days 01:00:00', '2 days 01:00:00', + '3 days 01:00:00', '4 days 01:00:00', '5 days 01:00:00', + '6 days 01:00:00', '7 days 01:00:00', '8 days 01:00:00', + '9 days 01:00:00'], + categories=[0 days 01:00:00, 1 days 01:00:00, 2 days 01:00:00, 3 days 01:00:00, 4 days 01:00:00, 5 days 01:00:00, 6 days 01:00:00, 7 days 01:00:00, ...], ordered=True, dtype='category')""" + self.assertEqual(repr(i), exp) + + def test_categorical_frame(self): + # normal DataFrame + dt = pd.date_range('2011-01-01 09:00', freq='H', periods=5, tz='US/Eastern') + p = pd.period_range('2011-01', freq='M', periods=5) + df = pd.DataFrame({'dt': dt, 'p': p}) + exp = """ dt p +0 2011-01-01 09:00:00-05:00 2011-01 +1 2011-01-01 10:00:00-05:00 2011-02 +2 2011-01-01 11:00:00-05:00 2011-03 +3 2011-01-01 12:00:00-05:00 2011-04 +4 2011-01-01 13:00:00-05:00 2011-05""" + + df = pd.DataFrame({'dt': pd.Categorical(dt), 'p': pd.Categorical(p)}) + self.assertEqual(repr(df), exp) + def test_info(self): # make sure it works @@ -2068,7 +2707,7 @@ def test_slicing_and_getting_ops(self): # row res_row = df.iloc[2,:] tm.assert_series_equal(res_row, exp_row) - tm.assert_isinstance(res_row["cats"], compat.string_types) + tm.assertIsInstance(res_row["cats"], compat.string_types) # col res_col = df.iloc[:,0] @@ -2088,7 +2727,7 @@ def test_slicing_and_getting_ops(self): # row res_row = df.loc["j",:] tm.assert_series_equal(res_row, exp_row) - tm.assert_isinstance(res_row["cats"], compat.string_types) + tm.assertIsInstance(res_row["cats"], compat.string_types) # col res_col = df.loc[:,"cats"] @@ -2109,7 +2748,7 @@ def test_slicing_and_getting_ops(self): # row res_row = df.ix["j",:] tm.assert_series_equal(res_row, exp_row) - tm.assert_isinstance(res_row["cats"], compat.string_types) + tm.assertIsInstance(res_row["cats"], compat.string_types) # col res_col = df.ix[:,"cats"] @@ -2141,27 +2780,27 @@ def test_slicing_and_getting_ops(self): self.assertEqual(res_val, exp_val) # i : int, slice, or sequence of integers - res_row = df.irow(2) + res_row = df.iloc[2] tm.assert_series_equal(res_row, exp_row) - tm.assert_isinstance(res_row["cats"], compat.string_types) + tm.assertIsInstance(res_row["cats"], compat.string_types) - res_df = df.irow(slice(2,4)) + res_df = df.iloc[slice(2,4)] tm.assert_frame_equal(res_df, exp_df) self.assertTrue(com.is_categorical_dtype(res_df["cats"])) - res_df = df.irow([2,3]) + res_df = df.iloc[[2,3]] tm.assert_frame_equal(res_df, exp_df) self.assertTrue(com.is_categorical_dtype(res_df["cats"])) - res_col = df.icol(0) + res_col = df.iloc[:,0] tm.assert_series_equal(res_col, exp_col) self.assertTrue(com.is_categorical_dtype(res_col)) - res_df = df.icol(slice(0,2)) + res_df = df.iloc[:,slice(0,2)] tm.assert_frame_equal(res_df, df) self.assertTrue(com.is_categorical_dtype(res_df["cats"])) - res_df = df.icol([0,1]) + res_df = df.iloc[:,[0,1]] tm.assert_frame_equal(res_df, df) self.assertTrue(com.is_categorical_dtype(res_df["cats"])) @@ -2182,8 +2821,8 @@ def test_slicing_doc_examples(self): tm.assert_series_equal(result, expected) result = df.loc["h":"j","cats"] - expected = Series(Categorical(['a','b','b'], name='cats', - categories=['a','b','c']), index=['h','i','j']) + expected = Series(Categorical(['a','b','b'], + categories=['a','b','c']), index=['h','i','j'], name='cats') tm.assert_series_equal(result, expected) result = df.ix["h":"j",0:1] @@ -2883,7 +3522,7 @@ def test_to_records(self): # this coerces result = df.to_records() expected = np.rec.array([(0, 'a'), (1, 'b'), (2, 'c')], - dtype=[('index', '""" self.assertEqual(result, expected) + df.index = Index(df.index.values, name='idx') + result = df.to_html(index=False) + self.assertEqual(result, expected) + def test_to_html_multiindex_sparsify_false_multi_sparse(self): with option_context('display.multi_sparse', False): index = MultiIndex.from_arrays([[0, 0, 1, 1], [0, 1, 0, 1]], @@ -990,7 +994,7 @@ def test_to_html_truncate(self):
footAfootB

20 rows × 20 columns

'''.format(div_style) - if sys.version_info[0] < 3: + if compat.PY2: expected = expected.decode('utf-8') self.assertEqual(result, expected) @@ -1106,7 +1110,7 @@ def test_to_html_truncate_multi_index(self):

8 rows × 8 columns

'''.format(div_style) - if sys.version_info[0] < 3: + if compat.PY2: expected = expected.decode('utf-8') self.assertEqual(result, expected) @@ -1216,7 +1220,7 @@ def test_to_html_truncate_multi_index_sparse_off(self):

8 rows × 8 columns

'''.format(div_style) - if sys.version_info[0] < 3: + if compat.PY2: expected = expected.decode('utf-8') self.assertEqual(result, expected) @@ -1470,7 +1474,7 @@ def test_to_string(self): self.assertIsNone(retval) self.assertEqual(buf.getvalue(), s) - tm.assert_isinstance(s, compat.string_types) + tm.assertIsInstance(s, compat.string_types) # print in right order result = biggie.to_string(columns=['B', 'A'], col_space=17, @@ -1523,7 +1527,7 @@ def test_to_string_no_index(self): def test_to_string_float_formatting(self): self.reset_display_options() - fmt.set_option('display.precision', 6, 'display.column_space', + fmt.set_option('display.precision', 5, 'display.column_space', 12, 'display.notebook_repr_html', False) df = DataFrame({'x': [0, 0.25, 3456.000, 12e+45, 1.64e+6, @@ -1554,7 +1558,7 @@ def test_to_string_float_formatting(self): self.assertEqual(df_s, expected) self.reset_display_options() - self.assertEqual(get_option("display.precision"), 7) + self.assertEqual(get_option("display.precision"), 6) df = DataFrame({'x': [1e9, 0.2512]}) df_s = df.to_string() @@ -1719,7 +1723,7 @@ def test_to_html(self): self.assertIsNone(retval) self.assertEqual(buf.getvalue(), s) - tm.assert_isinstance(s, compat.string_types) + tm.assertIsInstance(s, compat.string_types) biggie.to_html(columns=['B', 'A'], col_space=17) biggie.to_html(columns=['B', 'A'], @@ -1922,15 +1926,195 @@ def test_to_html_index(self): 'C': ['one', 'two', np.NaN]}, columns=['A', 'B', 'C'], index=index) + expected_with_index = ('\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
ABC
foo11.2one
bar23.4two
baz35.6NaN
') + self.assertEqual(df.to_html(), expected_with_index) + + expected_without_index = ('\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
ABC
11.2one
23.4two
35.6NaN
') result = df.to_html(index=False) for i in index: self.assertNotIn(i, result) + self.assertEqual(result, expected_without_index) + df.index = Index(['foo', 'bar', 'baz'], name='idx') + expected_with_index = ('\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
ABC
idx
foo11.2one
bar23.4two
baz35.6NaN
') + self.assertEqual(df.to_html(), expected_with_index) + self.assertEqual(df.to_html(index=False), expected_without_index) tuples = [('foo', 'car'), ('foo', 'bike'), ('bar', 'car')] df.index = MultiIndex.from_tuples(tuples) + + expected_with_index = ('\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
ABC
foocar11.2one
bike23.4two
barcar35.6NaN
') + self.assertEqual(df.to_html(), expected_with_index) + result = df.to_html(index=False) for i in ['foo', 'bar', 'car', 'bike']: self.assertNotIn(i, result) + # must be the same result as normal index + self.assertEqual(result, expected_without_index) + + df.index = MultiIndex.from_tuples(tuples, names=['idx1', 'idx2']) + expected_with_index = ('\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '
ABC
idx1idx2
foocar11.2one
bike23.4two
barcar35.6NaN
') + self.assertEqual(df.to_html(), expected_with_index) + self.assertEqual(df.to_html(index=False), expected_without_index) def test_repr_html(self): self.frame._repr_html_() @@ -3055,7 +3239,7 @@ def test_output_significant_digits(self): # Issue #9764 # In case default display precision changes: - with pd.option_context('display.precision', 7): + with pd.option_context('display.precision', 6): # DataFrame example from issue #9764 d=pd.DataFrame({'col1':[9.999e-8, 1e-7, 1.0001e-7, 2e-7, 4.999e-7, 5e-7, 5.0001e-7, 6e-7, 9.999e-7, 1e-6, 1.0001e-6, 2e-6, 4.999e-6, 5e-6, 5.0001e-6, 6e-6]}) @@ -3070,6 +3254,17 @@ def test_output_significant_digits(self): for (start, stop), v in expected_output.items(): self.assertEqual(str(d[start:stop]), v) + def test_too_long(self): + # GH 10451 + with pd.option_context('display.precision', 4): + # need both a number > 1e8 and something that normally formats to having length > display.precision + 6 + df = pd.DataFrame(dict(x=[12345.6789])) + self.assertEqual(str(df), ' x\n0 12345.6789') + df = pd.DataFrame(dict(x=[2e8])) + self.assertEqual(str(df), ' x\n0 200000000') + df = pd.DataFrame(dict(x=[12345.6789, 2e8])) + self.assertEqual(str(df), ' x\n0 1.2346e+04\n1 2.0000e+08') + class TestRepr_timedelta64(tm.TestCase): diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index 4b1954a3be64e..7b6243f391a19 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -3,7 +3,7 @@ from __future__ import print_function # pylint: disable-msg=W0612,E1101 from copy import deepcopy -from datetime import datetime, timedelta, time +from datetime import datetime, timedelta, time, date import sys import operator import re @@ -24,7 +24,6 @@ from numpy.random import randn import numpy as np import numpy.ma as ma -from numpy.testing import assert_array_equal import numpy.ma.mrecords as mrecords import pandas.core.nanops as nanops @@ -40,12 +39,14 @@ from pandas.util.misc import is_little_endian from pandas.util.testing import (assert_almost_equal, + assert_numpy_array_equal, assert_series_equal, assert_frame_equal, assertRaisesRegexp, assertRaises, makeCustomDataframe as mkdf, - ensure_clean) + ensure_clean, + SubclassedDataFrame) from pandas.core.indexing import IndexingError from pandas.core.common import PandasError @@ -124,7 +125,7 @@ def test_getitem(self): df['@awesome_domain'] = ad self.assertRaises(KeyError, df.__getitem__, 'df["$10"]') res = df['@awesome_domain'] - assert_array_equal(ad, res.values) + assert_numpy_array_equal(ad, res.values) def test_getitem_dupe_cols(self): df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'a', 'b']) @@ -1465,7 +1466,7 @@ def f(): self.assertTrue(result.values.all()) self.assertTrue((cp.iloc[0:1] == df.iloc[0:1]).values.all()) - warnings.filterwarnings(action='ignore', category=FutureWarning) + warnings.filterwarnings(action='default', category=FutureWarning) cp = df.copy() cp.iloc[4:5] = 0 @@ -1780,16 +1781,20 @@ def test_single_element_ix_dont_upcast(self): def test_irow(self): df = DataFrame(np.random.randn(10, 4), index=lrange(0, 20, 2)) - result = df.irow(1) + # 10711, deprecated + with tm.assert_produces_warning(FutureWarning): + df.irow(1) + + result = df.iloc[1] exp = df.ix[2] assert_series_equal(result, exp) - result = df.irow(2) + result = df.iloc[2] exp = df.ix[4] assert_series_equal(result, exp) # slice - result = df.irow(slice(4, 8)) + result = df.iloc[slice(4, 8)] expected = df.ix[8:14] assert_frame_equal(result, expected) @@ -1803,23 +1808,28 @@ def f(): assert_series_equal(df[2], exp_col) # list of integers - result = df.irow([1, 2, 4, 6]) + result = df.iloc[[1, 2, 4, 6]] expected = df.reindex(df.index[[1, 2, 4, 6]]) assert_frame_equal(result, expected) def test_icol(self): + df = DataFrame(np.random.randn(4, 10), columns=lrange(0, 20, 2)) - result = df.icol(1) + # 10711, deprecated + with tm.assert_produces_warning(FutureWarning): + df.icol(1) + + result = df.iloc[:, 1] exp = df.ix[:, 2] assert_series_equal(result, exp) - result = df.icol(2) + result = df.iloc[:, 2] exp = df.ix[:, 4] assert_series_equal(result, exp) # slice - result = df.icol(slice(4, 8)) + result = df.iloc[:, slice(4, 8)] expected = df.ix[:, 8:14] assert_frame_equal(result, expected) @@ -1831,23 +1841,25 @@ def f(): self.assertTrue((df[8] == 0).all()) # list of integers - result = df.icol([1, 2, 4, 6]) + result = df.iloc[:, [1, 2, 4, 6]] expected = df.reindex(columns=df.columns[[1, 2, 4, 6]]) assert_frame_equal(result, expected) def test_irow_icol_duplicates(self): + # 10711, deprecated + df = DataFrame(np.random.rand(3, 3), columns=list('ABC'), index=list('aab')) - result = df.irow(0) + result = df.iloc[0] result2 = df.ix[0] - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) assert_almost_equal(result.values, df.values[0]) assert_series_equal(result, result2) - result = df.T.icol(0) + result = df.T.iloc[:, 0] result2 = df.T.ix[:, 0] - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) assert_almost_equal(result.values, df.values[0]) assert_series_equal(result, result2) @@ -1855,34 +1867,39 @@ def test_irow_icol_duplicates(self): df = DataFrame(np.random.randn(3, 3), columns=[['i', 'i', 'j'], ['A', 'A', 'B']], index=[['i', 'i', 'j'], ['X', 'X', 'Y']]) - rs = df.irow(0) + rs = df.iloc[0] xp = df.ix[0] assert_series_equal(rs, xp) - rs = df.icol(0) + rs = df.iloc[:, 0] xp = df.T.ix[0] assert_series_equal(rs, xp) - rs = df.icol([0]) + rs = df.iloc[:, [0]] xp = df.ix[:, [0]] assert_frame_equal(rs, xp) # #2259 df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=[1, 1, 2]) - result = df.icol([0]) + result = df.iloc[:, [0]] expected = df.take([0], axis=1) assert_frame_equal(result, expected) def test_icol_sparse_propegate_fill_value(self): from pandas.sparse.api import SparseDataFrame df = SparseDataFrame({'A': [999, 1]}, default_fill_value=999) - self.assertTrue(len(df['A'].sp_values) == len(df.icol(0).sp_values)) + self.assertTrue(len(df['A'].sp_values) == len(df.iloc[:, 0].sp_values)) def test_iget_value(self): + # 10711 deprecated + + with tm.assert_produces_warning(FutureWarning): + self.frame.iget_value(0,0) + for i, row in enumerate(self.frame.index): for j, col in enumerate(self.frame.columns): - result = self.frame.iget_value(i, j) - expected = self.frame.get_value(row, col) + result = self.frame.iat[i,j] + expected = self.frame.at[row, col] assert_almost_equal(result, expected) def test_nested_exception(self): @@ -1912,6 +1929,12 @@ def test_reindex_methods(self): actual = df.reindex(target, method=method) assert_frame_equal(expected, actual) + actual = df.reindex_like(df, method=method, tolerance=0) + assert_frame_equal(df, actual) + + actual = df.reindex(target, method=method, tolerance=1) + assert_frame_equal(expected, actual) + e2 = expected[::-1] actual = df.reindex(target[::-1], method=method) assert_frame_equal(e2, actual) @@ -1927,6 +1950,10 @@ def test_reindex_methods(self): actual = df[::-1].reindex(target, method=switched_method) assert_frame_equal(expected, actual) + expected = pd.DataFrame({'x': [0, 1, 1, np.nan]}, index=target) + actual = df.reindex(target, method='nearest', tolerance=0.2) + assert_frame_equal(expected, actual) + def test_non_monotonic_reindex_methods(self): dr = pd.date_range('2013-08-01', periods=6, freq='B') data = np.random.randn(6,1) @@ -2203,7 +2230,6 @@ class TestDataFrame(tm.TestCase, CheckIndexing, def setUp(self): import warnings - warnings.filterwarnings(action='ignore', category=FutureWarning) self.frame = _frame.copy() self.frame2 = _frame2.copy() @@ -2439,7 +2465,7 @@ def test_set_index_cast_datetimeindex(self): 'B': np.random.randn(1000)}) idf = df.set_index('A') - tm.assert_isinstance(idf.index, DatetimeIndex) + tm.assertIsInstance(idf.index, DatetimeIndex) # don't cast a DatetimeIndex WITH a tz, leave as object # GH 6032 @@ -2602,7 +2628,7 @@ def test_constructor_list_frames(self): self.assertEqual(result.shape, (1,0)) result = DataFrame([DataFrame(dict(A = lrange(5)))]) - tm.assert_isinstance(result.iloc[0,0], DataFrame) + tm.assertIsInstance(result.iloc[0,0], DataFrame) def test_constructor_mixed_dtypes(self): @@ -2922,10 +2948,10 @@ def test_constructor_dict_cast(self): def test_constructor_dict_dont_upcast(self): d = {'Col1': {'Row1': 'A String', 'Row2': np.nan}} df = DataFrame(d) - tm.assert_isinstance(df['Col1']['Row2'], float) + tm.assertIsInstance(df['Col1']['Row2'], float) dm = DataFrame([[1, 2], ['a', 'b']], index=[1, 2], columns=[1, 2]) - tm.assert_isinstance(dm[1][1], int) + tm.assertIsInstance(dm[1][1], int) def test_constructor_dict_of_tuples(self): # GH #1491 @@ -3575,7 +3601,7 @@ def test_constructor_from_items(self): columns=self.mixed_frame.columns, orient='index') assert_frame_equal(recons, self.mixed_frame) - tm.assert_isinstance(recons['foo'][0], tuple) + tm.assertIsInstance(recons['foo'][0], tuple) rs = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])], orient='index', columns=['one', 'two', 'three']) @@ -3616,6 +3642,20 @@ def test_constructor_column_duplicates(self): [('a', [8]), ('a', [5]), ('b', [6])], columns=['b', 'a', 'a']) + def test_constructor_empty_with_string_dtype(self): + # GH 9428 + expected = DataFrame(index=[0, 1], columns=[0, 1], dtype=object) + + df = DataFrame(index=[0, 1], columns=[0, 1], dtype=str) + assert_frame_equal(df, expected) + df = DataFrame(index=[0, 1], columns=[0, 1], dtype=np.str_) + assert_frame_equal(df, expected) + df = DataFrame(index=[0, 1], columns=[0, 1], dtype=np.unicode_) + assert_frame_equal(df, expected) + df = DataFrame(index=[0, 1], columns=[0, 1], dtype='U5') + assert_frame_equal(df, expected) + + def test_column_dups_operations(self): def check(result, expected=None): @@ -4247,6 +4287,16 @@ def test_datetimelike_setitem_with_inference(self): expected = Series([np.dtype('timedelta64[ns]')]*6+[np.dtype('datetime64[ns]')]*2,index=list('ABCDEFGH')) assert_series_equal(result,expected) + def test_setitem_datetime_coercion(self): + # GH 1048 + df = pd.DataFrame({'c': [pd.Timestamp('2010-10-01')]*3}) + df.loc[0:1, 'c'] = np.datetime64('2008-08-08') + self.assertEqual(pd.Timestamp('2008-08-08'), df.loc[0, 'c']) + self.assertEqual(pd.Timestamp('2008-08-08'), df.loc[1, 'c']) + df.loc[2, 'c'] = date(2005, 5, 5) + self.assertEqual(pd.Timestamp('2005-05-05'), df.loc[2, 'c']) + + def test_new_empty_index(self): df1 = DataFrame(randn(0, 3)) df2 = DataFrame(randn(0, 3)) @@ -4368,7 +4418,7 @@ def test_astype_str(self): def test_array_interface(self): result = np.sqrt(self.frame) - tm.assert_isinstance(result, type(self.frame)) + tm.assertIsInstance(result, type(self.frame)) self.assertIs(result.index, self.frame.index) self.assertIs(result.columns, self.frame.columns) @@ -4639,13 +4689,13 @@ def test_from_records_empty(self): def test_from_records_empty_with_nonempty_fields_gh3682(self): a = np.array([(1, 2)], dtype=[('id', np.int64), ('value', np.int64)]) df = DataFrame.from_records(a, index='id') - assert_array_equal(df.index, Index([1], name='id')) + assert_numpy_array_equal(df.index, Index([1], name='id')) self.assertEqual(df.index.name, 'id') - assert_array_equal(df.columns, Index(['value'])) + assert_numpy_array_equal(df.columns, Index(['value'])) b = np.array([], dtype=[('id', np.int64), ('value', np.int64)]) df = DataFrame.from_records(b, index='id') - assert_array_equal(df.index, Index([], name='id')) + assert_numpy_array_equal(df.index, Index([], name='id')) self.assertEqual(df.index.name, 'id') def test_from_records_with_datetimes(self): @@ -4709,6 +4759,33 @@ def test_join_str_datetime(self): self.assertEqual(len(tst.columns), 3) + def test_join_multiindex_leftright(self): + # GH 10741 + df1 = pd.DataFrame([['a', 'x', 0.471780], ['a','y', 0.774908], + ['a', 'z', 0.563634], ['b', 'x', -0.353756], + ['b', 'y', 0.368062], ['b', 'z', -1.721840], + ['c', 'x', 1], ['c', 'y', 2], ['c', 'z', 3]], + columns=['first', 'second', 'value1']).set_index(['first', 'second']) + df2 = pd.DataFrame([['a', 10], ['b', 20]], columns=['first', 'value2']).set_index(['first']) + + exp = pd.DataFrame([[0.471780, 10], [0.774908, 10], [0.563634, 10], + [-0.353756, 20], [0.368062, 20], [-1.721840, 20], + [1.000000, np.nan], [2.000000, np.nan], [3.000000, np.nan]], + index=df1.index, columns=['value1', 'value2']) + + # these must be the same results (but columns are flipped) + tm.assert_frame_equal(df1.join(df2, how='left'), exp) + tm.assert_frame_equal(df2.join(df1, how='right'), exp[['value2', 'value1']]) + + exp_idx = pd.MultiIndex.from_product([['a', 'b'], ['x', 'y', 'z']], + names=['first', 'second']) + exp = pd.DataFrame([[0.471780, 10], [0.774908, 10], [0.563634, 10], + [-0.353756, 20], [0.368062, 20], [-1.721840, 20]], + index=exp_idx, columns=['value1', 'value2']) + + tm.assert_frame_equal(df1.join(df2, how='right'), exp) + tm.assert_frame_equal(df2.join(df1, how='left'), exp[['value2', 'value1']]) + def test_from_records_sequencelike(self): df = DataFrame({'A' : np.array(np.random.randn(6), dtype = np.float64), 'A1': np.array(np.random.randn(6), dtype = np.float64), @@ -4730,7 +4807,7 @@ def test_from_records_sequencelike(self): for i in range(len(df.index)): tup = [] for _, b in compat.iteritems(blocks): - tup.extend(b.irow(i).values) + tup.extend(b.iloc[i].values) tuples.append(tuple(tup)) recarray = np.array(tuples, dtype=dtypes).view(np.recarray) @@ -5134,7 +5211,7 @@ def test_itertuples(self): 'ints': lrange(5)}, columns=['floats', 'ints']) for tup in df.itertuples(index=False): - tm.assert_isinstance(tup[1], np.integer) + tm.assertIsInstance(tup[1], np.integer) df = DataFrame(data={"a": [1, 2, 3], "b": [4, 5, 6]}) dfaa = df[['a', 'a']] @@ -5596,9 +5673,9 @@ def test_arith_flex_frame(self): result = self.frame[:0].add(self.frame) assert_frame_equal(result, self.frame * np.nan) with assertRaisesRegexp(NotImplementedError, 'fill_value'): - self.frame.add(self.frame.irow(0), fill_value=3) + self.frame.add(self.frame.iloc[0], fill_value=3) with assertRaisesRegexp(NotImplementedError, 'fill_value'): - self.frame.add(self.frame.irow(0), axis='index', fill_value=3) + self.frame.add(self.frame.iloc[0], axis='index', fill_value=3) def test_binary_ops_align(self): @@ -6083,7 +6160,7 @@ def test_boolean_comparison(self): assert_frame_equal(result,expected) result = df.values>b - assert_array_equal(result,expected.values) + assert_numpy_array_equal(result,expected.values) result = df>l assert_frame_equal(result,expected) @@ -6095,7 +6172,7 @@ def test_boolean_comparison(self): assert_frame_equal(result,expected) result = df.values>b_r - assert_array_equal(result,expected.values) + assert_numpy_array_equal(result,expected.values) self.assertRaises(ValueError, df.__gt__, b_c) self.assertRaises(ValueError, df.values.__gt__, b_c) @@ -6115,7 +6192,7 @@ def test_boolean_comparison(self): assert_frame_equal(result,expected) result = df.values == b_r - assert_array_equal(result,expected.values) + assert_numpy_array_equal(result,expected.values) self.assertRaises(ValueError, lambda : df == b_c) self.assertFalse((df.values == b_c)) @@ -6149,6 +6226,34 @@ def test_equals_different_blocks(self): self.assertTrue(df0.equals(df1)) self.assertTrue(df1.equals(df0)) + def test_copy_blocks(self): + # API/ENH 9607 + df = DataFrame(self.frame, copy=True) + column = df.columns[0] + + # use the default copy=True, change a column + blocks = df.as_blocks() + for dtype, _df in blocks.items(): + if column in _df: + _df.ix[:, column] = _df[column] + 1 + + # make sure we did not change the original DataFrame + self.assertFalse(_df[column].equals(df[column])) + + def test_no_copy_blocks(self): + # API/ENH 9607 + df = DataFrame(self.frame, copy=True) + column = df.columns[0] + + # use the copy=False, change a column + blocks = df.as_blocks(copy=False) + for dtype, _df in blocks.items(): + if column in _df: + _df.ix[:, column] = _df[column] + 1 + + # make sure we did change the original DataFrame + self.assertTrue(_df[column].equals(df[column])) + def test_to_csv_from_csv(self): pname = '__tmp_to_csv_from_csv__' @@ -6327,7 +6432,7 @@ def _to_uni(x): # labeling them dupe.1,dupe.2, etc'. monkey patch columns recons.columns = df.columns if rnlvl and not cnlvl: - delta_lvl = [recons.icol(i).values for i in range(rnlvl-1)] + delta_lvl = [recons.iloc[:, i].values for i in range(rnlvl-1)] ix=MultiIndex.from_arrays([list(recons.index)]+delta_lvl) recons.index = ix recons = recons.iloc[:,rnlvl-1:] @@ -6405,7 +6510,8 @@ def make_dtnat_arr(n,nnat=None): with ensure_clean('.csv') as pth: df=DataFrame(dict(a=s1,b=s2)) df.to_csv(pth,chunksize=chunksize) - recons = DataFrame.from_csv(pth).convert_objects('coerce') + recons = DataFrame.from_csv(pth).convert_objects(datetime=True, + coerce=True) assert_frame_equal(df, recons,check_names=False,check_less_precise=True) for ncols in [4]: @@ -7115,7 +7221,7 @@ def test_dtypes(self): def test_convert_objects(self): oops = self.mixed_frame.T.T - converted = oops.convert_objects() + converted = oops.convert_objects(datetime=True) assert_frame_equal(converted, self.mixed_frame) self.assertEqual(converted['A'].dtype, np.float64) @@ -7128,7 +7234,8 @@ def test_convert_objects(self): self.mixed_frame['J'] = '1.' self.mixed_frame['K'] = '1' self.mixed_frame.ix[0:5,['J','K']] = 'garbled' - converted = self.mixed_frame.convert_objects(convert_numeric=True) + converted = self.mixed_frame.convert_objects(datetime=True, + numeric=True) self.assertEqual(converted['H'].dtype, 'float64') self.assertEqual(converted['I'].dtype, 'int64') self.assertEqual(converted['J'].dtype, 'float64') @@ -7150,14 +7257,14 @@ def test_convert_objects(self): # mixed in a single column df = DataFrame(dict(s = Series([1, 'na', 3 ,4]))) - result = df.convert_objects(convert_numeric=True) + result = df.convert_objects(datetime=True, numeric=True) expected = DataFrame(dict(s = Series([1, np.nan, 3 ,4]))) assert_frame_equal(result, expected) def test_convert_objects_no_conversion(self): mixed1 = DataFrame( {'a': [1, 2, 3], 'b': [4.0, 5, 6], 'c': ['x', 'y', 'z']}) - mixed2 = mixed1.convert_objects() + mixed2 = mixed1.convert_objects(datetime=True) assert_frame_equal(mixed1, mixed2) def test_append_series_dict(self): @@ -7304,10 +7411,10 @@ def test_asfreq_datetimeindex(self): index=[datetime(2011, 11, 1), datetime(2011, 11, 2), datetime(2011, 11, 3)]) df = df.asfreq('B') - tm.assert_isinstance(df.index, DatetimeIndex) + tm.assertIsInstance(df.index, DatetimeIndex) ts = df['A'].asfreq('B') - tm.assert_isinstance(ts.index, DatetimeIndex) + tm.assertIsInstance(ts.index, DatetimeIndex) def test_at_time_between_time_datetimeindex(self): index = date_range("2012-01-01", "2012-01-05", freq='30min') @@ -7791,10 +7898,21 @@ def test_drop_duplicates(self): expected = df[:2] assert_frame_equal(result, expected) - result = df.drop_duplicates('AAA', take_last=True) + result = df.drop_duplicates('AAA', keep='last') expected = df.ix[[6, 7]] assert_frame_equal(result, expected) + result = df.drop_duplicates('AAA', keep=False) + expected = df.ix[[]] + assert_frame_equal(result, expected) + self.assertEqual(len(result), 0) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates('AAA', take_last=True) + expected = df.ix[[6, 7]] + assert_frame_equal(result, expected) + # multi column expected = df.ix[[0, 1, 2, 3]] result = df.drop_duplicates(np.array(['AAA', 'B'])) @@ -7802,7 +7920,17 @@ def test_drop_duplicates(self): result = df.drop_duplicates(['AAA', 'B']) assert_frame_equal(result, expected) - result = df.drop_duplicates(('AAA', 'B'), take_last=True) + result = df.drop_duplicates(('AAA', 'B'), keep='last') + expected = df.ix[[0, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(('AAA', 'B'), keep=False) + expected = df.ix[[0]] + assert_frame_equal(result, expected) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates(('AAA', 'B'), take_last=True) expected = df.ix[[0, 5, 6, 7]] assert_frame_equal(result, expected) @@ -7814,8 +7942,53 @@ def test_drop_duplicates(self): expected = df2.drop_duplicates(['AAA', 'B']) assert_frame_equal(result, expected) - result = df2.drop_duplicates(take_last=True) - expected = df2.drop_duplicates(['AAA', 'B'], take_last=True) + result = df2.drop_duplicates(keep='last') + expected = df2.drop_duplicates(['AAA', 'B'], keep='last') + assert_frame_equal(result, expected) + + result = df2.drop_duplicates(keep=False) + expected = df2.drop_duplicates(['AAA', 'B'], keep=False) + assert_frame_equal(result, expected) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df2.drop_duplicates(take_last=True) + with tm.assert_produces_warning(FutureWarning): + expected = df2.drop_duplicates(['AAA', 'B'], take_last=True) + assert_frame_equal(result, expected) + + def test_drop_duplicates_for_take_all(self): + df = DataFrame({'AAA': ['foo', 'bar', 'baz', 'bar', + 'foo', 'bar', 'qux', 'foo'], + 'B': ['one', 'one', 'two', 'two', + 'two', 'two', 'one', 'two'], + 'C': [1, 1, 2, 2, 2, 2, 1, 2], + 'D': lrange(8)}) + + # single column + result = df.drop_duplicates('AAA') + expected = df.iloc[[0, 1, 2, 6]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('AAA', keep='last') + expected = df.iloc[[2, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('AAA', keep=False) + expected = df.iloc[[2, 6]] + assert_frame_equal(result, expected) + + # multiple columns + result = df.drop_duplicates(['AAA', 'B']) + expected = df.iloc[[0, 1, 2, 3, 4, 6]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(['AAA', 'B'], keep='last') + expected = df.iloc[[0, 1, 2, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(['AAA', 'B'], keep=False) + expected = df.iloc[[0, 1, 2, 6]] assert_frame_equal(result, expected) def test_drop_duplicates_deprecated_warning(self): @@ -7844,6 +8017,14 @@ def test_drop_duplicates_deprecated_warning(self): self.assertRaises(TypeError, df.drop_duplicates, kwargs={'subset': 'AAA', 'bad_arg': True}) + # deprecate take_last + # Raises warning + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates(take_last=False, subset='AAA') + assert_frame_equal(result, expected) + + self.assertRaises(ValueError, df.drop_duplicates, keep='invalid_name') + def test_drop_duplicates_tuple(self): df = DataFrame({('AA', 'AB'): ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'bar', 'foo'], @@ -7857,7 +8038,18 @@ def test_drop_duplicates_tuple(self): expected = df[:2] assert_frame_equal(result, expected) - result = df.drop_duplicates(('AA', 'AB'), take_last=True) + result = df.drop_duplicates(('AA', 'AB'), keep='last') + expected = df.ix[[6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(('AA', 'AB'), keep=False) + expected = df.ix[[]] # empty df + self.assertEqual(len(result), 0) + assert_frame_equal(result, expected) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates(('AA', 'AB'), take_last=True) expected = df.ix[[6, 7]] assert_frame_equal(result, expected) @@ -7880,7 +8072,18 @@ def test_drop_duplicates_NA(self): expected = df.ix[[0, 2, 3]] assert_frame_equal(result, expected) - result = df.drop_duplicates('A', take_last=True) + result = df.drop_duplicates('A', keep='last') + expected = df.ix[[1, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('A', keep=False) + expected = df.ix[[]] # empty df + assert_frame_equal(result, expected) + self.assertEqual(len(result), 0) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates('A', take_last=True) expected = df.ix[[1, 6, 7]] assert_frame_equal(result, expected) @@ -7889,7 +8092,17 @@ def test_drop_duplicates_NA(self): expected = df.ix[[0, 2, 3, 6]] assert_frame_equal(result, expected) - result = df.drop_duplicates(['A', 'B'], take_last=True) + result = df.drop_duplicates(['A', 'B'], keep='last') + expected = df.ix[[1, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(['A', 'B'], keep=False) + expected = df.ix[[6]] + assert_frame_equal(result, expected) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates(['A', 'B'], take_last=True) expected = df.ix[[1, 5, 6, 7]] assert_frame_equal(result, expected) @@ -7906,7 +8119,18 @@ def test_drop_duplicates_NA(self): expected = df[:2] assert_frame_equal(result, expected) - result = df.drop_duplicates('C', take_last=True) + result = df.drop_duplicates('C', keep='last') + expected = df.ix[[3, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('C', keep=False) + expected = df.ix[[]] # empty df + assert_frame_equal(result, expected) + self.assertEqual(len(result), 0) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates('C', take_last=True) expected = df.ix[[3, 7]] assert_frame_equal(result, expected) @@ -7915,10 +8139,54 @@ def test_drop_duplicates_NA(self): expected = df.ix[[0, 1, 2, 4]] assert_frame_equal(result, expected) - result = df.drop_duplicates(['C', 'B'], take_last=True) + result = df.drop_duplicates(['C', 'B'], keep='last') + expected = df.ix[[1, 3, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates(['C', 'B'], keep=False) + expected = df.ix[[1]] + assert_frame_equal(result, expected) + + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + result = df.drop_duplicates(['C', 'B'], take_last=True) expected = df.ix[[1, 3, 6, 7]] assert_frame_equal(result, expected) + def test_drop_duplicates_NA_for_take_all(self): + # none + df = DataFrame({'A': [None, None, 'foo', 'bar', + 'foo', 'baz', 'bar', 'qux'], + 'C': [1.0, np.nan, np.nan, np.nan, 1., 2., 3, 1.]}) + + # single column + result = df.drop_duplicates('A') + expected = df.iloc[[0, 2, 3, 5, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('A', keep='last') + expected = df.iloc[[1, 4, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('A', keep=False) + expected = df.iloc[[5, 7]] + assert_frame_equal(result, expected) + + # nan + + # single column + result = df.drop_duplicates('C') + expected = df.iloc[[0, 1, 5, 6]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('C', keep='last') + expected = df.iloc[[3, 5, 6, 7]] + assert_frame_equal(result, expected) + + result = df.drop_duplicates('C', keep=False) + expected = df.iloc[[5, 6]] + assert_frame_equal(result, expected) + def test_drop_duplicates_inplace(self): orig = DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'bar', 'foo'], @@ -7935,7 +8203,22 @@ def test_drop_duplicates_inplace(self): assert_frame_equal(result, expected) df = orig.copy() - df.drop_duplicates('A', take_last=True, inplace=True) + df.drop_duplicates('A', keep='last', inplace=True) + expected = orig.ix[[6, 7]] + result = df + assert_frame_equal(result, expected) + + df = orig.copy() + df.drop_duplicates('A', keep=False, inplace=True) + expected = orig.ix[[]] + result = df + assert_frame_equal(result, expected) + self.assertEqual(len(df), 0) + + # deprecate take_last + df = orig.copy() + with tm.assert_produces_warning(FutureWarning): + df.drop_duplicates('A', take_last=True, inplace=True) expected = orig.ix[[6, 7]] result = df assert_frame_equal(result, expected) @@ -7948,7 +8231,21 @@ def test_drop_duplicates_inplace(self): assert_frame_equal(result, expected) df = orig.copy() - df.drop_duplicates(['A', 'B'], take_last=True, inplace=True) + df.drop_duplicates(['A', 'B'], keep='last', inplace=True) + expected = orig.ix[[0, 5, 6, 7]] + result = df + assert_frame_equal(result, expected) + + df = orig.copy() + df.drop_duplicates(['A', 'B'], keep=False, inplace=True) + expected = orig.ix[[0]] + result = df + assert_frame_equal(result, expected) + + # deprecate take_last + df = orig.copy() + with tm.assert_produces_warning(FutureWarning): + df.drop_duplicates(['A', 'B'], take_last=True, inplace=True) expected = orig.ix[[0, 5, 6, 7]] result = df assert_frame_equal(result, expected) @@ -7964,8 +8261,23 @@ def test_drop_duplicates_inplace(self): assert_frame_equal(result, expected) df2 = orig2.copy() - df2.drop_duplicates(take_last=True, inplace=True) - expected = orig2.drop_duplicates(['A', 'B'], take_last=True) + df2.drop_duplicates(keep='last', inplace=True) + expected = orig2.drop_duplicates(['A', 'B'], keep='last') + result = df2 + assert_frame_equal(result, expected) + + df2 = orig2.copy() + df2.drop_duplicates(keep=False, inplace=True) + expected = orig2.drop_duplicates(['A', 'B'], keep=False) + result = df2 + assert_frame_equal(result, expected) + + # deprecate take_last + df2 = orig2.copy() + with tm.assert_produces_warning(FutureWarning): + df2.drop_duplicates(take_last=True, inplace=True) + with tm.assert_produces_warning(FutureWarning): + expected = orig2.drop_duplicates(['A', 'B'], take_last=True) result = df2 assert_frame_equal(result, expected) @@ -9354,7 +9666,7 @@ def test_xs_duplicates(self): df = DataFrame(randn(5, 2), index=['b', 'b', 'c', 'b', 'a']) cross = df.xs('c') - exp = df.irow(2) + exp = df.iloc[2] assert_series_equal(cross, exp) def test_xs_keep_level(self): @@ -9423,6 +9735,47 @@ def test_pivot_integer_bug(self): repr(result) self.assert_numpy_array_equal(result.columns, ['A', 'B']) + def test_pivot_index_none(self): + # gh-3962 + data = { + 'index': ['A', 'B', 'C', 'C', 'B', 'A'], + 'columns': ['One', 'One', 'One', 'Two', 'Two', 'Two'], + 'values': [1., 2., 3., 3., 2., 1.] + } + + frame = DataFrame(data).set_index('index') + result = frame.pivot(columns='columns', values='values') + expected = DataFrame({ + 'One': {'A': 1., 'B': 2., 'C': 3.}, + 'Two': {'A': 1., 'B': 2., 'C': 3.} + }) + + expected.index.name, expected.columns.name = 'index', 'columns' + assert_frame_equal(result, expected) + + # omit values + result = frame.pivot(columns='columns') + + expected.columns = pd.MultiIndex.from_tuples([('values', 'One'), + ('values', 'Two')], + names=[None, 'columns']) + expected.index.name = 'index' + assert_frame_equal(result, expected, check_names=False) + self.assertEqual(result.index.name, 'index',) + self.assertEqual(result.columns.names, (None, 'columns')) + expected.columns = expected.columns.droplevel(0) + + data = { + 'index': range(7), + 'columns': ['One', 'One', 'One', 'Two', 'Two', 'Two'], + 'values': [1., 2., 3., 3., 2., 1.] + } + + result = frame.pivot(columns='columns', values='values') + + expected.columns.name = 'columns' + assert_frame_equal(result, expected) + def test_reindex(self): newFrame = self.frame.reindex(self.ts1.index) @@ -9494,6 +9847,18 @@ def test_reindex_nan(self): df.index = df.index.astype('object') tm.assert_frame_equal(df.reindex(i), df.iloc[j]) + # GH10388 + df = pd.DataFrame({'other':['a', 'b', np.nan, 'c'], + 'date':['2015-03-22', np.nan, '2012-01-08', np.nan], + 'amount':[2, 3, 4, 5]}) + + df['date'] = pd.to_datetime(df.date) + df['delta'] = (pd.to_datetime('2015-06-18') - df['date']).shift(1) + + left = df.set_index(['delta', 'other', 'date']).reset_index() + right = df.reindex(columns=['delta', 'other', 'date', 'amount']) + assert_frame_equal(left, right) + def test_reindex_name_remains(self): s = Series(random.rand(10)) df = DataFrame(s, index=np.arange(len(s))) @@ -9772,6 +10137,39 @@ def test_align_int_fill_bug(self): expected = df2 - df2.mean() assert_frame_equal(result, expected) + def test_align_multiindex(self): + # GH 10665 + # same test cases as test_align_multiindex in test_series.py + + midx = pd.MultiIndex.from_product([range(2), range(3), range(2)], + names=('a', 'b', 'c')) + idx = pd.Index(range(2), name='b') + df1 = pd.DataFrame(np.arange(12,dtype='int64'), index=midx) + df2 = pd.DataFrame(np.arange(2,dtype='int64'), index=idx) + + # these must be the same results (but flipped) + res1l, res1r = df1.align(df2, join='left') + res2l, res2r = df2.align(df1, join='right') + + expl = df1 + tm.assert_frame_equal(expl, res1l) + tm.assert_frame_equal(expl, res2r) + expr = pd.DataFrame([0, 0, 1, 1, np.nan, np.nan] * 2, index=midx) + tm.assert_frame_equal(expr, res1r) + tm.assert_frame_equal(expr, res2l) + + res1l, res1r = df1.align(df2, join='right') + res2l, res2r = df2.align(df1, join='left') + + exp_idx = pd.MultiIndex.from_product([range(2), range(2), range(2)], + names=('a', 'b', 'c')) + expl = pd.DataFrame([0, 1, 2, 3, 6, 7, 8, 9], index=exp_idx) + tm.assert_frame_equal(expl, res1l) + tm.assert_frame_equal(expl, res2r) + expr = pd.DataFrame([0, 0, 1, 1] * 2, index=exp_idx) + tm.assert_frame_equal(expr, res1r) + tm.assert_frame_equal(expr, res2l) + def test_where(self): default_frame = DataFrame(np.random.randn(5, 3),columns=['A','B','C']) @@ -10006,6 +10404,110 @@ def test_where_complex(self): df[df.abs() >= 5] = np.nan assert_frame_equal(df,expected) + def test_where_axis(self): + # GH 9736 + df = DataFrame(np.random.randn(2, 2)) + mask = DataFrame([[False, False], [False, False]]) + s = Series([0, 1]) + + expected = DataFrame([[0, 0], [1, 1]], dtype='float64') + result = df.where(mask, s, axis='index') + assert_frame_equal(result, expected) + + result = df.copy() + result.where(mask, s, axis='index', inplace=True) + assert_frame_equal(result, expected) + + expected = DataFrame([[0, 1], [0, 1]], dtype='float64') + result = df.where(mask, s, axis='columns') + assert_frame_equal(result, expected) + + result = df.copy() + result.where(mask, s, axis='columns', inplace=True) + assert_frame_equal(result, expected) + + # Upcast needed + df = DataFrame([[1, 2], [3, 4]], dtype='int64') + mask = DataFrame([[False, False], [False, False]]) + s = Series([0, np.nan]) + + expected = DataFrame([[0, 0], [np.nan, np.nan]], dtype='float64') + result = df.where(mask, s, axis='index') + assert_frame_equal(result, expected) + + result = df.copy() + result.where(mask, s, axis='index', inplace=True) + assert_frame_equal(result, expected) + + expected = DataFrame([[0, np.nan], [0, np.nan]], dtype='float64') + result = df.where(mask, s, axis='columns') + assert_frame_equal(result, expected) + + expected = DataFrame({0 : np.array([0, 0], dtype='int64'), + 1 : np.array([np.nan, np.nan], dtype='float64')}) + result = df.copy() + result.where(mask, s, axis='columns', inplace=True) + assert_frame_equal(result, expected) + + # Multiple dtypes (=> multiple Blocks) + df = pd.concat([DataFrame(np.random.randn(10, 2)), + DataFrame(np.random.randint(0, 10, size=(10, 2)))], + ignore_index=True, axis=1) + mask = DataFrame(False, columns=df.columns, index=df.index) + s1 = Series(1, index=df.columns) + s2 = Series(2, index=df.index) + + result = df.where(mask, s1, axis='columns') + expected = DataFrame(1.0, columns=df.columns, index=df.index) + expected[2] = expected[2].astype(int) + expected[3] = expected[3].astype(int) + assert_frame_equal(result, expected) + + result = df.copy() + result.where(mask, s1, axis='columns', inplace=True) + assert_frame_equal(result, expected) + + result = df.where(mask, s2, axis='index') + expected = DataFrame(2.0, columns=df.columns, index=df.index) + expected[2] = expected[2].astype(int) + expected[3] = expected[3].astype(int) + assert_frame_equal(result, expected) + + result = df.copy() + result.where(mask, s2, axis='index', inplace=True) + assert_frame_equal(result, expected) + + # DataFrame vs DataFrame + d1 = df.copy().drop(1, axis=0) + expected = df.copy() + expected.loc[1, :] = np.nan + + result = df.where(mask, d1) + assert_frame_equal(result, expected) + result = df.where(mask, d1, axis='index') + assert_frame_equal(result, expected) + result = df.copy() + result.where(mask, d1, inplace=True) + assert_frame_equal(result, expected) + result = df.copy() + result.where(mask, d1, inplace=True, axis='index') + assert_frame_equal(result, expected) + + d2 = df.copy().drop(1, axis=1) + expected = df.copy() + expected.loc[:, 1] = np.nan + + result = df.where(mask, d2) + assert_frame_equal(result, expected) + result = df.where(mask, d2, axis='columns') + assert_frame_equal(result, expected) + result = df.copy() + result.where(mask, d2, inplace=True) + assert_frame_equal(result, expected) + result = df.copy() + result.where(mask, d2, inplace=True, axis='columns') + assert_frame_equal(result, expected) + def test_mask(self): df = DataFrame(np.random.randn(5, 3)) cond = df > 0 @@ -10320,6 +10822,15 @@ def test_shift_bool(self): columns=['high', 'low']) assert_frame_equal(rs, xp) + def test_shift_categorical(self): + # GH 9416 + s1 = pd.Series(['a', 'b', 'c'], dtype='category') + s2 = pd.Series(['A', 'B', 'C'], dtype='category') + df = DataFrame({'one': s1, 'two': s2}) + rs = df.shift(1) + xp = DataFrame({'one': s1.shift(1), 'two': s2.shift(1)}) + assert_frame_equal(rs, xp) + def test_shift_empty(self): # Regression test for #8019 df = DataFrame({'foo': []}) @@ -10382,6 +10893,13 @@ def test_apply(self): [[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['a', 'a', 'c']) self.assertRaises(ValueError, df.apply, lambda x: x, 2) + # GH9573 + df = DataFrame({'c0':['A','A','B','B'], 'c1':['C','C','D','D']}) + df = df.apply(lambda ts: ts.astype('category')) + self.assertEqual(df.shape, (4, 2)) + self.assertTrue(isinstance(df['c0'].dtype, com.CategoricalDtype)) + self.assertTrue(isinstance(df['c1'].dtype, com.CategoricalDtype)) + def test_apply_mixed_datetimelike(self): # mixed datetimelike # GH 7778 @@ -10507,10 +11025,10 @@ def _checkit(axis=0, raw=False): res = df.apply(f, axis=axis, raw=raw) if is_reduction: agg_axis = df._get_agg_axis(axis) - tm.assert_isinstance(res, Series) + tm.assertIsInstance(res, Series) self.assertIs(res.index, agg_axis) else: - tm.assert_isinstance(res, DataFrame) + tm.assertIsInstance(res, DataFrame) _checkit() _checkit(axis=1) @@ -10523,7 +11041,7 @@ def _checkit(axis=0, raw=False): _check(no_index, lambda x: x.mean()) result = no_cols.apply(lambda x: x.mean(), broadcast=True) - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) def test_apply_with_args_kwds(self): def add_some(x, howmuch=0): @@ -10650,7 +11168,7 @@ def test_apply_convert_objects(self): 'F': np.random.randn(11)}) result = data.apply(lambda x: x, axis=1) - assert_frame_equal(result.convert_objects(), data) + assert_frame_equal(result.convert_objects(datetime=True), data) def test_apply_attach_name(self): result = self.frame.apply(lambda x: x.name) @@ -10682,7 +11200,7 @@ def test_apply_multi_index(self): s.index = MultiIndex.from_arrays([['a','a','b'], ['c','d','d']]) s.columns = ['col1','col2'] res = s.apply(lambda x: Series({'min': min(x), 'max': max(x)}), 1) - tm.assert_isinstance(res.index, MultiIndex) + tm.assertIsInstance(res.index, MultiIndex) def test_applymap(self): applied = self.frame.applymap(lambda x: x * 2) @@ -10691,7 +11209,7 @@ def test_applymap(self): # GH #465, function returning tuples result = self.frame.applymap(lambda x: (x, x)) - tm.assert_isinstance(result['A'][0], tuple) + tm.assertIsInstance(result['A'][0], tuple) # GH 2909, object conversion to float in constructor? df = DataFrame(data=[1,'a']) @@ -10734,7 +11252,7 @@ def test_filter(self): idx = self.frame.index[0:4] filtered = self.frame.filter(idx, axis='index') expected = self.frame.reindex(index=idx) - assert_frame_equal(filtered,expected) + assert_frame_equal(filtered, expected) # like fcopy = self.frame.copy() @@ -10749,6 +11267,17 @@ def test_filter(self): filtered = df.filter(like='_') self.assertEqual(len(filtered.columns), 2) + # regex with ints in column names + # from PR #10384 + df = DataFrame(0., index=[0, 1, 2], columns=['A1', 1, 'B', 2, 'C']) + expected = DataFrame(0., index=[0, 1, 2], columns=[1, 2]) + filtered = df.filter(regex='^[0-9]+$') + self.assert_frame_equal(filtered, expected) + + expected = DataFrame(0., index=[0, 1, 2], columns=[0, '0', 1, '1']) + filtered = expected.filter(regex='^[0-9]+$') # shouldn't remove anything + self.assert_frame_equal(filtered, expected) + # pass in None with assertRaisesRegexp(TypeError, 'Must pass'): self.frame.filter(items=None) @@ -11432,61 +11961,65 @@ def test_update_from_non_df(self): assert_frame_equal(df, expected) def test_combineAdd(self): - # trivial - comb = self.frame.combineAdd(self.frame) - assert_frame_equal(comb, self.frame * 2) - - # more rigorous - a = DataFrame([[1., nan, nan, 2., nan]], - columns=np.arange(5)) - b = DataFrame([[2., 3., nan, 2., 6., nan]], - columns=np.arange(6)) - expected = DataFrame([[3., 3., nan, 4., 6., nan]], - columns=np.arange(6)) - - result = a.combineAdd(b) - assert_frame_equal(result, expected) - result2 = a.T.combineAdd(b.T) - assert_frame_equal(result2, expected.T) - - expected2 = a.combine(b, operator.add, fill_value=0.) - assert_frame_equal(expected, expected2) - - # corner cases - comb = self.frame.combineAdd(self.empty) - assert_frame_equal(comb, self.frame) - comb = self.empty.combineAdd(self.frame) - assert_frame_equal(comb, self.frame) - - # integer corner case - df1 = DataFrame({'x': [5]}) - df2 = DataFrame({'x': [1]}) - df3 = DataFrame({'x': [6]}) - comb = df1.combineAdd(df2) - assert_frame_equal(comb, df3) - - # mixed type GH2191 - df1 = DataFrame({'A': [1, 2], 'B': [3, 4]}) - df2 = DataFrame({'A': [1, 2], 'C': [5, 6]}) - rs = df1.combineAdd(df2) - xp = DataFrame({'A': [2, 4], 'B': [3, 4.], 'C': [5, 6.]}) - assert_frame_equal(xp, rs) + with tm.assert_produces_warning(FutureWarning): + # trivial + comb = self.frame.combineAdd(self.frame) + assert_frame_equal(comb, self.frame * 2) + + # more rigorous + a = DataFrame([[1., nan, nan, 2., nan]], + columns=np.arange(5)) + b = DataFrame([[2., 3., nan, 2., 6., nan]], + columns=np.arange(6)) + expected = DataFrame([[3., 3., nan, 4., 6., nan]], + columns=np.arange(6)) + + result = a.combineAdd(b) + assert_frame_equal(result, expected) + result2 = a.T.combineAdd(b.T) + assert_frame_equal(result2, expected.T) + + expected2 = a.combine(b, operator.add, fill_value=0.) + assert_frame_equal(expected, expected2) + + # corner cases + comb = self.frame.combineAdd(self.empty) + assert_frame_equal(comb, self.frame) + + comb = self.empty.combineAdd(self.frame) + assert_frame_equal(comb, self.frame) + + # integer corner case + df1 = DataFrame({'x': [5]}) + df2 = DataFrame({'x': [1]}) + df3 = DataFrame({'x': [6]}) + comb = df1.combineAdd(df2) + assert_frame_equal(comb, df3) + + # mixed type GH2191 + df1 = DataFrame({'A': [1, 2], 'B': [3, 4]}) + df2 = DataFrame({'A': [1, 2], 'C': [5, 6]}) + rs = df1.combineAdd(df2) + xp = DataFrame({'A': [2, 4], 'B': [3, 4.], 'C': [5, 6.]}) + assert_frame_equal(xp, rs) # TODO: test integer fill corner? def test_combineMult(self): - # trivial - comb = self.frame.combineMult(self.frame) - assert_frame_equal(comb, self.frame ** 2) + with tm.assert_produces_warning(FutureWarning): + # trivial + comb = self.frame.combineMult(self.frame) - # corner cases - comb = self.frame.combineMult(self.empty) - assert_frame_equal(comb, self.frame) + assert_frame_equal(comb, self.frame ** 2) - comb = self.empty.combineMult(self.frame) - assert_frame_equal(comb, self.frame) + # corner cases + comb = self.frame.combineMult(self.empty) + assert_frame_equal(comb, self.frame) + + comb = self.empty.combineMult(self.frame) + assert_frame_equal(comb, self.frame) def test_combine_generic(self): df1 = self.frame @@ -11674,10 +12207,10 @@ def test_count(self): # corner case frame = DataFrame() ct1 = frame.count(1) - tm.assert_isinstance(ct1, Series) + tm.assertIsInstance(ct1, Series) ct2 = frame.count(0) - tm.assert_isinstance(ct2, Series) + tm.assertIsInstance(ct2, Series) # GH #423 df = DataFrame(index=lrange(10)) @@ -12036,8 +12569,8 @@ def test_mode(self): def test_sum_corner(self): axis0 = self.empty.sum(0) axis1 = self.empty.sum(1) - tm.assert_isinstance(axis0, Series) - tm.assert_isinstance(axis1, Series) + tm.assertIsInstance(axis0, Series) + tm.assertIsInstance(axis1, Series) self.assertEqual(len(axis0), 0) self.assertEqual(len(axis1), 0) @@ -12114,8 +12647,8 @@ def test_quantile(self): result = df.quantile([.5, .75], axis=1) expected = DataFrame({1: [1.5, 1.75], 2: [2.5, 2.75], - 3: [3.5, 3.75]}, index=["0.5", "0.75"]) - assert_frame_equal(result, expected) + 3: [3.5, 3.75]}, index=[0.5, 0.75]) + assert_frame_equal(result, expected, check_index_type=True) # We may want to break API in the future to change this # so that we exclude non-numeric along the same axis @@ -14443,16 +14976,8 @@ def test_assign_bad(self): def test_dataframe_metadata(self): - class TestDataFrame(DataFrame): - _metadata = ['testattr'] - - @property - def _constructor(self): - return TestDataFrame - - - df = TestDataFrame({'X': [1, 2, 3], 'Y': [1, 2, 3]}, - index=['a', 'b', 'c']) + df = SubclassedDataFrame({'X': [1, 2, 3], 'Y': [1, 2, 3]}, + index=['a', 'b', 'c']) df.testattr = 'XXX' self.assertEqual(df.testattr, 'XXX') @@ -14461,6 +14986,46 @@ def _constructor(self): self.assertEqual(df.iloc[[0, 1], :].testattr, 'XXX') # GH9776 self.assertEqual(df.iloc[0:1, :].testattr, 'XXX') + # GH10553 + unpickled = self.round_trip_pickle(df) + assert_frame_equal(df, unpickled) + self.assertEqual(df._metadata, unpickled._metadata) + self.assertEqual(df.testattr, unpickled.testattr) + + def test_nlargest(self): + # GH10393 + from string import ascii_lowercase + df = pd.DataFrame({'a': np.random.permutation(10), + 'b': list(ascii_lowercase[:10])}) + result = df.nlargest(5, 'a') + expected = df.sort('a', ascending=False).head(5) + tm.assert_frame_equal(result, expected) + + def test_nlargest_multiple_columns(self): + from string import ascii_lowercase + df = pd.DataFrame({'a': np.random.permutation(10), + 'b': list(ascii_lowercase[:10]), + 'c': np.random.permutation(10).astype('float64')}) + result = df.nlargest(5, ['a', 'b']) + expected = df.sort(['a', 'b'], ascending=False).head(5) + tm.assert_frame_equal(result, expected) + + def test_nsmallest(self): + from string import ascii_lowercase + df = pd.DataFrame({'a': np.random.permutation(10), + 'b': list(ascii_lowercase[:10])}) + result = df.nsmallest(5, 'a') + expected = df.sort('a').head(5) + tm.assert_frame_equal(result, expected) + + def test_nsmallest_multiple_columns(self): + from string import ascii_lowercase + df = pd.DataFrame({'a': np.random.permutation(10), + 'b': list(ascii_lowercase[:10]), + 'c': np.random.permutation(10).astype('float64')}) + result = df.nsmallest(5, ['a', 'c']) + expected = df.sort(['a', 'c']).head(5) + tm.assert_frame_equal(result, expected) def test_to_panel_expanddim(self): # GH 9762 diff --git a/pandas/tests/test_generic.py b/pandas/tests/test_generic.py index 44f7791b7f8ba..c1f6045c61d54 100644 --- a/pandas/tests/test_generic.py +++ b/pandas/tests/test_generic.py @@ -374,7 +374,7 @@ def test_sample(self): self._compare(o.sample(frac=0.7,random_state=np.random.RandomState(test)), o.sample(frac=0.7, random_state=np.random.RandomState(test))) - + # Check for error when random_state argument invalid. with tm.assertRaises(ValueError): @@ -415,6 +415,10 @@ def test_sample(self): bad_weights = [0.5]*11 o.sample(n=3, weights=bad_weights) + with tm.assertRaises(ValueError): + bad_weight_series = Series([0,0,0.2]) + o.sample(n=4, weights=bad_weight_series) + # Check won't accept negative weights with tm.assertRaises(ValueError): bad_weights = [-0.1]*10 @@ -431,6 +435,16 @@ def test_sample(self): weights_with_ninf[0] = -np.inf o.sample(n=3, weights=weights_with_ninf) + # All zeros raises errors + zero_weights = [0]*10 + with tm.assertRaises(ValueError): + o.sample(n=3, weights=zero_weights) + + # All missing weights + nan_weights = [np.nan]*10 + with tm.assertRaises(ValueError): + o.sample(n=3, weights=nan_weights) + # A few dataframe test with degenerate weights. easy_weight_list = [0]*10 @@ -496,7 +510,6 @@ def test_sample(self): assert_frame_equal(df.sample(n=1, axis='index', weights=weight), df.iloc[5:6]) - # Check out of range axis values with tm.assertRaises(ValueError): df.sample(n=1, axis=2) @@ -527,6 +540,26 @@ def test_sample(self): assert_panel_equal(p.sample(n=3, random_state=42), p.sample(n=3, axis=1, random_state=42)) assert_frame_equal(df.sample(n=3, random_state=42), df.sample(n=3, axis=0, random_state=42)) + # Test that function aligns weights with frame + df = DataFrame({'col1':[5,6,7], 'col2':['a','b','c'], }, index = [9,5,3]) + s = Series([1,0,0], index=[3,5,9]) + assert_frame_equal(df.loc[[3]], df.sample(1, weights=s)) + + # Weights have index values to be dropped because not in + # sampled DataFrame + s2 = Series([0.001,0,10000], index=[3,5,10]) + assert_frame_equal(df.loc[[3]], df.sample(1, weights=s2)) + + # Weights have empty values to be filed with zeros + s3 = Series([0.01,0], index=[3,5]) + assert_frame_equal(df.loc[[3]], df.sample(1, weights=s3)) + + # No overlap in weight and sampled DataFrame indices + s4 = Series([1,0], index=[1,2]) + with tm.assertRaises(ValueError): + df.sample(1, weights=s4) + + def test_size_compat(self): # GH8846 # size property should be defined @@ -1117,6 +1150,14 @@ def test_interp_inplace(self): result['a'].interpolate(inplace=True, downcast='infer') assert_frame_equal(result, expected.astype('int64')) + def test_interp_inplace_row(self): + # GH 10395 + result = DataFrame({'a': [1.,2.,3.,4.], 'b': [np.nan, 2., 3., 4.], + 'c': [3, 2, 2, 2]}) + expected = result.interpolate(method='linear', axis=1, inplace=False) + result.interpolate(method='linear', axis=1, inplace=True) + assert_frame_equal(result, expected) + def test_interp_ignore_all_good(self): # GH df = DataFrame({'A': [1, 2, np.nan, 4], @@ -1365,6 +1406,23 @@ def test_spline(self): expected = Series([1., 2., 3., 4., 5., 6., 7.]) assert_series_equal(result, expected) + def test_spline_extrapolate(self): + tm.skip_if_no_package('scipy', '0.15', 'setting ext on scipy.interpolate.UnivariateSpline') + s = Series([1, 2, 3, 4, np.nan, 6, np.nan]) + result3 = s.interpolate(method='spline', order=1, ext=3) + expected3 = Series([1., 2., 3., 4., 5., 6., 6.]) + assert_series_equal(result3, expected3) + + result1 = s.interpolate(method='spline', order=1, ext=0) + expected1 = Series([1., 2., 3., 4., 5., 6., 7.]) + assert_series_equal(result1, expected1) + + def test_spline_smooth(self): + tm._skip_if_no_scipy() + s = Series([1, 2, np.nan, 4, 5.1, np.nan, 7]) + self.assertNotEqual(s.interpolate(method='spline', order=3, s=0)[5], + s.interpolate(method='spline', order=3)[5]) + def test_metadata_propagation_indiv(self): # groupby diff --git a/pandas/tests/test_graphics.py b/pandas/tests/test_graphics.py index 2c8123244c53c..1907cbd78da1d 100644 --- a/pandas/tests/test_graphics.py +++ b/pandas/tests/test_graphics.py @@ -25,18 +25,16 @@ from numpy import random from numpy.random import rand, randn -from numpy.testing import assert_array_equal, assert_allclose +from numpy.testing import assert_allclose from numpy.testing.decorators import slow import pandas.tools.plotting as plotting -def _skip_if_mpl_14_or_dev_boxplot(): - # GH 8382 - # Boxplot failures on 1.4 and 1.4.1 - # Don't need try / except since that's done at class level - import matplotlib - if str(matplotlib.__version__) >= LooseVersion('1.4'): - raise nose.SkipTest("Matplotlib Regression in 1.4 and current dev.") +""" +These tests are for ``Dataframe.plot`` and ``Series.plot``. +Other plot methods such as ``.hist``, ``.boxplot`` and other miscellaneous +are tested in test_graphics_others.py +""" def _skip_if_no_scipy_gaussian_kde(): @@ -46,6 +44,7 @@ def _skip_if_no_scipy_gaussian_kde(): except ImportError: raise nose.SkipTest("scipy version doesn't support gaussian_kde") + def _ok_for_gaussian_kde(kind): if kind in ['kde','density']: try: @@ -55,6 +54,7 @@ def _ok_for_gaussian_kde(kind): return False return True + @tm.mplskip class TestPlotBase(tm.TestCase): @@ -646,11 +646,11 @@ def test_bar_log(self): expected = np.hstack((.1, expected, 1e4)) ax = Series([200, 500]).plot(log=True, kind='bar') - assert_array_equal(ax.yaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax.yaxis.get_ticklocs(), expected) tm.close() ax = Series([200, 500]).plot(log=True, kind='barh') - assert_array_equal(ax.xaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax.xaxis.get_ticklocs(), expected) tm.close() # GH 9905 @@ -660,13 +660,13 @@ def test_bar_log(self): expected = np.hstack((1.0e-04, expected, 1.0e+01)) ax = Series([0.1, 0.01, 0.001]).plot(log=True, kind='bar') - assert_array_equal(ax.get_ylim(), (0.001, 0.10000000000000001)) - assert_array_equal(ax.yaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax.get_ylim(), (0.001, 0.10000000000000001)) + tm.assert_numpy_array_equal(ax.yaxis.get_ticklocs(), expected) tm.close() ax = Series([0.1, 0.01, 0.001]).plot(log=True, kind='barh') - assert_array_equal(ax.get_xlim(), (0.001, 0.10000000000000001)) - assert_array_equal(ax.xaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax.get_xlim(), (0.001, 0.10000000000000001)) + tm.assert_numpy_array_equal(ax.xaxis.get_ticklocs(), expected) @slow def test_bar_ignore_index(self): @@ -943,20 +943,6 @@ def test_plot_fails_with_dupe_color_and_style(self): with tm.assertRaises(ValueError): x.plot(style='k--', color='k') - @slow - def test_hist_by_no_extra_plots(self): - df = self.hist_df - axes = df.height.hist(by=df.gender) - self.assertEqual(len(self.plt.get_fignums()), 1) - - def test_plot_fails_when_ax_differs_from_figure(self): - from pylab import figure - fig1 = figure() - fig2 = figure() - ax1 = fig1.add_subplot(111) - with tm.assertRaises(AssertionError): - self.ts.hist(ax=ax1, figure=fig2) - @slow def test_hist_kde(self): ax = self.ts.plot(kind='hist', logy=True) @@ -1001,12 +987,12 @@ def test_kde_missing_vals(self): def test_hist_kwargs(self): ax = self.ts.plot(kind='hist', bins=5) self.assertEqual(len(ax.patches), 5) - self._check_text_labels(ax.yaxis.get_label(), 'Degree') + self._check_text_labels(ax.yaxis.get_label(), 'Frequency') tm.close() if self.mpl_ge_1_3_1: ax = self.ts.plot(kind='hist', orientation='horizontal') - self._check_text_labels(ax.xaxis.get_label(), 'Degree') + self._check_text_labels(ax.xaxis.get_label(), 'Frequency') tm.close() ax = self.ts.plot(kind='hist', align='left', stacked=True) @@ -1037,25 +1023,6 @@ def test_boxplot_series(self): self._check_text_labels(ylabels, [''] * len(ylabels)) @slow - def test_autocorrelation_plot(self): - from pandas.tools.plotting import autocorrelation_plot - _check_plot_works(autocorrelation_plot, self.ts) - _check_plot_works(autocorrelation_plot, self.ts.values) - - ax = autocorrelation_plot(self.ts, label='Test') - self._check_legend_labels(ax, labels=['Test']) - - @slow - def test_lag_plot(self): - from pandas.tools.plotting import lag_plot - _check_plot_works(lag_plot, self.ts) - _check_plot_works(lag_plot, self.ts, lag=5) - - @slow - def test_bootstrap_plot(self): - from pandas.tools.plotting import bootstrap_plot - _check_plot_works(bootstrap_plot, self.ts, size=10) - def test_invalid_plot_data(self): s = Series(list('abcd')) for kind in plotting._common_kinds: @@ -1146,6 +1113,77 @@ def test_series_grid_settings(self): self._check_grid_settings(Series([1,2,3]), plotting._series_kinds + plotting._common_kinds) + @slow + def test_standard_colors(self): + for c in ['r', 'red', 'green', '#FF0000']: + result = plotting._get_standard_colors(1, color=c) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(1, color=[c]) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(3, color=c) + self.assertEqual(result, [c] * 3) + + result = plotting._get_standard_colors(3, color=[c]) + self.assertEqual(result, [c] * 3) + + @slow + def test_standard_colors_all(self): + import matplotlib.colors as colors + + # multiple colors like mediumaquamarine + for c in colors.cnames: + result = plotting._get_standard_colors(num_colors=1, color=c) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(num_colors=1, color=[c]) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(num_colors=3, color=c) + self.assertEqual(result, [c] * 3) + + result = plotting._get_standard_colors(num_colors=3, color=[c]) + self.assertEqual(result, [c] * 3) + + # single letter colors like k + for c in colors.ColorConverter.colors: + result = plotting._get_standard_colors(num_colors=1, color=c) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(num_colors=1, color=[c]) + self.assertEqual(result, [c]) + + result = plotting._get_standard_colors(num_colors=3, color=c) + self.assertEqual(result, [c] * 3) + + result = plotting._get_standard_colors(num_colors=3, color=[c]) + self.assertEqual(result, [c] * 3) + + def test_series_plot_color_kwargs(self): + # GH1890 + ax = Series(np.arange(12) + 1).plot(color='green') + self._check_colors(ax.get_lines(), linecolors=['green']) + + def test_time_series_plot_color_kwargs(self): + # #1890 + ax = Series(np.arange(12) + 1, index=date_range( + '1/1/2000', periods=12)).plot(color='green') + self._check_colors(ax.get_lines(), linecolors=['green']) + + def test_time_series_plot_color_with_empty_kwargs(self): + import matplotlib as mpl + + def_colors = mpl.rcParams['axes.color_cycle'] + index = date_range('1/1/2000', periods=12) + s = Series(np.arange(1, 13), index=index) + + ncolors = 3 + + for i in range(ncolors): + ax = s.plot() + self._check_colors(ax.get_lines(), linecolors=def_colors[:ncolors]) + @tm.mplskip class TestDataFramePlots(TestPlotBase): @@ -1736,7 +1774,6 @@ def test_bar_colors(self): default_colors = plt.rcParams.get('axes.color_cycle') - df = DataFrame(randn(5, 5)) ax = df.plot(kind='bar') self._check_colors(ax.patches[::5], facecolors=default_colors[:5]) @@ -1762,6 +1799,11 @@ def test_bar_colors(self): ax = df.ix[:, [0]].plot(kind='bar', color='DodgerBlue') self._check_colors([ax.patches[0]], facecolors=['DodgerBlue']) + tm.close() + + ax = df.plot(kind='bar', color='green') + self._check_colors(ax.patches[::5], facecolors=['green'] * 5) + tm.close() @slow def test_bar_linewidth(self): @@ -2112,7 +2154,7 @@ def test_bar_log_no_subplots(self): # no subplots df = DataFrame({'A': [3] * 5, 'B': lrange(1, 6)}, index=lrange(5)) ax = df.plot(kind='bar', grid=True, log=True) - assert_array_equal(ax.yaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax.yaxis.get_ticklocs(), expected) @slow def test_bar_log_subplots(self): @@ -2124,8 +2166,8 @@ def test_bar_log_subplots(self): Series([300, 500])]).plot(log=True, kind='bar', subplots=True) - assert_array_equal(ax[0].yaxis.get_ticklocs(), expected) - assert_array_equal(ax[1].yaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax[0].yaxis.get_ticklocs(), expected) + tm.assert_numpy_array_equal(ax[1].yaxis.get_ticklocs(), expected) @slow def test_boxplot(self): @@ -2136,7 +2178,7 @@ def test_boxplot(self): ax = _check_plot_works(df.plot, kind='box') self._check_text_labels(ax.get_xticklabels(), labels) - assert_array_equal(ax.xaxis.get_ticklocs(), + tm.assert_numpy_array_equal(ax.xaxis.get_ticklocs(), np.arange(1, len(numeric_cols) + 1)) self.assertEqual(len(ax.lines), self.bp_n_objects * len(numeric_cols)) @@ -2163,7 +2205,7 @@ def test_boxplot(self): numeric_cols = df._get_numeric_data().columns labels = [com.pprint_thing(c) for c in numeric_cols] self._check_text_labels(ax.get_xticklabels(), labels) - assert_array_equal(ax.xaxis.get_ticklocs(), positions) + tm.assert_numpy_array_equal(ax.xaxis.get_ticklocs(), positions) self.assertEqual(len(ax.lines), self.bp_n_objects * len(numeric_cols)) @slow @@ -2189,7 +2231,7 @@ def test_boxplot_vertical(self): positions = np.array([3, 2, 8]) ax = df.plot(kind='box', positions=positions, vert=False) self._check_text_labels(ax.get_yticklabels(), labels) - assert_array_equal(ax.yaxis.get_ticklocs(), positions) + tm.assert_numpy_array_equal(ax.yaxis.get_ticklocs(), positions) self.assertEqual(len(ax.lines), self.bp_n_objects * len(numeric_cols)) @slow @@ -2225,112 +2267,6 @@ def test_boxplot_subplots_return_type(self): expected_keys=['height', 'weight', 'category'], check_ax_title=False) - @slow - def test_boxplot_legacy(self): - df = DataFrame(randn(6, 4), - index=list(string.ascii_letters[:6]), - columns=['one', 'two', 'three', 'four']) - df['indic'] = ['foo', 'bar'] * 3 - df['indic2'] = ['foo', 'bar', 'foo'] * 2 - - _check_plot_works(df.boxplot, return_type='dict') - _check_plot_works(df.boxplot, column=['one', 'two'], return_type='dict') - _check_plot_works(df.boxplot, column=['one', 'two'], by='indic') - _check_plot_works(df.boxplot, column='one', by=['indic', 'indic2']) - _check_plot_works(df.boxplot, by='indic') - _check_plot_works(df.boxplot, by=['indic', 'indic2']) - _check_plot_works(plotting.boxplot, df['one'], return_type='dict') - _check_plot_works(df.boxplot, notch=1, return_type='dict') - _check_plot_works(df.boxplot, by='indic', notch=1) - - df = DataFrame(np.random.rand(10, 2), columns=['Col1', 'Col2']) - df['X'] = Series(['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B']) - df['Y'] = Series(['A'] * 10) - _check_plot_works(df.boxplot, by='X') - - # When ax is supplied and required number of axes is 1, - # passed ax should be used: - fig, ax = self.plt.subplots() - axes = df.boxplot('Col1', by='X', ax=ax) - self.assertIs(ax.get_axes(), axes) - - fig, ax = self.plt.subplots() - axes = df.groupby('Y').boxplot(ax=ax, return_type='axes') - self.assertIs(ax.get_axes(), axes['A']) - - # Multiple columns with an ax argument should use same figure - fig, ax = self.plt.subplots() - axes = df.boxplot(column=['Col1', 'Col2'], by='X', ax=ax, return_type='axes') - self.assertIs(axes['Col1'].get_figure(), fig) - - # When by is None, check that all relevant lines are present in the dict - fig, ax = self.plt.subplots() - d = df.boxplot(ax=ax, return_type='dict') - lines = list(itertools.chain.from_iterable(d.values())) - self.assertEqual(len(ax.get_lines()), len(lines)) - - @slow - def test_boxplot_return_type_legacy(self): - # API change in https://github.com/pydata/pandas/pull/7096 - import matplotlib as mpl - - df = DataFrame(randn(6, 4), - index=list(string.ascii_letters[:6]), - columns=['one', 'two', 'three', 'four']) - with tm.assertRaises(ValueError): - df.boxplot(return_type='NOTATYPE') - - with tm.assert_produces_warning(FutureWarning): - result = df.boxplot() - # change to Axes in future - self._check_box_return_type(result, 'dict') - - with tm.assert_produces_warning(False): - result = df.boxplot(return_type='dict') - self._check_box_return_type(result, 'dict') - - with tm.assert_produces_warning(False): - result = df.boxplot(return_type='axes') - self._check_box_return_type(result, 'axes') - - with tm.assert_produces_warning(False): - result = df.boxplot(return_type='both') - self._check_box_return_type(result, 'both') - - @slow - def test_boxplot_axis_limits(self): - - def _check_ax_limits(col, ax): - y_min, y_max = ax.get_ylim() - self.assertTrue(y_min <= col.min()) - self.assertTrue(y_max >= col.max()) - - df = self.hist_df.copy() - df['age'] = np.random.randint(1, 20, df.shape[0]) - # One full row - height_ax, weight_ax = df.boxplot(['height', 'weight'], by='category') - _check_ax_limits(df['height'], height_ax) - _check_ax_limits(df['weight'], weight_ax) - self.assertEqual(weight_ax._sharey, height_ax) - - # Two rows, one partial - p = df.boxplot(['height', 'weight', 'age'], by='category') - height_ax, weight_ax, age_ax = p[0, 0], p[0, 1], p[1, 0] - dummy_ax = p[1, 1] - _check_ax_limits(df['height'], height_ax) - _check_ax_limits(df['weight'], weight_ax) - _check_ax_limits(df['age'], age_ax) - self.assertEqual(weight_ax._sharey, height_ax) - self.assertEqual(age_ax._sharey, height_ax) - self.assertIsNone(dummy_ax._sharey) - - @slow - def test_boxplot_empty_column(self): - _skip_if_mpl_14_or_dev_boxplot() - df = DataFrame(np.random.randn(20, 4)) - df.loc[:, 0] = np.nan - _check_plot_works(df.boxplot, return_type='axes') - @slow def test_kde_df(self): tm._skip_if_no_scipy() @@ -2478,251 +2414,6 @@ def test_hist_df_coord(self): self._check_box_coord(axes[2].patches, expected_x=np.array([0, 0, 0, 0, 0]), expected_w=np.array([6, 7, 8, 9, 10])) - @slow - def test_hist_df_legacy(self): - _check_plot_works(self.hist_df.hist) - - # make sure layout is handled - df = DataFrame(randn(100, 3)) - axes = _check_plot_works(df.hist, grid=False) - self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) - self.assertFalse(axes[1, 1].get_visible()) - - df = DataFrame(randn(100, 1)) - _check_plot_works(df.hist) - - # make sure layout is handled - df = DataFrame(randn(100, 6)) - axes = _check_plot_works(df.hist, layout=(4, 2)) - self._check_axes_shape(axes, axes_num=6, layout=(4, 2)) - - # make sure sharex, sharey is handled - _check_plot_works(df.hist, sharex=True, sharey=True) - - # handle figsize arg - _check_plot_works(df.hist, figsize=(8, 10)) - - # check bins argument - _check_plot_works(df.hist, bins=5) - - # make sure xlabelsize and xrot are handled - ser = df[0] - xf, yf = 20, 18 - xrot, yrot = 30, 40 - axes = ser.hist(xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) - self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, - ylabelsize=yf, yrot=yrot) - - xf, yf = 20, 18 - xrot, yrot = 30, 40 - axes = df.hist(xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) - self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, - ylabelsize=yf, yrot=yrot) - - tm.close() - # make sure kwargs to hist are handled - ax = ser.hist(normed=True, cumulative=True, bins=4) - # height of last bin (index 5) must be 1.0 - self.assertAlmostEqual(ax.get_children()[5].get_height(), 1.0) - - tm.close() - ax = ser.hist(log=True) - # scale of y must be 'log' - self._check_ax_scales(ax, yaxis='log') - - tm.close() - - # propagate attr exception from matplotlib.Axes.hist - with tm.assertRaises(AttributeError): - ser.hist(foo='bar') - - @slow - def test_hist_layout(self): - df = DataFrame(randn(100, 3)) - - layout_to_expected_size = ( - {'layout': None, 'expected_size': (2, 2)}, # default is 2x2 - {'layout': (2, 2), 'expected_size': (2, 2)}, - {'layout': (4, 1), 'expected_size': (4, 1)}, - {'layout': (1, 4), 'expected_size': (1, 4)}, - {'layout': (3, 3), 'expected_size': (3, 3)}, - {'layout': (-1, 4), 'expected_size': (1, 4)}, - {'layout': (4, -1), 'expected_size': (4, 1)}, - {'layout': (-1, 2), 'expected_size': (2, 2)}, - {'layout': (2, -1), 'expected_size': (2, 2)} - ) - - for layout_test in layout_to_expected_size: - axes = df.hist(layout=layout_test['layout']) - expected = layout_test['expected_size'] - self._check_axes_shape(axes, axes_num=3, layout=expected) - - # layout too small for all 4 plots - with tm.assertRaises(ValueError): - df.hist(layout=(1, 1)) - - # invalid format for layout - with tm.assertRaises(ValueError): - df.hist(layout=(1,)) - with tm.assertRaises(ValueError): - df.hist(layout=(-1, -1)) - - - @slow - def test_scatter(self): - tm._skip_if_no_scipy() - - df = DataFrame(randn(100, 2)) - - def scat(**kwds): - return plotting.scatter_matrix(df, **kwds) - - _check_plot_works(scat) - _check_plot_works(scat, marker='+') - _check_plot_works(scat, vmin=0) - if _ok_for_gaussian_kde('kde'): - _check_plot_works(scat, diagonal='kde') - if _ok_for_gaussian_kde('density'): - _check_plot_works(scat, diagonal='density') - _check_plot_works(scat, diagonal='hist') - _check_plot_works(scat, range_padding=.1) - - def scat2(x, y, by=None, ax=None, figsize=None): - return plotting.scatter_plot(df, x, y, by, ax, figsize=None) - - _check_plot_works(scat2, 0, 1) - grouper = Series(np.repeat([1, 2, 3, 4, 5], 20), df.index) - _check_plot_works(scat2, 0, 1, by=grouper) - - def test_scatter_matrix_axis(self): - tm._skip_if_no_scipy() - scatter_matrix = plotting.scatter_matrix - - with tm.RNGContext(42): - df = DataFrame(randn(100, 3)) - - axes = _check_plot_works(scatter_matrix, df, range_padding=.1) - axes0_labels = axes[0][0].yaxis.get_majorticklabels() - # GH 5662 - expected = ['-2', '-1', '0', '1', '2'] - self._check_text_labels(axes0_labels, expected) - self._check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) - - df[0] = ((df[0] - 2) / 3) - axes = _check_plot_works(scatter_matrix, df, range_padding=.1) - axes0_labels = axes[0][0].yaxis.get_majorticklabels() - expected = ['-1.2', '-1.0', '-0.8', '-0.6', '-0.4', '-0.2', '0.0'] - self._check_text_labels(axes0_labels, expected) - self._check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) - - @slow - def test_andrews_curves(self): - from pandas.tools.plotting import andrews_curves - from matplotlib import cm - - df = self.iris - - _check_plot_works(andrews_curves, df, 'Name') - - rgba = ('#556270', '#4ECDC4', '#C7F464') - ax = _check_plot_works(andrews_curves, df, 'Name', color=rgba) - self._check_colors(ax.get_lines()[:10], linecolors=rgba, mapping=df['Name'][:10]) - - cnames = ['dodgerblue', 'aquamarine', 'seagreen'] - ax = _check_plot_works(andrews_curves, df, 'Name', color=cnames) - self._check_colors(ax.get_lines()[:10], linecolors=cnames, mapping=df['Name'][:10]) - - ax = _check_plot_works(andrews_curves, df, 'Name', colormap=cm.jet) - cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) - self._check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df['Name'][:10]) - - colors = ['b', 'g', 'r'] - df = DataFrame({"A": [1, 2, 3], - "B": [1, 2, 3], - "C": [1, 2, 3], - "Name": colors}) - ax = andrews_curves(df, 'Name', color=colors) - handles, labels = ax.get_legend_handles_labels() - self._check_colors(handles, linecolors=colors) - - with tm.assert_produces_warning(FutureWarning): - andrews_curves(data=df, class_column='Name') - - @slow - def test_parallel_coordinates(self): - from pandas.tools.plotting import parallel_coordinates - from matplotlib import cm - - df = self.iris - - ax = _check_plot_works(parallel_coordinates, df, 'Name') - nlines = len(ax.get_lines()) - nxticks = len(ax.xaxis.get_ticklabels()) - - rgba = ('#556270', '#4ECDC4', '#C7F464') - ax = _check_plot_works(parallel_coordinates, df, 'Name', color=rgba) - self._check_colors(ax.get_lines()[:10], linecolors=rgba, mapping=df['Name'][:10]) - - cnames = ['dodgerblue', 'aquamarine', 'seagreen'] - ax = _check_plot_works(parallel_coordinates, df, 'Name', color=cnames) - self._check_colors(ax.get_lines()[:10], linecolors=cnames, mapping=df['Name'][:10]) - - ax = _check_plot_works(parallel_coordinates, df, 'Name', colormap=cm.jet) - cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) - self._check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df['Name'][:10]) - - ax = _check_plot_works(parallel_coordinates, df, 'Name', axvlines=False) - assert len(ax.get_lines()) == (nlines - nxticks) - - colors = ['b', 'g', 'r'] - df = DataFrame({"A": [1, 2, 3], - "B": [1, 2, 3], - "C": [1, 2, 3], - "Name": colors}) - ax = parallel_coordinates(df, 'Name', color=colors) - handles, labels = ax.get_legend_handles_labels() - self._check_colors(handles, linecolors=colors) - - with tm.assert_produces_warning(FutureWarning): - parallel_coordinates(data=df, class_column='Name') - with tm.assert_produces_warning(FutureWarning): - parallel_coordinates(df, 'Name', colors=colors) - - @slow - def test_radviz(self): - from pandas.tools.plotting import radviz - from matplotlib import cm - - df = self.iris - _check_plot_works(radviz, df, 'Name') - - rgba = ('#556270', '#4ECDC4', '#C7F464') - ax = _check_plot_works(radviz, df, 'Name', color=rgba) - # skip Circle drawn as ticks - patches = [p for p in ax.patches[:20] if p.get_label() != ''] - self._check_colors(patches[:10], facecolors=rgba, mapping=df['Name'][:10]) - - cnames = ['dodgerblue', 'aquamarine', 'seagreen'] - _check_plot_works(radviz, df, 'Name', color=cnames) - patches = [p for p in ax.patches[:20] if p.get_label() != ''] - self._check_colors(patches, facecolors=cnames, mapping=df['Name'][:10]) - - _check_plot_works(radviz, df, 'Name', colormap=cm.jet) - cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) - patches = [p for p in ax.patches[:20] if p.get_label() != ''] - self._check_colors(patches, facecolors=cmaps, mapping=df['Name'][:10]) - - colors = [[0., 0., 1., 1.], - [0., 0.5, 1., 1.], - [1., 0., 0., 1.]] - df = DataFrame({"A": [1, 2, 3], - "B": [2, 1, 3], - "C": [3, 2, 1], - "Name": ['b', 'g', 'r']}) - ax = radviz(df, 'Name', color=colors) - handles, labels = ax.get_legend_handles_labels() - self._check_colors(handles, facecolors=colors) - @slow def test_plot_int_columns(self): df = DataFrame(randn(100, 4)).cumsum() @@ -2897,6 +2588,71 @@ def test_line_colors(self): ax = df.ix[:, [0]].plot(color='DodgerBlue') self._check_colors(ax.lines, linecolors=['DodgerBlue']) + ax = df.plot(color='red') + self._check_colors(ax.get_lines(), linecolors=['red'] * 5) + tm.close() + + @slow + def test_line_colors_and_styles_subplots(self): + # GH 9894 + from matplotlib import cm + default_colors = self.plt.rcParams.get('axes.color_cycle') + + df = DataFrame(randn(5, 5)) + + axes = df.plot(subplots=True) + for ax, c in zip(axes, list(default_colors)): + self._check_colors(ax.get_lines(), linecolors=c) + tm.close() + + # single color char + axes = df.plot(subplots=True, color='k') + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['k']) + tm.close() + + # single color str + axes = df.plot(subplots=True, color='green') + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['green']) + tm.close() + + custom_colors = 'rgcby' + axes = df.plot(color=custom_colors, subplots=True) + for ax, c in zip(axes, list(custom_colors)): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + axes = df.plot(color=list(custom_colors), subplots=True) + for ax, c in zip(axes, list(custom_colors)): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + rgba_colors = lmap(cm.jet, np.linspace(0, 1, len(df))) + for cmap in ['jet', cm.jet]: + axes = df.plot(colormap=cmap, subplots=True) + for ax, c in zip(axes, rgba_colors): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + # make color a list if plotting one column frame + # handles cases like df.plot(color='DodgerBlue') + axes = df.ix[:, [0]].plot(color='DodgerBlue', subplots=True) + self._check_colors(axes[0].lines, linecolors=['DodgerBlue']) + + # single character style + axes = df.plot(style='r', subplots=True) + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['r']) + tm.close() + + # list of styles + styles = list('rgcby') + axes = df.plot(style=styles, subplots=True) + for ax, c in zip(axes, styles): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + @slow def test_area_colors(self): from matplotlib import cm @@ -2972,6 +2728,10 @@ def test_hist_colors(self): ax = df.ix[:, [0]].plot(kind='hist', color='DodgerBlue') self._check_colors([ax.patches[0]], facecolors=['DodgerBlue']) + ax = df.plot(kind='hist', color='green') + self._check_colors(ax.patches[::10], facecolors=['green'] * 5) + tm.close() + @slow def test_kde_colors(self): tm._skip_if_no_scipy() @@ -2995,6 +2755,64 @@ def test_kde_colors(self): rgba_colors = lmap(cm.jet, np.linspace(0, 1, len(df))) self._check_colors(ax.get_lines(), linecolors=rgba_colors) + @slow + def test_kde_colors_and_styles_subplots(self): + tm._skip_if_no_scipy() + _skip_if_no_scipy_gaussian_kde() + + from matplotlib import cm + default_colors = self.plt.rcParams.get('axes.color_cycle') + + df = DataFrame(randn(5, 5)) + + axes = df.plot(kind='kde', subplots=True) + for ax, c in zip(axes, list(default_colors)): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + # single color char + axes = df.plot(kind='kde', color='k', subplots=True) + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['k']) + tm.close() + + # single color str + axes = df.plot(kind='kde', color='red', subplots=True) + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['red']) + tm.close() + + custom_colors = 'rgcby' + axes = df.plot(kind='kde', color=custom_colors, subplots=True) + for ax, c in zip(axes, list(custom_colors)): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + rgba_colors = lmap(cm.jet, np.linspace(0, 1, len(df))) + for cmap in ['jet', cm.jet]: + axes = df.plot(kind='kde', colormap=cmap, subplots=True) + for ax, c in zip(axes, rgba_colors): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + + # make color a list if plotting one column frame + # handles cases like df.plot(color='DodgerBlue') + axes = df.ix[:, [0]].plot(kind='kde', color='DodgerBlue', subplots=True) + self._check_colors(axes[0].lines, linecolors=['DodgerBlue']) + + # single character style + axes = df.plot(kind='kde', style='r', subplots=True) + for ax in axes: + self._check_colors(ax.get_lines(), linecolors=['r']) + tm.close() + + # list of styles + styles = list('rgcby') + axes = df.plot(kind='kde', style=styles, subplots=True) + for ax, c in zip(axes, styles): + self._check_colors(ax.get_lines(), linecolors=[c]) + tm.close() + @slow def test_boxplot_colors(self): @@ -3070,7 +2888,7 @@ def test_unordered_ts(self): xticks = ax.lines[0].get_xdata() self.assertTrue(xticks[0] < xticks[1]) ydata = ax.lines[0].get_ydata() - assert_array_equal(ydata, np.array([1.0, 2.0, 3.0])) + tm.assert_numpy_array_equal(ydata, np.array([1.0, 2.0, 3.0])) def test_all_invalid_plot_data(self): df = DataFrame(list('abcd')) @@ -3463,6 +3281,35 @@ def test_sharey_and_ax(self): self.assertTrue(ax.yaxis.get_label().get_visible(), "y label is invisible but shouldn't") + def test_memory_leak(self): + """ Check that every plot type gets properly collected. """ + import weakref + import gc + + results = {} + for kind in plotting._plot_klass.keys(): + args = {} + if kind in ['hexbin', 'scatter', 'pie']: + df = self.hexbin_df + args = {'x': 'A', 'y': 'B'} + elif kind == 'area': + df = self.tdf.abs() + else: + df = self.tdf + + # Use a weakref so we can see if the object gets collected without + # also preventing it from being collected + results[kind] = weakref.proxy(df.plot(kind=kind, **args)) + + # have matplotlib delete all the figures + tm.close() + # force a garbage collection + gc.collect() + for key in results: + # check that every plot was collected + with tm.assertRaises(ReferenceError): + # need to actually access something to get an error + results[key].lines @slow def test_df_grid_settings(self): @@ -3470,392 +3317,6 @@ def test_df_grid_settings(self): self._check_grid_settings(DataFrame({'a':[1,2,3],'b':[2,3,4]}), plotting._dataframe_kinds, kws={'x':'a','y':'b'}) - -@tm.mplskip -class TestDataFrameGroupByPlots(TestPlotBase): - - @slow - def test_boxplot(self): - grouped = self.hist_df.groupby(by='gender') - with warnings.catch_warnings(): - warnings.simplefilter('ignore') - axes = _check_plot_works(grouped.boxplot, return_type='axes') - self._check_axes_shape(list(axes.values()), axes_num=2, layout=(1, 2)) - - axes = _check_plot_works(grouped.boxplot, subplots=False, - return_type='axes') - self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) - tuples = lzip(string.ascii_letters[:10], range(10)) - df = DataFrame(np.random.rand(10, 3), - index=MultiIndex.from_tuples(tuples)) - - grouped = df.groupby(level=1) - axes = _check_plot_works(grouped.boxplot, return_type='axes') - self._check_axes_shape(list(axes.values()), axes_num=10, layout=(4, 3)) - - axes = _check_plot_works(grouped.boxplot, subplots=False, - return_type='axes') - self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) - - grouped = df.unstack(level=1).groupby(level=0, axis=1) - axes = _check_plot_works(grouped.boxplot, return_type='axes') - self._check_axes_shape(list(axes.values()), axes_num=3, layout=(2, 2)) - - axes = _check_plot_works(grouped.boxplot, subplots=False, - return_type='axes') - self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) - - @slow - def test_grouped_plot_fignums(self): - n = 10 - weight = Series(np.random.normal(166, 20, size=n)) - height = Series(np.random.normal(60, 10, size=n)) - with tm.RNGContext(42): - gender = tm.choice(['male', 'female'], size=n) - df = DataFrame({'height': height, 'weight': weight, 'gender': gender}) - gb = df.groupby('gender') - - res = gb.plot() - self.assertEqual(len(self.plt.get_fignums()), 2) - self.assertEqual(len(res), 2) - tm.close() - - res = gb.boxplot(return_type='axes') - self.assertEqual(len(self.plt.get_fignums()), 1) - self.assertEqual(len(res), 2) - tm.close() - - # now works with GH 5610 as gender is excluded - res = df.groupby('gender').hist() - tm.close() - - def test_series_plot_color_kwargs(self): - # GH1890 - ax = Series(np.arange(12) + 1).plot(color='green') - self._check_colors(ax.get_lines(), linecolors=['green']) - - def test_time_series_plot_color_kwargs(self): - # #1890 - ax = Series(np.arange(12) + 1, index=date_range( - '1/1/2000', periods=12)).plot(color='green') - self._check_colors(ax.get_lines(), linecolors=['green']) - - def test_time_series_plot_color_with_empty_kwargs(self): - import matplotlib as mpl - - def_colors = mpl.rcParams['axes.color_cycle'] - index = date_range('1/1/2000', periods=12) - s = Series(np.arange(1, 13), index=index) - - ncolors = 3 - - for i in range(ncolors): - ax = s.plot() - self._check_colors(ax.get_lines(), linecolors=def_colors[:ncolors]) - - @slow - def test_grouped_hist(self): - df = DataFrame(randn(500, 2), columns=['A', 'B']) - df['C'] = np.random.randint(0, 4, 500) - df['D'] = ['X'] * 500 - - axes = plotting.grouped_hist(df.A, by=df.C) - self._check_axes_shape(axes, axes_num=4, layout=(2, 2)) - - tm.close() - axes = df.hist(by=df.C) - self._check_axes_shape(axes, axes_num=4, layout=(2, 2)) - - tm.close() - # group by a key with single value - axes = df.hist(by='D', rot=30) - self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) - self._check_ticks_props(axes, xrot=30) - - tm.close() - # make sure kwargs to hist are handled - xf, yf = 20, 18 - xrot, yrot = 30, 40 - axes = plotting.grouped_hist(df.A, by=df.C, normed=True, - cumulative=True, bins=4, - xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) - # height of last bin (index 5) must be 1.0 - for ax in axes.ravel(): - height = ax.get_children()[5].get_height() - self.assertAlmostEqual(height, 1.0) - self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, - ylabelsize=yf, yrot=yrot) - - tm.close() - axes = plotting.grouped_hist(df.A, by=df.C, log=True) - # scale of y must be 'log' - self._check_ax_scales(axes, yaxis='log') - - tm.close() - # propagate attr exception from matplotlib.Axes.hist - with tm.assertRaises(AttributeError): - plotting.grouped_hist(df.A, by=df.C, foo='bar') - - with tm.assert_produces_warning(FutureWarning): - df.hist(by='C', figsize='default') - - @slow - def test_grouped_hist2(self): - n = 10 - weight = Series(np.random.normal(166, 20, size=n)) - height = Series(np.random.normal(60, 10, size=n)) - with tm.RNGContext(42): - gender_int = tm.choice([0, 1], size=n) - df_int = DataFrame({'height': height, 'weight': weight, - 'gender': gender_int}) - gb = df_int.groupby('gender') - axes = gb.hist() - self.assertEqual(len(axes), 2) - self.assertEqual(len(self.plt.get_fignums()), 2) - tm.close() - - @slow - def test_grouped_box_return_type(self): - df = self.hist_df - - # old style: return_type=None - result = df.boxplot(by='gender') - self.assertIsInstance(result, np.ndarray) - self._check_box_return_type(result, None, - expected_keys=['height', 'weight', 'category']) - - # now for groupby - with tm.assert_produces_warning(FutureWarning): - result = df.groupby('gender').boxplot() - self._check_box_return_type(result, 'dict', expected_keys=['Male', 'Female']) - - columns2 = 'X B C D A G Y N Q O'.split() - df2 = DataFrame(random.randn(50, 10), columns=columns2) - categories2 = 'A B C D E F G H I J'.split() - df2['category'] = categories2 * 5 - - for t in ['dict', 'axes', 'both']: - returned = df.groupby('classroom').boxplot(return_type=t) - self._check_box_return_type(returned, t, expected_keys=['A', 'B', 'C']) - - returned = df.boxplot(by='classroom', return_type=t) - self._check_box_return_type(returned, t, - expected_keys=['height', 'weight', 'category']) - - returned = df2.groupby('category').boxplot(return_type=t) - self._check_box_return_type(returned, t, expected_keys=categories2) - - returned = df2.boxplot(by='category', return_type=t) - self._check_box_return_type(returned, t, expected_keys=columns2) - - @slow - def test_grouped_box_layout(self): - df = self.hist_df - - self.assertRaises(ValueError, df.boxplot, column=['weight', 'height'], - by=df.gender, layout=(1, 1)) - self.assertRaises(ValueError, df.boxplot, column=['height', 'weight', 'category'], - layout=(2, 1), return_type='dict') - self.assertRaises(ValueError, df.boxplot, column=['weight', 'height'], - by=df.gender, layout=(-1, -1)) - - box = _check_plot_works(df.groupby('gender').boxplot, column='height', - return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=2, layout=(1, 2)) - - box = _check_plot_works(df.groupby('category').boxplot, column='height', - return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(2, 2)) - - # GH 6769 - box = _check_plot_works(df.groupby('classroom').boxplot, - column='height', return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) - - # GH 5897 - axes = df.boxplot(column=['height', 'weight', 'category'], by='gender', - return_type='axes') - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) - for ax in [axes['height']]: - self._check_visible(ax.get_xticklabels(), visible=False) - self._check_visible([ax.xaxis.get_label()], visible=False) - for ax in [axes['weight'], axes['category']]: - self._check_visible(ax.get_xticklabels()) - self._check_visible([ax.xaxis.get_label()]) - - box = df.groupby('classroom').boxplot( - column=['height', 'weight', 'category'], return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) - - box = _check_plot_works(df.groupby('category').boxplot, column='height', - layout=(3, 2), return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(3, 2)) - box = _check_plot_works(df.groupby('category').boxplot, column='height', - layout=(3, -1), return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(3, 2)) - - box = df.boxplot(column=['height', 'weight', 'category'], by='gender', - layout=(4, 1)) - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(4, 1)) - - box = df.boxplot(column=['height', 'weight', 'category'], by='gender', - layout=(-1, 1)) - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(3, 1)) - - box = df.groupby('classroom').boxplot( - column=['height', 'weight', 'category'], layout=(1, 4), - return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(1, 4)) - - box = df.groupby('classroom').boxplot( - column=['height', 'weight', 'category'], layout=(1, -1), - return_type='dict') - self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(1, 3)) - - - @slow - def test_grouped_box_multiple_axes(self): - # GH 6970, GH 7069 - df = self.hist_df - - # check warning to ignore sharex / sharey - # this check should be done in the first function which - # passes multiple axes to plot, hist or boxplot - # location should be changed if other test is added - # which has earlier alphabetical order - with tm.assert_produces_warning(UserWarning): - fig, axes = self.plt.subplots(2, 2) - df.groupby('category').boxplot(column='height', return_type='axes', ax=axes) - self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(2, 2)) - - fig, axes = self.plt.subplots(2, 3) - with warnings.catch_warnings(): - warnings.simplefilter('ignore') - returned = df.boxplot(column=['height', 'weight', 'category'], - by='gender', return_type='axes', ax=axes[0]) - returned = np.array(list(returned.values())) - self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) - self.assert_numpy_array_equal(returned, axes[0]) - self.assertIs(returned[0].figure, fig) - - # draw on second row - with warnings.catch_warnings(): - warnings.simplefilter('ignore') - returned = df.groupby('classroom').boxplot( - column=['height', 'weight', 'category'], - return_type='axes', ax=axes[1]) - returned = np.array(list(returned.values())) - self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) - self.assert_numpy_array_equal(returned, axes[1]) - self.assertIs(returned[0].figure, fig) - - with tm.assertRaises(ValueError): - fig, axes = self.plt.subplots(2, 3) - # pass different number of axes from required - axes = df.groupby('classroom').boxplot(ax=axes) - - @slow - def test_grouped_hist_layout(self): - - df = self.hist_df - self.assertRaises(ValueError, df.hist, column='weight', by=df.gender, - layout=(1, 1)) - self.assertRaises(ValueError, df.hist, column='height', by=df.category, - layout=(1, 3)) - self.assertRaises(ValueError, df.hist, column='height', by=df.category, - layout=(-1, -1)) - - axes = _check_plot_works(df.hist, column='height', by=df.gender, - layout=(2, 1)) - self._check_axes_shape(axes, axes_num=2, layout=(2, 1)) - - axes = _check_plot_works(df.hist, column='height', by=df.gender, - layout=(2, -1)) - self._check_axes_shape(axes, axes_num=2, layout=(2, 1)) - - axes = df.hist(column='height', by=df.category, layout=(4, 1)) - self._check_axes_shape(axes, axes_num=4, layout=(4, 1)) - - axes = df.hist(column='height', by=df.category, layout=(-1, 1)) - self._check_axes_shape(axes, axes_num=4, layout=(4, 1)) - - axes = df.hist(column='height', by=df.category, layout=(4, 2), figsize=(12, 8)) - self._check_axes_shape(axes, axes_num=4, layout=(4, 2), figsize=(12, 8)) - tm.close() - - # GH 6769 - axes = _check_plot_works(df.hist, column='height', by='classroom', layout=(2, 2)) - self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) - - # without column - axes = _check_plot_works(df.hist, by='classroom') - self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) - - axes = df.hist(by='gender', layout=(3, 5)) - self._check_axes_shape(axes, axes_num=2, layout=(3, 5)) - - axes = df.hist(column=['height', 'weight', 'category']) - self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) - - @slow - def test_grouped_hist_multiple_axes(self): - # GH 6970, GH 7069 - df = self.hist_df - - fig, axes = self.plt.subplots(2, 3) - returned = df.hist(column=['height', 'weight', 'category'], ax=axes[0]) - self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) - self.assert_numpy_array_equal(returned, axes[0]) - self.assertIs(returned[0].figure, fig) - returned = df.hist(by='classroom', ax=axes[1]) - self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) - self.assert_numpy_array_equal(returned, axes[1]) - self.assertIs(returned[0].figure, fig) - - with tm.assertRaises(ValueError): - fig, axes = self.plt.subplots(2, 3) - # pass different number of axes from required - axes = df.hist(column='height', ax=axes) - @slow - def test_axis_share_x(self): - df = self.hist_df - # GH4089 - ax1, ax2 = df.hist(column='height', by=df.gender, sharex=True) - - # share x - self.assertTrue(ax1._shared_x_axes.joined(ax1, ax2)) - self.assertTrue(ax2._shared_x_axes.joined(ax1, ax2)) - - # don't share y - self.assertFalse(ax1._shared_y_axes.joined(ax1, ax2)) - self.assertFalse(ax2._shared_y_axes.joined(ax1, ax2)) - - @slow - def test_axis_share_y(self): - df = self.hist_df - ax1, ax2 = df.hist(column='height', by=df.gender, sharey=True) - - # share y - self.assertTrue(ax1._shared_y_axes.joined(ax1, ax2)) - self.assertTrue(ax2._shared_y_axes.joined(ax1, ax2)) - - # don't share x - self.assertFalse(ax1._shared_x_axes.joined(ax1, ax2)) - self.assertFalse(ax2._shared_x_axes.joined(ax1, ax2)) - - @slow - def test_axis_share_xy(self): - df = self.hist_df - ax1, ax2 = df.hist(column='height', by=df.gender, sharex=True, - sharey=True) - - # share both x and y - self.assertTrue(ax1._shared_x_axes.joined(ax1, ax2)) - self.assertTrue(ax2._shared_x_axes.joined(ax1, ax2)) - - self.assertTrue(ax1._shared_y_axes.joined(ax1, ax2)) - self.assertTrue(ax2._shared_y_axes.joined(ax1, ax2)) - def test_option_mpl_style(self): set_option('display.mpl_style', 'default') set_option('display.mpl_style', None) @@ -3870,6 +3331,10 @@ def test_invalid_colormap(self): with tm.assertRaises(ValueError): df.plot(colormap='invalid_colormap') + +@tm.mplskip +class TestDataFrameGroupByPlots(TestPlotBase): + def test_series_groupby_plotting_nominally_works(self): n = 10 weight = Series(np.random.normal(166, 20, size=n)) diff --git a/pandas/tests/test_graphics_others.py b/pandas/tests/test_graphics_others.py new file mode 100644 index 0000000000000..f461a8ab624dc --- /dev/null +++ b/pandas/tests/test_graphics_others.py @@ -0,0 +1,913 @@ +#!/usr/bin/env python +# coding: utf-8 + +import nose +import itertools +import os +import string +import warnings +from distutils.version import LooseVersion + +from datetime import datetime, date + +from pandas import (Series, DataFrame, MultiIndex, PeriodIndex, date_range, + bdate_range) +from pandas.compat import (range, lrange, StringIO, lmap, lzip, u, zip, + iteritems, OrderedDict, PY3) +from pandas.util.decorators import cache_readonly +import pandas.core.common as com +import pandas.util.testing as tm +from pandas.util.testing import ensure_clean +from pandas.core.config import set_option + + +import numpy as np +from numpy import random +from numpy.random import rand, randn + +from numpy.testing import assert_array_equal, assert_allclose +from numpy.testing.decorators import slow +import pandas.tools.plotting as plotting + +from pandas.tests.test_graphics import (TestPlotBase, _check_plot_works, + curpath, _ok_for_gaussian_kde) + + +""" +These tests are for ``DataFrame.hist``, ``DataFrame.boxplot`` and +other miscellaneous plots. +`Dataframe.plot`` and ``Series.plot`` are tested in test_graphics.py +""" + + +def _skip_if_mpl_14_or_dev_boxplot(): + # GH 8382 + # Boxplot failures on 1.4 and 1.4.1 + # Don't need try / except since that's done at class level + import matplotlib + if str(matplotlib.__version__) >= LooseVersion('1.4'): + raise nose.SkipTest("Matplotlib Regression in 1.4 and current dev.") + + +@tm.mplskip +class TestSeriesPlots(TestPlotBase): + + def setUp(self): + TestPlotBase.setUp(self) + import matplotlib as mpl + mpl.rcdefaults() + + self.ts = tm.makeTimeSeries() + self.ts.name = 'ts' + + self.series = tm.makeStringSeries() + self.series.name = 'series' + + self.iseries = tm.makePeriodSeries() + self.iseries.name = 'iseries' + + @slow + def test_hist_legacy(self): + _check_plot_works(self.ts.hist) + _check_plot_works(self.ts.hist, grid=False) + _check_plot_works(self.ts.hist, figsize=(8, 10)) + _check_plot_works(self.ts.hist, by=self.ts.index.month) + _check_plot_works(self.ts.hist, by=self.ts.index.month, bins=5) + + fig, ax = self.plt.subplots(1, 1) + _check_plot_works(self.ts.hist, ax=ax) + _check_plot_works(self.ts.hist, ax=ax, figure=fig) + _check_plot_works(self.ts.hist, figure=fig) + tm.close() + + fig, (ax1, ax2) = self.plt.subplots(1, 2) + _check_plot_works(self.ts.hist, figure=fig, ax=ax1) + _check_plot_works(self.ts.hist, figure=fig, ax=ax2) + + with tm.assertRaises(ValueError): + self.ts.hist(by=self.ts.index, figure=fig) + + @slow + def test_hist_bins_legacy(self): + df = DataFrame(np.random.randn(10, 2)) + ax = df.hist(bins=2)[0][0] + self.assertEqual(len(ax.patches), 2) + + @slow + def test_hist_layout(self): + df = self.hist_df + with tm.assertRaises(ValueError): + df.height.hist(layout=(1, 1)) + + with tm.assertRaises(ValueError): + df.height.hist(layout=[1, 1]) + + @slow + def test_hist_layout_with_by(self): + df = self.hist_df + + axes = _check_plot_works(df.height.hist, by=df.gender, layout=(2, 1)) + self._check_axes_shape(axes, axes_num=2, layout=(2, 1)) + + axes = _check_plot_works(df.height.hist, by=df.gender, layout=(3, -1)) + self._check_axes_shape(axes, axes_num=2, layout=(3, 1)) + + axes = _check_plot_works(df.height.hist, by=df.category, layout=(4, 1)) + self._check_axes_shape(axes, axes_num=4, layout=(4, 1)) + + axes = _check_plot_works(df.height.hist, by=df.category, layout=(2, -1)) + self._check_axes_shape(axes, axes_num=4, layout=(2, 2)) + + axes = _check_plot_works(df.height.hist, by=df.category, layout=(3, -1)) + self._check_axes_shape(axes, axes_num=4, layout=(3, 2)) + + axes = _check_plot_works(df.height.hist, by=df.category, layout=(-1, 4)) + self._check_axes_shape(axes, axes_num=4, layout=(1, 4)) + + axes = _check_plot_works(df.height.hist, by=df.classroom, layout=(2, 2)) + self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) + + axes = df.height.hist(by=df.category, layout=(4, 2), figsize=(12, 7)) + self._check_axes_shape(axes, axes_num=4, layout=(4, 2), figsize=(12, 7)) + + @slow + def test_hist_no_overlap(self): + from matplotlib.pyplot import subplot, gcf + x = Series(randn(2)) + y = Series(randn(2)) + subplot(121) + x.hist() + subplot(122) + y.hist() + fig = gcf() + axes = fig.get_axes() + self.assertEqual(len(axes), 2) + + @slow + def test_hist_by_no_extra_plots(self): + df = self.hist_df + axes = df.height.hist(by=df.gender) + self.assertEqual(len(self.plt.get_fignums()), 1) + + @slow + def test_plot_fails_when_ax_differs_from_figure(self): + from pylab import figure + fig1 = figure() + fig2 = figure() + ax1 = fig1.add_subplot(111) + with tm.assertRaises(AssertionError): + self.ts.hist(ax=ax1, figure=fig2) + + @slow + def test_autocorrelation_plot(self): + from pandas.tools.plotting import autocorrelation_plot + _check_plot_works(autocorrelation_plot, self.ts) + _check_plot_works(autocorrelation_plot, self.ts.values) + + ax = autocorrelation_plot(self.ts, label='Test') + self._check_legend_labels(ax, labels=['Test']) + + @slow + def test_lag_plot(self): + from pandas.tools.plotting import lag_plot + _check_plot_works(lag_plot, self.ts) + _check_plot_works(lag_plot, self.ts, lag=5) + + @slow + def test_bootstrap_plot(self): + from pandas.tools.plotting import bootstrap_plot + _check_plot_works(bootstrap_plot, self.ts, size=10) + + +@tm.mplskip +class TestDataFramePlots(TestPlotBase): + + def setUp(self): + TestPlotBase.setUp(self) + import matplotlib as mpl + mpl.rcdefaults() + + self.tdf = tm.makeTimeDataFrame() + self.hexbin_df = DataFrame({"A": np.random.uniform(size=20), + "B": np.random.uniform(size=20), + "C": np.arange(20) + np.random.uniform(size=20)}) + + from pandas import read_csv + path = os.path.join(curpath(), 'data', 'iris.csv') + self.iris = read_csv(path) + + @slow + def test_boxplot_legacy(self): + df = DataFrame(randn(6, 4), + index=list(string.ascii_letters[:6]), + columns=['one', 'two', 'three', 'four']) + df['indic'] = ['foo', 'bar'] * 3 + df['indic2'] = ['foo', 'bar', 'foo'] * 2 + + _check_plot_works(df.boxplot, return_type='dict') + _check_plot_works(df.boxplot, column=['one', 'two'], return_type='dict') + _check_plot_works(df.boxplot, column=['one', 'two'], by='indic') + _check_plot_works(df.boxplot, column='one', by=['indic', 'indic2']) + _check_plot_works(df.boxplot, by='indic') + _check_plot_works(df.boxplot, by=['indic', 'indic2']) + _check_plot_works(plotting.boxplot, df['one'], return_type='dict') + _check_plot_works(df.boxplot, notch=1, return_type='dict') + _check_plot_works(df.boxplot, by='indic', notch=1) + + df = DataFrame(np.random.rand(10, 2), columns=['Col1', 'Col2']) + df['X'] = Series(['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B']) + df['Y'] = Series(['A'] * 10) + _check_plot_works(df.boxplot, by='X') + + # When ax is supplied and required number of axes is 1, + # passed ax should be used: + fig, ax = self.plt.subplots() + axes = df.boxplot('Col1', by='X', ax=ax) + self.assertIs(ax.get_axes(), axes) + + fig, ax = self.plt.subplots() + axes = df.groupby('Y').boxplot(ax=ax, return_type='axes') + self.assertIs(ax.get_axes(), axes['A']) + + # Multiple columns with an ax argument should use same figure + fig, ax = self.plt.subplots() + axes = df.boxplot(column=['Col1', 'Col2'], by='X', ax=ax, return_type='axes') + self.assertIs(axes['Col1'].get_figure(), fig) + + # When by is None, check that all relevant lines are present in the dict + fig, ax = self.plt.subplots() + d = df.boxplot(ax=ax, return_type='dict') + lines = list(itertools.chain.from_iterable(d.values())) + self.assertEqual(len(ax.get_lines()), len(lines)) + + @slow + def test_boxplot_return_type_legacy(self): + # API change in https://github.com/pydata/pandas/pull/7096 + import matplotlib as mpl + + df = DataFrame(randn(6, 4), + index=list(string.ascii_letters[:6]), + columns=['one', 'two', 'three', 'four']) + with tm.assertRaises(ValueError): + df.boxplot(return_type='NOTATYPE') + + with tm.assert_produces_warning(FutureWarning): + result = df.boxplot() + # change to Axes in future + self._check_box_return_type(result, 'dict') + + with tm.assert_produces_warning(False): + result = df.boxplot(return_type='dict') + self._check_box_return_type(result, 'dict') + + with tm.assert_produces_warning(False): + result = df.boxplot(return_type='axes') + self._check_box_return_type(result, 'axes') + + with tm.assert_produces_warning(False): + result = df.boxplot(return_type='both') + self._check_box_return_type(result, 'both') + + @slow + def test_boxplot_axis_limits(self): + + def _check_ax_limits(col, ax): + y_min, y_max = ax.get_ylim() + self.assertTrue(y_min <= col.min()) + self.assertTrue(y_max >= col.max()) + + df = self.hist_df.copy() + df['age'] = np.random.randint(1, 20, df.shape[0]) + # One full row + height_ax, weight_ax = df.boxplot(['height', 'weight'], by='category') + _check_ax_limits(df['height'], height_ax) + _check_ax_limits(df['weight'], weight_ax) + self.assertEqual(weight_ax._sharey, height_ax) + + # Two rows, one partial + p = df.boxplot(['height', 'weight', 'age'], by='category') + height_ax, weight_ax, age_ax = p[0, 0], p[0, 1], p[1, 0] + dummy_ax = p[1, 1] + _check_ax_limits(df['height'], height_ax) + _check_ax_limits(df['weight'], weight_ax) + _check_ax_limits(df['age'], age_ax) + self.assertEqual(weight_ax._sharey, height_ax) + self.assertEqual(age_ax._sharey, height_ax) + self.assertIsNone(dummy_ax._sharey) + + @slow + def test_boxplot_empty_column(self): + _skip_if_mpl_14_or_dev_boxplot() + df = DataFrame(np.random.randn(20, 4)) + df.loc[:, 0] = np.nan + _check_plot_works(df.boxplot, return_type='axes') + + @slow + def test_hist_df_legacy(self): + _check_plot_works(self.hist_df.hist) + + # make sure layout is handled + df = DataFrame(randn(100, 3)) + axes = _check_plot_works(df.hist, grid=False) + self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) + self.assertFalse(axes[1, 1].get_visible()) + + df = DataFrame(randn(100, 1)) + _check_plot_works(df.hist) + + # make sure layout is handled + df = DataFrame(randn(100, 6)) + axes = _check_plot_works(df.hist, layout=(4, 2)) + self._check_axes_shape(axes, axes_num=6, layout=(4, 2)) + + # make sure sharex, sharey is handled + _check_plot_works(df.hist, sharex=True, sharey=True) + + # handle figsize arg + _check_plot_works(df.hist, figsize=(8, 10)) + + # check bins argument + _check_plot_works(df.hist, bins=5) + + # make sure xlabelsize and xrot are handled + ser = df[0] + xf, yf = 20, 18 + xrot, yrot = 30, 40 + axes = ser.hist(xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) + self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, + ylabelsize=yf, yrot=yrot) + + xf, yf = 20, 18 + xrot, yrot = 30, 40 + axes = df.hist(xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) + self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, + ylabelsize=yf, yrot=yrot) + + tm.close() + # make sure kwargs to hist are handled + ax = ser.hist(normed=True, cumulative=True, bins=4) + # height of last bin (index 5) must be 1.0 + self.assertAlmostEqual(ax.get_children()[5].get_height(), 1.0) + + tm.close() + ax = ser.hist(log=True) + # scale of y must be 'log' + self._check_ax_scales(ax, yaxis='log') + + tm.close() + + # propagate attr exception from matplotlib.Axes.hist + with tm.assertRaises(AttributeError): + ser.hist(foo='bar') + + @slow + def test_hist_layout(self): + df = DataFrame(randn(100, 3)) + + layout_to_expected_size = ( + {'layout': None, 'expected_size': (2, 2)}, # default is 2x2 + {'layout': (2, 2), 'expected_size': (2, 2)}, + {'layout': (4, 1), 'expected_size': (4, 1)}, + {'layout': (1, 4), 'expected_size': (1, 4)}, + {'layout': (3, 3), 'expected_size': (3, 3)}, + {'layout': (-1, 4), 'expected_size': (1, 4)}, + {'layout': (4, -1), 'expected_size': (4, 1)}, + {'layout': (-1, 2), 'expected_size': (2, 2)}, + {'layout': (2, -1), 'expected_size': (2, 2)} + ) + + for layout_test in layout_to_expected_size: + axes = df.hist(layout=layout_test['layout']) + expected = layout_test['expected_size'] + self._check_axes_shape(axes, axes_num=3, layout=expected) + + # layout too small for all 4 plots + with tm.assertRaises(ValueError): + df.hist(layout=(1, 1)) + + # invalid format for layout + with tm.assertRaises(ValueError): + df.hist(layout=(1,)) + with tm.assertRaises(ValueError): + df.hist(layout=(-1, -1)) + + @slow + def test_scatter_plot_legacy(self): + tm._skip_if_no_scipy() + + df = DataFrame(randn(100, 2)) + + def scat(**kwds): + return plotting.scatter_matrix(df, **kwds) + + _check_plot_works(scat) + _check_plot_works(scat, marker='+') + _check_plot_works(scat, vmin=0) + if _ok_for_gaussian_kde('kde'): + _check_plot_works(scat, diagonal='kde') + if _ok_for_gaussian_kde('density'): + _check_plot_works(scat, diagonal='density') + _check_plot_works(scat, diagonal='hist') + _check_plot_works(scat, range_padding=.1) + + def scat2(x, y, by=None, ax=None, figsize=None): + return plotting.scatter_plot(df, x, y, by, ax, figsize=None) + + _check_plot_works(scat2, 0, 1) + grouper = Series(np.repeat([1, 2, 3, 4, 5], 20), df.index) + _check_plot_works(scat2, 0, 1, by=grouper) + + def test_scatter_matrix_axis(self): + tm._skip_if_no_scipy() + scatter_matrix = plotting.scatter_matrix + + with tm.RNGContext(42): + df = DataFrame(randn(100, 3)) + + axes = _check_plot_works(scatter_matrix, df, range_padding=.1) + axes0_labels = axes[0][0].yaxis.get_majorticklabels() + # GH 5662 + expected = ['-2', '-1', '0', '1', '2'] + self._check_text_labels(axes0_labels, expected) + self._check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) + + df[0] = ((df[0] - 2) / 3) + axes = _check_plot_works(scatter_matrix, df, range_padding=.1) + axes0_labels = axes[0][0].yaxis.get_majorticklabels() + expected = ['-1.2', '-1.0', '-0.8', '-0.6', '-0.4', '-0.2', '0.0'] + self._check_text_labels(axes0_labels, expected) + self._check_ticks_props(axes, xlabelsize=8, xrot=90, ylabelsize=8, yrot=0) + + @slow + def test_andrews_curves(self): + from pandas.tools.plotting import andrews_curves + from matplotlib import cm + + df = self.iris + + _check_plot_works(andrews_curves, df, 'Name') + + rgba = ('#556270', '#4ECDC4', '#C7F464') + ax = _check_plot_works(andrews_curves, df, 'Name', color=rgba) + self._check_colors(ax.get_lines()[:10], linecolors=rgba, mapping=df['Name'][:10]) + + cnames = ['dodgerblue', 'aquamarine', 'seagreen'] + ax = _check_plot_works(andrews_curves, df, 'Name', color=cnames) + self._check_colors(ax.get_lines()[:10], linecolors=cnames, mapping=df['Name'][:10]) + + ax = _check_plot_works(andrews_curves, df, 'Name', colormap=cm.jet) + cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) + self._check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df['Name'][:10]) + + colors = ['b', 'g', 'r'] + df = DataFrame({"A": [1, 2, 3], + "B": [1, 2, 3], + "C": [1, 2, 3], + "Name": colors}) + ax = andrews_curves(df, 'Name', color=colors) + handles, labels = ax.get_legend_handles_labels() + self._check_colors(handles, linecolors=colors) + + with tm.assert_produces_warning(FutureWarning): + andrews_curves(data=df, class_column='Name') + + @slow + def test_parallel_coordinates(self): + from pandas.tools.plotting import parallel_coordinates + from matplotlib import cm + + df = self.iris + + ax = _check_plot_works(parallel_coordinates, df, 'Name') + nlines = len(ax.get_lines()) + nxticks = len(ax.xaxis.get_ticklabels()) + + rgba = ('#556270', '#4ECDC4', '#C7F464') + ax = _check_plot_works(parallel_coordinates, df, 'Name', color=rgba) + self._check_colors(ax.get_lines()[:10], linecolors=rgba, mapping=df['Name'][:10]) + + cnames = ['dodgerblue', 'aquamarine', 'seagreen'] + ax = _check_plot_works(parallel_coordinates, df, 'Name', color=cnames) + self._check_colors(ax.get_lines()[:10], linecolors=cnames, mapping=df['Name'][:10]) + + ax = _check_plot_works(parallel_coordinates, df, 'Name', colormap=cm.jet) + cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) + self._check_colors(ax.get_lines()[:10], linecolors=cmaps, mapping=df['Name'][:10]) + + ax = _check_plot_works(parallel_coordinates, df, 'Name', axvlines=False) + assert len(ax.get_lines()) == (nlines - nxticks) + + colors = ['b', 'g', 'r'] + df = DataFrame({"A": [1, 2, 3], + "B": [1, 2, 3], + "C": [1, 2, 3], + "Name": colors}) + ax = parallel_coordinates(df, 'Name', color=colors) + handles, labels = ax.get_legend_handles_labels() + self._check_colors(handles, linecolors=colors) + + with tm.assert_produces_warning(FutureWarning): + parallel_coordinates(data=df, class_column='Name') + with tm.assert_produces_warning(FutureWarning): + parallel_coordinates(df, 'Name', colors=colors) + + @slow + def test_radviz(self): + from pandas.tools.plotting import radviz + from matplotlib import cm + + df = self.iris + _check_plot_works(radviz, df, 'Name') + + rgba = ('#556270', '#4ECDC4', '#C7F464') + ax = _check_plot_works(radviz, df, 'Name', color=rgba) + # skip Circle drawn as ticks + patches = [p for p in ax.patches[:20] if p.get_label() != ''] + self._check_colors(patches[:10], facecolors=rgba, mapping=df['Name'][:10]) + + cnames = ['dodgerblue', 'aquamarine', 'seagreen'] + _check_plot_works(radviz, df, 'Name', color=cnames) + patches = [p for p in ax.patches[:20] if p.get_label() != ''] + self._check_colors(patches, facecolors=cnames, mapping=df['Name'][:10]) + + _check_plot_works(radviz, df, 'Name', colormap=cm.jet) + cmaps = lmap(cm.jet, np.linspace(0, 1, df['Name'].nunique())) + patches = [p for p in ax.patches[:20] if p.get_label() != ''] + self._check_colors(patches, facecolors=cmaps, mapping=df['Name'][:10]) + + colors = [[0., 0., 1., 1.], + [0., 0.5, 1., 1.], + [1., 0., 0., 1.]] + df = DataFrame({"A": [1, 2, 3], + "B": [2, 1, 3], + "C": [3, 2, 1], + "Name": ['b', 'g', 'r']}) + ax = radviz(df, 'Name', color=colors) + handles, labels = ax.get_legend_handles_labels() + self._check_colors(handles, facecolors=colors) + + +@tm.mplskip +class TestDataFrameGroupByPlots(TestPlotBase): + + @slow + def test_boxplot_legacy(self): + grouped = self.hist_df.groupby(by='gender') + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + axes = _check_plot_works(grouped.boxplot, return_type='axes') + self._check_axes_shape(list(axes.values()), axes_num=2, layout=(1, 2)) + + axes = _check_plot_works(grouped.boxplot, subplots=False, + return_type='axes') + self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) + tuples = lzip(string.ascii_letters[:10], range(10)) + df = DataFrame(np.random.rand(10, 3), + index=MultiIndex.from_tuples(tuples)) + + grouped = df.groupby(level=1) + axes = _check_plot_works(grouped.boxplot, return_type='axes') + self._check_axes_shape(list(axes.values()), axes_num=10, layout=(4, 3)) + + axes = _check_plot_works(grouped.boxplot, subplots=False, + return_type='axes') + self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) + + grouped = df.unstack(level=1).groupby(level=0, axis=1) + axes = _check_plot_works(grouped.boxplot, return_type='axes') + self._check_axes_shape(list(axes.values()), axes_num=3, layout=(2, 2)) + + axes = _check_plot_works(grouped.boxplot, subplots=False, + return_type='axes') + self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) + + @slow + def test_grouped_plot_fignums(self): + n = 10 + weight = Series(np.random.normal(166, 20, size=n)) + height = Series(np.random.normal(60, 10, size=n)) + with tm.RNGContext(42): + gender = tm.choice(['male', 'female'], size=n) + df = DataFrame({'height': height, 'weight': weight, 'gender': gender}) + gb = df.groupby('gender') + + res = gb.plot() + self.assertEqual(len(self.plt.get_fignums()), 2) + self.assertEqual(len(res), 2) + tm.close() + + res = gb.boxplot(return_type='axes') + self.assertEqual(len(self.plt.get_fignums()), 1) + self.assertEqual(len(res), 2) + tm.close() + + # now works with GH 5610 as gender is excluded + res = df.groupby('gender').hist() + tm.close() + + @slow + def test_grouped_hist_legacy(self): + df = DataFrame(randn(500, 2), columns=['A', 'B']) + df['C'] = np.random.randint(0, 4, 500) + df['D'] = ['X'] * 500 + + axes = plotting.grouped_hist(df.A, by=df.C) + self._check_axes_shape(axes, axes_num=4, layout=(2, 2)) + + tm.close() + axes = df.hist(by=df.C) + self._check_axes_shape(axes, axes_num=4, layout=(2, 2)) + + tm.close() + # group by a key with single value + axes = df.hist(by='D', rot=30) + self._check_axes_shape(axes, axes_num=1, layout=(1, 1)) + self._check_ticks_props(axes, xrot=30) + + tm.close() + # make sure kwargs to hist are handled + xf, yf = 20, 18 + xrot, yrot = 30, 40 + axes = plotting.grouped_hist(df.A, by=df.C, normed=True, + cumulative=True, bins=4, + xlabelsize=xf, xrot=xrot, ylabelsize=yf, yrot=yrot) + # height of last bin (index 5) must be 1.0 + for ax in axes.ravel(): + height = ax.get_children()[5].get_height() + self.assertAlmostEqual(height, 1.0) + self._check_ticks_props(axes, xlabelsize=xf, xrot=xrot, + ylabelsize=yf, yrot=yrot) + + tm.close() + axes = plotting.grouped_hist(df.A, by=df.C, log=True) + # scale of y must be 'log' + self._check_ax_scales(axes, yaxis='log') + + tm.close() + # propagate attr exception from matplotlib.Axes.hist + with tm.assertRaises(AttributeError): + plotting.grouped_hist(df.A, by=df.C, foo='bar') + + with tm.assert_produces_warning(FutureWarning): + df.hist(by='C', figsize='default') + + @slow + def test_grouped_hist_legacy2(self): + n = 10 + weight = Series(np.random.normal(166, 20, size=n)) + height = Series(np.random.normal(60, 10, size=n)) + with tm.RNGContext(42): + gender_int = tm.choice([0, 1], size=n) + df_int = DataFrame({'height': height, 'weight': weight, + 'gender': gender_int}) + gb = df_int.groupby('gender') + axes = gb.hist() + self.assertEqual(len(axes), 2) + self.assertEqual(len(self.plt.get_fignums()), 2) + tm.close() + + @slow + def test_grouped_box_return_type(self): + df = self.hist_df + + # old style: return_type=None + result = df.boxplot(by='gender') + self.assertIsInstance(result, np.ndarray) + self._check_box_return_type(result, None, + expected_keys=['height', 'weight', 'category']) + + # now for groupby + with tm.assert_produces_warning(FutureWarning): + result = df.groupby('gender').boxplot() + self._check_box_return_type(result, 'dict', expected_keys=['Male', 'Female']) + + columns2 = 'X B C D A G Y N Q O'.split() + df2 = DataFrame(random.randn(50, 10), columns=columns2) + categories2 = 'A B C D E F G H I J'.split() + df2['category'] = categories2 * 5 + + for t in ['dict', 'axes', 'both']: + returned = df.groupby('classroom').boxplot(return_type=t) + self._check_box_return_type(returned, t, expected_keys=['A', 'B', 'C']) + + returned = df.boxplot(by='classroom', return_type=t) + self._check_box_return_type(returned, t, + expected_keys=['height', 'weight', 'category']) + + returned = df2.groupby('category').boxplot(return_type=t) + self._check_box_return_type(returned, t, expected_keys=categories2) + + returned = df2.boxplot(by='category', return_type=t) + self._check_box_return_type(returned, t, expected_keys=columns2) + + @slow + def test_grouped_box_layout(self): + df = self.hist_df + + self.assertRaises(ValueError, df.boxplot, column=['weight', 'height'], + by=df.gender, layout=(1, 1)) + self.assertRaises(ValueError, df.boxplot, column=['height', 'weight', 'category'], + layout=(2, 1), return_type='dict') + self.assertRaises(ValueError, df.boxplot, column=['weight', 'height'], + by=df.gender, layout=(-1, -1)) + + box = _check_plot_works(df.groupby('gender').boxplot, column='height', + return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=2, layout=(1, 2)) + + box = _check_plot_works(df.groupby('category').boxplot, column='height', + return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(2, 2)) + + # GH 6769 + box = _check_plot_works(df.groupby('classroom').boxplot, + column='height', return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) + + # GH 5897 + axes = df.boxplot(column=['height', 'weight', 'category'], by='gender', + return_type='axes') + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) + for ax in [axes['height']]: + self._check_visible(ax.get_xticklabels(), visible=False) + self._check_visible([ax.xaxis.get_label()], visible=False) + for ax in [axes['weight'], axes['category']]: + self._check_visible(ax.get_xticklabels()) + self._check_visible([ax.xaxis.get_label()]) + + box = df.groupby('classroom').boxplot( + column=['height', 'weight', 'category'], return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(2, 2)) + + box = _check_plot_works(df.groupby('category').boxplot, column='height', + layout=(3, 2), return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(3, 2)) + box = _check_plot_works(df.groupby('category').boxplot, column='height', + layout=(3, -1), return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(3, 2)) + + box = df.boxplot(column=['height', 'weight', 'category'], by='gender', + layout=(4, 1)) + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(4, 1)) + + box = df.boxplot(column=['height', 'weight', 'category'], by='gender', + layout=(-1, 1)) + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(3, 1)) + + box = df.groupby('classroom').boxplot( + column=['height', 'weight', 'category'], layout=(1, 4), + return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(1, 4)) + + box = df.groupby('classroom').boxplot( + column=['height', 'weight', 'category'], layout=(1, -1), + return_type='dict') + self._check_axes_shape(self.plt.gcf().axes, axes_num=3, layout=(1, 3)) + + @slow + def test_grouped_box_multiple_axes(self): + # GH 6970, GH 7069 + df = self.hist_df + + # check warning to ignore sharex / sharey + # this check should be done in the first function which + # passes multiple axes to plot, hist or boxplot + # location should be changed if other test is added + # which has earlier alphabetical order + with tm.assert_produces_warning(UserWarning): + fig, axes = self.plt.subplots(2, 2) + df.groupby('category').boxplot(column='height', return_type='axes', ax=axes) + self._check_axes_shape(self.plt.gcf().axes, axes_num=4, layout=(2, 2)) + + fig, axes = self.plt.subplots(2, 3) + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + returned = df.boxplot(column=['height', 'weight', 'category'], + by='gender', return_type='axes', ax=axes[0]) + returned = np.array(list(returned.values())) + self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) + self.assert_numpy_array_equal(returned, axes[0]) + self.assertIs(returned[0].figure, fig) + + # draw on second row + with warnings.catch_warnings(): + warnings.simplefilter('ignore') + returned = df.groupby('classroom').boxplot( + column=['height', 'weight', 'category'], + return_type='axes', ax=axes[1]) + returned = np.array(list(returned.values())) + self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) + self.assert_numpy_array_equal(returned, axes[1]) + self.assertIs(returned[0].figure, fig) + + with tm.assertRaises(ValueError): + fig, axes = self.plt.subplots(2, 3) + # pass different number of axes from required + axes = df.groupby('classroom').boxplot(ax=axes) + + @slow + def test_grouped_hist_layout(self): + df = self.hist_df + self.assertRaises(ValueError, df.hist, column='weight', by=df.gender, + layout=(1, 1)) + self.assertRaises(ValueError, df.hist, column='height', by=df.category, + layout=(1, 3)) + self.assertRaises(ValueError, df.hist, column='height', by=df.category, + layout=(-1, -1)) + + axes = _check_plot_works(df.hist, column='height', by=df.gender, + layout=(2, 1)) + self._check_axes_shape(axes, axes_num=2, layout=(2, 1)) + + axes = _check_plot_works(df.hist, column='height', by=df.gender, + layout=(2, -1)) + self._check_axes_shape(axes, axes_num=2, layout=(2, 1)) + + axes = df.hist(column='height', by=df.category, layout=(4, 1)) + self._check_axes_shape(axes, axes_num=4, layout=(4, 1)) + + axes = df.hist(column='height', by=df.category, layout=(-1, 1)) + self._check_axes_shape(axes, axes_num=4, layout=(4, 1)) + + axes = df.hist(column='height', by=df.category, layout=(4, 2), figsize=(12, 8)) + self._check_axes_shape(axes, axes_num=4, layout=(4, 2), figsize=(12, 8)) + tm.close() + + # GH 6769 + axes = _check_plot_works(df.hist, column='height', by='classroom', layout=(2, 2)) + self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) + + # without column + axes = _check_plot_works(df.hist, by='classroom') + self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) + + axes = df.hist(by='gender', layout=(3, 5)) + self._check_axes_shape(axes, axes_num=2, layout=(3, 5)) + + axes = df.hist(column=['height', 'weight', 'category']) + self._check_axes_shape(axes, axes_num=3, layout=(2, 2)) + + @slow + def test_grouped_hist_multiple_axes(self): + # GH 6970, GH 7069 + df = self.hist_df + + fig, axes = self.plt.subplots(2, 3) + returned = df.hist(column=['height', 'weight', 'category'], ax=axes[0]) + self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) + self.assert_numpy_array_equal(returned, axes[0]) + self.assertIs(returned[0].figure, fig) + returned = df.hist(by='classroom', ax=axes[1]) + self._check_axes_shape(returned, axes_num=3, layout=(1, 3)) + self.assert_numpy_array_equal(returned, axes[1]) + self.assertIs(returned[0].figure, fig) + + with tm.assertRaises(ValueError): + fig, axes = self.plt.subplots(2, 3) + # pass different number of axes from required + axes = df.hist(column='height', ax=axes) + + @slow + def test_axis_share_x(self): + df = self.hist_df + # GH4089 + ax1, ax2 = df.hist(column='height', by=df.gender, sharex=True) + + # share x + self.assertTrue(ax1._shared_x_axes.joined(ax1, ax2)) + self.assertTrue(ax2._shared_x_axes.joined(ax1, ax2)) + + # don't share y + self.assertFalse(ax1._shared_y_axes.joined(ax1, ax2)) + self.assertFalse(ax2._shared_y_axes.joined(ax1, ax2)) + + @slow + def test_axis_share_y(self): + df = self.hist_df + ax1, ax2 = df.hist(column='height', by=df.gender, sharey=True) + + # share y + self.assertTrue(ax1._shared_y_axes.joined(ax1, ax2)) + self.assertTrue(ax2._shared_y_axes.joined(ax1, ax2)) + + # don't share x + self.assertFalse(ax1._shared_x_axes.joined(ax1, ax2)) + self.assertFalse(ax2._shared_x_axes.joined(ax1, ax2)) + + @slow + def test_axis_share_xy(self): + df = self.hist_df + ax1, ax2 = df.hist(column='height', by=df.gender, sharex=True, + sharey=True) + + # share both x and y + self.assertTrue(ax1._shared_x_axes.joined(ax1, ax2)) + self.assertTrue(ax2._shared_x_axes.joined(ax1, ax2)) + + self.assertTrue(ax1._shared_y_axes.joined(ax1, ax2)) + self.assertTrue(ax2._shared_y_axes.joined(ax1, ax2)) + + +if __name__ == '__main__': + nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], + exit=False) diff --git a/pandas/tests/test_groupby.py b/pandas/tests/test_groupby.py index 576c5c6be890d..feb3c10a729ae 100644 --- a/pandas/tests/test_groupby.py +++ b/pandas/tests/test_groupby.py @@ -549,7 +549,7 @@ def func(dataf): return dataf["val2"] - dataf["val2"].mean() result = df1.groupby("val1", squeeze=True).apply(func) - tm.assert_isinstance(result,Series) + tm.assertIsInstance(result,Series) df2 = DataFrame([{"val1": 1, "val2" : 20}, {"val1":1, "val2": 19}, {"val1":1, "val2": 27}, {"val1":1, "val2": 12}]) @@ -557,12 +557,12 @@ def func(dataf): return dataf["val2"] - dataf["val2"].mean() result = df2.groupby("val1", squeeze=True).apply(func) - tm.assert_isinstance(result,Series) + tm.assertIsInstance(result,Series) # GH3596, return a consistent type (regression in 0.11 from 0.10.1) df = DataFrame([[1,1],[1,1]],columns=['X','Y']) result = df.groupby('X',squeeze=False).count() - tm.assert_isinstance(result,DataFrame) + tm.assertIsInstance(result,DataFrame) # GH5592 # inconcistent return type @@ -601,7 +601,7 @@ def f(grp): return grp.iloc[0] result = df.groupby('A').apply(f)[['C']] e = df.groupby('A').first()[['C']] - e.loc['Pony'] = np.nan + e.loc['Pony'] = pd.NaT assert_frame_equal(result,e) # scalar outputs @@ -670,7 +670,7 @@ def test_agg_period_index(self): prng = period_range('2012-1-1', freq='M', periods=3) df = DataFrame(np.random.randn(3, 2), index=prng) rs = df.groupby(level=0).sum() - tm.assert_isinstance(rs.index, PeriodIndex) + tm.assertIsInstance(rs.index, PeriodIndex) # GH 3579 index = period_range(start='1999-01', periods=5, freq='M') @@ -912,7 +912,7 @@ def test_aggregate_item_by_item(self): def aggfun(ser): return ser.size result = DataFrame().groupby(self.df.A).agg(aggfun) - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) self.assertEqual(len(result), 0) def test_agg_item_by_item_raise_typeerror(self): @@ -1642,22 +1642,22 @@ def test_as_index_series_return_frame(self): result = grouped['C'].agg(np.sum) expected = grouped.agg(np.sum).ix[:, ['A', 'C']] - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) assert_frame_equal(result, expected) result2 = grouped2['C'].agg(np.sum) expected2 = grouped2.agg(np.sum).ix[:, ['A', 'B', 'C']] - tm.assert_isinstance(result2, DataFrame) + tm.assertIsInstance(result2, DataFrame) assert_frame_equal(result2, expected2) result = grouped['C'].sum() expected = grouped.sum().ix[:, ['A', 'C']] - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) assert_frame_equal(result, expected) result2 = grouped2['C'].sum() expected2 = grouped2.sum().ix[:, ['A', 'B', 'C']] - tm.assert_isinstance(result2, DataFrame) + tm.assertIsInstance(result2, DataFrame) assert_frame_equal(result2, expected2) # corner case @@ -2023,7 +2023,7 @@ def test_wrap_aggregated_output_multindex(self): keys = [np.array([0, 0, 1]), np.array([0, 0, 1])] agged = df.groupby(keys).agg(np.mean) - tm.assert_isinstance(agged.columns, MultiIndex) + tm.assertIsInstance(agged.columns, MultiIndex) def aggfun(ser): if ser.name == ('foo', 'one'): @@ -2181,7 +2181,7 @@ def f(piece): grouped = ts.groupby(lambda x: x.month) result = grouped.apply(f) - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) self.assertTrue(result.index.equals(ts.index)) def test_apply_series_yield_constant(self): @@ -2779,11 +2779,11 @@ def convert_force_pure(x): result = grouped.agg(convert_fast) self.assertEqual(result.dtype, np.object_) - tm.assert_isinstance(result[0], Decimal) + tm.assertIsInstance(result[0], Decimal) result = grouped.agg(convert_force_pure) self.assertEqual(result.dtype, np.object_) - tm.assert_isinstance(result[0], Decimal) + tm.assertIsInstance(result[0], Decimal) def test_fast_apply(self): # make sure that fast apply is correctly called @@ -3225,7 +3225,7 @@ def g(group): result = self.df.groupby('A')['C'].apply(f) expected = self.df.groupby('A')['C'].apply(g) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) assert_series_equal(result, expected) def test_getitem_list_of_columns(self): @@ -3413,7 +3413,8 @@ def test_groupby_sort_categorical(self): col = 'range' assert_frame_equal(result_sort, df.groupby(col, sort=True).first()) - assert_frame_equal(result_nosort, df.groupby(col, sort=False).first()) + # when categories is ordered, group is ordered by category's order + assert_frame_equal(result_sort, df.groupby(col, sort=False).first()) df['range'] = Categorical(df['range'],ordered=False) index = Index(['(0, 2.5]', '(2.5, 5]', '(5, 7.5]', '(7.5, 10]'], dtype='object') @@ -3431,6 +3432,55 @@ def test_groupby_sort_categorical(self): assert_frame_equal(result_sort, df.groupby(col, sort=True).first()) assert_frame_equal(result_nosort, df.groupby(col, sort=False).first()) + def test_groupby_sort_categorical_datetimelike(self): + # GH10505 + + # use same data as test_groupby_sort_categorical, which category is + # corresponding to datetime.month + df = DataFrame({'dt': [datetime(2011, 7, 1), datetime(2011, 7, 1), + datetime(2011, 2, 1), datetime(2011, 5, 1), + datetime(2011, 2, 1), datetime(2011, 1, 1), + datetime(2011, 5, 1)], + 'foo': [10, 8, 5, 6, 4, 1, 7], + 'bar': [10, 20, 30, 40, 50, 60, 70]}, + columns=['dt', 'foo', 'bar']) + + # ordered=True + df['dt'] = Categorical(df['dt'], ordered=True) + index = [datetime(2011, 1, 1), datetime(2011, 2, 1), + datetime(2011, 5, 1), datetime(2011, 7, 1)] + result_sort = DataFrame([[1, 60], [5, 30], [6, 40], [10, 10]], columns=['foo', 'bar']) + result_sort.index = CategoricalIndex(index, name='dt', ordered=True) + + index = [datetime(2011, 7, 1), datetime(2011, 2, 1), + datetime(2011, 5, 1), datetime(2011, 1, 1)] + result_nosort = DataFrame([[10, 10], [5, 30], [6, 40], [1, 60]], + columns=['foo', 'bar']) + result_nosort.index = CategoricalIndex(index, categories=index, + name='dt', ordered=True) + + col = 'dt' + assert_frame_equal(result_sort, df.groupby(col, sort=True).first()) + # when categories is ordered, group is ordered by category's order + assert_frame_equal(result_sort, df.groupby(col, sort=False).first()) + + # ordered = False + df['dt'] = Categorical(df['dt'], ordered=False) + index = [datetime(2011, 1, 1), datetime(2011, 2, 1), + datetime(2011, 5, 1), datetime(2011, 7, 1)] + result_sort = DataFrame([[1, 60], [5, 30], [6, 40], [10, 10]], columns=['foo', 'bar']) + result_sort.index = CategoricalIndex(index, name='dt') + + index = [datetime(2011, 7, 1), datetime(2011, 2, 1), + datetime(2011, 5, 1), datetime(2011, 1, 1)] + result_nosort = DataFrame([[10, 10], [5, 30], [6, 40], [1, 60]], + columns=['foo', 'bar']) + result_nosort.index = CategoricalIndex(index, categories=index, name='dt') + + col = 'dt' + assert_frame_equal(result_sort, df.groupby(col, sort=True).first()) + assert_frame_equal(result_nosort, df.groupby(col, sort=False).first()) + def test_groupby_sort_multiindex_series(self): # series multiindex groupby sort argument was not being passed through _compress_group_index @@ -3453,7 +3503,7 @@ def test_groupby_categorical(self): levels = ['foo', 'bar', 'baz', 'qux'] codes = np.random.randint(0, 4, size=100) - cats = Categorical.from_codes(codes, levels, name='myfactor', ordered=True) + cats = Categorical.from_codes(codes, levels, ordered=True) data = DataFrame(np.random.randn(100, 4)) @@ -3461,10 +3511,8 @@ def test_groupby_categorical(self): expected = data.groupby(np.asarray(cats)).mean() expected = expected.reindex(levels) - expected.index.name = 'myfactor' assert_frame_equal(result, expected) - self.assertEqual(result.index.name, cats.name) grouped = data.groupby(cats) desc_result = grouped.describe() @@ -3473,35 +3521,52 @@ def test_groupby_categorical(self): ord_labels = np.asarray(cats).take(idx) ord_data = data.take(idx) expected = ord_data.groupby(ord_labels, sort=False).describe() - expected.index.names = ['myfactor', None] + expected.index.names = [None, None] assert_frame_equal(desc_result, expected) + # GH 10460 + expc = Categorical.from_codes(np.arange(4).repeat(8), levels, ordered=True) + exp = CategoricalIndex(expc) + self.assert_index_equal(desc_result.index.get_level_values(0), exp) + exp = Index(['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max'] * 4) + self.assert_index_equal(desc_result.index.get_level_values(1), exp) + def test_groupby_datetime_categorical(self): # GH9049: ensure backward compatibility levels = pd.date_range('2014-01-01', periods=4) codes = np.random.randint(0, 4, size=100) - cats = Categorical.from_codes(codes, levels, name='myfactor', ordered=True) + cats = Categorical.from_codes(codes, levels, ordered=True) data = DataFrame(np.random.randn(100, 4)) result = data.groupby(cats).mean() expected = data.groupby(np.asarray(cats)).mean() expected = expected.reindex(levels) - expected.index = CategoricalIndex(expected.index,categories=expected.index,name='myfactor',ordered=True) + expected.index = CategoricalIndex(expected.index, categories=expected.index, + ordered=True) assert_frame_equal(result, expected) - self.assertEqual(result.index.name, cats.name) grouped = data.groupby(cats) desc_result = grouped.describe() idx = cats.codes.argsort() - ord_labels = np.asarray(cats).take(idx) + ord_labels = cats.take_nd(idx) ord_data = data.take(idx) - expected = ord_data.groupby(ord_labels, sort=False).describe() - expected.index.names = ['myfactor', None] + expected = ord_data.groupby(ord_labels).describe() + expected.index.names = [None, None] assert_frame_equal(desc_result, expected) + tm.assert_index_equal(desc_result.index, expected.index) + tm.assert_index_equal(desc_result.index.get_level_values(0), expected.index.get_level_values(0)) + + # GH 10460 + expc = Categorical.from_codes(np.arange(4).repeat(8), levels, ordered=True) + exp = CategoricalIndex(expc) + self.assert_index_equal(desc_result.index.get_level_values(0), exp) + exp = Index(['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max'] * 4) + self.assert_index_equal(desc_result.index.get_level_values(1), exp) + def test_groupby_categorical_index(self): @@ -3534,7 +3599,7 @@ def test_groupby_groups_datetimeindex(self): # it works! groups = grouped.groups - tm.assert_isinstance(list(groups.keys())[0], datetime) + tm.assertIsInstance(list(groups.keys())[0], datetime) def test_groupby_groups_datetimeindex_tz(self): # GH 3950 @@ -3670,7 +3735,7 @@ def test_groupby_categorical_no_compress(self): result = data.groupby("b").mean() result = result["a"].values exp = np.array([1,2,4,np.nan]) - self.assert_numpy_array_equivalent(result, exp) + self.assert_numpy_array_equal(result, exp) def test_groupby_non_arithmetic_agg_types(self): # GH9311, GH6620 @@ -4412,6 +4477,32 @@ def test_filter_maintains_ordering(self): expected = s.iloc[[1, 2, 4, 7]] assert_series_equal(actual, expected) + def test_filter_multiple_timestamp(self): + # GH 10114 + df = DataFrame({'A' : np.arange(5,dtype='int64'), + 'B' : ['foo','bar','foo','bar','bar'], + 'C' : Timestamp('20130101') }) + + grouped = df.groupby(['B', 'C']) + + result = grouped['A'].filter(lambda x: True) + assert_series_equal(df['A'], result) + + result = grouped['A'].transform(len) + expected = Series([2, 3, 2, 3, 3], name='A') + assert_series_equal(result, expected) + + result = grouped.filter(lambda x: True) + assert_frame_equal(df, result) + + result = grouped.transform('sum') + expected = DataFrame({'A' : [2, 8, 2, 8, 8]}) + assert_frame_equal(result, expected) + + result = grouped.transform(len) + expected = DataFrame({'A' : [2, 3, 2, 3, 3]}) + assert_frame_equal(result, expected) + def test_filter_and_transform_with_non_unique_int_index(self): # GH4620 index = [1, 1, 1, 2, 1, 1, 0, 1] @@ -4793,7 +4884,7 @@ def test_groupby_whitelist(self): 'fillna', 'mad', 'any', 'all', - 'irow', 'take', + 'take', 'idxmax', 'idxmin', 'shift', 'tshift', 'ffill', 'bfill', @@ -4814,7 +4905,7 @@ def test_groupby_whitelist(self): 'fillna', 'mad', 'any', 'all', - 'irow', 'take', + 'take', 'idxmax', 'idxmin', 'shift', 'tshift', 'ffill', 'bfill', @@ -4839,6 +4930,20 @@ def test_groupby_whitelist(self): 'mad', 'std', 'var', 'sem'] AGG_FUNCTIONS_WITH_SKIPNA = ['skew', 'mad'] + def test_groupby_whitelist_deprecations(self): + from string import ascii_lowercase + letters = np.array(list(ascii_lowercase)) + N = 10 + random_letters = letters.take(np.random.randint(0, 26, N)) + df = DataFrame({'floats': N / 10 * Series(np.random.random(N)), + 'letters': Series(random_letters)}) + + # 10711 deprecated + with tm.assert_produces_warning(FutureWarning): + df.groupby('letters').irow(0) + with tm.assert_produces_warning(FutureWarning): + df.groupby('letters').floats.irow(0) + def test_regression_whitelist_methods(self) : # GH6944 @@ -4909,16 +5014,17 @@ def test_tab_completion(self): grp = self.mframe.groupby(level='second') results = set([v for v in dir(grp) if not v.startswith('_')]) expected = set(['A','B','C', - 'agg','aggregate','apply','boxplot','filter','first','get_group', - 'groups','hist','indices','last','max','mean','median', - 'min','name','ngroups','nth','ohlc','plot', 'prod', - 'size', 'std', 'sum', 'transform', 'var', 'sem', 'count', 'head', - 'describe', 'cummax', 'quantile', 'rank', 'cumprod', 'tail', - 'resample', 'cummin', 'fillna', 'cumsum', 'cumcount', - 'all', 'shift', 'skew', 'bfill', 'irow', 'ffill', - 'take', 'tshift', 'pct_change', 'any', 'mad', 'corr', 'corrwith', - 'cov', 'dtypes', 'diff', 'idxmax', 'idxmin' - ]) + 'agg','aggregate','apply','boxplot','filter','first','get_group', + 'groups','hist','indices','last','max','mean','median', + 'min','name','ngroups','nth','ohlc','plot', 'prod', + 'size', 'std', 'sum', 'transform', 'var', 'sem', 'count', 'head', + 'irow', + 'describe', 'cummax', 'quantile', 'rank', 'cumprod', 'tail', + 'resample', 'cummin', 'fillna', 'cumsum', 'cumcount', + 'all', 'shift', 'skew', 'bfill', 'ffill', + 'take', 'tshift', 'pct_change', 'any', 'mad', 'corr', 'corrwith', + 'cov', 'dtypes', 'diff', 'idxmax', 'idxmin' + ]) self.assertEqual(results, expected) def test_lexsort_indexer(self): diff --git a/pandas/tests/test_index.py b/pandas/tests/test_index.py index f422c3b49b691..35de75c6cdf02 100644 --- a/pandas/tests/test_index.py +++ b/pandas/tests/test_index.py @@ -10,7 +10,6 @@ import os import numpy as np -from numpy.testing import assert_array_equal from pandas import (period_range, date_range, Categorical, Series, Index, Float64Index, Int64Index, MultiIndex, @@ -101,7 +100,7 @@ def test_reindex_base(self): expected = np.arange(idx.size) actual = idx.get_indexer(idx) - assert_array_equal(expected, actual) + tm.assert_numpy_array_equal(expected, actual) with tm.assertRaisesRegexp(ValueError, 'Invalid fill method'): idx.get_indexer(idx, method='invalid') @@ -133,6 +132,15 @@ def test_str(self): self.assertTrue("'foo'" in str(idx)) self.assertTrue(idx.__class__.__name__ in str(idx)) + def test_dtype_str(self): + for idx in self.indices.values(): + dtype = idx.dtype_str + self.assertIsInstance(dtype, compat.string_types) + if isinstance(idx, PeriodIndex): + self.assertEqual(dtype, 'period') + else: + self.assertEqual(dtype, str(idx.dtype)) + def test_repr_max_seq_item_setting(self): # GH10182 idx = self.create_index() @@ -207,10 +215,19 @@ def test_duplicates(self): if not len(ind): continue + if isinstance(ind, MultiIndex): + continue idx = self._holder([ind[0]]*5) self.assertFalse(idx.is_unique) self.assertTrue(idx.has_duplicates) + # GH 10115 + # preserve names + idx.name = 'foo' + result = idx.drop_duplicates() + self.assertEqual(result.name, 'foo') + self.assert_index_equal(result, Index([ind[0]],name='foo')) + def test_sort(self): for ind in self.indices.values(): self.assertRaises(TypeError, ind.sort) @@ -239,7 +256,7 @@ def test_argsort(self): result = ind.argsort() expected = np.array(ind).argsort() - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def test_pickle(self): for ind in self.indices.values(): @@ -259,6 +276,11 @@ def test_take(self): expected = ind[indexer] self.assertTrue(result.equals(expected)) + if not isinstance(ind, (DatetimeIndex, PeriodIndex, TimedeltaIndex)): + # GH 10791 + with tm.assertRaises(AttributeError): + ind.freq + def test_setops_errorcases(self): for name, idx in compat.iteritems(self.indices): # # non-iterable input @@ -349,7 +371,7 @@ def test_difference_base(self): pass elif isinstance(idx, (DatetimeIndex, TimedeltaIndex)): self.assertEqual(result.__class__, answer.__class__) - self.assert_numpy_array_equal(result.asi8, answer.asi8) + tm.assert_numpy_array_equal(result.asi8, answer.asi8) else: result = first.difference(case) self.assertTrue(tm.equalContents(result, answer)) @@ -388,6 +410,99 @@ def test_symmetric_diff(self): with tm.assertRaisesRegexp(TypeError, msg): result = first.sym_diff([1, 2, 3]) + def test_insert_base(self): + + for name, idx in compat.iteritems(self.indices): + result = idx[1:4] + + if not len(idx): + continue + + #test 0th element + self.assertTrue(idx[0:4].equals( + result.insert(0, idx[0]))) + + def test_delete_base(self): + + for name, idx in compat.iteritems(self.indices): + + if not len(idx): + continue + + expected = idx[1:] + result = idx.delete(0) + self.assertTrue(result.equals(expected)) + self.assertEqual(result.name, expected.name) + + expected = idx[:-1] + result = idx.delete(-1) + self.assertTrue(result.equals(expected)) + self.assertEqual(result.name, expected.name) + + with tm.assertRaises((IndexError, ValueError)): + # either depending on numpy version + result = idx.delete(len(idx)) + + def test_equals_op(self): + # GH9947, GH10637 + index_a = self.create_index() + if isinstance(index_a, PeriodIndex): + return + + n = len(index_a) + index_b = index_a[0:-1] + index_c = index_a[0:-1].append(index_a[-2:-1]) + index_d = index_a[0:1] + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == index_b + expected1 = np.array([True] * n) + expected2 = np.array([True] * (n - 1) + [False]) + tm.assert_numpy_array_equal(index_a == index_a, expected1) + tm.assert_numpy_array_equal(index_a == index_c, expected2) + + # test comparisons with numpy arrays + array_a = np.array(index_a) + array_b = np.array(index_a[0:-1]) + array_c = np.array(index_a[0:-1].append(index_a[-2:-1])) + array_d = np.array(index_a[0:1]) + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == array_b + tm.assert_numpy_array_equal(index_a == array_a, expected1) + tm.assert_numpy_array_equal(index_a == array_c, expected2) + + # test comparisons with Series + series_a = Series(array_a) + series_b = Series(array_b) + series_c = Series(array_c) + series_d = Series(array_d) + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == series_b + tm.assert_numpy_array_equal(index_a == series_a, expected1) + tm.assert_numpy_array_equal(index_a == series_c, expected2) + + # cases where length is 1 for one of them + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == index_d + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == series_d + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + index_a == array_d + with tm.assertRaisesRegexp(ValueError, "Series lengths must match"): + series_a == series_d + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + series_a == array_d + + # comparing with a scalar should broadcast; note that we are excluding + # MultiIndex because in this case each item in the index is a tuple of + # length 2, and therefore is considered an array of length 2 in the + # comparison instead of a scalar + if not isinstance(index_a, MultiIndex): + expected3 = np.array([False] * (len(index_a) - 2) + [True, False]) + # assuming the 2nd to last item is unique in the data + item = index_a[-2] + tm.assert_numpy_array_equal(index_a == item, expected3) + tm.assert_numpy_array_equal(series_a == item, expected3) + class TestIndex(Base, tm.TestCase): _holder = Index @@ -416,7 +531,7 @@ def create_index(self): def test_new_axis(self): new_index = self.dateIndex[None, :] self.assertEqual(new_index.ndim, 2) - tm.assert_isinstance(new_index, np.ndarray) + tm.assertIsInstance(new_index, np.ndarray) def test_copy_and_deepcopy(self): super(TestIndex, self).test_copy_and_deepcopy() @@ -433,14 +548,14 @@ def test_constructor(self): arr = np.array(self.strIndex) index = Index(arr) tm.assert_contains_all(arr, index) - self.assert_numpy_array_equal(self.strIndex, index) + tm.assert_numpy_array_equal(self.strIndex, index) # copy arr = np.array(self.strIndex) index = Index(arr, copy=True, name='name') - tm.assert_isinstance(index, Index) + tm.assertIsInstance(index, Index) self.assertEqual(index.name, 'name') - assert_array_equal(arr, index) + tm.assert_numpy_array_equal(arr, index) arr[0] = "SOMEBIGLONGSTRING" self.assertNotEqual(index[0], "SOMEBIGLONGSTRING") @@ -452,6 +567,15 @@ def test_constructor_corner(self): # corner case self.assertRaises(TypeError, Index, 0) + def test_consruction_list_mixed_tuples(self): + # 10697 + # if we are constructing from a mixed list of tuples, make sure that we + # are independent of the sorting order + idx1 = Index([('A',1),'B']) + self.assertIsInstance(idx1, Index) and self.assertNotInstance(idx1, MultiIndex) + idx2 = Index(['B',('A',1)]) + self.assertIsInstance(idx2, Index) and self.assertNotInstance(idx2, MultiIndex) + def test_constructor_from_series(self): expected = DatetimeIndex([Timestamp('20110101'),Timestamp('20120101'),Timestamp('20130101')]) @@ -497,8 +621,8 @@ def __array__(self, dtype=None): def test_index_ctor_infer_periodindex(self): xp = period_range('2012-1-1', freq='M', periods=3) rs = Index(xp) - assert_array_equal(rs, xp) - tm.assert_isinstance(rs, PeriodIndex) + tm.assert_numpy_array_equal(rs, xp) + tm.assertIsInstance(rs, PeriodIndex) def test_constructor_simple_new(self): idx = Index([1, 2, 3, 4, 5], name='int') @@ -655,7 +779,7 @@ def test_asof(self): self.assertEqual(self.dateIndex.asof(d + timedelta(1)), d) d = self.dateIndex[0].to_datetime() - tm.assert_isinstance(self.dateIndex.asof(d), Timestamp) + tm.assertIsInstance(self.dateIndex.asof(d), Timestamp) def test_asof_datetime_partial(self): idx = pd.date_range('2010-01-01', periods=2, freq='m') @@ -688,7 +812,7 @@ def _check(op): index_result = op(index, element) self.assertIsInstance(index_result, np.ndarray) - self.assert_numpy_array_equal(arr_result, index_result) + tm.assert_numpy_array_equal(arr_result, index_result) _check(operator.eq) _check(operator.ne) @@ -746,10 +870,10 @@ def test_shift(self): self.assertIs(shifted, self.dateIndex) shifted = self.dateIndex.shift(5, timedelta(1)) - self.assert_numpy_array_equal(shifted, self.dateIndex + timedelta(5)) + tm.assert_numpy_array_equal(shifted, self.dateIndex + timedelta(5)) shifted = self.dateIndex.shift(1, 'B') - self.assert_numpy_array_equal(shifted, self.dateIndex + offsets.BDay()) + tm.assert_numpy_array_equal(shifted, self.dateIndex + offsets.BDay()) shifted.name = 'shifted' self.assertEqual(shifted.name, shifted.shift(1, 'D').name) @@ -1013,7 +1137,7 @@ def test_format(self): # windows has different precision on datetime.datetime.now (it doesn't include us # since the default for Timestamp shows these but Index formating does not # we are skipping - if not is_platform_windows: + if not is_platform_windows(): formatted = index.format() expected = [str(index[0])] self.assertEqual(formatted, expected) @@ -1096,17 +1220,37 @@ def test_get_indexer(self): r2 = idx2.get_indexer(idx1[::-1], method='backfill') assert_almost_equal(r2, e1[::-1]) + def test_get_indexer_invalid(self): + # GH10411 + idx = Index(np.arange(10)) + + with tm.assertRaisesRegexp(ValueError, 'tolerance argument'): + idx.get_indexer([1, 0], tolerance=1) + + with tm.assertRaisesRegexp(ValueError, 'limit argument'): + idx.get_indexer([1, 0], limit=1) + def test_get_indexer_nearest(self): idx = Index(np.arange(10)) all_methods = ['pad', 'backfill', 'nearest'] for method in all_methods: actual = idx.get_indexer([0, 5, 9], method=method) - self.assert_array_equal(actual, [0, 5, 9]) + tm.assert_numpy_array_equal(actual, [0, 5, 9]) + + actual = idx.get_indexer([0, 5, 9], method=method, tolerance=0) + tm.assert_numpy_array_equal(actual, [0, 5, 9]) for method, expected in zip(all_methods, [[0, 1, 8], [1, 2, 9], [0, 2, 9]]): actual = idx.get_indexer([0.2, 1.8, 8.5], method=method) - self.assert_array_equal(actual, expected) + tm.assert_numpy_array_equal(actual, expected) + + actual = idx.get_indexer([0.2, 1.8, 8.5], method=method, tolerance=1) + tm.assert_numpy_array_equal(actual, expected) + + for method, expected in zip(all_methods, [[0, -1, -1], [-1, 2, -1], [0, 2, -1]]): + actual = idx.get_indexer([0.2, 1.8, 8.5], method=method, tolerance=0.2) + tm.assert_numpy_array_equal(actual, expected) with tm.assertRaisesRegexp(ValueError, 'limit argument'): idx.get_indexer([1, 0], method='nearest', limit=1) @@ -1117,40 +1261,59 @@ def test_get_indexer_nearest_decreasing(self): all_methods = ['pad', 'backfill', 'nearest'] for method in all_methods: actual = idx.get_indexer([0, 5, 9], method=method) - self.assert_array_equal(actual, [9, 4, 0]) + tm.assert_numpy_array_equal(actual, [9, 4, 0]) for method, expected in zip(all_methods, [[8, 7, 0], [9, 8, 1], [9, 7, 0]]): actual = idx.get_indexer([0.2, 1.8, 8.5], method=method) - self.assert_array_equal(actual, expected) + tm.assert_numpy_array_equal(actual, expected) def test_get_indexer_strings(self): idx = pd.Index(['b', 'c']) actual = idx.get_indexer(['a', 'b', 'c', 'd'], method='pad') expected = [-1, 0, 1, 1] - self.assert_array_equal(actual, expected) + tm.assert_numpy_array_equal(actual, expected) actual = idx.get_indexer(['a', 'b', 'c', 'd'], method='backfill') expected = [0, 0, 1, -1] - self.assert_array_equal(actual, expected) + tm.assert_numpy_array_equal(actual, expected) with tm.assertRaises(TypeError): idx.get_indexer(['a', 'b', 'c', 'd'], method='nearest') + with tm.assertRaises(TypeError): + idx.get_indexer(['a', 'b', 'c', 'd'], method='pad', tolerance=2) + def test_get_loc(self): idx = pd.Index([0, 1, 2]) all_methods = [None, 'pad', 'backfill', 'nearest'] for method in all_methods: self.assertEqual(idx.get_loc(1, method=method), 1) + if method is not None: + self.assertEqual(idx.get_loc(1, method=method, tolerance=0), 1) with tm.assertRaises(TypeError): idx.get_loc([1, 2], method=method) for method, loc in [('pad', 1), ('backfill', 2), ('nearest', 1)]: self.assertEqual(idx.get_loc(1.1, method), loc) + for method, loc in [('pad', 1), ('backfill', 2), ('nearest', 1)]: + self.assertEqual(idx.get_loc(1.1, method, tolerance=1), loc) + + for method in ['pad', 'backfill', 'nearest']: + with tm.assertRaises(KeyError): + idx.get_loc(1.1, method, tolerance=0.05) + + with tm.assertRaisesRegexp(ValueError, 'must be numeric'): + idx.get_loc(1.1, 'nearest', tolerance='invalid') + with tm.assertRaisesRegexp(ValueError, 'tolerance .* valid if'): + idx.get_loc(1.1, tolerance=1) + idx = pd.Index(['a', 'c']) with tm.assertRaises(TypeError): idx.get_loc('a', method='nearest') + with tm.assertRaises(TypeError): + idx.get_loc('a', method='pad', tolerance='invalid') def test_slice_locs(self): for dtype in [int, float]: @@ -1331,7 +1494,7 @@ def test_isin(self): idx = Index(['qux', 'baz', 'foo', 'bar']) result = idx.isin(values) expected = np.array([False, False, True, True]) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) # empty, return dtype bool idx = Index([]) @@ -1340,20 +1503,20 @@ def test_isin(self): self.assertEqual(result.dtype, np.bool_) def test_isin_nan(self): - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Index(['a', np.nan]).isin([np.nan]), [False, True]) - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Index(['a', pd.NaT]).isin([pd.NaT]), [False, True]) - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Index(['a', np.nan]).isin([float('nan')]), [False, False]) - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Index(['a', np.nan]).isin([pd.NaT]), [False, False]) # Float64Index overrides isin, so must be checked separately - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Float64Index([1.0, np.nan]).isin([np.nan]), [False, True]) - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Float64Index([1.0, np.nan]).isin([float('nan')]), [False, True]) - self.assert_numpy_array_equal( + tm.assert_numpy_array_equal( Float64Index([1.0, np.nan]).isin([pd.NaT]), [False, True]) def test_isin_level_kwarg(self): @@ -1361,8 +1524,8 @@ def check_idx(idx): values = idx.tolist()[-2:] + ['nonexisting'] expected = np.array([False, False, True, True]) - self.assert_numpy_array_equal(expected, idx.isin(values, level=0)) - self.assert_numpy_array_equal(expected, idx.isin(values, level=-1)) + tm.assert_numpy_array_equal(expected, idx.isin(values, level=0)) + tm.assert_numpy_array_equal(expected, idx.isin(values, level=-1)) self.assertRaises(IndexError, idx.isin, values, level=1) self.assertRaises(IndexError, idx.isin, values, level=10) @@ -1372,7 +1535,7 @@ def check_idx(idx): self.assertRaises(KeyError, idx.isin, values, level='foobar') idx.name = 'foobar' - self.assert_numpy_array_equal(expected, + tm.assert_numpy_array_equal(expected, idx.isin(values, level='foobar')) self.assertRaises(KeyError, idx.isin, values, level='xyzzy') @@ -1388,7 +1551,7 @@ def test_boolean_cmp(self): idx = Index(values) res = (idx == values) - self.assert_numpy_array_equal(res,np.array([True,True,True,True],dtype=bool)) + tm.assert_numpy_array_equal(res,np.array([True,True,True,True],dtype=bool)) def test_get_level_values(self): result = self.strIndex.get_level_values(0) @@ -1438,7 +1601,7 @@ def test_str_attribute(self): # test boolean case, should return np.array instead of boolean Index idx = Index(['a1', 'a2', 'b1', 'b2']) expected = np.array([True, True, False, False]) - self.assert_array_equal(idx.str.startswith('a'), expected) + tm.assert_numpy_array_equal(idx.str.startswith('a'), expected) self.assertIsInstance(idx.str.startswith('a'), np.ndarray) s = Series(range(4), index=idx) expected = Series(range(2), index=['a1', 'a2']) @@ -1540,23 +1703,26 @@ def test_groupby(self): exp = {1: [0, 1], 2: [2, 3, 4]} tm.assert_dict_equal(groups, exp) - def test_equals_op(self): - # For issue #9785 + def test_equals_op_multiindex(self): + # GH9785 + # test comparisons of multiindex + from pandas.compat import StringIO + df = pd.read_csv(StringIO('a,b,c\n1,2,3\n4,5,6'), index_col=[0, 1]) + tm.assert_numpy_array_equal(df.index == df.index, np.array([True, True])) + + mi1 = MultiIndex.from_tuples([(1, 2), (4, 5)]) + tm.assert_numpy_array_equal(df.index == mi1, np.array([True, True])) + mi2 = MultiIndex.from_tuples([(1, 2), (4, 6)]) + tm.assert_numpy_array_equal(df.index == mi2, np.array([True, False])) + mi3 = MultiIndex.from_tuples([(1, 2), (4, 5), (8, 9)]) + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + df.index == mi3 + index_a = Index(['foo', 'bar', 'baz']) - index_b = Index(['foo', 'bar', 'baz', 'qux']) - # Testing Numpy Results Equivelent - assert_array_equal( - index_a.equals(index_a), - index_a == index_a - ) - assert_array_equal( - index_a.equals(index_b), - index_a == index_b, - ) - assert_array_equal( - index_b.equals(index_a), - index_b == index_a, - ) + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + df.index == index_a + tm.assert_numpy_array_equal(index_a == mi3, np.array([False, False, False])) + class TestCategoricalIndex(Base, tm.TestCase): _holder = CategoricalIndex @@ -1586,39 +1752,39 @@ def test_construction(self): # empty result = CategoricalIndex(categories=categories) self.assertTrue(result.categories.equals(Index(categories))) - self.assert_numpy_array_equal(result.codes,np.array([],dtype='int8')) + tm.assert_numpy_array_equal(result.codes, np.array([],dtype='int8')) self.assertFalse(result.ordered) # passing categories result = CategoricalIndex(list('aabbca'),categories=categories) self.assertTrue(result.categories.equals(Index(categories))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) c = pd.Categorical(list('aabbca')) result = CategoricalIndex(c) self.assertTrue(result.categories.equals(Index(list('abc')))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) self.assertFalse(result.ordered) result = CategoricalIndex(c,categories=categories) self.assertTrue(result.categories.equals(Index(categories))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) self.assertFalse(result.ordered) ci = CategoricalIndex(c,categories=list('abcd')) result = CategoricalIndex(ci) self.assertTrue(result.categories.equals(Index(categories))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,2,0],dtype='int8')) self.assertFalse(result.ordered) result = CategoricalIndex(ci, categories=list('ab')) self.assertTrue(result.categories.equals(Index(list('ab')))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,-1,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,-1,0],dtype='int8')) self.assertFalse(result.ordered) result = CategoricalIndex(ci, categories=list('ab'), ordered=True) self.assertTrue(result.categories.equals(Index(list('ab')))) - self.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,-1,0],dtype='int8')) + tm.assert_numpy_array_equal(result.codes,np.array([0,0,1,1,-1,0],dtype='int8')) self.assertTrue(result.ordered) # turn me to an Index @@ -1811,7 +1977,7 @@ def test_reindex_base(self): expected = np.array([4,0,1,5,2,3]) actual = idx.get_indexer(idx) - assert_array_equal(expected, actual) + tm.assert_numpy_array_equal(expected, actual) with tm.assertRaisesRegexp(ValueError, 'Invalid fill method'): idx.get_indexer(idx, method='invalid') @@ -1826,14 +1992,17 @@ def test_reindexing(self): expected = oidx.get_indexer_non_unique(finder)[0] actual = ci.get_indexer(finder) - assert_array_equal(expected, actual) + tm.assert_numpy_array_equal(expected, actual) def test_duplicates(self): - idx = CategoricalIndex([0, 0, 0]) + idx = CategoricalIndex([0, 0, 0], name='foo') self.assertFalse(idx.is_unique) self.assertTrue(idx.has_duplicates) + expected = CategoricalIndex([0], name='foo') + self.assert_index_equal(idx.drop_duplicates(), expected) + def test_get_indexer(self): idx1 = CategoricalIndex(list('aabcde'),categories=list('edabc')) @@ -1870,13 +2039,13 @@ def test_repr_roundtrip(self): def test_isin(self): ci = CategoricalIndex(list('aabca') + [np.nan],categories=['c','a','b',np.nan]) - self.assert_numpy_array_equal(ci.isin(['c']),np.array([False,False,False,True,False,False])) - self.assert_numpy_array_equal(ci.isin(['c','a','b']),np.array([True]*5 + [False])) - self.assert_numpy_array_equal(ci.isin(['c','a','b',np.nan]),np.array([True]*6)) + tm.assert_numpy_array_equal(ci.isin(['c']),np.array([False,False,False,True,False,False])) + tm.assert_numpy_array_equal(ci.isin(['c','a','b']),np.array([True]*5 + [False])) + tm.assert_numpy_array_equal(ci.isin(['c','a','b',np.nan]),np.array([True]*6)) # mismatched categorical -> coerced to ndarray so doesn't matter - self.assert_numpy_array_equal(ci.isin(ci.set_categories(list('abcdefghi'))),np.array([True]*6)) - self.assert_numpy_array_equal(ci.isin(ci.set_categories(list('defghi'))),np.array([False]*5 + [True])) + tm.assert_numpy_array_equal(ci.isin(ci.set_categories(list('abcdefghi'))),np.array([True]*6)) + tm.assert_numpy_array_equal(ci.isin(ci.set_categories(list('defghi'))),np.array([False]*5 + [True])) def test_identical(self): @@ -1908,7 +2077,8 @@ def test_equals(self): self.assertTrue((ci1 == ci1.values).all()) # invalid comparisons - self.assertRaises(TypeError, lambda : ci1 == Index(['a','b','c'])) + with tm.assertRaisesRegexp(ValueError, "Lengths must match"): + ci1 == Index(['a','b','c']) self.assertRaises(TypeError, lambda : ci1 == ci2) self.assertRaises(TypeError, lambda : ci1 == Categorical(ci1.values, ordered=False)) self.assertRaises(TypeError, lambda : ci1 == Categorical(ci1.values, categories=list('abc'))) @@ -2024,7 +2194,7 @@ def setUp(self): self.setup_indices() def create_index(self): - return Float64Index(np.arange(5,dtype='float64')) + return Float64Index(np.arange(5, dtype='float64')) def test_repr_roundtrip(self): for ind in (self.mixed, self.float): @@ -2124,23 +2294,31 @@ def test_equals(self): def test_get_indexer(self): idx = Float64Index([0.0, 1.0, 2.0]) - self.assert_array_equal(idx.get_indexer(idx), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(idx), [0, 1, 2]) target = [-0.1, 0.5, 1.1] - self.assert_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) - self.assert_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) - self.assert_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) def test_get_loc(self): idx = Float64Index([0.0, 1.0, 2.0]) for method in [None, 'pad', 'backfill', 'nearest']: self.assertEqual(idx.get_loc(1, method), 1) + if method is not None: + self.assertEqual(idx.get_loc(1, method, tolerance=0), 1) for method, loc in [('pad', 1), ('backfill', 2), ('nearest', 1)]: self.assertEqual(idx.get_loc(1.1, method), loc) + self.assertEqual(idx.get_loc(1.1, method, tolerance=0.9), loc) self.assertRaises(KeyError, idx.get_loc, 'foo') self.assertRaises(KeyError, idx.get_loc, 1.5) + self.assertRaises(KeyError, idx.get_loc, 1.5, + method='pad', tolerance=0.1) + + with tm.assertRaisesRegexp(ValueError, 'must be numeric'): + idx.get_loc(1.4, method='nearest', tolerance='foo') def test_get_loc_na(self): idx = Float64Index([np.nan, 1, 2]) @@ -2149,6 +2327,16 @@ def test_get_loc_na(self): idx = Float64Index([np.nan, 1, np.nan]) self.assertEqual(idx.get_loc(1), 1) + + # representable by slice [0:2:2] + # self.assertRaises(KeyError, idx.slice_locs, np.nan) + sliced = idx.slice_locs(np.nan) + self.assertTrue(isinstance(sliced, tuple)) + self.assertEqual(sliced, (0, 3)) + + # not representable by slice + idx = Float64Index([np.nan, 1, np.nan, np.nan]) + self.assertEqual(idx.get_loc(1), 1) self.assertRaises(KeyError, idx.slice_locs, np.nan) def test_contains_nans(self): @@ -2167,16 +2355,16 @@ def test_doesnt_contain_all_the_things(self): def test_nan_multiple_containment(self): i = Float64Index([1.0, np.nan]) - np.testing.assert_array_equal(i.isin([1.0]), np.array([True, False])) - np.testing.assert_array_equal(i.isin([2.0, np.pi]), - np.array([False, False])) - np.testing.assert_array_equal(i.isin([np.nan]), - np.array([False, True])) - np.testing.assert_array_equal(i.isin([1.0, np.nan]), - np.array([True, True])) + tm.assert_numpy_array_equal(i.isin([1.0]), np.array([True, False])) + tm.assert_numpy_array_equal(i.isin([2.0, np.pi]), + np.array([False, False])) + tm.assert_numpy_array_equal(i.isin([np.nan]), + np.array([False, True])) + tm.assert_numpy_array_equal(i.isin([1.0, np.nan]), + np.array([True, True])) i = Float64Index([1.0, 2.0]) - np.testing.assert_array_equal(i.isin([np.nan]), - np.array([False, False])) + tm.assert_numpy_array_equal(i.isin([np.nan]), + np.array([False, False])) def test_astype_from_object(self): index = Index([1.0, np.nan, 0.2], dtype='object') @@ -2195,7 +2383,7 @@ def setUp(self): self.setup_indices() def create_index(self): - return Int64Index(np.arange(5,dtype='int64')) + return Int64Index(np.arange(5, dtype='int64')) def test_too_many_names(self): def testit(): @@ -2206,11 +2394,11 @@ def test_constructor(self): # pass list, coerce fine index = Int64Index([-5, 0, 1, 2]) expected = np.array([-5, 0, 1, 2], dtype=np.int64) - self.assert_numpy_array_equal(index, expected) + tm.assert_numpy_array_equal(index, expected) # from iterable index = Int64Index(iter([-5, 0, 1, 2])) - self.assert_numpy_array_equal(index, expected) + tm.assert_numpy_array_equal(index, expected) # scalar raise Exception self.assertRaises(TypeError, Int64Index, 5) @@ -2218,7 +2406,7 @@ def test_constructor(self): # copy arr = self.index.values new_index = Int64Index(arr, copy=True) - self.assert_numpy_array_equal(new_index, self.index) + tm.assert_numpy_array_equal(new_index, self.index) val = arr[0] + 3000 # this should not change index arr[0] = val @@ -2260,11 +2448,11 @@ def test_view(self): def test_coerce_list(self): # coerce things arr = Index([1, 2, 3, 4]) - tm.assert_isinstance(arr, Int64Index) + tm.assertIsInstance(arr, Int64Index) # but not if explicit dtype passed arr = Index([1, 2, 3, 4], dtype=object) - tm.assert_isinstance(arr, Index) + tm.assertIsInstance(arr, Index) def test_dtype(self): self.assertEqual(self.index.dtype, np.int64) @@ -2331,19 +2519,19 @@ def test_get_indexer(self): target = Int64Index(np.arange(10)) indexer = self.index.get_indexer(target) expected = np.array([0, -1, 1, -1, 2, -1, 3, -1, 4, -1]) - self.assert_numpy_array_equal(indexer, expected) + tm.assert_numpy_array_equal(indexer, expected) def test_get_indexer_pad(self): target = Int64Index(np.arange(10)) indexer = self.index.get_indexer(target, method='pad') expected = np.array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) - self.assert_numpy_array_equal(indexer, expected) + tm.assert_numpy_array_equal(indexer, expected) def test_get_indexer_backfill(self): target = Int64Index(np.arange(10)) indexer = self.index.get_indexer(target, method='backfill') expected = np.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5]) - self.assert_numpy_array_equal(indexer, expected) + tm.assert_numpy_array_equal(indexer, expected) def test_join_outer(self): other = Int64Index([7, 12, 25, 1, 2, 5]) @@ -2362,10 +2550,10 @@ def test_join_outer(self): eridx = np.array([-1, 3, 4, -1, 5, -1, 0, -1, -1, 1, -1, -1, -1, 2], dtype=np.int64) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) # monotonic res, lidx, ridx = self.index.join(other_mono, how='outer', @@ -2375,10 +2563,10 @@ def test_join_outer(self): eridx = np.array([-1, 0, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, -1, 5], dtype=np.int64) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) def test_join_inner(self): other = Int64Index([7, 12, 25, 1, 2, 5]) @@ -2398,10 +2586,10 @@ def test_join_inner(self): elidx = np.array([1, 6]) eridx = np.array([4, 1]) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) # monotonic res, lidx, ridx = self.index.join(other_mono, how='inner', @@ -2411,10 +2599,10 @@ def test_join_inner(self): self.assertTrue(res.equals(res2)) eridx = np.array([1, 4]) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) def test_join_left(self): other = Int64Index([7, 12, 25, 1, 2, 5]) @@ -2427,20 +2615,20 @@ def test_join_left(self): eridx = np.array([-1, 4, -1, -1, -1, -1, 1, -1, -1, -1], dtype=np.int64) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) self.assertIsNone(lidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(ridx, eridx) # monotonic res, lidx, ridx = self.index.join(other_mono, how='left', return_indexers=True) eridx = np.array([-1, 1, -1, -1, -1, -1, 4, -1, -1, -1], dtype=np.int64) - tm.assert_isinstance(res, Int64Index) + tm.assertIsInstance(res, Int64Index) self.assertTrue(res.equals(eres)) self.assertIsNone(lidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(ridx, eridx) # non-unique """ @@ -2451,8 +2639,8 @@ def test_join_left(self): eridx = np.array([0, 2, 3, -1, -1]) elidx = np.array([0, 1, 2, 3, 4]) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) """ def test_join_right(self): @@ -2466,9 +2654,9 @@ def test_join_right(self): elidx = np.array([-1, 6, -1, -1, 1, -1], dtype=np.int64) - tm.assert_isinstance(other, Int64Index) + tm.assertIsInstance(other, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(lidx, elidx) self.assertIsNone(ridx) # monotonic @@ -2477,9 +2665,9 @@ def test_join_right(self): eres = other_mono elidx = np.array([-1, 1, -1, -1, 6, -1], dtype=np.int64) - tm.assert_isinstance(other, Int64Index) + tm.assertIsInstance(other, Int64Index) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(lidx, elidx) self.assertIsNone(ridx) # non-unique @@ -2491,8 +2679,8 @@ def test_join_right(self): elidx = np.array([0, 2, 3, -1, -1]) eridx = np.array([0, 1, 2, 3, 4]) self.assertTrue(res.equals(eres)) - self.assert_numpy_array_equal(lidx, elidx) - self.assert_numpy_array_equal(ridx, eridx) + tm.assert_numpy_array_equal(lidx, elidx) + tm.assert_numpy_array_equal(ridx, eridx) idx = Index([1,1,2,5]) idx2 = Index([1,2,5,9,7]) @@ -2538,10 +2726,10 @@ def test_join_non_unique(self): self.assertTrue(joined.equals(exp_joined)) exp_lidx = np.array([2, 2, 3, 3, 0, 0, 1, 1], dtype=np.int64) - self.assert_numpy_array_equal(lidx, exp_lidx) + tm.assert_numpy_array_equal(lidx, exp_lidx) exp_ridx = np.array([2, 3, 2, 3, 0, 1, 0, 1], dtype=np.int64) - self.assert_numpy_array_equal(ridx, exp_ridx) + tm.assert_numpy_array_equal(ridx, exp_ridx) def test_join_self(self): kinds = 'outer', 'inner', 'left', 'right' @@ -2553,12 +2741,12 @@ def test_intersection(self): other = Index([1, 2, 3, 4, 5]) result = self.index.intersection(other) expected = np.sort(np.intersect1d(self.index.values, other.values)) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) result = other.intersection(self.index) expected = np.sort(np.asarray(np.intersect1d(self.index.values, other.values))) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def test_intersect_str_dates(self): dt_dates = [datetime(2012, 2, 9), datetime(2012, 2, 22)] @@ -2576,11 +2764,11 @@ def test_union_noncomparable(self): other = Index([now + timedelta(i) for i in range(4)], dtype=object) result = self.index.union(other) expected = np.concatenate((self.index, other)) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) result = other.union(self.index) expected = np.concatenate((other, self.index)) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def test_cant_or_shouldnt_cast(self): # can't @@ -2685,19 +2873,11 @@ def setUp(self): self.setup_indices() def create_index(self): - return date_range('20130101',periods=5) + return date_range('20130101', periods=5) def test_pickle_compat_construction(self): pass - def test_numeric_compat(self): - super(TestDatetimeIndex, self).test_numeric_compat() - - if not compat.PY3_2: - for f in [lambda : np.timedelta64(1, 'D').astype('m8[ns]') * pd.date_range('2000-01-01', periods=3), - lambda : pd.date_range('2000-01-01', periods=3) * np.timedelta64(1, 'D').astype('m8[ns]') ]: - self.assertRaises(TypeError, f) - def test_get_loc(self): idx = pd.date_range('2000-01-01', periods=3) @@ -2705,10 +2885,28 @@ def test_get_loc(self): self.assertEqual(idx.get_loc(idx[1], method), 1) self.assertEqual(idx.get_loc(idx[1].to_pydatetime(), method), 1) self.assertEqual(idx.get_loc(str(idx[1]), method), 1) + if method is not None: + self.assertEqual(idx.get_loc(idx[1], method, + tolerance=pd.Timedelta('0 days')), + 1) self.assertEqual(idx.get_loc('2000-01-01', method='nearest'), 0) self.assertEqual(idx.get_loc('2000-01-01T12', method='nearest'), 1) + self.assertEqual(idx.get_loc('2000-01-01T12', method='nearest', + tolerance='1 day'), 1) + self.assertEqual(idx.get_loc('2000-01-01T12', method='nearest', + tolerance=pd.Timedelta('1D')), 1) + self.assertEqual(idx.get_loc('2000-01-01T12', method='nearest', + tolerance=np.timedelta64(1, 'D')), 1) + self.assertEqual(idx.get_loc('2000-01-01T12', method='nearest', + tolerance=timedelta(1)), 1) + with tm.assertRaisesRegexp(ValueError, 'must be convertible'): + idx.get_loc('2000-01-01T12', method='nearest', tolerance='foo') + with tm.assertRaises(KeyError): + idx.get_loc('2000-01-01T03', method='nearest', + tolerance='2 hours') + self.assertEqual(idx.get_loc('2000', method='nearest'), slice(0, 3)) self.assertEqual(idx.get_loc('2000-01', method='nearest'), slice(0, 3)) @@ -2732,19 +2930,24 @@ def test_get_loc(self): # time indexing idx = pd.date_range('2000-01-01', periods=24, freq='H') - assert_array_equal(idx.get_loc(time(12)), [12]) - assert_array_equal(idx.get_loc(time(12, 30)), []) + tm.assert_numpy_array_equal(idx.get_loc(time(12)), [12]) + tm.assert_numpy_array_equal(idx.get_loc(time(12, 30)), []) with tm.assertRaises(NotImplementedError): idx.get_loc(time(12, 30), method='pad') def test_get_indexer(self): idx = pd.date_range('2000-01-01', periods=3) - self.assert_array_equal(idx.get_indexer(idx), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(idx), [0, 1, 2]) target = idx[0] + pd.to_timedelta(['-1 hour', '12 hours', '1 day 1 hour']) - self.assert_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) - self.assert_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) - self.assert_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal( + idx.get_indexer(target, 'nearest', tolerance=pd.Timedelta('1 hour')), + [0, -1, 1]) + with tm.assertRaises(ValueError): + idx.get_indexer(idx[[0]], method='nearest', tolerance='foo') def test_roundtrip_pickle_with_tz(self): @@ -2774,7 +2977,7 @@ def test_time_loc(self): # GH8667 ts = pd.Series(np.random.randn(n), index=idx) i = np.arange(start, n, step) - tm.assert_array_equal(ts.index.get_loc(key), i) + tm.assert_numpy_array_equal(ts.index.get_loc(key), i) tm.assert_series_equal(ts[key], ts.iloc[i]) left, right = ts.copy(), ts.copy() @@ -2827,6 +3030,9 @@ def test_union(self): result = first.union(case) self.assertTrue(tm.equalContents(result, everything)) + def test_nat(self): + self.assertIs(DatetimeIndex([np.nan])[0], pd.NaT) + class TestPeriodIndex(DatetimeLike, tm.TestCase): _holder = PeriodIndex @@ -2852,18 +3058,40 @@ def test_get_loc(self): self.assertEqual(idx.get_loc(idx[1].to_timestamp().to_pydatetime(), method), 1) self.assertEqual(idx.get_loc(str(idx[1]), method), 1) + idx = pd.period_range('2000-01-01', periods=5)[::2] + self.assertEqual(idx.get_loc('2000-01-02T12', method='nearest', + tolerance='1 day'), 1) + self.assertEqual(idx.get_loc('2000-01-02T12', method='nearest', + tolerance=pd.Timedelta('1D')), 1) + self.assertEqual(idx.get_loc('2000-01-02T12', method='nearest', + tolerance=np.timedelta64(1, 'D')), 1) + self.assertEqual(idx.get_loc('2000-01-02T12', method='nearest', + tolerance=timedelta(1)), 1) + with tm.assertRaisesRegexp(ValueError, 'must be convertible'): + idx.get_loc('2000-01-10', method='nearest', tolerance='foo') + with tm.assertRaisesRegexp(ValueError, 'different freq'): + idx.get_loc('2000-01-10', method='nearest', tolerance='1 hour') + with tm.assertRaises(KeyError): + idx.get_loc('2000-01-10', method='nearest', tolerance='1 day') + def test_get_indexer(self): idx = pd.period_range('2000-01-01', periods=3).asfreq('H', how='start') - self.assert_array_equal(idx.get_indexer(idx), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(idx), [0, 1, 2]) target = pd.PeriodIndex(['1999-12-31T23', '2000-01-01T12', '2000-01-02T01'], freq='H') - self.assert_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) - self.assert_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) - self.assert_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal( + idx.get_indexer(target, 'nearest', tolerance='1 hour'), + [0, -1, 1]) with self.assertRaisesRegexp(ValueError, 'different freq'): - idx.asfreq('D').get_indexer(idx) + idx.get_indexer(target, 'nearest', tolerance='1 minute') + + tm.assert_numpy_array_equal( + idx.get_indexer(target, 'nearest', tolerance='1 day'), [0, 1, 1]) def test_repeat(self): # GH10183 @@ -2883,7 +3111,7 @@ def setUp(self): self.setup_indices() def create_index(self): - return pd.to_timedelta(range(5),unit='d') + pd.offsets.Hour(1) + return pd.to_timedelta(range(5), unit='d') + pd.offsets.Hour(1) def test_get_loc(self): idx = pd.to_timedelta(['0 days', '1 days', '2 days']) @@ -2893,17 +3121,28 @@ def test_get_loc(self): self.assertEqual(idx.get_loc(idx[1].to_pytimedelta(), method), 1) self.assertEqual(idx.get_loc(str(idx[1]), method), 1) + self.assertEqual(idx.get_loc(idx[1], 'pad', tolerance=pd.Timedelta(0)), 1) + self.assertEqual(idx.get_loc(idx[1], 'pad', tolerance=np.timedelta64(0, 's')), 1) + self.assertEqual(idx.get_loc(idx[1], 'pad', tolerance=timedelta(0)), 1) + + with tm.assertRaisesRegexp(ValueError, 'must be convertible'): + idx.get_loc(idx[1], method='nearest', tolerance='foo') + for method, loc in [('pad', 1), ('backfill', 2), ('nearest', 1)]: self.assertEqual(idx.get_loc('1 day 1 hour', method), loc) def test_get_indexer(self): idx = pd.to_timedelta(['0 days', '1 days', '2 days']) - self.assert_array_equal(idx.get_indexer(idx), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(idx), [0, 1, 2]) target = pd.to_timedelta(['-1 hour', '12 hours', '1 day 1 hour']) - self.assert_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) - self.assert_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) - self.assert_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'pad'), [-1, 0, 1]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'backfill'), [0, 1, 2]) + tm.assert_numpy_array_equal(idx.get_indexer(target, 'nearest'), [0, 1, 1]) + tm.assert_numpy_array_equal( + idx.get_indexer(target, 'nearest', + tolerance=pd.Timedelta('1 hour')), + [0, -1, 1]) def test_numeric_compat(self): @@ -3240,7 +3479,10 @@ def test_inplace_mutation_resets_values(self): # make sure label setting works too labels2 = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] - exp_values = np.array([(long(1), 'a')] * 6, dtype=object) + exp_values = np.empty((6, ), dtype=object) + exp_values[:] = [(long(1), 'a')] * 6 + # must be 1d array of tuples + self.assertEqual(exp_values.shape, (6, )) new_values = mi2.set_labels(labels2).values # not inplace shouldn't change assert_almost_equal(mi2._tuples, vals2) @@ -3335,7 +3577,7 @@ def test_constructor_single_level(self): single_level = MultiIndex(levels=[['foo', 'bar', 'baz', 'qux']], labels=[[0, 1, 2, 3]], names=['first']) - tm.assert_isinstance(single_level, Index) + tm.assertIsInstance(single_level, Index) self.assertNotIsInstance(single_level, MultiIndex) self.assertEqual(single_level.name, 'first') @@ -3483,7 +3725,7 @@ def test_from_product(self): ('buz', 'a'), ('buz', 'b'), ('buz', 'c')] expected = MultiIndex.from_tuples(tuples, names=names) - assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) self.assertEqual(result.names, names) def test_from_product_datetimeindex(self): @@ -3493,7 +3735,7 @@ def test_from_product_datetimeindex(self): (1, pd.Timestamp('2000-01-02')), (2, pd.Timestamp('2000-01-01')), (2, pd.Timestamp('2000-01-02'))]) - assert_array_equal(mi.values, etalon) + tm.assert_numpy_array_equal(mi.values, etalon) def test_values_boxed(self): tuples = [(1, pd.Timestamp('2000-01-01')), @@ -3503,9 +3745,9 @@ def test_values_boxed(self): (2, pd.Timestamp('2000-01-02')), (3, pd.Timestamp('2000-01-03'))] mi = pd.MultiIndex.from_tuples(tuples) - assert_array_equal(mi.values, pd.lib.list_to_object_array(tuples)) + tm.assert_numpy_array_equal(mi.values, pd.lib.list_to_object_array(tuples)) # Check that code branches for boxed values produce identical results - assert_array_equal(mi.values[:4], mi[:4].values) + tm.assert_numpy_array_equal(mi.values[:4], mi[:4].values) def test_append(self): result = self.index[:3].append(self.index[3:]) @@ -3522,41 +3764,51 @@ def test_append(self): def test_get_level_values(self): result = self.index.get_level_values(0) expected = ['foo', 'foo', 'bar', 'baz', 'qux', 'qux'] - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) self.assertEqual(result.name, 'first') result = self.index.get_level_values('first') expected = self.index.get_level_values(0) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) + + # GH 10460 + index = MultiIndex(levels=[CategoricalIndex(['A', 'B']), + CategoricalIndex([1, 2, 3])], + labels=[np.array([0, 0, 0, 1, 1, 1]), + np.array([0, 1, 2, 0, 1, 2])]) + exp = CategoricalIndex(['A', 'A', 'A', 'B', 'B', 'B']) + self.assert_index_equal(index.get_level_values(0), exp) + exp = CategoricalIndex([1, 2 ,3, 1, 2, 3]) + self.assert_index_equal(index.get_level_values(1), exp) def test_get_level_values_na(self): arrays = [['a', 'b', 'b'], [1, np.nan, 2]] index = pd.MultiIndex.from_arrays(arrays) values = index.get_level_values(1) expected = [1, np.nan, 2] - assert_array_equal(values.values.astype(float), expected) + tm.assert_numpy_array_equal(values.values.astype(float), expected) arrays = [['a', 'b', 'b'], [np.nan, np.nan, 2]] index = pd.MultiIndex.from_arrays(arrays) values = index.get_level_values(1) expected = [np.nan, np.nan, 2] - assert_array_equal(values.values.astype(float), expected) + tm.assert_numpy_array_equal(values.values.astype(float), expected) arrays = [[np.nan, np.nan, np.nan], ['a', np.nan, 1]] index = pd.MultiIndex.from_arrays(arrays) values = index.get_level_values(0) expected = [np.nan, np.nan, np.nan] - assert_array_equal(values.values.astype(float), expected) + tm.assert_numpy_array_equal(values.values.astype(float), expected) values = index.get_level_values(1) expected = np.array(['a', np.nan, 1],dtype=object) - assert_array_equal(values.values, expected) + tm.assert_numpy_array_equal(values.values, expected) arrays = [['a', 'b', 'b'], pd.DatetimeIndex([0, 1, pd.NaT])] index = pd.MultiIndex.from_arrays(arrays) values = index.get_level_values(1) expected = pd.DatetimeIndex([0, 1, pd.NaT]) - assert_array_equal(values.values, expected.values) + tm.assert_numpy_array_equal(values.values, expected.values) arrays = [[], []] index = pd.MultiIndex.from_arrays(arrays) @@ -3910,6 +4162,8 @@ def test_get_indexer_nearest(self): midx = MultiIndex.from_tuples([('a', 1), ('b', 2)]) with tm.assertRaises(NotImplementedError): midx.get_indexer(['a'], method='nearest') + with tm.assertRaises(NotImplementedError): + midx.get_indexer(['a'], method='pad', tolerance=2) def test_format(self): self.index.format() @@ -4145,7 +4399,7 @@ def test_difference(self): sortorder=0, names=self.index.names) - tm.assert_isinstance(result, MultiIndex) + tm.assertIsInstance(result, MultiIndex) self.assertTrue(result.equals(expected)) self.assertEqual(result.names, self.index.names) @@ -4206,7 +4460,7 @@ def test_from_tuples(self): def test_argsort(self): result = self.index.argsort() expected = self.index._tuple_index.argsort() - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def test_sortlevel(self): import random @@ -4352,9 +4606,9 @@ def test_insert(self): # key not contained in all levels new_index = self.index.insert(0, ('abc', 'three')) - self.assert_numpy_array_equal(new_index.levels[0], + tm.assert_numpy_array_equal(new_index.levels[0], list(self.index.levels[0]) + ['abc']) - self.assert_numpy_array_equal(new_index.levels[1], + tm.assert_numpy_array_equal(new_index.levels[1], list(self.index.levels[1]) + ['three']) self.assertEqual(new_index[0], ('abc', 'three')) @@ -4430,7 +4684,7 @@ def _check_how(other, how): mask = np.array( [x[1] in exp_level for x in self.index], dtype=bool) exp_values = self.index.values[mask] - self.assert_numpy_array_equal(join_index.values, exp_values) + tm.assert_numpy_array_equal(join_index.values, exp_values) if how in ('outer', 'inner'): join_index2, ridx2, lidx2 = \ @@ -4438,9 +4692,9 @@ def _check_how(other, how): return_indexers=True) self.assertTrue(join_index.equals(join_index2)) - self.assert_numpy_array_equal(lidx, lidx2) - self.assert_numpy_array_equal(ridx, ridx2) - self.assert_numpy_array_equal(join_index2.values, exp_values) + tm.assert_numpy_array_equal(lidx, lidx2) + tm.assert_numpy_array_equal(ridx, ridx2) + tm.assert_numpy_array_equal(join_index2.values, exp_values) def _check_all(other): _check_how(other, 'outer') @@ -4455,7 +4709,7 @@ def _check_all(other): # some corner cases idx = Index(['three', 'one', 'two']) result = idx.join(self.index, level='second') - tm.assert_isinstance(result, MultiIndex) + tm.assertIsInstance(result, MultiIndex) assertRaisesRegexp(TypeError, "Join.*MultiIndex.*ambiguous", self.index.join, self.index, level=1) @@ -4467,13 +4721,44 @@ def test_join_self(self): joined = res.join(res, how=kind) self.assertIs(res, joined) + def test_join_multi(self): + # GH 10665 + midx = pd.MultiIndex.from_product([np.arange(4), np.arange(4)], names=['a', 'b']) + idx = pd.Index([1, 2, 5], name='b') + + # inner + jidx, lidx, ridx = midx.join(idx, how='inner', return_indexers=True) + exp_idx = pd.MultiIndex.from_product([np.arange(4), [1, 2]], names=['a', 'b']) + exp_lidx = np.array([1, 2, 5, 6, 9, 10, 13, 14]) + exp_ridx = np.array([0, 1, 0, 1, 0, 1, 0, 1]) + self.assert_index_equal(jidx, exp_idx) + self.assert_numpy_array_equal(lidx, exp_lidx) + self.assert_numpy_array_equal(ridx, exp_ridx) + # flip + jidx, ridx, lidx = idx.join(midx, how='inner', return_indexers=True) + self.assert_index_equal(jidx, exp_idx) + self.assert_numpy_array_equal(lidx, exp_lidx) + self.assert_numpy_array_equal(ridx, exp_ridx) + + # keep MultiIndex + jidx, lidx, ridx = midx.join(idx, how='left', return_indexers=True) + exp_ridx = np.array([-1, 0, 1, -1, -1, 0, 1, -1, -1, 0, 1, -1, -1, 0, 1, -1]) + self.assert_index_equal(jidx, midx) + self.assertIsNone(lidx) + self.assert_numpy_array_equal(ridx, exp_ridx) + # flip + jidx, ridx, lidx = idx.join(midx, how='right', return_indexers=True) + self.assert_index_equal(jidx, midx) + self.assertIsNone(lidx) + self.assert_numpy_array_equal(ridx, exp_ridx) + def test_reindex(self): result, indexer = self.index.reindex(list(self.index[:4])) - tm.assert_isinstance(result, MultiIndex) + tm.assertIsInstance(result, MultiIndex) self.check_level_names(result, self.index[:4].names) result, indexer = self.index.reindex(list(self.index)) - tm.assert_isinstance(result, MultiIndex) + tm.assertIsInstance(result, MultiIndex) self.assertIsNone(indexer) self.check_level_names(result, self.index.names) @@ -4488,11 +4773,11 @@ def test_reindex_level(self): self.assertTrue(target.equals(exp_index)) exp_indexer = np.array([0, 2, 4]) - self.assert_numpy_array_equal(indexer, exp_indexer) + tm.assert_numpy_array_equal(indexer, exp_indexer) self.assertTrue(target2.equals(exp_index2)) exp_indexer2 = np.array([0, -1, 0, -1, 0, -1]) - self.assert_numpy_array_equal(indexer2, exp_indexer2) + tm.assert_numpy_array_equal(indexer2, exp_indexer2) assertRaisesRegexp(TypeError, "Fill method not supported", self.index.reindex, self.index, method='pad', @@ -4579,17 +4864,17 @@ def check(nlevels, with_nulls): labels = [np.random.choice(n, k * n) for lev in levels] mi = MultiIndex(levels=levels, labels=labels) - for take_last in [False, True]: - left = mi.duplicated(take_last=take_last) - right = pd.lib.duplicated(mi.values, take_last=take_last) - tm.assert_array_equal(left, right) + for keep in ['first', 'last', False]: + left = mi.duplicated(keep=keep) + right = pd.lib.duplicated(mi.values, keep=keep) + tm.assert_numpy_array_equal(left, right) # GH5873 for a in [101, 102]: mi = MultiIndex.from_arrays([[101, a], [3.5, np.nan]]) self.assertFalse(mi.has_duplicates) self.assertEqual(mi.get_duplicates(), []) - self.assert_array_equal(mi.duplicated(), np.zeros(2, dtype='bool')) + tm.assert_numpy_array_equal(mi.duplicated(), np.zeros(2, dtype='bool')) for n in range(1, 6): # 1st level shape for m in range(1, 5): # 2nd level shape @@ -4600,8 +4885,21 @@ def check(nlevels, with_nulls): self.assertEqual(len(mi), (n + 1) * (m + 1)) self.assertFalse(mi.has_duplicates) self.assertEqual(mi.get_duplicates(), []) - self.assert_array_equal(mi.duplicated(), - np.zeros(len(mi), dtype='bool')) + tm.assert_numpy_array_equal(mi.duplicated(), + np.zeros(len(mi), dtype='bool')) + + def test_duplicate_meta_data(self): + # GH 10115 + index = MultiIndex(levels=[[0, 1], [0, 1, 2]], + labels=[[0, 0, 0, 0, 1, 1, 1], + [0, 1, 2, 0, 0, 1, 2]]) + for idx in [index, + index.set_names([None, None]), + index.set_names([None, 'Num']), + index.set_names(['Upper','Num']), + ]: + self.assertTrue(idx.has_duplicates) + self.assertEqual(idx.drop_duplicates().names, idx.names) def test_tolist(self): result = self.index.tolist() @@ -4618,7 +4916,19 @@ def test_repr_roundtrip(self): mi = MultiIndex.from_product([list('ab'),range(3)],names=['first','second']) str(mi) - tm.assert_index_equal(eval(repr(mi)),mi,exact=True) + + if compat.PY3: + tm.assert_index_equal(eval(repr(mi)), mi, exact=True) + else: + result = eval(repr(mi)) + # string coerces to unicode + tm.assert_index_equal(result, mi, exact=False) + self.assertEqual(mi.get_level_values('first').inferred_type, 'string') + self.assertEqual(result.get_level_values('first').inferred_type, 'unicode') + + mi_u = MultiIndex.from_product([list(u'ab'),range(3)],names=['first','second']) + result = eval(repr(mi_u)) + tm.assert_index_equal(result, mi_u, exact=True) # formatting if compat.PY3: @@ -4629,7 +4939,19 @@ def test_repr_roundtrip(self): # long format mi = MultiIndex.from_product([list('abcdefg'),range(10)],names=['first','second']) result = str(mi) - tm.assert_index_equal(eval(repr(mi)),mi,exact=True) + + if compat.PY3: + tm.assert_index_equal(eval(repr(mi)), mi, exact=True) + else: + result = eval(repr(mi)) + # string coerces to unicode + tm.assert_index_equal(result, mi, exact=False) + self.assertEqual(mi.get_level_values('first').inferred_type, 'string') + self.assertEqual(result.get_level_values('first').inferred_type, 'unicode') + + mi = MultiIndex.from_product([list(u'abcdefg'),range(10)],names=['first','second']) + result = eval(repr(mi_u)) + tm.assert_index_equal(result, mi_u, exact=True) def test_str(self): # tested elsewhere @@ -4682,7 +5004,7 @@ def test_isin(self): np.arange(4)]) result = idx.isin(values) expected = np.array([False, False, True, True]) - self.assert_numpy_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) # empty, return dtype bool idx = MultiIndex.from_arrays([[], []]) @@ -4692,9 +5014,9 @@ def test_isin(self): def test_isin_nan(self): idx = MultiIndex.from_arrays([['foo', 'bar'], [1.0, np.nan]]) - self.assert_numpy_array_equal(idx.isin([('bar', np.nan)]), + tm.assert_numpy_array_equal(idx.isin([('bar', np.nan)]), [False, False]) - self.assert_numpy_array_equal(idx.isin([('bar', float('nan'))]), + tm.assert_numpy_array_equal(idx.isin([('bar', float('nan'))]), [False, False]) def test_isin_level_kwarg(self): @@ -4705,11 +5027,11 @@ def test_isin_level_kwarg(self): vals_1 = [2, 3, 10] expected = np.array([False, False, True, True]) - self.assert_numpy_array_equal(expected, idx.isin(vals_0, level=0)) - self.assert_numpy_array_equal(expected, idx.isin(vals_0, level=-2)) + tm.assert_numpy_array_equal(expected, idx.isin(vals_0, level=0)) + tm.assert_numpy_array_equal(expected, idx.isin(vals_0, level=-2)) - self.assert_numpy_array_equal(expected, idx.isin(vals_1, level=1)) - self.assert_numpy_array_equal(expected, idx.isin(vals_1, level=-1)) + tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level=1)) + tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level=-1)) self.assertRaises(IndexError, idx.isin, vals_0, level=5) self.assertRaises(IndexError, idx.isin, vals_0, level=-5) @@ -4719,8 +5041,8 @@ def test_isin_level_kwarg(self): self.assertRaises(KeyError, idx.isin, vals_1, level='A') idx.names = ['A', 'B'] - self.assert_numpy_array_equal(expected, idx.isin(vals_0, level='A')) - self.assert_numpy_array_equal(expected, idx.isin(vals_1, level='B')) + tm.assert_numpy_array_equal(expected, idx.isin(vals_0, level='A')) + tm.assert_numpy_array_equal(expected, idx.isin(vals_1, level='B')) self.assertRaises(KeyError, idx.isin, vals_1, level='C') @@ -4788,47 +5110,9 @@ def test_index_name_retained(self): tm.assert_frame_equal(result, df_expected) def test_equals_operator(self): - # For issue #9785 + # GH9785 self.assertTrue((self.index == self.index).all()) - def test_index_compare(self): - # For issue #9785 - index_unequal = Index(['foo', 'bar', 'baz']) - index_equal = Index([ - ('foo', 'one'), ('foo', 'two'), ('bar', 'one'), - ('baz', 'two'), ('qux', 'one'), ('qux', 'two') - ], tupleize_cols=False) - # Testing Numpy Results Equivelent - assert_array_equal( - index_unequal.equals(self.index), - index_unequal == self.index, - err_msg = 'Index compared with MultiIndex failed', - ) - assert_array_equal( - self.index.equals(index_unequal), - self.index == index_unequal, - err_msg = 'MultiIndex compared with Index failed', - ) - assert_array_equal( - self.index.equals(index_equal), - self.index == index_equal, - err_msg = 'MultiIndex compared with Similar Index failed', - ) - assert_array_equal( - index_equal.equals(self.index), - index_equal == self.index, - err_msg = 'Index compared with Similar MultiIndex failed', - ) - # Testing that the result is true for the index_equal case - self.assertTrue( - (self.index == index_equal).all(), - msg='Assert Index compared with Similar MultiIndex match' - ) - self.assertTrue( - (index_equal == self.index).all(), - msg='Assert MultiIndex compared with Similar Index match' - ) - def test_get_combined_index(): from pandas.core.index import _get_combined_index diff --git a/pandas/tests/test_indexing.py b/pandas/tests/test_indexing.py index 710367bf04605..ee16b44f173ec 100644 --- a/pandas/tests/test_indexing.py +++ b/pandas/tests/test_indexing.py @@ -411,6 +411,12 @@ def test_iloc_exceeds_bounds(self): df.iloc[30] self.assertRaises(IndexError, lambda : df.iloc[-30]) + # GH10779 + # single positive/negative indexer exceeding Series bounds should raise an IndexError + with tm.assertRaisesRegexp(IndexError, 'single positional indexer is out-of-bounds'): + s.iloc[30] + self.assertRaises(IndexError, lambda : s.iloc[-30]) + # slices are ok result = df.iloc[:,4:10] # 0 < start < len < stop expected = df.iloc[:,4:] @@ -471,7 +477,6 @@ def check(result,expected): self.assertRaises(IndexError, lambda : dfl.iloc[[4,5,6]]) self.assertRaises(IndexError, lambda : dfl.iloc[:,4]) - def test_iloc_getitem_int(self): # integer @@ -497,6 +502,33 @@ def test_iloc_getitem_list_int(self): self.check_result('array int', 'iloc', np.array([2]), 'ix', { 0 : [4], 1 : [6], 2: [8] }, typs = ['ints']) self.check_result('array int', 'iloc', np.array([0,1,2]), 'indexer', [0,1,2], typs = ['labels','mixed','ts','floats','empty'], fails = IndexError) + def test_iloc_getitem_neg_int_can_reach_first_index(self): + # GH10547 and GH10779 + # negative integers should be able to reach index 0 + df = DataFrame({'A': [2, 3, 5], 'B': [7, 11, 13]}) + s = df['A'] + + expected = df.iloc[0] + result = df.iloc[-3] + assert_series_equal(result, expected) + + expected = df.iloc[[0]] + result = df.iloc[[-3]] + assert_frame_equal(result, expected) + + expected = s.iloc[0] + result = s.iloc[-3] + self.assertEqual(result, expected) + + expected = s.iloc[[0]] + result = s.iloc[[-3]] + assert_series_equal(result, expected) + + # check the length 1 Series case highlighted in GH10547 + expected = pd.Series(['a'], index=['A']) + result = expected.iloc[[-1]] + assert_series_equal(result, expected) + def test_iloc_getitem_dups(self): # no dups in panel (bug?) @@ -559,16 +591,17 @@ def test_iloc_getitem_slice_dups(self): def test_iloc_getitem_multiindex(self): - df = DataFrame(np.random.randn(3, 3), + arr = np.random.randn(3, 3) + df = DataFrame(arr, columns=[[2,2,4],[6,8,10]], index=[[4,4,8],[8,10,12]]) rs = df.iloc[2] - xp = df.irow(2) + xp = Series(arr[2],index=df.columns) assert_series_equal(rs, xp) rs = df.iloc[:,2] - xp = df.icol(2) + xp = Series(arr[:, 2],index=df.index) assert_series_equal(rs, xp) rs = df.iloc[2,2] @@ -813,8 +846,8 @@ def test_chained_getitem_with_lists(self): # GH6394 # Regression in chained getitem indexing with embedded list-like from 0.12 def check(result, expected): - self.assert_numpy_array_equal(result,expected) - tm.assert_isinstance(result, np.ndarray) + tm.assert_numpy_array_equal(result,expected) + tm.assertIsInstance(result, np.ndarray) df = DataFrame({'A': 5*[np.zeros(3)], 'B':5*[np.ones(3)]}) @@ -1072,6 +1105,25 @@ def test_loc_setitem_consistency(self): df['x'] = 1 assert_frame_equal(df,expected) + # .loc[:,column] setting with slice == len of the column + # GH10408 + data = """Level_0,,,Respondent,Respondent,Respondent,OtherCat,OtherCat +Level_1,,,Something,StartDate,EndDate,Yes/No,SomethingElse +Region,Site,RespondentID,,,,, +Region_1,Site_1,3987227376,A,5/25/2015 10:59,5/25/2015 11:22,Yes, +Region_1,Site_1,3980680971,A,5/21/2015 9:40,5/21/2015 9:52,Yes,Yes +Region_1,Site_2,3977723249,A,5/20/2015 8:27,5/20/2015 8:41,Yes, +Region_1,Site_2,3977723089,A,5/20/2015 8:33,5/20/2015 9:09,Yes,No""" + + df = pd.read_csv(StringIO(data),header=[0,1], index_col=[0,1,2]) + df.loc[:,('Respondent','StartDate')] = pd.to_datetime(df.loc[:,('Respondent','StartDate')]) + df.loc[:,('Respondent','EndDate')] = pd.to_datetime(df.loc[:,('Respondent','EndDate')]) + df.loc[:,('Respondent','Duration')] = df.loc[:,('Respondent','EndDate')] - df.loc[:,('Respondent','StartDate')] + + df.loc[:,('Respondent','Duration')] = df.loc[:,('Respondent','Duration')].astype('timedelta64[s]') + expected = Series([1380,720,840,2160.],index=df.index,name=('Respondent','Duration')) + assert_series_equal(df[('Respondent','Duration')],expected) + def test_loc_setitem_frame(self): df = self.frame_labels @@ -2293,6 +2345,7 @@ def f(): index=pd.MultiIndex.from_product([['A','B','C'],['foo']], names=['one','two']) ).sortlevel() + result = s.loc[idx[:,['foo']]] assert_series_equal(result,expected) result = s.loc[idx[:,['foo','bah']]] @@ -2304,9 +2357,9 @@ def f(): df = DataFrame(np.random.randn(5, 6), index=range(5), columns=multi_index) df = df.sortlevel(0, axis=1) + expected = DataFrame(index=range(5),columns=multi_index.reindex([])[0]) result1 = df.loc[:, ([], slice(None))] result2 = df.loc[:, (['foo'], [])] - expected = DataFrame(index=range(5),columns=multi_index.reindex([])[0]) assert_frame_equal(result1, expected) assert_frame_equal(result2, expected) @@ -2331,14 +2384,14 @@ def test_setitem_dtype_upcast(self): assert_frame_equal(df,expected) # GH10280 - df = DataFrame(np.arange(6,dtype='int64').reshape(2, 3), + df = DataFrame(np.arange(6,dtype='int64').reshape(2, 3), index=list('ab'), columns=['foo', 'bar', 'baz']) for val in [3.14, 'wxyz']: left = df.copy() left.loc['a', 'bar'] = val - right = DataFrame([[0, val, 2], [3, 4, 5]], + right = DataFrame([[0, val, 2], [3, 4, 5]], index=list('ab'), columns=['foo', 'bar', 'baz']) @@ -2346,12 +2399,12 @@ def test_setitem_dtype_upcast(self): self.assertTrue(com.is_integer_dtype(left['foo'])) self.assertTrue(com.is_integer_dtype(left['baz'])) - left = DataFrame(np.arange(6,dtype='int64').reshape(2, 3) / 10.0, + left = DataFrame(np.arange(6,dtype='int64').reshape(2, 3) / 10.0, index=list('ab'), columns=['foo', 'bar', 'baz']) left.loc['a', 'bar'] = 'wxyz' - right = DataFrame([[0, 'wxyz', .2], [.3, .4, .5]], + right = DataFrame([[0, 'wxyz', .2], [.3, .4, .5]], index=list('ab'), columns=['foo', 'bar', 'baz']) @@ -2599,6 +2652,44 @@ def test_panel_setitem(self): tm.assert_panel_equal(p, expected) + def test_panel_setitem_with_multiindex(self): + + # 10360 + # failing with a multi-index + arr = np.array([[[1,2,3],[0,0,0]],[[0,0,0],[0,0,0]]],dtype=np.float64) + + # reg index + axes = dict(items=['A', 'B'], major_axis=[0, 1], minor_axis=['X', 'Y' ,'Z']) + p1 = Panel(0., **axes) + p1.iloc[0, 0, :] = [1, 2, 3] + expected = Panel(arr, **axes) + tm.assert_panel_equal(p1, expected) + + # multi-indexes + axes['items'] = pd.MultiIndex.from_tuples([('A','a'), ('B','b')]) + p2 = Panel(0., **axes) + p2.iloc[0, 0, :] = [1, 2, 3] + expected = Panel(arr, **axes) + tm.assert_panel_equal(p2, expected) + + axes['major_axis']=pd.MultiIndex.from_tuples([('A',1),('A',2)]) + p3 = Panel(0., **axes) + p3.iloc[0, 0, :] = [1, 2, 3] + expected = Panel(arr, **axes) + tm.assert_panel_equal(p3, expected) + + axes['minor_axis']=pd.MultiIndex.from_product([['X'],range(3)]) + p4 = Panel(0., **axes) + p4.iloc[0, 0, :] = [1, 2, 3] + expected = Panel(arr, **axes) + tm.assert_panel_equal(p4, expected) + + arr = np.array([[[1,0,0],[2,0,0]],[[0,0,0],[0,0,0]]],dtype=np.float64) + p5 = Panel(0., **axes) + p5.iloc[0, :, 0] = [1, 2] + expected = Panel(arr, **axes) + tm.assert_panel_equal(p5, expected) + def test_panel_assignment(self): # GH3777 @@ -3040,7 +3131,8 @@ def test_astype_assignment(self): assert_frame_equal(df,expected) df = df_orig.copy() - df.iloc[:,0:2] = df.iloc[:,0:2].convert_objects(convert_numeric=True) + df.iloc[:,0:2] = df.iloc[:,0:2].convert_objects(datetime=True, + numeric=True) expected = DataFrame([[1,2,'3','.4',5,6.,'foo']],columns=list('ABCDEFG')) assert_frame_equal(df,expected) @@ -4082,9 +4174,12 @@ def test_slice_indexer(self): def check_iloc_compat(s): # invalid type for iloc (but works with a warning) - self.assert_produces_warning(FutureWarning, lambda : s.iloc[6.0:8]) - self.assert_produces_warning(FutureWarning, lambda : s.iloc[6.0:8.0]) - self.assert_produces_warning(FutureWarning, lambda : s.iloc[6:8.0]) + with self.assert_produces_warning(FutureWarning): + s.iloc[6.0:8] + with self.assert_produces_warning(FutureWarning): + s.iloc[6.0:8.0] + with self.assert_produces_warning(FutureWarning): + s.iloc[6:8.0] def check_slicing_positional(index): @@ -4744,7 +4839,7 @@ def test_coercion_with_setitem(self): expected_series = Series(expected_result) assert_attr_equal('dtype', start_series, expected_series) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_series.values, expected_series.values, strict_nan=True) @@ -4756,7 +4851,7 @@ def test_coercion_with_loc_setitem(self): expected_series = Series(expected_result) assert_attr_equal('dtype', start_series, expected_series) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_series.values, expected_series.values, strict_nan=True) @@ -4768,7 +4863,7 @@ def test_coercion_with_setitem_and_series(self): expected_series = Series(expected_result) assert_attr_equal('dtype', start_series, expected_series) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_series.values, expected_series.values, strict_nan=True) @@ -4780,7 +4875,7 @@ def test_coercion_with_loc_and_series(self): expected_series = Series(expected_result) assert_attr_equal('dtype', start_series, expected_series) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_series.values, expected_series.values, strict_nan=True) @@ -4807,7 +4902,7 @@ def test_coercion_with_loc(self): expected_dataframe = DataFrame({'foo': expected_result}) assert_attr_equal('dtype', start_dataframe['foo'], expected_dataframe['foo']) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_dataframe['foo'].values, expected_dataframe['foo'].values, strict_nan=True) @@ -4819,7 +4914,7 @@ def test_coercion_with_setitem_and_dataframe(self): expected_dataframe = DataFrame({'foo': expected_result}) assert_attr_equal('dtype', start_dataframe['foo'], expected_dataframe['foo']) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_dataframe['foo'].values, expected_dataframe['foo'].values, strict_nan=True) @@ -4831,7 +4926,7 @@ def test_none_coercion_loc_and_dataframe(self): expected_dataframe = DataFrame({'foo': expected_result}) assert_attr_equal('dtype', start_dataframe['foo'], expected_dataframe['foo']) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_dataframe['foo'].values, expected_dataframe['foo'].values, strict_nan=True) @@ -4851,7 +4946,7 @@ def test_none_coercion_mixed_dtypes(self): for column in expected_dataframe.columns: assert_attr_equal('dtype', start_dataframe[column], expected_dataframe[column]) - self.assert_numpy_array_equivalent( + tm.assert_numpy_array_equal( start_dataframe[column].values, expected_dataframe[column].values, strict_nan=True) diff --git a/pandas/tests/test_internals.py b/pandas/tests/test_internals.py index 36585abd1b98f..7c51641b8e5da 100644 --- a/pandas/tests/test_internals.py +++ b/pandas/tests/test_internals.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # pylint: disable=W0102 +from datetime import datetime, date + import nose import numpy as np @@ -286,6 +288,26 @@ def test_repr(self): pass +class TestDatetimeBlock(tm.TestCase): + _multiprocess_can_split_ = True + + def test_try_coerce_arg(self): + block = create_block('datetime', [0]) + + # coerce None + none_coerced = block._try_coerce_args(block.values, None)[1] + self.assertTrue(pd.Timestamp(none_coerced) is pd.NaT) + + # coerce different types of date bojects + vals = (np.datetime64('2010-10-10'), + datetime(2010, 10, 10), + date(2010, 10, 10)) + for val in vals: + coerced = block._try_coerce_args(block.values, val)[1] + self.assertEqual(np.int64, type(coerced)) + self.assertEqual(pd.Timestamp('2010-10-10'), pd.Timestamp(coerced)) + + class TestBlockManager(tm.TestCase): _multiprocess_can_split_ = True @@ -554,7 +576,7 @@ def _compare(old_mgr, new_mgr): mgr.set('a', np.array(['1'] * N, dtype=np.object_)) mgr.set('b', np.array(['2.'] * N, dtype=np.object_)) mgr.set('foo', np.array(['foo.'] * N, dtype=np.object_)) - new_mgr = mgr.convert(convert_numeric=True) + new_mgr = mgr.convert(numeric=True) self.assertEqual(new_mgr.get('a').dtype, np.int64) self.assertEqual(new_mgr.get('b').dtype, np.float64) self.assertEqual(new_mgr.get('foo').dtype, np.object_) @@ -566,7 +588,7 @@ def _compare(old_mgr, new_mgr): mgr.set('a', np.array(['1'] * N, dtype=np.object_)) mgr.set('b', np.array(['2.'] * N, dtype=np.object_)) mgr.set('foo', np.array(['foo.'] * N, dtype=np.object_)) - new_mgr = mgr.convert(convert_numeric=True) + new_mgr = mgr.convert(numeric=True) self.assertEqual(new_mgr.get('a').dtype, np.int64) self.assertEqual(new_mgr.get('b').dtype, np.float64) self.assertEqual(new_mgr.get('foo').dtype, np.object_) @@ -636,7 +658,9 @@ def test_interleave_non_unique_cols(self): df_unique = df.copy() df_unique.columns = ['x', 'y'] - np.testing.assert_array_equal(df_unique.values, df.values) + self.assertEqual(df_unique.values.shape, df.values.shape) + tm.assert_numpy_array_equal(df_unique.values[0], df.values[0]) + tm.assert_numpy_array_equal(df_unique.values[1], df.values[1]) def test_consolidate(self): pass @@ -753,15 +777,15 @@ def test_equals(self): def test_equals_block_order_different_dtypes(self): # GH 9330 - - mgr_strings = [ + + mgr_strings = [ "a:i8;b:f8", # basic case "a:i8;b:f8;c:c8;d:b", # many types "a:i8;e:dt;f:td;g:string", # more types "a:i8;b:category;c:category2;d:category2", # categories "c:sparse;d:sparse_na;b:f8", # sparse ] - + for mgr_string in mgr_strings: bm = create_mgr(mgr_string) block_perms = itertools.permutations(bm.blocks) @@ -812,6 +836,13 @@ def test_get_slice(self): def assert_slice_ok(mgr, axis, slobj): # import pudb; pudb.set_trace() mat = mgr.as_matrix() + + # we maybe using an ndarray to test slicing and + # might not be the full length of the axis + if isinstance(slobj, np.ndarray): + ax = mgr.axes[axis] + if len(ax) and len(slobj) and len(slobj) != len(ax): + slobj = np.concatenate([slobj, np.zeros(len(ax)-len(slobj),dtype=bool)]) sliced = mgr.get_slice(slobj, axis=axis) mat_slobj = (slice(None),) * axis + (slobj,) assert_almost_equal(mat[mat_slobj], sliced.as_matrix()) @@ -1037,7 +1068,7 @@ def test_slice_iter(self): def test_slice_to_array_conversion(self): def assert_as_array_equals(slc, asarray): - np.testing.assert_array_equal( + tm.assert_numpy_array_equal( BlockPlacement(slc).as_array, np.asarray(asarray)) diff --git a/pandas/tests/test_lib.py b/pandas/tests/test_lib.py index 6d9bea29cf44d..cfc98f5c20360 100644 --- a/pandas/tests/test_lib.py +++ b/pandas/tests/test_lib.py @@ -4,7 +4,7 @@ import numpy as np import pandas as pd -from pandas.lib import isscalar, item_from_zerodim, max_len_string_array +import pandas.lib as lib import pandas.util.testing as tm from pandas.compat import u, PY2 @@ -14,19 +14,19 @@ class TestMisc(tm.TestCase): def test_max_len_string_array(self): arr = a = np.array(['foo', 'b', np.nan], dtype='object') - self.assertTrue(max_len_string_array(arr), 3) + self.assertTrue(lib.max_len_string_array(arr), 3) # unicode arr = a.astype('U').astype(object) - self.assertTrue(max_len_string_array(arr), 3) + self.assertTrue(lib.max_len_string_array(arr), 3) # bytes for python3 arr = a.astype('S').astype(object) - self.assertTrue(max_len_string_array(arr), 3) + self.assertTrue(lib.max_len_string_array(arr), 3) # raises tm.assertRaises(TypeError, - lambda: max_len_string_array(arr.astype('U'))) + lambda: lib.max_len_string_array(arr.astype('U'))) def test_infer_dtype_bytes(self): compare = 'string' if PY2 else 'bytes' @@ -39,68 +39,197 @@ def test_infer_dtype_bytes(self): arr = arr.astype(object) self.assertEqual(pd.lib.infer_dtype(arr), compare) - -class TestIsscalar(tm.TestCase): + def test_maybe_indices_to_slice_left_edge(self): + target = np.arange(100) + + # slice + indices = np.array([], dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + for end in [1, 2, 5, 20, 99]: + for step in [1, 2, 4]: + indices = np.arange(0, end, step, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # reverse + indices = indices[::-1] + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # not slice + for case in [[2, 1, 2, 0], [2, 2, 1, 0], [0, 1, 2, 1], [-2, 0, 2], [2, 0, -2]]: + indices = np.array(case, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + def test_maybe_indices_to_slice_right_edge(self): + target = np.arange(100) + + # slice + for start in [0, 2, 5, 20, 97, 98]: + for step in [1, 2, 4]: + indices = np.arange(start, 99, step, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # reverse + indices = indices[::-1] + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # not slice + indices = np.array([97, 98, 99, 100], dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + with self.assertRaises(IndexError): + target[indices] + with self.assertRaises(IndexError): + target[maybe_slice] + + indices = np.array([100, 99, 98, 97], dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + with self.assertRaises(IndexError): + target[indices] + with self.assertRaises(IndexError): + target[maybe_slice] + + for case in [[99, 97, 99, 96], [99, 99, 98, 97], [98, 98, 97, 96]]: + indices = np.array(case, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + def test_maybe_indices_to_slice_both_edges(self): + target = np.arange(10) + + # slice + for step in [1, 2, 4, 5, 8, 9]: + indices = np.arange(0, 9, step, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # reverse + indices = indices[::-1] + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # not slice + for case in [[4, 2, 0, -2], [2, 2, 1, 0], [0, 1, 2, 1]]: + indices = np.array(case, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + def test_maybe_indices_to_slice_middle(self): + target = np.arange(100) + + # slice + for start, end in [(2, 10), (5, 25), (65, 97)]: + for step in [1, 2, 4, 20]: + indices = np.arange(start, end, step, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # reverse + indices = indices[::-1] + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertTrue(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + # not slice + for case in [[14, 12, 10, 12], [12, 12, 11, 10], [10, 11, 12, 11]]: + indices = np.array(case, dtype=np.int64) + maybe_slice = lib.maybe_indices_to_slice(indices, len(target)) + self.assertFalse(isinstance(maybe_slice, slice)) + self.assert_numpy_array_equal(maybe_slice, indices) + self.assert_numpy_array_equal(target[indices], target[maybe_slice]) + + +class Testisscalar(tm.TestCase): def test_isscalar_builtin_scalars(self): - self.assertTrue(isscalar(None)) - self.assertTrue(isscalar(True)) - self.assertTrue(isscalar(False)) - self.assertTrue(isscalar(0.)) - self.assertTrue(isscalar(np.nan)) - self.assertTrue(isscalar('foobar')) - self.assertTrue(isscalar(b'foobar')) - self.assertTrue(isscalar(u('efoobar'))) - self.assertTrue(isscalar(datetime(2014, 1, 1))) - self.assertTrue(isscalar(date(2014, 1, 1))) - self.assertTrue(isscalar(time(12, 0))) - self.assertTrue(isscalar(timedelta(hours=1))) - self.assertTrue(isscalar(pd.NaT)) + self.assertTrue(lib.isscalar(None)) + self.assertTrue(lib.isscalar(True)) + self.assertTrue(lib.isscalar(False)) + self.assertTrue(lib.isscalar(0.)) + self.assertTrue(lib.isscalar(np.nan)) + self.assertTrue(lib.isscalar('foobar')) + self.assertTrue(lib.isscalar(b'foobar')) + self.assertTrue(lib.isscalar(u('efoobar'))) + self.assertTrue(lib.isscalar(datetime(2014, 1, 1))) + self.assertTrue(lib.isscalar(date(2014, 1, 1))) + self.assertTrue(lib.isscalar(time(12, 0))) + self.assertTrue(lib.isscalar(timedelta(hours=1))) + self.assertTrue(lib.isscalar(pd.NaT)) def test_isscalar_builtin_nonscalars(self): - self.assertFalse(isscalar({})) - self.assertFalse(isscalar([])) - self.assertFalse(isscalar([1])) - self.assertFalse(isscalar(())) - self.assertFalse(isscalar((1,))) - self.assertFalse(isscalar(slice(None))) - self.assertFalse(isscalar(Ellipsis)) + self.assertFalse(lib.isscalar({})) + self.assertFalse(lib.isscalar([])) + self.assertFalse(lib.isscalar([1])) + self.assertFalse(lib.isscalar(())) + self.assertFalse(lib.isscalar((1,))) + self.assertFalse(lib.isscalar(slice(None))) + self.assertFalse(lib.isscalar(Ellipsis)) def test_isscalar_numpy_array_scalars(self): - self.assertTrue(isscalar(np.int64(1))) - self.assertTrue(isscalar(np.float64(1.))) - self.assertTrue(isscalar(np.int32(1))) - self.assertTrue(isscalar(np.object_('foobar'))) - self.assertTrue(isscalar(np.str_('foobar'))) - self.assertTrue(isscalar(np.unicode_(u('foobar')))) - self.assertTrue(isscalar(np.bytes_(b'foobar'))) - self.assertTrue(isscalar(np.datetime64('2014-01-01'))) - self.assertTrue(isscalar(np.timedelta64(1, 'h'))) + self.assertTrue(lib.isscalar(np.int64(1))) + self.assertTrue(lib.isscalar(np.float64(1.))) + self.assertTrue(lib.isscalar(np.int32(1))) + self.assertTrue(lib.isscalar(np.object_('foobar'))) + self.assertTrue(lib.isscalar(np.str_('foobar'))) + self.assertTrue(lib.isscalar(np.unicode_(u('foobar')))) + self.assertTrue(lib.isscalar(np.bytes_(b'foobar'))) + self.assertTrue(lib.isscalar(np.datetime64('2014-01-01'))) + self.assertTrue(lib.isscalar(np.timedelta64(1, 'h'))) def test_isscalar_numpy_zerodim_arrays(self): for zerodim in [np.array(1), np.array('foobar'), np.array(np.datetime64('2014-01-01')), np.array(np.timedelta64(1, 'h'))]: - self.assertFalse(isscalar(zerodim)) - self.assertTrue(isscalar(item_from_zerodim(zerodim))) + self.assertFalse(lib.isscalar(zerodim)) + self.assertTrue(lib.isscalar(lib.item_from_zerodim(zerodim))) def test_isscalar_numpy_arrays(self): - self.assertFalse(isscalar(np.array([]))) - self.assertFalse(isscalar(np.array([[]]))) - self.assertFalse(isscalar(np.matrix('1; 2'))) + self.assertFalse(lib.isscalar(np.array([]))) + self.assertFalse(lib.isscalar(np.array([[]]))) + self.assertFalse(lib.isscalar(np.matrix('1; 2'))) def test_isscalar_pandas_scalars(self): - self.assertTrue(isscalar(pd.Timestamp('2014-01-01'))) - self.assertTrue(isscalar(pd.Timedelta(hours=1))) - self.assertTrue(isscalar(pd.Period('2014-01-01'))) - - def test_isscalar_pandas_containers(self): - self.assertFalse(isscalar(pd.Series())) - self.assertFalse(isscalar(pd.Series([1]))) - self.assertFalse(isscalar(pd.DataFrame())) - self.assertFalse(isscalar(pd.DataFrame([[1]]))) - self.assertFalse(isscalar(pd.Panel())) - self.assertFalse(isscalar(pd.Panel([[[1]]]))) - self.assertFalse(isscalar(pd.Index([]))) - self.assertFalse(isscalar(pd.Index([1]))) + self.assertTrue(lib.isscalar(pd.Timestamp('2014-01-01'))) + self.assertTrue(lib.isscalar(pd.Timedelta(hours=1))) + self.assertTrue(lib.isscalar(pd.Period('2014-01-01'))) + + def test_lisscalar_pandas_containers(self): + self.assertFalse(lib.isscalar(pd.Series())) + self.assertFalse(lib.isscalar(pd.Series([1]))) + self.assertFalse(lib.isscalar(pd.DataFrame())) + self.assertFalse(lib.isscalar(pd.DataFrame([[1]]))) + self.assertFalse(lib.isscalar(pd.Panel())) + self.assertFalse(lib.isscalar(pd.Panel([[[1]]]))) + self.assertFalse(lib.isscalar(pd.Index([]))) + self.assertFalse(lib.isscalar(pd.Index([1]))) + + +if __name__ == '__main__': + import nose + + nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], + exit=False) \ No newline at end of file diff --git a/pandas/tests/test_msgpack/test_buffer.py b/pandas/tests/test_msgpack/test_buffer.py index 940b65406103e..43f5e64012885 100644 --- a/pandas/tests/test_msgpack/test_buffer.py +++ b/pandas/tests/test_msgpack/test_buffer.py @@ -7,6 +7,14 @@ def test_unpack_buffer(): from array import array buf = array('b') - buf.fromstring(packb(('foo', 'bar'))) + buf.fromstring(packb((b'foo', b'bar'))) obj = unpackb(buf, use_list=1) assert [b'foo', b'bar'] == obj + + +def test_unpack_bytearray(): + buf = bytearray(packb(('foo', 'bar'))) + obj = unpackb(buf, use_list=1) + assert [b'foo', b'bar'] == obj + expected_type = bytes + assert all(type(s) == expected_type for s in obj) diff --git a/pandas/tests/test_msgpack/test_case.py b/pandas/tests/test_msgpack/test_case.py index e78456b2ddb62..187668b242495 100644 --- a/pandas/tests/test_msgpack/test_case.py +++ b/pandas/tests/test_msgpack/test_case.py @@ -99,3 +99,4 @@ def test_match(): def test_unicode(): assert unpackb(packb('foobar'), use_list=1) == b'foobar' + diff --git a/pandas/tests/test_msgpack/test_extension.py b/pandas/tests/test_msgpack/test_extension.py new file mode 100644 index 0000000000000..3172605c0aae1 --- /dev/null +++ b/pandas/tests/test_msgpack/test_extension.py @@ -0,0 +1,57 @@ +from __future__ import print_function +import array +import pandas.msgpack as msgpack +from pandas.msgpack import ExtType + + +def test_pack_ext_type(): + def p(s): + packer = msgpack.Packer() + packer.pack_ext_type(0x42, s) + return packer.bytes() + assert p(b'A') == b'\xd4\x42A' # fixext 1 + assert p(b'AB') == b'\xd5\x42AB' # fixext 2 + assert p(b'ABCD') == b'\xd6\x42ABCD' # fixext 4 + assert p(b'ABCDEFGH') == b'\xd7\x42ABCDEFGH' # fixext 8 + assert p(b'A'*16) == b'\xd8\x42' + b'A'*16 # fixext 16 + assert p(b'ABC') == b'\xc7\x03\x42ABC' # ext 8 + assert p(b'A'*0x0123) == b'\xc8\x01\x23\x42' + b'A'*0x0123 # ext 16 + assert p(b'A'*0x00012345) == b'\xc9\x00\x01\x23\x45\x42' + b'A'*0x00012345 # ext 32 + + +def test_unpack_ext_type(): + def check(b, expected): + assert msgpack.unpackb(b) == expected + + check(b'\xd4\x42A', ExtType(0x42, b'A')) # fixext 1 + check(b'\xd5\x42AB', ExtType(0x42, b'AB')) # fixext 2 + check(b'\xd6\x42ABCD', ExtType(0x42, b'ABCD')) # fixext 4 + check(b'\xd7\x42ABCDEFGH', ExtType(0x42, b'ABCDEFGH')) # fixext 8 + check(b'\xd8\x42' + b'A'*16, ExtType(0x42, b'A'*16)) # fixext 16 + check(b'\xc7\x03\x42ABC', ExtType(0x42, b'ABC')) # ext 8 + check(b'\xc8\x01\x23\x42' + b'A'*0x0123, + ExtType(0x42, b'A'*0x0123)) # ext 16 + check(b'\xc9\x00\x01\x23\x45\x42' + b'A'*0x00012345, + ExtType(0x42, b'A'*0x00012345)) # ext 32 + + +def test_extension_type(): + def default(obj): + print('default called', obj) + if isinstance(obj, array.array): + typecode = 123 # application specific typecode + data = obj.tostring() + return ExtType(typecode, data) + raise TypeError("Unknwon type object %r" % (obj,)) + + def ext_hook(code, data): + print('ext_hook called', code, data) + assert code == 123 + obj = array.array('d') + obj.fromstring(data) + return obj + + obj = [42, b'hello', array.array('d', [1.1, 2.2, 3.3])] + s = msgpack.packb(obj, default=default) + obj2 = msgpack.unpackb(s, ext_hook=ext_hook) + assert obj == obj2 diff --git a/pandas/tests/test_msgpack/test_format.py b/pandas/tests/test_msgpack/test_format.py index a3a3afd046ce2..706c48436d7d3 100644 --- a/pandas/tests/test_msgpack/test_format.py +++ b/pandas/tests/test_msgpack/test_format.py @@ -7,7 +7,7 @@ def check(src, should, use_list=0): assert unpackb(src, use_list=use_list) == should def testSimpleValue(): - check(b"\x93\xc0\xc2\xc3", + check(b"\x93\xc0\xc2\xc3", (None, False, True,)) def testFixnum(): diff --git a/pandas/tests/test_msgpack/test_limits.py b/pandas/tests/test_msgpack/test_limits.py new file mode 100644 index 0000000000000..d9aa957182d65 --- /dev/null +++ b/pandas/tests/test_msgpack/test_limits.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# coding: utf-8 +from __future__ import absolute_import, division, print_function, unicode_literals +import pandas.util.testing as tm + +from pandas.msgpack import packb, unpackb, Packer, Unpacker, ExtType + +class TestLimits(tm.TestCase): + def test_integer(self): + x = -(2 ** 63) + assert unpackb(packb(x)) == x + self.assertRaises((OverflowError, ValueError), packb, x-1) + x = 2 ** 64 - 1 + assert unpackb(packb(x)) == x + self.assertRaises((OverflowError, ValueError), packb, x+1) + + + def test_array_header(self): + packer = Packer() + packer.pack_array_header(2**32-1) + self.assertRaises((OverflowError, ValueError), + packer.pack_array_header, 2**32) + + + def test_map_header(self): + packer = Packer() + packer.pack_map_header(2**32-1) + self.assertRaises((OverflowError, ValueError), + packer.pack_array_header, 2**32) + + + def test_max_str_len(self): + d = 'x' * 3 + packed = packb(d) + + unpacker = Unpacker(max_str_len=3, encoding='utf-8') + unpacker.feed(packed) + assert unpacker.unpack() == d + + unpacker = Unpacker(max_str_len=2, encoding='utf-8') + unpacker.feed(packed) + self.assertRaises(ValueError, unpacker.unpack) + + + def test_max_bin_len(self): + d = b'x' * 3 + packed = packb(d, use_bin_type=True) + + unpacker = Unpacker(max_bin_len=3) + unpacker.feed(packed) + assert unpacker.unpack() == d + + unpacker = Unpacker(max_bin_len=2) + unpacker.feed(packed) + self.assertRaises(ValueError, unpacker.unpack) + + + def test_max_array_len(self): + d = [1, 2, 3] + packed = packb(d) + + unpacker = Unpacker(max_array_len=3) + unpacker.feed(packed) + assert unpacker.unpack() == d + + unpacker = Unpacker(max_array_len=2) + unpacker.feed(packed) + self.assertRaises(ValueError, unpacker.unpack) + + + def test_max_map_len(self): + d = {1: 2, 3: 4, 5: 6} + packed = packb(d) + + unpacker = Unpacker(max_map_len=3) + unpacker.feed(packed) + assert unpacker.unpack() == d + + unpacker = Unpacker(max_map_len=2) + unpacker.feed(packed) + self.assertRaises(ValueError, unpacker.unpack) + + + def test_max_ext_len(self): + d = ExtType(42, b"abc") + packed = packb(d) + + unpacker = Unpacker(max_ext_len=3) + unpacker.feed(packed) + assert unpacker.unpack() == d + + unpacker = Unpacker(max_ext_len=2) + unpacker.feed(packed) + self.assertRaises(ValueError, unpacker.unpack) diff --git a/pandas/tests/test_msgpack/test_newspec.py b/pandas/tests/test_msgpack/test_newspec.py new file mode 100644 index 0000000000000..8532ab8cfb1a4 --- /dev/null +++ b/pandas/tests/test_msgpack/test_newspec.py @@ -0,0 +1,88 @@ +# coding: utf-8 + +from pandas.msgpack import packb, unpackb, ExtType + + +def test_str8(): + header = b'\xd9' + data = b'x' * 32 + b = packb(data.decode(), use_bin_type=True) + assert len(b) == len(data) + 2 + assert b[0:2] == header + b'\x20' + assert b[2:] == data + assert unpackb(b) == data + + data = b'x' * 255 + b = packb(data.decode(), use_bin_type=True) + assert len(b) == len(data) + 2 + assert b[0:2] == header + b'\xff' + assert b[2:] == data + assert unpackb(b) == data + + +def test_bin8(): + header = b'\xc4' + data = b'' + b = packb(data, use_bin_type=True) + assert len(b) == len(data) + 2 + assert b[0:2] == header + b'\x00' + assert b[2:] == data + assert unpackb(b) == data + + data = b'x' * 255 + b = packb(data, use_bin_type=True) + assert len(b) == len(data) + 2 + assert b[0:2] == header + b'\xff' + assert b[2:] == data + assert unpackb(b) == data + + +def test_bin16(): + header = b'\xc5' + data = b'x' * 256 + b = packb(data, use_bin_type=True) + assert len(b) == len(data) + 3 + assert b[0:1] == header + assert b[1:3] == b'\x01\x00' + assert b[3:] == data + assert unpackb(b) == data + + data = b'x' * 65535 + b = packb(data, use_bin_type=True) + assert len(b) == len(data) + 3 + assert b[0:1] == header + assert b[1:3] == b'\xff\xff' + assert b[3:] == data + assert unpackb(b) == data + + +def test_bin32(): + header = b'\xc6' + data = b'x' * 65536 + b = packb(data, use_bin_type=True) + assert len(b) == len(data) + 5 + assert b[0:1] == header + assert b[1:5] == b'\x00\x01\x00\x00' + assert b[5:] == data + assert unpackb(b) == data + +def test_ext(): + def check(ext, packed): + assert packb(ext) == packed + assert unpackb(packed) == ext + check(ExtType(0x42, b'Z'), b'\xd4\x42Z') # fixext 1 + check(ExtType(0x42, b'ZZ'), b'\xd5\x42ZZ') # fixext 2 + check(ExtType(0x42, b'Z'*4), b'\xd6\x42' + b'Z'*4) # fixext 4 + check(ExtType(0x42, b'Z'*8), b'\xd7\x42' + b'Z'*8) # fixext 8 + check(ExtType(0x42, b'Z'*16), b'\xd8\x42' + b'Z'*16) # fixext 16 + # ext 8 + check(ExtType(0x42, b''), b'\xc7\x00\x42') + check(ExtType(0x42, b'Z'*255), b'\xc7\xff\x42' + b'Z'*255) + # ext 16 + check(ExtType(0x42, b'Z'*256), b'\xc8\x01\x00\x42' + b'Z'*256) + check(ExtType(0x42, b'Z'*0xffff), b'\xc8\xff\xff\x42' + b'Z'*0xffff) + # ext 32 + check(ExtType(0x42, b'Z'*0x10000), b'\xc9\x00\x01\x00\x00\x42' + b'Z'*0x10000) + # needs large memory + #check(ExtType(0x42, b'Z'*0xffffffff), + # b'\xc9\xff\xff\xff\xff\x42' + b'Z'*0xffffffff) diff --git a/pandas/tests/test_msgpack/test_obj.py b/pandas/tests/test_msgpack/test_obj.py index 4a018bc8b87f1..886fec522d4f3 100644 --- a/pandas/tests/test_msgpack/test_obj.py +++ b/pandas/tests/test_msgpack/test_obj.py @@ -44,13 +44,13 @@ def test_decode_pairs_hook(self): assert unpacked[1] == prod_sum def test_only_one_obj_hook(self): - self.assertRaises(ValueError, unpackb, b'', object_hook=lambda x: x, object_pairs_hook=lambda x: x) + self.assertRaises(TypeError, unpackb, b'', object_hook=lambda x: x, object_pairs_hook=lambda x: x) def test_bad_hook(self): def f(): packed = packb([3, 1+2j], default=lambda o: o) unpacked = unpackb(packed, use_list=1) - self.assertRaises(ValueError, f) + self.assertRaises(TypeError, f) def test_array_hook(self): packed = packb([1,2,3]) diff --git a/pandas/tests/test_msgpack/test_read_size.py b/pandas/tests/test_msgpack/test_read_size.py index db3e1deb04f8f..7cbb9c9807201 100644 --- a/pandas/tests/test_msgpack/test_read_size.py +++ b/pandas/tests/test_msgpack/test_read_size.py @@ -63,3 +63,4 @@ def test_incorrect_type_nested_map(): assert 0, 'should raise exception' except UnexpectedTypeException: assert 1, 'okay' + diff --git a/pandas/tests/test_msgpack/test_seq.py b/pandas/tests/test_msgpack/test_seq.py index e5ee68c4cab84..464ff6d0174af 100644 --- a/pandas/tests/test_msgpack/test_seq.py +++ b/pandas/tests/test_msgpack/test_seq.py @@ -1,21 +1,18 @@ #!/usr/bin/env python # coding: utf-8 -from pandas import compat -from pandas.compat import u +import io import pandas.msgpack as msgpack -binarydata = [chr(i) for i in range(256)] -binarydata = "".join(binarydata) -if compat.PY3: - binarydata = binarydata.encode('utf-8') + +binarydata = bytes(bytearray(range(256))) def gen_binary_data(idx): - data = binarydata[:idx % 300] - return data + return binarydata[:idx % 300] + def test_exceeding_unpacker_read_size(): - dumpf = compat.BytesIO() + dumpf = io.BytesIO() packer = msgpack.Packer() @@ -30,7 +27,7 @@ def test_exceeding_unpacker_read_size(): data = gen_binary_data(idx) dumpf.write(packer.pack(data)) - f = compat.BytesIO(dumpf.getvalue()) + f = io.BytesIO(dumpf.getvalue()) dumpf.close() unpacker = msgpack.Unpacker(f, read_size=read_size, use_list=1) diff --git a/pandas/tests/test_msgpack/test_sequnpack.py b/pandas/tests/test_msgpack/test_sequnpack.py index 4c3ad363e5b6e..72ceed0471437 100644 --- a/pandas/tests/test_msgpack/test_sequnpack.py +++ b/pandas/tests/test_msgpack/test_sequnpack.py @@ -82,3 +82,15 @@ def test_readbytes(self): assert unpacker.read_bytes(3) == b'oob' assert unpacker.unpack() == ord(b'a') assert unpacker.unpack() == ord(b'r') + + def test_issue124(self): + unpacker = Unpacker() + unpacker.feed(b'\xa1?\xa1!') + assert tuple(unpacker) == (b'?', b'!') + assert tuple(unpacker) == () + unpacker.feed(b"\xa1?\xa1") + assert tuple(unpacker) == (b'?',) + assert tuple(unpacker) == () + unpacker.feed(b"!") + assert tuple(unpacker) == (b'!',) + assert tuple(unpacker) == () diff --git a/pandas/tests/test_msgpack/test_unpack.py b/pandas/tests/test_msgpack/test_unpack.py new file mode 100644 index 0000000000000..fe840083ae1c2 --- /dev/null +++ b/pandas/tests/test_msgpack/test_unpack.py @@ -0,0 +1,65 @@ +from io import BytesIO +import sys +from pandas.msgpack import Unpacker, packb, OutOfData, ExtType +import pandas.util.testing as tm +import nose + +class TestUnpack(tm.TestCase): + def test_unpack_array_header_from_file(self): + f = BytesIO(packb([1,2,3,4])) + unpacker = Unpacker(f) + assert unpacker.read_array_header() == 4 + assert unpacker.unpack() == 1 + assert unpacker.unpack() == 2 + assert unpacker.unpack() == 3 + assert unpacker.unpack() == 4 + self.assertRaises(OutOfData, unpacker.unpack) + + + def test_unpacker_hook_refcnt(self): + if not hasattr(sys, 'getrefcount'): + raise nose.SkipTest('no sys.getrefcount()') + result = [] + + def hook(x): + result.append(x) + return x + + basecnt = sys.getrefcount(hook) + + up = Unpacker(object_hook=hook, list_hook=hook) + + assert sys.getrefcount(hook) >= basecnt + 2 + + up.feed(packb([{}])) + up.feed(packb([{}])) + assert up.unpack() == [{}] + assert up.unpack() == [{}] + assert result == [{}, [{}], {}, [{}]] + + del up + + assert sys.getrefcount(hook) == basecnt + + + def test_unpacker_ext_hook(self): + + class MyUnpacker(Unpacker): + + def __init__(self): + super(MyUnpacker, self).__init__(ext_hook=self._hook, + encoding='utf-8') + + def _hook(self, code, data): + if code == 1: + return int(data) + else: + return ExtType(code, data) + + unpacker = MyUnpacker() + unpacker.feed(packb({'a': 1}, encoding='utf-8')) + assert unpacker.unpack() == {'a': 1} + unpacker.feed(packb({'a': ExtType(1, b'123')}, encoding='utf-8')) + assert unpacker.unpack() == {'a': 123} + unpacker.feed(packb({'a': ExtType(2, b'321')}, encoding='utf-8')) + assert unpacker.unpack() == {'a': ExtType(2, b'321')} diff --git a/pandas/tests/test_msgpack/test_unpack_raw.py b/pandas/tests/test_msgpack/test_unpack_raw.py index 0e96a79cf190a..c6bf747c8d992 100644 --- a/pandas/tests/test_msgpack/test_unpack_raw.py +++ b/pandas/tests/test_msgpack/test_unpack_raw.py @@ -1,18 +1,19 @@ """Tests for cases where the user seeks to obtain packed msgpack objects""" -from pandas import compat +import io from pandas.msgpack import Unpacker, packb + def test_write_bytes(): unpacker = Unpacker() unpacker.feed(b'abc') - f = compat.BytesIO() + f = io.BytesIO() assert unpacker.unpack(f.write) == ord('a') assert f.getvalue() == b'a' - f = compat.BytesIO() + f = io.BytesIO() assert unpacker.skip(f.write) is None assert f.getvalue() == b'b' - f = compat.BytesIO() + f = io.BytesIO() assert unpacker.skip() is None assert f.getvalue() == b'' @@ -20,9 +21,9 @@ def test_write_bytes(): def test_write_bytes_multi_buffer(): long_val = (5) * 100 expected = packb(long_val) - unpacker = Unpacker(compat.BytesIO(expected), read_size=3, max_buffer_size=3) + unpacker = Unpacker(io.BytesIO(expected), read_size=3, max_buffer_size=3) - f = compat.BytesIO() + f = io.BytesIO() unpacked = unpacker.unpack(f.write) assert unpacked == long_val assert f.getvalue() == expected diff --git a/pandas/tests/test_multilevel.py b/pandas/tests/test_multilevel.py index 9460c6373d0d2..be7ed6c1b268f 100644 --- a/pandas/tests/test_multilevel.py +++ b/pandas/tests/test_multilevel.py @@ -117,26 +117,26 @@ def test_dataframe_constructor(self): multi = DataFrame(np.random.randn(4, 4), index=[np.array(['a', 'a', 'b', 'b']), np.array(['x', 'y', 'x', 'y'])]) - tm.assert_isinstance(multi.index, MultiIndex) + tm.assertIsInstance(multi.index, MultiIndex) self.assertNotIsInstance(multi.columns, MultiIndex) multi = DataFrame(np.random.randn(4, 4), columns=[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']]) - tm.assert_isinstance(multi.columns, MultiIndex) + tm.assertIsInstance(multi.columns, MultiIndex) def test_series_constructor(self): multi = Series(1., index=[np.array(['a', 'a', 'b', 'b']), np.array(['x', 'y', 'x', 'y'])]) - tm.assert_isinstance(multi.index, MultiIndex) + tm.assertIsInstance(multi.index, MultiIndex) multi = Series(1., index=[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']]) - tm.assert_isinstance(multi.index, MultiIndex) + tm.assertIsInstance(multi.index, MultiIndex) multi = Series(lrange(4), index=[['a', 'a', 'b', 'b'], ['x', 'y', 'x', 'y']]) - tm.assert_isinstance(multi.index, MultiIndex) + tm.assertIsInstance(multi.index, MultiIndex) def test_reindex_level(self): # axis=0 @@ -702,7 +702,7 @@ def test_setitem_change_dtype(self): s = dft['foo', 'two'] dft['foo', 'two'] = s > s.median() assert_series_equal(dft['foo', 'two'], s > s.median()) - # tm.assert_isinstance(dft._data.blocks[1].items, MultiIndex) + # tm.assertIsInstance(dft._data.blocks[1].items, MultiIndex) reindexed = dft.reindex(columns=[('foo', 'two')]) assert_series_equal(reindexed['foo', 'two'], s > s.median()) @@ -798,12 +798,12 @@ def test_reset_index_with_drop(self): self.assertEqual(len(deleveled.columns), len(self.ymd.columns)) deleveled = self.series.reset_index() - tm.assert_isinstance(deleveled, DataFrame) + tm.assertIsInstance(deleveled, DataFrame) self.assertEqual(len(deleveled.columns), len(self.series.index.levels) + 1) deleveled = self.series.reset_index(drop=True) - tm.assert_isinstance(deleveled, Series) + tm.assertIsInstance(deleveled, Series) def test_sortlevel_by_name(self): self.frame.index.names = ['first', 'second'] @@ -964,6 +964,44 @@ def test_stack(self): result = self.ymd.unstack(0).stack(-2) expected = self.ymd.unstack(0).stack(0) + # GH10417 + def check(left, right): + assert_series_equal(left, right) + self.assertFalse(left.index.is_unique) + li, ri = left.index, right.index + for i in range(ri.nlevels): + tm.assert_numpy_array_equal(li.levels[i], ri.levels[i]) + tm.assert_numpy_array_equal(li.labels[i], ri.labels[i]) + + df = DataFrame(np.arange(12).reshape(4, 3), + index=list('abab'), + columns=['1st', '2nd', '3rd']) + + mi = MultiIndex(levels=[['a', 'b'], ['1st', '2nd', '3rd']], + labels=[np.tile(np.arange(2).repeat(3), 2), + np.tile(np.arange(3), 4)]) + + left, right = df.stack(), Series(np.arange(12), index=mi) + check(left, right) + + df.columns = ['1st', '2nd', '1st'] + mi = MultiIndex(levels=[['a', 'b'], ['1st', '2nd']], + labels=[np.tile(np.arange(2).repeat(3), 2), + np.tile([0, 1, 0], 4)]) + + left, right = df.stack(), Series(np.arange(12), index=mi) + check(left, right) + + tpls = ('a', 2), ('b', 1), ('a', 1), ('b', 2) + df.index = MultiIndex.from_tuples(tpls) + mi = MultiIndex(levels=[['a', 'b'], [1, 2], ['1st', '2nd']], + labels=[np.tile(np.arange(2).repeat(3), 2), + np.repeat([1, 0, 1], [3, 6, 3]), + np.tile([0, 1, 0], 4)]) + + left, right = df.stack(), Series(np.arange(12), index=mi) + check(left, right) + def test_unstack_odd_failure(self): data = """day,time,smoker,sum,len Fri,Dinner,No,8.25,3. @@ -1325,7 +1363,7 @@ def test_reorder_levels(self): def test_insert_index(self): df = self.ymd[:5].T df[2000, 1, 10] = df[2000, 1, 7] - tm.assert_isinstance(df.columns, MultiIndex) + tm.assertIsInstance(df.columns, MultiIndex) self.assertTrue((df[2000, 1, 10] == df[2000, 1, 7]).all()) def test_alignment(self): @@ -1993,8 +2031,8 @@ def test_indexing_ambiguity_bug_1678(self): columns=columns) result = frame.ix[:, 1] - exp = frame.icol(1) - tm.assert_isinstance(result, Series) + exp = frame.loc[:, ('Ohio', 'Red')] + tm.assertIsInstance(result, Series) assert_series_equal(result, exp) def test_nonunique_assignment_1750(self): @@ -2098,11 +2136,28 @@ def test_duplicated_drop_duplicates(self): tm.assert_index_equal(idx.drop_duplicates(), expected) expected = np.array([True, False, False, False, False, False]) - duplicated = idx.duplicated(take_last=True) + duplicated = idx.duplicated(keep='last') + tm.assert_numpy_array_equal(duplicated, expected) + self.assertTrue(duplicated.dtype == bool) + expected = MultiIndex.from_arrays(([2, 3, 1, 2 ,3], [1, 1, 1, 2, 2])) + tm.assert_index_equal(idx.drop_duplicates(keep='last'), expected) + + expected = np.array([True, False, False, True, False, False]) + duplicated = idx.duplicated(keep=False) + tm.assert_numpy_array_equal(duplicated, expected) + self.assertTrue(duplicated.dtype == bool) + expected = MultiIndex.from_arrays(([2, 3, 2 ,3], [1, 1, 2, 2])) + tm.assert_index_equal(idx.drop_duplicates(keep=False), expected) + + # deprecate take_last + expected = np.array([True, False, False, False, False, False]) + with tm.assert_produces_warning(FutureWarning): + duplicated = idx.duplicated(take_last=True) tm.assert_numpy_array_equal(duplicated, expected) self.assertTrue(duplicated.dtype == bool) expected = MultiIndex.from_arrays(([2, 3, 1, 2 ,3], [1, 1, 1, 2, 2])) - tm.assert_index_equal(idx.drop_duplicates(take_last=True), expected) + with tm.assert_produces_warning(FutureWarning): + tm.assert_index_equal(idx.drop_duplicates(take_last=True), expected) def test_multiindex_set_index(self): # segfault in #3308 diff --git a/pandas/tests/test_panel.py b/pandas/tests/test_panel.py index 529d3ed68e24d..9cdc769dd7d74 100644 --- a/pandas/tests/test_panel.py +++ b/pandas/tests/test_panel.py @@ -821,7 +821,7 @@ def test_set_value(self): # resize res = self.panel.set_value('ItemE', 'foo', 'bar', 1.5) - tm.assert_isinstance(res, Panel) + tm.assertIsInstance(res, Panel) self.assertIsNot(res, self.panel) self.assertEqual(res.get_value('ItemE', 'foo', 'bar'), 1.5) @@ -1119,7 +1119,7 @@ def test_convert_objects(self): # GH 4937 p = Panel(dict(A = dict(a = ['1','1.0']))) expected = Panel(dict(A = dict(a = [1,1.0]))) - result = p.convert_objects(convert_numeric='force') + result = p.convert_objects(numeric=True, coerce=True) assert_panel_equal(result, expected) def test_dtypes(self): diff --git a/pandas/tests/test_panel4d.py b/pandas/tests/test_panel4d.py index 7a72200077225..289f7f134aa27 100644 --- a/pandas/tests/test_panel4d.py +++ b/pandas/tests/test_panel4d.py @@ -584,7 +584,7 @@ def test_set_value(self): # resize res = self.panel4d.set_value('l4', 'ItemE', 'foo', 'bar', 1.5) - tm.assert_isinstance(res, Panel4D) + tm.assertIsInstance(res, Panel4D) self.assertIsNot(res, self.panel4d) self.assertEqual(res.get_value('l4', 'ItemE', 'foo', 'bar'), 1.5) diff --git a/pandas/tests/test_reshape.py b/pandas/tests/test_reshape.py index 346c9e2598985..2961301366188 100644 --- a/pandas/tests/test_reshape.py +++ b/pandas/tests/test_reshape.py @@ -8,13 +8,13 @@ import nose from pandas import DataFrame, Series +from pandas.core.sparse import SparseDataFrame import pandas as pd from numpy import nan import numpy as np from pandas.util.testing import assert_frame_equal -from numpy.testing import assert_array_equal from pandas.core.reshape import (melt, lreshape, get_dummies, wide_to_long) @@ -171,6 +171,33 @@ def test_basic(self): expected.index = list('ABC') assert_frame_equal(get_dummies(s_series_index, sparse=self.sparse), expected) + def test_basic_types(self): + # GH 10531 + s_list = list('abc') + s_series = Series(s_list) + s_df = DataFrame({'a': [0, 1, 0, 1, 2], + 'b': ['A', 'A', 'B', 'C', 'C'], + 'c': [2, 3, 3, 3, 2]}) + + if not self.sparse: + exp_df_type = DataFrame + exp_blk_type = pd.core.internals.FloatBlock + else: + exp_df_type = SparseDataFrame + exp_blk_type = pd.core.internals.SparseBlock + + self.assertEqual(type(get_dummies(s_list, sparse=self.sparse)), exp_df_type) + self.assertEqual(type(get_dummies(s_series, sparse=self.sparse)), exp_df_type) + + r = get_dummies(s_df, sparse=self.sparse, columns=s_df.columns) + self.assertEqual(type(r), exp_df_type) + + r = get_dummies(s_df, sparse=self.sparse, columns=['a']) + self.assertEqual(type(r[['a_0']]._data.blocks[0]), exp_blk_type) + self.assertEqual(type(r[['a_1']]._data.blocks[0]), exp_blk_type) + self.assertEqual(type(r[['a_2']]._data.blocks[0]), exp_blk_type) + + def test_just_na(self): just_na_list = [np.nan] just_na_series = Series(just_na_list) @@ -206,7 +233,7 @@ def test_include_na(self): res_just_na = get_dummies([nan], dummy_na=True, sparse=self.sparse) exp_just_na = DataFrame(Series(1.0,index=[0]),columns=[nan]) - assert_array_equal(res_just_na.values, exp_just_na.values) + tm.assert_numpy_array_equal(res_just_na.values, exp_just_na.values) def test_unicode(self): # See GH 6885 - get_dummies chokes on unicode values import unicodedata diff --git a/pandas/tests/test_rplot.py b/pandas/tests/test_rplot.py index c58f17550a137..e79acfcbc58d8 100644 --- a/pandas/tests/test_rplot.py +++ b/pandas/tests/test_rplot.py @@ -160,7 +160,7 @@ def setUp(self): def test_gradient(self): for index in range(len(self.data)): - row = self.data.irow(index) + row = self.data.iloc[index] r, g, b = self.gradient(self.data, index) r1, g1, b1 = self.gradient.colour1 r2, g2, b2 = self.gradient.colour2 @@ -178,7 +178,7 @@ def setUp(self): def test_gradient2(self): for index in range(len(self.data)): - row = self.data.irow(index) + row = self.data.iloc[index] r, g, b = self.gradient(self.data, index) r1, g1, b1 = self.gradient.colour1 r2, g2, b2 = self.gradient.colour2 diff --git a/pandas/tests/test_series.py b/pandas/tests/test_series.py index ff0d5739588f2..56146df37a27f 100644 --- a/pandas/tests/test_series.py +++ b/pandas/tests/test_series.py @@ -8,6 +8,7 @@ from inspect import getargspec from itertools import product, starmap from distutils.version import LooseVersion +import warnings import nose @@ -35,6 +36,7 @@ from pandas.util.testing import (assert_series_equal, assert_almost_equal, assert_frame_equal, + assert_index_equal, ensure_clean) import pandas.util.testing as tm @@ -81,9 +83,10 @@ def test_dt_namespace_accessor(self): ok_for_base = ['year','month','day','hour','minute','second','weekofyear','week','dayofweek','weekday','dayofyear','quarter','freq','days_in_month','daysinmonth'] ok_for_period = ok_for_base + ['qyear'] + ok_for_period_methods = ['strftime'] ok_for_dt = ok_for_base + ['date','time','microsecond','nanosecond', 'is_month_start', 'is_month_end', 'is_quarter_start', 'is_quarter_end', 'is_year_start', 'is_year_end', 'tz'] - ok_for_dt_methods = ['to_period','to_pydatetime','tz_localize','tz_convert', 'normalize'] + ok_for_dt_methods = ['to_period','to_pydatetime','tz_localize','tz_convert', 'normalize', 'strftime'] ok_for_td = ['days','seconds','microseconds','nanoseconds'] ok_for_td_methods = ['components','to_pytimedelta'] @@ -109,13 +112,12 @@ def compare(s, name): Series(date_range('20130101',periods=5,freq='s')), Series(date_range('20130101 00:00:00',periods=5,freq='ms'))]: for prop in ok_for_dt: - # we test freq below if prop != 'freq': compare(s, prop) for prop in ok_for_dt_methods: - getattr(s.dt,prop) + getattr(s.dt, prop) result = s.dt.to_pydatetime() self.assertIsInstance(result,np.ndarray) @@ -140,13 +142,12 @@ def compare(s, name): Series(timedelta_range('1 day 01:23:45',periods=5,freq='s')), Series(timedelta_range('2 days 01:23:45.012345',periods=5,freq='ms'))]: for prop in ok_for_td: - # we test freq below if prop != 'freq': compare(s, prop) for prop in ok_for_td_methods: - getattr(s.dt,prop) + getattr(s.dt, prop) result = s.dt.components self.assertIsInstance(result,DataFrame) @@ -169,13 +170,14 @@ def compare(s, name): # periodindex for s in [Series(period_range('20130101',periods=5,freq='D'))]: - for prop in ok_for_period: - # we test freq below if prop != 'freq': compare(s, prop) + for prop in ok_for_period_methods: + getattr(s.dt, prop) + freq_result = s.dt.freq self.assertEqual(freq_result, PeriodIndex(s.values).freq) @@ -190,7 +192,7 @@ def get_dir(s): s = Series(period_range('20130101',periods=5,freq='D').asobject) results = get_dir(s) - tm.assert_almost_equal(results,list(sorted(set(ok_for_period)))) + tm.assert_almost_equal(results, list(sorted(set(ok_for_period + ok_for_period_methods)))) # no setting allowed s = Series(date_range('20130101',periods=5,freq='D')) @@ -203,13 +205,68 @@ def f(): s.dt.hour[0] = 5 self.assertRaises(com.SettingWithCopyError, f) + def test_strftime(self): + # GH 10086 + s = Series(date_range('20130101', periods=5)) + result = s.dt.strftime('%Y/%m/%d') + expected = Series(['2013/01/01', '2013/01/02', '2013/01/03', '2013/01/04', '2013/01/05']) + tm.assert_series_equal(result, expected) + + s = Series(date_range('2015-02-03 11:22:33.4567', periods=5)) + result = s.dt.strftime('%Y/%m/%d %H-%M-%S') + expected = Series(['2015/02/03 11-22-33', '2015/02/04 11-22-33', '2015/02/05 11-22-33', + '2015/02/06 11-22-33', '2015/02/07 11-22-33']) + tm.assert_series_equal(result, expected) + + s = Series(period_range('20130101', periods=5)) + result = s.dt.strftime('%Y/%m/%d') + expected = Series(['2013/01/01', '2013/01/02', '2013/01/03', '2013/01/04', '2013/01/05']) + tm.assert_series_equal(result, expected) + + s = Series(period_range('2015-02-03 11:22:33.4567', periods=5, freq='s')) + result = s.dt.strftime('%Y/%m/%d %H-%M-%S') + expected = Series(['2015/02/03 11-22-33', '2015/02/03 11-22-34', '2015/02/03 11-22-35', + '2015/02/03 11-22-36', '2015/02/03 11-22-37']) + tm.assert_series_equal(result, expected) + + s = Series(date_range('20130101', periods=5)) + s.iloc[0] = pd.NaT + result = s.dt.strftime('%Y/%m/%d') + expected = Series(['NaT', '2013/01/02', '2013/01/03', '2013/01/04', '2013/01/05']) + tm.assert_series_equal(result, expected) + + datetime_index = date_range('20150301', periods=5) + result = datetime_index.strftime("%Y/%m/%d") + expected = np.array(['2015/03/01', '2015/03/02', '2015/03/03', '2015/03/04', '2015/03/05'], dtype=object) + self.assert_numpy_array_equal(result, expected) + + period_index = period_range('20150301', periods=5) + result = period_index.strftime("%Y/%m/%d") + expected = np.array(['2015/03/01', '2015/03/02', '2015/03/03', '2015/03/04', '2015/03/05'], dtype=object) + self.assert_numpy_array_equal(result, expected) + + s = Series([datetime(2013, 1, 1, 2, 32, 59), datetime(2013, 1, 2, 14, 32, 1)]) + result = s.dt.strftime('%Y-%m-%d %H:%M:%S') + expected = Series(["2013-01-01 02:32:59", "2013-01-02 14:32:01"]) + tm.assert_series_equal(result, expected) + + s = Series(period_range('20130101', periods=4, freq='H')) + result = s.dt.strftime('%Y/%m/%d %H:%M:%S') + expected = Series(["2013/01/01 00:00:00", "2013/01/01 01:00:00", + "2013/01/01 02:00:00", "2013/01/01 03:00:00"]) + + s = Series(period_range('20130101', periods=4, freq='L')) + result = s.dt.strftime('%Y/%m/%d %H:%M:%S.%l') + expected = Series(["2013/01/01 00:00:00.000", "2013/01/01 00:00:00.001", + "2013/01/01 00:00:00.002", "2013/01/01 00:00:00.003"]) + tm.assert_series_equal(result, expected) + def test_valid_dt_with_missing_values(self): from datetime import date, time # GH 8689 s = Series(date_range('20130101',periods=5,freq='D')) - s_orig = s.copy() s.iloc[2] = pd.NaT for attr in ['microsecond','nanosecond','second','minute','hour','day']: @@ -503,11 +560,6 @@ def test_comparisons(self): s == s2 s2 == s - def test_none_comparison(self): - # bug brought up by #1079 - s = Series(np.random.randn(10), index=lrange(0, 20, 2)) - self.assertRaises(TypeError, s.__eq__, None) - def test_sum_zero(self): arr = np.array([]) self.assertEqual(nanops.nansum(arr), 0) @@ -581,7 +633,6 @@ class TestSeries(tm.TestCase, CheckNameIntegration): def setUp(self): import warnings - warnings.filterwarnings(action='ignore', category=FutureWarning) self.ts = _ts.copy() self.ts.name = 'ts' @@ -696,9 +747,7 @@ def test_constructor_map(self): def test_constructor_categorical(self): cat = pd.Categorical([0, 1, 2, 0, 1, 2], ['a', 'b', 'c'], fastpath=True) - cat.name = 'foo' res = Series(cat) - self.assertEqual(res.name, cat.name) self.assertTrue(res.values.equals(cat)) def test_constructor_maskedarray(self): @@ -781,7 +830,7 @@ def test_constructor_corner(self): df = tm.makeTimeDataFrame() objs = [df, df] s = Series(objs, index=[0, 1]) - tm.assert_isinstance(s, Series) + tm.assertIsInstance(s, Series) def test_constructor_sanitize(self): s = Series(np.array([1., 1., 8.]), dtype='i8') @@ -1069,7 +1118,7 @@ def test_setindex(self): # works series = self.series.copy() series.index = np.arange(len(series)) - tm.assert_isinstance(series.index, Index) + tm.assertIsInstance(series.index, Index) def test_array_finalize(self): pass @@ -1151,14 +1200,28 @@ def test_getitem_get(self): self.assertIsNone(result) def test_iget(self): + s = Series(np.random.randn(10), index=lrange(0, 20, 2)) + + # 10711, deprecated + with tm.assert_produces_warning(FutureWarning): + s.iget(1) + + # 10711, deprecated + with tm.assert_produces_warning(FutureWarning): + s.irow(1) + + # 10711, deprecated + with tm.assert_produces_warning(FutureWarning): + s.iget_value(1) + for i in range(len(s)): - result = s.iget(i) + result = s.iloc[i] exp = s[s.index[i]] assert_almost_equal(result, exp) # pass a slice - result = s.iget(slice(1, 3)) + result = s.iloc[slice(1, 3)] expected = s.ix[2:4] assert_series_equal(result, expected) @@ -1167,13 +1230,13 @@ def test_iget(self): self.assertTrue((s[1:3] == 0).all()) # list of integers - result = s.iget([0, 2, 3, 4, 5]) + result = s.iloc[[0, 2, 3, 4, 5]] expected = s.reindex(s.index[[0, 2, 3, 4, 5]]) assert_series_equal(result, expected) def test_iget_nonunique(self): s = Series([0, 1, 2], index=[0, 1, 0]) - self.assertEqual(s.iget(2), 2) + self.assertEqual(s.iloc[2], 2) def test_getitem_regression(self): s = Series(lrange(5), index=lrange(5)) @@ -1326,7 +1389,7 @@ def test_getitem_setitem_integers(self): def test_getitem_box_float64(self): value = self.ts[5] - tm.assert_isinstance(value, np.float64) + tm.assertIsInstance(value, np.float64) def test_getitem_ambiguous_keyerror(self): s = Series(lrange(10), index=lrange(0, 20, 2)) @@ -1480,6 +1543,18 @@ def test_setitem(self): expected = self.series.append(app) assert_series_equal(s, expected) + # Test for issue #10193 + key = pd.Timestamp('2012-01-01') + series = pd.Series() + series[key] = 47 + expected = pd.Series(47, [key]) + assert_series_equal(series, expected) + + series = pd.Series([], pd.DatetimeIndex([], freq='D')) + series[key] = 47 + expected = pd.Series(47, pd.DatetimeIndex([key], freq='D')) + assert_series_equal(series, expected) + def test_setitem_dtypes(self): # change dtypes @@ -1556,7 +1631,7 @@ def test_reshape_non_2d(self): a = Series([1, 2, 3, 4]) result = a.reshape(2, 2) expected = a.values.reshape(2, 2) - np.testing.assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) self.assertTrue(type(result) is type(expected)) def test_reshape_2d_return_array(self): @@ -3120,7 +3195,7 @@ def test_operators_timedelta64(self): # scalar Timestamp on rhs maxa = df['A'].max() - tm.assert_isinstance(maxa, Timestamp) + tm.assertIsInstance(maxa, Timestamp) resultb = df['A'] - df['A'].max() self.assertEqual(resultb.dtype, 'timedelta64[ns]') @@ -3211,14 +3286,37 @@ def test_timedeltas_with_DateOffset(self): s + op(5) op(5) + s - # invalid DateOffsets - for do in [ 'Week', 'BDay', 'BQuarterEnd', 'BMonthEnd', 'BYearEnd', - 'BYearBegin','BQuarterBegin', 'BMonthBegin', - 'MonthEnd','YearBegin', 'YearEnd', - 'MonthBegin', 'QuarterBegin' ]: + + def test_timedelta64_operations_with_DateOffset(self): + # GH 10699 + td = Series([timedelta(minutes=5, seconds=3)] * 3) + result = td + pd.offsets.Minute(1) + expected = Series([timedelta(minutes=6, seconds=3)] * 3) + assert_series_equal(result, expected) + + result = td - pd.offsets.Minute(1) + expected = Series([timedelta(minutes=4, seconds=3)] * 3) + assert_series_equal(result, expected) + + result = td + Series([pd.offsets.Minute(1), pd.offsets.Second(3), + pd.offsets.Hour(2)]) + expected = Series([timedelta(minutes=6, seconds=3), + timedelta(minutes=5, seconds=6), + timedelta(hours=2, minutes=5, seconds=3)]) + assert_series_equal(result, expected) + + result = td + pd.offsets.Minute(1) + pd.offsets.Second(12) + expected = Series([timedelta(minutes=6, seconds=15)] * 3) + assert_series_equal(result, expected) + + # valid DateOffsets + for do in [ 'Hour', 'Minute', 'Second', 'Day', 'Micro', + 'Milli', 'Nano' ]: op = getattr(pd.offsets,do) - self.assertRaises(TypeError, s.__add__, op(5)) - self.assertRaises(TypeError, s.__radd__, op(5)) + td + op(5) + op(5) + td + td - op(5) + op(5) - td def test_timedelta64_operations_with_timedeltas(self): @@ -4707,29 +4805,69 @@ def test_axis_alias(self): self.assertEqual(s._get_axis_name('rows'), 'index') def test_drop_duplicates(self): - s = Series([1, 2, 3, 3]) + # check both int and object + for s in [Series([1, 2, 3, 3]), Series(['1', '2', '3', '3'])]: + expected = Series([False, False, False, True]) + assert_series_equal(s.duplicated(), expected) + assert_series_equal(s.drop_duplicates(), s[~expected]) + sc = s.copy() + sc.drop_duplicates(inplace=True) + assert_series_equal(sc, s[~expected]) - result = s.duplicated() - expected = Series([False, False, False, True]) - assert_series_equal(result, expected) + expected = Series([False, False, True, False]) + assert_series_equal(s.duplicated(keep='last'), expected) + assert_series_equal(s.drop_duplicates(keep='last'), s[~expected]) + sc = s.copy() + sc.drop_duplicates(keep='last', inplace=True) + assert_series_equal(sc, s[~expected]) + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(s.duplicated(take_last=True), expected) + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(s.drop_duplicates(take_last=True), s[~expected]) + sc = s.copy() + with tm.assert_produces_warning(FutureWarning): + sc.drop_duplicates(take_last=True, inplace=True) + assert_series_equal(sc, s[~expected]) - result = s.duplicated(take_last=True) - expected = Series([False, False, True, False]) - assert_series_equal(result, expected) + expected = Series([False, False, True, True]) + assert_series_equal(s.duplicated(keep=False), expected) + assert_series_equal(s.drop_duplicates(keep=False), s[~expected]) + sc = s.copy() + sc.drop_duplicates(keep=False, inplace=True) + assert_series_equal(sc, s[~expected]) + + for s in [Series([1, 2, 3, 5, 3, 2, 4]), + Series(['1', '2', '3', '5', '3', '2', '4'])]: + expected = Series([False, False, False, False, True, True, False]) + assert_series_equal(s.duplicated(), expected) + assert_series_equal(s.drop_duplicates(), s[~expected]) + sc = s.copy() + sc.drop_duplicates(inplace=True) + assert_series_equal(sc, s[~expected]) - result = s.drop_duplicates() - expected = s[[True, True, True, False]] - assert_series_equal(result, expected) - sc = s.copy() - sc.drop_duplicates(inplace=True) - assert_series_equal(sc, expected) + expected = Series([False, True, True, False, False, False, False]) + assert_series_equal(s.duplicated(keep='last'), expected) + assert_series_equal(s.drop_duplicates(keep='last'), s[~expected]) + sc = s.copy() + sc.drop_duplicates(keep='last', inplace=True) + assert_series_equal(sc, s[~expected]) + # deprecate take_last + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(s.duplicated(take_last=True), expected) + with tm.assert_produces_warning(FutureWarning): + assert_series_equal(s.drop_duplicates(take_last=True), s[~expected]) + sc = s.copy() + with tm.assert_produces_warning(FutureWarning): + sc.drop_duplicates(take_last=True, inplace=True) + assert_series_equal(sc, s[~expected]) - result = s.drop_duplicates(take_last=True) - expected = s[[True, True, False, True]] - assert_series_equal(result, expected) - sc = s.copy() - sc.drop_duplicates(take_last=True, inplace=True) - assert_series_equal(sc, expected) + expected = Series([False, True, True, False, True, True, False]) + assert_series_equal(s.duplicated(keep=False), expected) + assert_series_equal(s.drop_duplicates(keep=False), s[~expected]) + sc = s.copy() + sc.drop_duplicates(keep=False, inplace=True) + assert_series_equal(sc, s[~expected]) def test_sort(self): ts = self.ts.copy() @@ -4967,6 +5105,11 @@ def test_from_csv(self): self.assertTrue(ts.name is None) self.assertTrue(ts.index.name is None) + # GH10483 + self.ts.to_csv(path, header=True) + ts_h = Series.from_csv(path, header=0) + self.assertTrue(ts_h.name == 'ts') + self.series.to_csv(path) series = Series.from_csv(path) self.assertIsNone(series.name) @@ -4975,6 +5118,10 @@ def test_from_csv(self): self.assertTrue(series.name is None) self.assertTrue(series.index.name is None) + self.series.to_csv(path, header=True) + series_h = Series.from_csv(path, header=0) + self.assertTrue(series_h.name == 'series') + outfile = open(path, 'w') outfile.write('1998-01-01|1.0\n1999-01-01|2.0') outfile.close() @@ -5090,7 +5237,7 @@ def test_clip(self): result = self.ts.clip(-0.5, 0.5) expected = np.clip(self.ts, -0.5, 0.5) assert_series_equal(result, expected) - tm.assert_isinstance(expected, Series) + tm.assertIsInstance(expected, Series) def test_clip_types_and_nulls(self): @@ -5239,6 +5386,25 @@ def test_shift_int(self): expected = ts.astype(float).shift(1) assert_series_equal(shifted, expected) + def test_shift_categorical(self): + # GH 9416 + s = pd.Series(['a', 'b', 'c', 'd'], dtype='category') + + assert_series_equal(s.iloc[:-1], s.shift(1).shift(-1).valid()) + + sp1 = s.shift(1) + assert_index_equal(s.index, sp1.index) + self.assertTrue(np.all(sp1.values.codes[:1] == -1)) + self.assertTrue(np.all(s.values.codes[:-1] == sp1.values.codes[1:])) + + sn2 = s.shift(-2) + assert_index_equal(s.index, sn2.index) + self.assertTrue(np.all(sn2.values.codes[-2:] == -1)) + self.assertTrue(np.all(s.values.codes[2:] == sn2.values.codes[:-2])) + + assert_index_equal(s.values.categories, sp1.values.categories) + assert_index_equal(s.values.categories, sn2.values.categories) + def test_truncate(self): offset = datetools.bday @@ -5741,6 +5907,35 @@ def test_map(self): result = self.ts.map(lambda x: x * 2) self.assert_numpy_array_equal(result, self.ts * 2) + # GH 10324 + a = Series([1, 2, 3, 4]) + b = Series(["even", "odd", "even", "odd"], dtype="category") + c = Series(["even", "odd", "even", "odd"]) + + exp = Series(["odd", "even", "odd", np.nan], dtype="category") + self.assert_series_equal(a.map(b), exp) + exp = Series(["odd", "even", "odd", np.nan]) + self.assert_series_equal(a.map(c), exp) + + a = Series(['a', 'b', 'c', 'd']) + b = Series([1, 2, 3, 4], index=pd.CategoricalIndex(['b', 'c', 'd', 'e'])) + c = Series([1, 2, 3, 4], index=Index(['b', 'c', 'd', 'e'])) + + exp = Series([np.nan, 1, 2, 3]) + self.assert_series_equal(a.map(b), exp) + exp = Series([np.nan, 1, 2, 3]) + self.assert_series_equal(a.map(c), exp) + + a = Series(['a', 'b', 'c', 'd']) + b = Series(['B', 'C', 'D', 'E'], dtype='category', + index=pd.CategoricalIndex(['b', 'c', 'd', 'e'])) + c = Series(['B', 'C', 'D', 'E'], index=Index(['b', 'c', 'd', 'e'])) + + exp = Series([np.nan, 'B', 'C', 'D'], dtype='category') + self.assert_series_equal(a.map(b), exp) + exp = Series([np.nan, 'B', 'C', 'D']) + self.assert_series_equal(a.map(c), exp) + def test_map_compat(self): # related GH 8024 s = Series([True,True,False],index=[1,2,3]) @@ -5786,7 +5981,7 @@ def test_map_decimal(self): result = self.series.map(lambda x: Decimal(str(x))) self.assertEqual(result.dtype, np.object_) - tm.assert_isinstance(result[0], Decimal) + tm.assertIsInstance(result[0], Decimal) def test_map_na_exclusion(self): s = Series([1.5, np.nan, 3, np.nan, 5]) @@ -5862,39 +6057,105 @@ def test_apply_dont_convert_dtype(self): result = s.apply(f, convert_dtype=False) self.assertEqual(result.dtype, object) + # GH 10265 def test_convert_objects(self): + # Tests: All to nans, coerce, true + # Test coercion returns correct type + s = Series(['a', 'b', 'c']) + results = s.convert_objects(datetime=True, coerce=True) + expected = Series([lib.NaT] * 3) + assert_series_equal(results, expected) + + results = s.convert_objects(numeric=True, coerce=True) + expected = Series([np.nan] * 3) + assert_series_equal(results, expected) + + expected = Series([lib.NaT] * 3, dtype=np.dtype('m8[ns]')) + results = s.convert_objects(timedelta=True, coerce=True) + assert_series_equal(results, expected) + + dt = datetime(2001, 1, 1, 0, 0) + td = dt - datetime(2000, 1, 1, 0, 0) + + # Test coercion with mixed types + s = Series(['a', '3.1415', dt, td]) + results = s.convert_objects(datetime=True, coerce=True) + expected = Series([lib.NaT, lib.NaT, dt, lib.NaT]) + assert_series_equal(results, expected) + + results = s.convert_objects(numeric=True, coerce=True) + expected = Series([nan, 3.1415, nan, nan]) + assert_series_equal(results, expected) + + results = s.convert_objects(timedelta=True, coerce=True) + expected = Series([lib.NaT, lib.NaT, lib.NaT, td], + dtype=np.dtype('m8[ns]')) + assert_series_equal(results, expected) + + # Test standard conversion returns original + results = s.convert_objects(datetime=True) + assert_series_equal(results, s) + results = s.convert_objects(numeric=True) + expected = Series([nan, 3.1415, nan, nan]) + assert_series_equal(results, expected) + results = s.convert_objects(timedelta=True) + assert_series_equal(results, s) + + # test pass-through and non-conversion when other types selected + s = Series(['1.0','2.0','3.0']) + results = s.convert_objects(datetime=True, numeric=True, timedelta=True) + expected = Series([1.0,2.0,3.0]) + assert_series_equal(results, expected) + results = s.convert_objects(True,False,True) + assert_series_equal(results, s) + + s = Series([datetime(2001, 1, 1, 0, 0),datetime(2001, 1, 1, 0, 0)], + dtype='O') + results = s.convert_objects(datetime=True, numeric=True, timedelta=True) + expected = Series([datetime(2001, 1, 1, 0, 0),datetime(2001, 1, 1, 0, 0)]) + assert_series_equal(results, expected) + results = s.convert_objects(datetime=False,numeric=True,timedelta=True) + assert_series_equal(results, s) + + td = datetime(2001, 1, 1, 0, 0) - datetime(2000, 1, 1, 0, 0) + s = Series([td, td], dtype='O') + results = s.convert_objects(datetime=True, numeric=True, timedelta=True) + expected = Series([td, td]) + assert_series_equal(results, expected) + results = s.convert_objects(True,True,False) + assert_series_equal(results, s) + s = Series([1., 2, 3], index=['a', 'b', 'c']) - result = s.convert_objects(convert_dates=False, convert_numeric=True) + result = s.convert_objects(numeric=True) assert_series_equal(result, s) # force numeric conversion r = s.copy().astype('O') r['a'] = '1' - result = r.convert_objects(convert_dates=False, convert_numeric=True) + result = r.convert_objects(numeric=True) assert_series_equal(result, s) r = s.copy().astype('O') r['a'] = '1.' - result = r.convert_objects(convert_dates=False, convert_numeric=True) + result = r.convert_objects(numeric=True) assert_series_equal(result, s) r = s.copy().astype('O') r['a'] = 'garbled' + result = r.convert_objects(numeric=True) expected = s.copy() - expected['a'] = np.nan - result = r.convert_objects(convert_dates=False, convert_numeric=True) + expected['a'] = nan assert_series_equal(result, expected) # GH 4119, not converting a mixed type (e.g.floats and object) s = Series([1, 'na', 3, 4]) - result = s.convert_objects(convert_numeric=True) - expected = Series([1, np.nan, 3, 4]) + result = s.convert_objects(datetime=True, numeric=True) + expected = Series([1, nan, 3, 4]) assert_series_equal(result, expected) s = Series([1, '', 3, 4]) - result = s.convert_objects(convert_numeric=True) - expected = Series([1, np.nan, 3, 4]) + result = s.convert_objects(datetime=True, numeric=True) assert_series_equal(result, expected) # dates @@ -5903,38 +6164,34 @@ def test_convert_objects(self): s2 = Series([datetime(2001, 1, 1, 0, 0), datetime(2001, 1, 2, 0, 0), datetime( 2001, 1, 3, 0, 0), 'foo', 1.0, 1, Timestamp('20010104'), '20010105'], dtype='O') - result = s.convert_objects(convert_dates=True, convert_numeric=False) + result = s.convert_objects(datetime=True) expected = Series( [Timestamp('20010101'), Timestamp('20010102'), Timestamp('20010103')], dtype='M8[ns]') assert_series_equal(result, expected) - result = s.convert_objects( - convert_dates='coerce', convert_numeric=False) - result = s.convert_objects( - convert_dates='coerce', convert_numeric=True) + result = s.convert_objects(datetime=True, coerce=True) assert_series_equal(result, expected) expected = Series( [Timestamp( '20010101'), Timestamp('20010102'), Timestamp('20010103'), lib.NaT, lib.NaT, lib.NaT, Timestamp('20010104'), Timestamp('20010105')], dtype='M8[ns]') - result = s2.convert_objects( - convert_dates='coerce', convert_numeric=False) + result = s2.convert_objects(datetime=True, + numeric=False, + timedelta=False, + coerce=True) assert_series_equal(result, expected) - result = s2.convert_objects( - convert_dates='coerce', convert_numeric=True) + result = s2.convert_objects(datetime=True, coerce=True) assert_series_equal(result, expected) - # preserver all-nans (if convert_dates='coerce') s = Series(['foo', 'bar', 1, 1.0], dtype='O') - result = s.convert_objects( - convert_dates='coerce', convert_numeric=False) - assert_series_equal(result, s) + result = s.convert_objects(datetime=True, coerce=True) + expected = Series([lib.NaT]*4) + assert_series_equal(result, expected) # preserver if non-object s = Series([1], dtype='float32') - result = s.convert_objects( - convert_dates='coerce', convert_numeric=False) + result = s.convert_objects(datetime=True, coerce=True) assert_series_equal(result, s) #r = s.copy() @@ -5943,23 +6200,31 @@ def test_convert_objects(self): #self.assertEqual(result.dtype, 'M8[ns]') # dateutil parses some single letters into today's value as a date + expected = Series([lib.NaT]) for x in 'abcdefghijklmnopqrstuvwxyz': s = Series([x]) - result = s.convert_objects(convert_dates='coerce') - assert_series_equal(result, s) + result = s.convert_objects(datetime=True, coerce=True) + assert_series_equal(result, expected) s = Series([x.upper()]) - result = s.convert_objects(convert_dates='coerce') - assert_series_equal(result, s) + result = s.convert_objects(datetime=True, coerce=True) + assert_series_equal(result, expected) + + def test_convert_objects_no_arg_warning(self): + s = Series(['1.0','2']) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter('always', DeprecationWarning) + s.convert_objects() + self.assertEqual(len(w), 1) def test_convert_objects_preserve_bool(self): s = Series([1, True, 3, 5], dtype=object) - r = s.convert_objects(convert_numeric=True) + r = s.convert_objects(datetime=True, numeric=True) e = Series([1, 1, 3, 5], dtype='i8') tm.assert_series_equal(r, e) def test_convert_objects_preserve_all_bool(self): s = Series([False, True, False, False], dtype=object) - r = s.convert_objects(convert_numeric=True) + r = s.convert_objects(datetime=True, numeric=True) e = Series([False, True, False, False], dtype=bool) tm.assert_series_equal(r, e) @@ -5968,7 +6233,7 @@ def test_apply_args(self): result = s.apply(str.split, args=(',',)) self.assertEqual(result[0], ['foo', 'bar']) - tm.assert_isinstance(result[0], list) + tm.assertIsInstance(result[0], list) def test_align(self): def _check_align(a, b, how='left', fill=None): @@ -6086,6 +6351,38 @@ def test_align_sameindex(self): # self.assertIsNot(a.index, self.ts.index) # self.assertIsNot(b.index, self.ts.index) + def test_align_multiindex(self): + # GH 10665 + + midx = pd.MultiIndex.from_product([range(2), range(3), range(2)], + names=('a', 'b', 'c')) + idx = pd.Index(range(2), name='b') + s1 = pd.Series(np.arange(12,dtype='int64'), index=midx) + s2 = pd.Series(np.arange(2,dtype='int64'), index=idx) + + # these must be the same results (but flipped) + res1l, res1r = s1.align(s2, join='left') + res2l, res2r = s2.align(s1, join='right') + + expl = s1 + tm.assert_series_equal(expl, res1l) + tm.assert_series_equal(expl, res2r) + expr = pd.Series([0, 0, 1, 1, np.nan, np.nan] * 2, index=midx) + tm.assert_series_equal(expr, res1r) + tm.assert_series_equal(expr, res2l) + + res1l, res1r = s1.align(s2, join='right') + res2l, res2r = s2.align(s1, join='left') + + exp_idx = pd.MultiIndex.from_product([range(2), range(2), range(2)], + names=('a', 'b', 'c')) + expl = pd.Series([0, 1, 2, 3, 6, 7, 8, 9], index=exp_idx) + tm.assert_series_equal(expl, res1l) + tm.assert_series_equal(expl, res2r) + expr = pd.Series([0, 0, 1, 1] * 2, index=exp_idx) + tm.assert_series_equal(expr, res1r) + tm.assert_series_equal(expr, res2l) + def test_reindex(self): identity = self.series.reindex(self.series.index) @@ -6200,6 +6497,13 @@ def test_reindex_nearest(self): actual = s.reindex_like(actual, method='nearest') assert_series_equal(expected, actual) + actual = s.reindex_like(actual, method='nearest', tolerance=1) + assert_series_equal(expected, actual) + + actual = s.reindex(target, method='nearest', tolerance=0.2) + expected = Series([0, 1, np.nan, 2], target) + assert_series_equal(expected, actual) + def test_reindex_backfill(self): pass @@ -6937,13 +7241,13 @@ def test_searchsorted_numeric_dtypes_scalar(self): r = s.searchsorted([30]) e = np.array([2]) - tm.assert_array_equal(r, e) + tm.assert_numpy_array_equal(r, e) def test_searchsorted_numeric_dtypes_vector(self): s = Series([1, 2, 90, 1000, 3e9]) r = s.searchsorted([91, 2e6]) e = np.array([3, 4]) - tm.assert_array_equal(r, e) + tm.assert_numpy_array_equal(r, e) def test_search_sorted_datetime64_scalar(self): s = Series(pd.date_range('20120101', periods=10, freq='2D')) @@ -6957,14 +7261,14 @@ def test_search_sorted_datetime64_list(self): v = [pd.Timestamp('20120102'), pd.Timestamp('20120104')] r = s.searchsorted(v) e = np.array([1, 2]) - tm.assert_array_equal(r, e) + tm.assert_numpy_array_equal(r, e) def test_searchsorted_sorter(self): # GH8490 s = Series([3, 1, 2]) r = s.searchsorted([0, 3], sorter=np.argsort(s)) e = np.array([0, 2]) - tm.assert_array_equal(r, e) + tm.assert_numpy_array_equal(r, e) def test_to_frame_expanddim(self): # GH 9762 @@ -7069,7 +7373,7 @@ def test_reset_index(self): rs = s.reset_index(level=[0, 2], drop=True) self.assertTrue(rs.index.equals(Index(index.get_level_values(1)))) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) def test_set_index_makes_timeseries(self): idx = tm.makeDateIndex(10) diff --git a/pandas/tests/test_strings.py b/pandas/tests/test_strings.py index a66410320e816..6a9ad175f42dd 100644 --- a/pandas/tests/test_strings.py +++ b/pandas/tests/test_strings.py @@ -11,7 +11,6 @@ from numpy import nan as NA import numpy as np -from numpy.testing import assert_array_equal from numpy.random import randint from pandas.compat import range, lrange, u, unichr @@ -49,11 +48,11 @@ def test_iter(self): for s in ds.str: # iter must yield a Series - tm.assert_isinstance(s, Series) + tm.assertIsInstance(s, Series) # indices of each yielded Series should be equal to the index of # the original Series - assert_array_equal(s.index, ds.index) + tm.assert_numpy_array_equal(s.index, ds.index) for el in s: # each element of the series is either a basestring/str or nan @@ -135,7 +134,7 @@ def test_count(self): tm.assert_almost_equal(result, exp) result = Series(values).str.count('f[o]+') - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) # mixed @@ -145,7 +144,7 @@ def test_count(self): tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.count('a') - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -156,7 +155,7 @@ def test_count(self): tm.assert_almost_equal(result, exp) result = Series(values).str.count('f[o]+') - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) def test_contains(self): @@ -195,7 +194,7 @@ def test_contains(self): tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.contains('o') - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -235,7 +234,7 @@ def test_startswith(self): tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.startswith('f') - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -263,7 +262,7 @@ def test_endswith(self): tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.endswith('f') - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -315,7 +314,7 @@ def test_lower_upper(self): mixed = mixed.str.upper() rs = Series(mixed).str.lower() xp = ['a', NA, 'b', NA, NA, 'foo', NA, NA, NA] - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -392,7 +391,7 @@ def test_replace(self): rs = Series(mixed).str.replace('BAD[_]*', '') xp = ['a', NA, 'b', NA, NA, 'foo', NA, NA, NA] - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -429,7 +428,7 @@ def test_repeat(self): rs = Series(mixed).str.repeat(3) xp = ['aaa', NA, 'bbb', NA, NA, 'foofoofoo', NA, NA, NA] - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -462,7 +461,7 @@ def test_deprecated_match(self): with tm.assert_produces_warning(): rs = Series(mixed).str.match('.*(BAD[_]+).*(BAD)') xp = [('BAD_', 'BAD'), NA, ('BAD_', 'BAD'), NA, NA, [], NA, NA, NA] - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -495,7 +494,7 @@ def test_match(self): with tm.assert_produces_warning(): rs = Series(mixed).str.match('.*(BAD[_]+).*(BAD)', as_indexer=True) xp = [True, NA, True, NA, NA, False, NA, NA, NA] - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -561,7 +560,7 @@ def test_extract(self): s_or_idx = klass(['A1', 'A2']) result = s_or_idx.str.extract(r'(?PA)\d') tm.assert_equal(result.name, 'uno') - tm.assert_array_equal(result, klass(['A', 'A'])) + tm.assert_numpy_array_equal(result, klass(['A', 'A'])) s = Series(['A1', 'B2', 'C3']) # one group, no matches @@ -747,20 +746,18 @@ def test_isnumeric(self): # 0x2605: ★ not number # 0x1378: ፸ ETHIOPIC NUMBER SEVENTY # 0xFF13: 3 Em 3 - values = ['A', '3', unichr(0x00bc), unichr(0x2605), - unichr(0x1378), unichr(0xFF13), 'four'] + values = ['A', '3', u'¼', u'★', u'፸', u'3', 'four'] s = Series(values) numeric_e = [False, True, True, False, True, True, False] decimal_e = [False, True, False, False, False, True, False] tm.assert_series_equal(s.str.isnumeric(), Series(numeric_e)) tm.assert_series_equal(s.str.isdecimal(), Series(decimal_e)) - unicodes = [u('A'), u('3'), unichr(0x00bc), unichr(0x2605), - unichr(0x1378), unichr(0xFF13), u('four')] + + unicodes = [u'A', u'3', u'¼', u'★', u'፸', u'3', u'four'] self.assertEqual(s.str.isnumeric().tolist(), [v.isnumeric() for v in unicodes]) self.assertEqual(s.str.isdecimal().tolist(), [v.isdecimal() for v in unicodes]) - values = ['A', np.nan, unichr(0x00bc), unichr(0x2605), - np.nan, unichr(0xFF13), 'four'] + values = ['A', np.nan, u'¼', u'★', np.nan, u'3', 'four'] s = Series(values) numeric_e = [False, np.nan, True, False, np.nan, True, False] decimal_e = [False, np.nan, False, False, np.nan, True, False] @@ -798,7 +795,7 @@ def test_join(self): rs = Series(mixed).str.split('_').str.join('_') xp = Series(['a_b', NA, 'asdf_cas_asdf', NA, NA, 'foo', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -821,7 +818,7 @@ def test_len(self): rs = Series(mixed).str.len() xp = Series([3, NA, 13, NA, NA, 3, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -846,7 +843,7 @@ def test_findall(self): rs = Series(mixed).str.findall('BAD[_]*') xp = Series([['BAD__', 'BAD'], NA, [], NA, NA, ['BAD'], NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -920,34 +917,34 @@ def test_index(self): s = klass(['ABCDEFG', 'BCDEFEF', 'DEFGHIJEF', 'EFGHEF']) result = s.str.index('EF') - tm.assert_array_equal(result, klass([4, 3, 1, 0])) + tm.assert_numpy_array_equal(result, klass([4, 3, 1, 0])) expected = np.array([v.index('EF') for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) result = s.str.rindex('EF') - tm.assert_array_equal(result, klass([4, 5, 7, 4])) + tm.assert_numpy_array_equal(result, klass([4, 5, 7, 4])) expected = np.array([v.rindex('EF') for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) result = s.str.index('EF', 3) - tm.assert_array_equal(result, klass([4, 3, 7, 4])) + tm.assert_numpy_array_equal(result, klass([4, 3, 7, 4])) expected = np.array([v.index('EF', 3) for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) result = s.str.rindex('EF', 3) - tm.assert_array_equal(result, klass([4, 5, 7, 4])) + tm.assert_numpy_array_equal(result, klass([4, 5, 7, 4])) expected = np.array([v.rindex('EF', 3) for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) result = s.str.index('E', 4, 8) - tm.assert_array_equal(result, klass([4, 5, 7, 4])) + tm.assert_numpy_array_equal(result, klass([4, 5, 7, 4])) expected = np.array([v.index('E', 4, 8) for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) result = s.str.rindex('E', 0, 5) - tm.assert_array_equal(result, klass([4, 3, 1, 4])) + tm.assert_numpy_array_equal(result, klass([4, 3, 1, 4])) expected = np.array([v.rindex('E', 0, 5) for v in s.values]) - tm.assert_array_equal(result.values, expected) + tm.assert_numpy_array_equal(result.values, expected) with tm.assertRaisesRegexp(ValueError, "substring not found"): result = s.str.index('DE') @@ -958,9 +955,9 @@ def test_index(self): # test with nan s = Series(['abcb', 'ab', 'bcbe', np.nan]) result = s.str.index('b') - tm.assert_array_equal(result, Series([1, 1, 0, np.nan])) + tm.assert_numpy_array_equal(result, Series([1, 1, 0, np.nan])) result = s.str.rindex('b') - tm.assert_array_equal(result, Series([3, 1, 2, np.nan])) + tm.assert_numpy_array_equal(result, Series([3, 1, 2, np.nan])) def test_pad(self): values = Series(['a', 'b', NA, 'c', NA, 'eeeeee']) @@ -984,7 +981,7 @@ def test_pad(self): rs = Series(mixed).str.pad(5, side='left') xp = Series([' a', NA, ' b', NA, NA, ' ee', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) mixed = Series(['a', NA, 'b', True, datetime.today(), @@ -993,7 +990,7 @@ def test_pad(self): rs = Series(mixed).str.pad(5, side='right') xp = Series(['a ', NA, 'b ', NA, NA, 'ee ', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) mixed = Series(['a', NA, 'b', True, datetime.today(), @@ -1002,7 +999,7 @@ def test_pad(self): rs = Series(mixed).str.pad(5, side='both') xp = Series([' a ', NA, ' b ', NA, NA, ' ee ', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -1056,17 +1053,17 @@ def test_translate(self): table = str.maketrans('abc', 'cde') result = s.str.translate(table) expected = klass(['cdedefg', 'cdee', 'edddfg', 'edefggg']) - tm.assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) # use of deletechars is python 2 only if not compat.PY3: result = s.str.translate(table, deletechars='fg') expected = klass(['cdede', 'cdee', 'eddd', 'ede']) - tm.assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) result = s.str.translate(None, deletechars='fg') expected = klass(['abcde', 'abcc', 'cddd', 'cde']) - tm.assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) else: with tm.assertRaisesRegexp(ValueError, "deletechars is not a valid argument"): result = s.str.translate(table, deletechars='fg') @@ -1075,7 +1072,7 @@ def test_translate(self): s = Series(['a', 'b', 'c', 1.2]) expected = Series(['c', 'd', 'e', np.nan]) result = s.str.translate(table) - tm.assert_array_equal(result, expected) + tm.assert_numpy_array_equal(result, expected) def test_center_ljust_rjust(self): values = Series(['a', 'b', NA, 'c', NA, 'eeeeee']) @@ -1099,19 +1096,19 @@ def test_center_ljust_rjust(self): rs = Series(mixed).str.center(5) xp = Series([' a ', NA, ' b ', NA, NA, ' c ', ' eee ', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.ljust(5) xp = Series(['a ', NA, 'b ', NA, NA, 'c ', 'eee ', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.rjust(5) xp = Series([' a', NA, ' b', NA, NA, ' c', ' eee', NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -1216,11 +1213,11 @@ def test_split(self): result = mixed.str.split('_') exp = Series([['a', 'b', 'c'], NA, ['d', 'e', 'f'], NA, NA, NA, NA, NA]) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) result = mixed.str.split('_', expand=False) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) # unicode @@ -1263,11 +1260,11 @@ def test_rsplit(self): result = mixed.str.rsplit('_') exp = Series([['a', 'b', 'c'], NA, ['d', 'e', 'f'], NA, NA, NA, NA, NA]) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) result = mixed.str.rsplit('_', expand=False) - tm.assert_isinstance(result, Series) + tm.assertIsInstance(result, Series) tm.assert_almost_equal(result, exp) # unicode @@ -1614,7 +1611,7 @@ def test_slice(self): xp = Series(['foo', NA, 'bar', NA, NA, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.slice(2, 5, -1) @@ -1692,21 +1689,21 @@ def test_strip_lstrip_rstrip_mixed(self): xp = Series(['aa', NA, 'bb', NA, NA, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.lstrip() xp = Series(['aa ', NA, 'bb \t\n', NA, NA, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) rs = Series(mixed).str.rstrip() xp = Series([' aa', NA, ' bb', NA, NA, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) def test_strip_lstrip_rstrip_unicode(self): @@ -1799,7 +1796,7 @@ def test_get(self): xp = Series(['b', NA, 'd', NA, NA, NA, NA, NA]) - tm.assert_isinstance(rs, Series) + tm.assertIsInstance(rs, Series) tm.assert_almost_equal(rs, xp) # unicode @@ -1950,33 +1947,16 @@ def test_encode_decode_errors(self): tm.assert_series_equal(result, exp) def test_normalize(self): - def unistr(codes): - # build unicode string from unichr - # we cannot use six.u() here because it escapes unicode - return ''.join([unichr(c) for c in codes]) - - values = ['ABC', # ASCII - unistr([0xFF21, 0xFF22, 0xFF23]), # ABC - unistr([0xFF11, 0xFF12, 0xFF13]), # 123 - np.nan, - unistr([0xFF71, 0xFF72, 0xFF74])] # アイエ + values = ['ABC', u'ABC', u'123', np.nan, u'アイエ'] s = Series(values, index=['a', 'b', 'c', 'd', 'e']) - normed = [compat.u_safe('ABC'), - compat.u_safe('ABC'), - compat.u_safe('123'), - np.nan, - unistr([0x30A2, 0x30A4, 0x30A8])] # アイエ + normed = [u'ABC', u'ABC', u'123', np.nan, u'アイエ'] expected = Series(normed, index=['a', 'b', 'c', 'd', 'e']) result = s.str.normalize('NFKC') tm.assert_series_equal(result, expected) - expected = Series([compat.u_safe('ABC'), - unistr([0xFF21, 0xFF22, 0xFF23]), # ABC - unistr([0xFF11, 0xFF12, 0xFF13]), # 123 - np.nan, - unistr([0xFF71, 0xFF72, 0xFF74])], # アイエ + expected = Series([u'ABC', u'ABC', u'123', np.nan, u'アイエ'], index=['a', 'b', 'c', 'd', 'e']) result = s.str.normalize('NFC') @@ -1985,12 +1965,8 @@ def unistr(codes): with tm.assertRaisesRegexp(ValueError, "invalid normalization form"): s.str.normalize('xxx') - s = Index([unistr([0xFF21, 0xFF22, 0xFF23]), # ABC - unistr([0xFF11, 0xFF12, 0xFF13]), # 123 - unistr([0xFF71, 0xFF72, 0xFF74])]) # アイエ - expected = Index([compat.u_safe('ABC'), - compat.u_safe('123'), - unistr([0x30A2, 0x30A4, 0x30A8])]) + s = Index([u'ABC', u'123', u'アイエ']) + expected = Index([u'ABC', u'123', u'アイエ']) result = s.str.normalize('NFKC') tm.assert_index_equal(result, expected) diff --git a/pandas/tests/test_testing.py b/pandas/tests/test_testing.py index cc0a0ea5662db..466ad3f220020 100644 --- a/pandas/tests/test_testing.py +++ b/pandas/tests/test_testing.py @@ -7,15 +7,17 @@ import numpy as np import sys from pandas import Series, DataFrame +import pandas.util.testing as tm from pandas.util.testing import ( - assert_almost_equal, assertRaisesRegexp, raise_with_traceback, - assert_series_equal, assert_frame_equal, - RNGContext + assert_almost_equal, assertRaisesRegexp, raise_with_traceback, + assert_index_equal, assert_series_equal, assert_frame_equal, + assert_numpy_array_equal, assert_isinstance, RNGContext ) +from pandas.compat import is_platform_windows # let's get meta. -class TestAssertAlmostEqual(unittest.TestCase): +class TestAssertAlmostEqual(tm.TestCase): _multiprocess_can_split_ = True def _assert_almost_equal_both(self, a, b, **kwargs): @@ -112,7 +114,8 @@ def test_assert_almost_equal_inf(self): self._assert_not_almost_equal_both(np.inf, 0) -class TestUtilTesting(unittest.TestCase): + +class TestUtilTesting(tm.TestCase): _multiprocess_can_split_ = True def test_raise_with_traceback(self): @@ -130,7 +133,280 @@ def test_raise_with_traceback(self): _, _, traceback = sys.exc_info() raise_with_traceback(e, traceback) -class TestAssertSeriesEqual(unittest.TestCase): + +class TestAssertNumpyArrayEqual(tm.TestCase): + + def test_numpy_array_equal_message(self): + + if is_platform_windows(): + raise nose.SkipTest("windows has incomparable line-endings and uses L on the shape") + + expected = """numpy array are different + +numpy array shapes are different +\\[left\\]: \\(2,\\) +\\[right\\]: \\(3,\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([1, 2]), np.array([3, 4, 5])) + + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([1, 2]), np.array([3, 4, 5])) + + # scalar comparison + expected = """: 1 != 2""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(1, 2) + expected = """expected 2\\.00000 but got 1\\.00000, with decimal 5""" + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(1, 2) + + # array / scalar array comparison + expected = """(numpy array|Iterable) are different + +First object is iterable, second isn't +\\[left\\]: \\[1\\] +\\[right\\]: 1""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([1]), 1) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([1]), 1) + + # scalar / array comparison + expected = """(numpy array|Iterable) are different + +Second object is iterable, first isn't +\\[left\\]: 1 +\\[right\\]: \\[1\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(1, np.array([1])) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(1, np.array([1])) + + expected = """numpy array are different + +numpy array values are different \\(66\\.66667 %\\) +\\[left\\]: \\[nan, 2\\.0, 3\\.0\\] +\\[right\\]: \\[1\\.0, nan, 3\\.0\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([np.nan, 2, 3]), np.array([1, np.nan, 3])) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([np.nan, 2, 3]), np.array([1, np.nan, 3])) + + expected = """numpy array are different + +numpy array values are different \\(50\\.0 %\\) +\\[left\\]: \\[1, 2\\] +\\[right\\]: \\[1, 3\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([1, 2]), np.array([1, 3])) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([1, 2]), np.array([1, 3])) + + + expected = """numpy array are different + +numpy array values are different \\(50\\.0 %\\) +\\[left\\]: \\[1\\.1, 2\\.000001\\] +\\[right\\]: \\[1\\.1, 2.0\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([1.1, 2.000001]), np.array([1.1, 2.0])) + + # must pass + assert_almost_equal(np.array([1.1, 2.000001]), np.array([1.1, 2.0])) + + expected = """numpy array are different + +numpy array values are different \\(16\\.66667 %\\) +\\[left\\]: \\[\\[1, 2\\], \\[3, 4\\], \\[5, 6\\]\\] +\\[right\\]: \\[\\[1, 3\\], \\[3, 4\\], \\[5, 6\\]\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([[1, 2], [3, 4], [5, 6]]), + np.array([[1, 3], [3, 4], [5, 6]])) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([[1, 2], [3, 4], [5, 6]]), + np.array([[1, 3], [3, 4], [5, 6]])) + + expected = """numpy array are different + +numpy array values are different \\(25\\.0 %\\) +\\[left\\]: \\[\\[1, 2\\], \\[3, 4\\]\\] +\\[right\\]: \\[\\[1, 3\\], \\[3, 4\\]\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([[1, 2], [3, 4]]), + np.array([[1, 3], [3, 4]])) + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([[1, 2], [3, 4]]), + np.array([[1, 3], [3, 4]])) + + # allow to overwrite message + expected = """Index are different + +Index shapes are different +\\[left\\]: \\(2,\\) +\\[right\\]: \\(3,\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_numpy_array_equal(np.array([1, 2]), np.array([3, 4, 5]), + obj='Index') + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal(np.array([1, 2]), np.array([3, 4, 5]), + obj='Index') + + def test_assert_almost_equal_iterable_message(self): + + expected = """Iterable are different + +Iterable length are different +\\[left\\]: 2 +\\[right\\]: 3""" + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal([1, 2], [3, 4, 5]) + + expected = """Iterable are different + +Iterable values are different \\(50\\.0 %\\) +\\[left\\]: \\[1, 2\\] +\\[right\\]: \\[1, 3\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_almost_equal([1, 2], [1, 3]) + + +class TestAssertIndexEqual(unittest.TestCase): + _multiprocess_can_split_ = True + + def test_index_equal_message(self): + + expected = """Index are different + +Index levels are different +\\[left\\]: 1, Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\) +\\[right\\]: 2, MultiIndex\\(levels=\\[\\[u?'A', u?'B'\\], \\[1, 2, 3, 4\\]\\], + labels=\\[\\[0, 0, 1, 1\\], \\[0, 1, 2, 3\\]\\]\\)""" + idx1 = pd.Index([1, 2, 3]) + idx2 = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 3), ('B', 4)]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, exact=False) + + + expected = """MultiIndex level \\[1\\] are different + +MultiIndex level \\[1\\] values are different \\(25\\.0 %\\) +\\[left\\]: Int64Index\\(\\[2, 2, 3, 4\\], dtype='int64'\\) +\\[right\\]: Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)""" + idx1 = pd.MultiIndex.from_tuples([('A', 2), ('A', 2), ('B', 3), ('B', 4)]) + idx2 = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 3), ('B', 4)]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, check_exact=False) + + expected = """Index are different + +Index length are different +\\[left\\]: 3, Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\) +\\[right\\]: 4, Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)""" + idx1 = pd.Index([1, 2, 3]) + idx2 = pd.Index([1, 2, 3, 4]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, check_exact=False) + + expected = """Index are different + +Index classes are different +\\[left\\]: Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\) +\\[right\\]: Float64Index\\(\\[1\\.0, 2\\.0, 3\\.0\\], dtype='float64'\\)""" + idx1 = pd.Index([1, 2, 3]) + idx2 = pd.Index([1, 2, 3.0]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, exact=True) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, exact=True, check_exact=False) + + expected = """Index are different + +Index values are different \\(33\\.33333 %\\) +\\[left\\]: Float64Index\\(\\[1.0, 2.0, 3.0], dtype='float64'\\) +\\[right\\]: Float64Index\\(\\[1.0, 2.0, 3.0000000001\\], dtype='float64'\\)""" + idx1 = pd.Index([1, 2, 3.]) + idx2 = pd.Index([1, 2, 3.0000000001]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + + # must success + assert_index_equal(idx1, idx2, check_exact=False) + + expected = """Index are different + +Index values are different \\(33\\.33333 %\\) +\\[left\\]: Float64Index\\(\\[1.0, 2.0, 3.0], dtype='float64'\\) +\\[right\\]: Float64Index\\(\\[1.0, 2.0, 3.0001\\], dtype='float64'\\)""" + idx1 = pd.Index([1, 2, 3.]) + idx2 = pd.Index([1, 2, 3.0001]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, check_exact=False) + # must success + assert_index_equal(idx1, idx2, check_exact=False, check_less_precise=True) + + expected = """Index are different + +Index values are different \\(33\\.33333 %\\) +\\[left\\]: Int64Index\\(\\[1, 2, 3\\], dtype='int64'\\) +\\[right\\]: Int64Index\\(\\[1, 2, 4\\], dtype='int64'\\)""" + idx1 = pd.Index([1, 2, 3]) + idx2 = pd.Index([1, 2, 4]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, check_less_precise=True) + + expected = """MultiIndex level \\[1\\] are different + +MultiIndex level \\[1\\] values are different \\(25\\.0 %\\) +\\[left\\]: Int64Index\\(\\[2, 2, 3, 4\\], dtype='int64'\\) +\\[right\\]: Int64Index\\(\\[1, 2, 3, 4\\], dtype='int64'\\)""" + idx1 = pd.MultiIndex.from_tuples([('A', 2), ('A', 2), ('B', 3), ('B', 4)]) + idx2 = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 3), ('B', 4)]) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2, check_exact=False) + + def test_index_equal_metadata_message(self): + + expected = """Index are different + +Attribute "names" are different +\\[left\\]: \\[None\\] +\\[right\\]: \\[u?'x'\\]""" + idx1 = pd.Index([1, 2, 3]) + idx2 = pd.Index([1, 2, 3], name='x') + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + + # same name, should pass + assert_index_equal(pd.Index([1, 2, 3], name=np.nan), + pd.Index([1, 2, 3], name=np.nan)) + assert_index_equal(pd.Index([1, 2, 3], name=pd.NaT), + pd.Index([1, 2, 3], name=pd.NaT)) + + + expected = """Index are different + +Attribute "names" are different +\\[left\\]: \\[nan\\] +\\[right\\]: \\[NaT\\]""" + idx1 = pd.Index([1, 2, 3], name=np.nan) + idx2 = pd.Index([1, 2, 3], name=pd.NaT) + with assertRaisesRegexp(AssertionError, expected): + assert_index_equal(idx1, idx2) + + +class TestAssertSeriesEqual(tm.TestCase): _multiprocess_can_split_ = True def _assert_equal(self, x, y, **kwargs): @@ -189,8 +465,30 @@ def test_multiindex_dtype(self): {'a':[1.0,2.0],'b':[2.1,1.5],'c':['l1','l2']}, index=['a','b']) self._assert_not_equal(df1.c, df2.c, check_index_type=True) + def test_series_equal_message(self): + + expected = """Series are different + +Series length are different +\\[left\\]: 3, Int64Index\\(\\[0, 1, 2\\], dtype='int64'\\) +\\[right\\]: 4, Int64Index\\(\\[0, 1, 2, 3\\], dtype='int64'\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_series_equal(pd.Series([1, 2, 3]), pd.Series([1, 2, 3, 4])) -class TestAssertFrameEqual(unittest.TestCase): + + expected = """Series are different + +Series values are different \\(33\\.33333 %\\) +\\[left\\]: \\[1, 2, 3\\] +\\[right\\]: \\[1, 2, 4\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_series_equal(pd.Series([1, 2, 3]), pd.Series([1, 2, 4])) + with assertRaisesRegexp(AssertionError, expected): + assert_series_equal(pd.Series([1, 2, 3]), pd.Series([1, 2, 4]), + check_less_precise=True) + + +class TestAssertFrameEqual(tm.TestCase): _multiprocess_can_split_ = True def _assert_equal(self, x, y, **kwargs): @@ -221,7 +519,66 @@ def test_empty_dtypes(self): df2=pd.DataFrame(columns=["col1","col2"]) self._assert_equal(df1, df2, check_dtype=False) self._assert_not_equal(df1, df2, check_dtype=True) - + + def test_frame_equal_message(self): + + expected = """DataFrame are different + +DataFrame shape \\(number of rows\\) are different +\\[left\\]: 3, Int64Index\\(\\[0, 1, 2\\], dtype='int64'\\) +\\[right\\]: 4, Int64Index\\(\\[0, 1, 2, 3\\], dtype='int64'\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3]}), + pd.DataFrame({'A':[1, 2, 3, 4]})) + + + expected = """DataFrame are different + +DataFrame shape \\(number of columns\\) are different +\\[left\\]: 2, Index\\(\\[u?'A', u?'B'\\], dtype='object'\\) +\\[right\\]: 1, Index\\(\\[u?'A'\\], dtype='object'\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}), + pd.DataFrame({'A':[1, 2, 3]})) + + + expected = """DataFrame\\.index are different + +DataFrame\\.index values are different \\(33\\.33333 %\\) +\\[left\\]: Index\\(\\[u?'a', u?'b', u?'c'\\], dtype='object'\\) +\\[right\\]: Index\\(\\[u?'a', u?'b', u?'d'\\], dtype='object'\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}, + index=['a', 'b', 'c']), + pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}, + index=['a', 'b', 'd'])) + + expected = """DataFrame\\.columns are different + +DataFrame\\.columns values are different \\(50\\.0 %\\) +\\[left\\]: Index\\(\\[u?'A', u?'B'\\], dtype='object'\\) +\\[right\\]: Index\\(\\[u?'A', u?'b'\\], dtype='object'\\)""" + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}, + index=['a', 'b', 'c']), + pd.DataFrame({'A':[1, 2, 3], 'b':[4, 5, 6]}, + index=['a', 'b', 'c'])) + + + expected = """DataFrame\\.iloc\\[:, 1\\] are different + +DataFrame\\.iloc\\[:, 1\\] values are different \\(33\\.33333 %\\) +\\[left\\]: \\[4, 5, 6\\] +\\[right\\]: \\[4, 5, 7\\]""" + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}), + pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 7]})) + + with assertRaisesRegexp(AssertionError, expected): + assert_frame_equal(pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 6]}), + pd.DataFrame({'A':[1, 2, 3], 'B':[4, 5, 7]}), + by_blocks=True) + class TestRNGContext(unittest.TestCase): @@ -233,3 +590,43 @@ def test_RNGContext(self): with RNGContext(1): self.assertEqual(np.random.randn(), expected1) self.assertEqual(np.random.randn(), expected0) + + + +class TestDeprecatedTests(tm.TestCase): + + def test_warning(self): + + with tm.assert_produces_warning(FutureWarning): + self.assertEquals(1, 1) + + with tm.assert_produces_warning(FutureWarning): + self.assertNotEquals(1, 2) + + with tm.assert_produces_warning(FutureWarning): + self.assert_(True) + + with tm.assert_produces_warning(FutureWarning): + self.assertAlmostEquals(1.0, 1.0000000001) + + with tm.assert_produces_warning(FutureWarning): + self.assertNotAlmostEquals(1, 2) + + with tm.assert_produces_warning(FutureWarning): + tm.assert_isinstance(Series([1, 2]), Series, msg='xxx') + + +class TestLocale(tm.TestCase): + + def test_locale(self): + if sys.platform == 'win32': + raise nose.SkipTest("skipping on win platforms as locale not available") + + #GH9744 + locales = tm.get_locales() + self.assertTrue(len(locales) >= 1) + + +if __name__ == '__main__': + nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], + exit=False) diff --git a/pandas/tests/test_tseries.py b/pandas/tests/test_tseries.py index 035b3ac07342d..6dd43539eeabf 100644 --- a/pandas/tests/test_tseries.py +++ b/pandas/tests/test_tseries.py @@ -9,7 +9,8 @@ import pandas.lib as lib import pandas._period as period import pandas.algos as algos -from pandas.tseries.holiday import Holiday, SA, next_monday +from pandas.tseries.holiday import Holiday, SA, next_monday,USMartinLutherKingJr,USMemorialDay,AbstractHolidayCalendar +import datetime from pandas import DateOffset @@ -275,10 +276,18 @@ def test_duplicated_with_nas(): expected = [False, False, False, True, False, True] assert(np.array_equal(result, expected)) - result = lib.duplicated(keys, take_last=True) + result = lib.duplicated(keys, keep='first') + expected = [False, False, False, True, False, True] + assert(np.array_equal(result, expected)) + + result = lib.duplicated(keys, keep='last') expected = [True, False, True, False, False, False] assert(np.array_equal(result, expected)) + result = lib.duplicated(keys, keep=False) + expected = [True, False, True, True, False, True] + assert(np.array_equal(result, expected)) + keys = np.empty(8, dtype=object) for i, t in enumerate(zip([0, 0, nan, nan] * 2, [0, nan, 0, nan] * 2)): keys[i] = t @@ -289,10 +298,14 @@ def test_duplicated_with_nas(): expected = falses + trues assert(np.array_equal(result, expected)) - result = lib.duplicated(keys, take_last=True) + result = lib.duplicated(keys, keep='last') expected = trues + falses assert(np.array_equal(result, expected)) + result = lib.duplicated(keys, keep=False) + expected = trues + trues + assert(np.array_equal(result, expected)) + def test_maybe_booleans_to_slice(): arr = np.array([0, 0, 1, 1, 1, 0, 1], dtype=np.uint8) @@ -363,9 +376,9 @@ def test_get_reverse_indexer(): def test_pad_backfill_object_segfault(): - from datetime import datetime + old = np.array([], dtype='O') - new = np.array([datetime(2010, 12, 31)], dtype='O') + new = np.array([datetime.datetime(2010, 12, 31)], dtype='O') result = algos.pad_object(old, new) expected = np.array([-1], dtype=np.int64) @@ -629,13 +642,13 @@ def test_unicode(self): pass def test_datetime(self): - import datetime + dates = [datetime.datetime(2012, 1, x) for x in range(1, 20)] index = Index(dates) self.assertEqual(index.inferred_type, 'datetime64') def test_date(self): - import datetime + dates = [datetime.date(2012, 1, x) for x in range(1, 20)] index = Index(dates) self.assertEqual(index.inferred_type, 'date') @@ -739,6 +752,29 @@ def test_get_period_field_raises_on_out_of_range(self): def test_get_period_field_array_raises_on_out_of_range(self): self.assertRaises(ValueError, period.get_period_field_arr, -1, np.empty(1), 0) +class TestFederalHolidayCalendar(tm.TestCase): + + # Test for issue 10278 + def test_no_mlk_before_1984(self): + class MLKCalendar(AbstractHolidayCalendar): + rules=[USMartinLutherKingJr] + holidays = MLKCalendar().holidays(start='1984', end='1988').to_pydatetime().tolist() + # Testing to make sure holiday is not incorrectly observed before 1986 + self.assertEqual(holidays, [datetime.datetime(1986, 1, 20, 0, 0), datetime.datetime(1987, 1, 19, 0, 0)]) + + def test_memorial_day(self): + class MemorialDay(AbstractHolidayCalendar): + rules=[USMemorialDay] + holidays = MemorialDay().holidays(start='1971', end='1980').to_pydatetime().tolist() + # Fixes 5/31 error and checked manually against wikipedia + self.assertEqual(holidays, [datetime.datetime(1971, 5, 31, 0, 0), datetime.datetime(1972, 5, 29, 0, 0), + datetime.datetime(1973, 5, 28, 0, 0), datetime.datetime(1974, 5, 27, 0, 0), + datetime.datetime(1975, 5, 26, 0, 0), datetime.datetime(1976, 5, 31, 0, 0), + datetime.datetime(1977, 5, 30, 0, 0), datetime.datetime(1978, 5, 29, 0, 0), + datetime.datetime(1979, 5, 28, 0, 0)]) + + + class TestHolidayConflictingArguments(tm.TestCase): diff --git a/pandas/tests/test_util.py b/pandas/tests/test_util.py index 38f058358b37f..fb334cf9912f3 100644 --- a/pandas/tests/test_util.py +++ b/pandas/tests/test_util.py @@ -61,33 +61,6 @@ def f4(new=None): pass -class TestTesting(tm.TestCase): - - def test_warning(self): - - with tm.assert_produces_warning(FutureWarning): - self.assertEquals(1, 1) - - with tm.assert_produces_warning(FutureWarning): - self.assertNotEquals(1, 2) - - with tm.assert_produces_warning(FutureWarning): - self.assert_(True) - - with tm.assert_produces_warning(FutureWarning): - self.assertAlmostEquals(1.0, 1.0000000001) - - with tm.assert_produces_warning(FutureWarning): - self.assertNotAlmostEquals(1, 2) - - def test_locale(self): - if sys.platform == 'win32': - raise nose.SkipTest("skipping on win platforms as locale not available") - - #GH9744 - locales = pandas.util.testing.get_locales() - self.assertTrue(len(locales) >= 1) - def test_rands(): r = tm.rands(10) assert(len(r) == 10) diff --git a/pandas/tools/merge.py b/pandas/tools/merge.py index c7c578232cd0f..a8b0d37b55bfe 100644 --- a/pandas/tools/merge.py +++ b/pandas/tools/merge.py @@ -1,7 +1,6 @@ """ SQL-style merge routines """ -import types import numpy as np from pandas.compat import range, long, lrange, lzip, zip, map, filter @@ -17,11 +16,9 @@ concatenate_block_managers) from pandas.util.decorators import Appender, Substitution from pandas.core.common import ABCSeries -from pandas.io.parsers import TextFileReader import pandas.core.common as com -import pandas.lib as lib import pandas.algos as algos import pandas.hashtable as _hash @@ -220,6 +217,9 @@ def _maybe_add_join_keys(self, result, left_indexer, right_indexer): if left_indexer is not None and right_indexer is not None: if name in self.left: + if len(self.left) == 0: + continue + na_indexer = (left_indexer == -1).nonzero()[0] if len(na_indexer) == 0: continue @@ -229,6 +229,9 @@ def _maybe_add_join_keys(self, result, left_indexer, right_indexer): na_indexer, com.take_1d(self.right_join_keys[i], right_na_indexer)) elif name in self.right: + if len(self.right) == 0: + continue + na_indexer = (right_indexer == -1).nonzero()[0] if len(na_indexer) == 0: continue @@ -273,9 +276,17 @@ def _get_join_info(self): sort=self.sort, how=self.how) if self.right_index: - join_index = self.left.index.take(left_indexer) + if len(self.left) > 0: + join_index = self.left.index.take(left_indexer) + else: + join_index = self.right.index.take(right_indexer) + left_indexer = np.array([-1] * len(join_index)) elif self.left_index: - join_index = self.right.index.take(right_indexer) + if len(self.right) > 0: + join_index = self.right.index.take(right_indexer) + else: + join_index = self.left.index.take(left_indexer) + right_indexer = np.array([-1] * len(join_index)) else: join_index = Index(np.arange(len(left_indexer))) @@ -402,19 +413,14 @@ def _validate_specification(self): if self.left_on is None: raise MergeError('Must pass left_on or left_index=True') else: - if not self.left.columns.is_unique: - raise MergeError("Left data columns not unique: %s" - % repr(self.left.columns)) - - if not self.right.columns.is_unique: - raise MergeError("Right data columns not unique: %s" - % repr(self.right.columns)) - # use the common columns common_cols = self.left.columns.intersection( self.right.columns) if len(common_cols) == 0: raise MergeError('No common columns to perform merge on') + if not common_cols.is_unique: + raise MergeError("Data columns not unique: %s" + % repr(common_cols)) self.left_on = self.right_on = common_cols elif self.on is not None: if self.left_on is not None or self.right_on is not None: @@ -780,9 +786,14 @@ def __init__(self, objs, axis=0, join='outer', join_axes=None, if keys is None: keys = sorted(objs) objs = [objs[k] for k in keys] + else: + objs = list(objs) + + if len(objs) == 0: + raise ValueError('No objects to concatenate') if keys is None: - objs = [obj for obj in objs if obj is not None ] + objs = [obj for obj in objs if obj is not None] else: # #1649 clean_keys = [] diff --git a/pandas/tools/plotting.py b/pandas/tools/plotting.py index 35893b9de8e75..c16e2686c5a3a 100644 --- a/pandas/tools/plotting.py +++ b/pandas/tools/plotting.py @@ -134,6 +134,32 @@ def random_color(column): else: raise ValueError("color_type must be either 'default' or 'random'") + if isinstance(colors, compat.string_types): + import matplotlib.colors + conv = matplotlib.colors.ColorConverter() + def _maybe_valid_colors(colors): + try: + [conv.to_rgba(c) for c in colors] + return True + except ValueError: + return False + + # check whether the string can be convertable to single color + maybe_single_color = _maybe_valid_colors([colors]) + # check whether each character can be convertable to colors + maybe_color_cycle = _maybe_valid_colors(list(colors)) + if maybe_single_color and maybe_color_cycle and len(colors) > 1: + msg = ("'{0}' can be parsed as both single color and " + "color cycle. Specify each color using a list " + "like ['{0}'] or {1}") + raise ValueError(msg.format(colors, list(colors))) + elif maybe_single_color: + colors = [colors] + else: + # ``colors`` is regarded as color cycle. + # mpl will raise error any of them is invalid + pass + if len(colors) != num_colors: multiple = num_colors//len(colors) - 1 mod = num_colors % len(colors) @@ -748,6 +774,7 @@ class MPLPlot(object): data : """ + _kind = 'base' _layout_type = 'vertical' _default_rot = 0 orientation = None @@ -804,10 +831,7 @@ def __init__(self, data, kind=None, by=None, subplots=False, sharex=None, self._rot_set = True else: self._rot_set = False - if isinstance(self._default_rot, dict): - self.rot = self._default_rot[self.kind] - else: - self.rot = self._default_rot + self.rot = self._default_rot if grid is None: grid = False if secondary_y else self.plt.rcParams['axes.grid'] @@ -1004,7 +1028,7 @@ def _compute_plot_data(self): label = 'None' data = data.to_frame(name=label) - numeric_data = data.convert_objects()._get_numeric_data() + numeric_data = data.convert_objects(datetime=True)._get_numeric_data() try: is_empty = numeric_data.empty @@ -1191,34 +1215,25 @@ def _get_xticks(self, convert_period=False): return x - def _is_datetype(self): - index = self.data.index - return (isinstance(index, (PeriodIndex, DatetimeIndex)) or - index.inferred_type in ('datetime', 'date', 'datetime64', - 'time')) + @classmethod + def _plot(cls, ax, x, y, style=None, is_errorbar=False, **kwds): + mask = com.isnull(y) + if mask.any(): + y = np.ma.array(y) + y = np.ma.masked_where(mask, y) - def _get_plot_function(self): - ''' - Returns the matplotlib plotting function (plot or errorbar) based on - the presence of errorbar keywords. - ''' - errorbar = any(e is not None for e in self.errors.values()) - def plotf(ax, x, y, style=None, **kwds): - mask = com.isnull(y) - if mask.any(): - y = np.ma.array(y) - y = np.ma.masked_where(mask, y) - - if errorbar: - return self.plt.Axes.errorbar(ax, x, y, **kwds) + if isinstance(x, Index): + x = x._mpl_repr() + + if is_errorbar: + return ax.errorbar(x, y, **kwds) + else: + # prevent style kwarg from going to errorbar, where it is unsupported + if style is not None: + args = (x, y, style) else: - # prevent style kwarg from going to errorbar, where it is unsupported - if style is not None: - args = (ax, x, y, style) - else: - args = (ax, x, y) - return self.plt.Axes.plot(*args, **kwds) - return plotf + args = (x, y) + return ax.plot(*args, **kwds) def _get_index_name(self): if isinstance(self.data.index, MultiIndex): @@ -1262,23 +1277,28 @@ def on_right(self, i): if isinstance(self.secondary_y, (tuple, list, np.ndarray, Index)): return self.data.columns[i] in self.secondary_y - def _get_style(self, i, col_name): - style = '' - if self.subplots: - style = 'k' - + def _apply_style_colors(self, colors, kwds, col_num, label): + """ + Manage style and color based on column number and its label. + Returns tuple of appropriate style and kwds which "color" may be added. + """ + style = None if self.style is not None: if isinstance(self.style, list): try: - style = self.style[i] + style = self.style[col_num] except IndexError: pass elif isinstance(self.style, dict): - style = self.style.get(col_name, style) + style = self.style.get(label, style) else: style = self.style - return style or None + has_color = 'color' in kwds or self.colormap is not None + nocolor_style = style is None or re.match('[a-z]+', style) is None + if (has_color or self.subplots) and nocolor_style: + kwds['color'] = colors[col_num % len(colors)] + return style, kwds def _get_colors(self, num_colors=None, color_kwds='color'): if num_colors is None: @@ -1288,11 +1308,6 @@ def _get_colors(self, num_colors=None, color_kwds='color'): colormap=self.colormap, color=self.kwds.get(color_kwds)) - def _maybe_add_color(self, colors, kwds, style, i): - has_color = 'color' in kwds or self.colormap is not None - if has_color and (style is None or re.match('[a-z]+', style) is None): - kwds['color'] = colors[i % len(colors)] - def _parse_errorbars(self, label, err): ''' Look for error keyword arguments and return the actual errorbar data @@ -1405,6 +1420,7 @@ def _get_axes_layout(self): return (len(y_set), len(x_set)) class ScatterPlot(MPLPlot): + _kind = 'scatter' _layout_type = 'single' def __init__(self, data, x, y, c=None, **kwargs): @@ -1483,6 +1499,7 @@ def _post_plot_logic(self): class HexBinPlot(MPLPlot): + _kind = 'hexbin' _layout_type = 'single' def __init__(self, data, x, y, C=None, **kwargs): @@ -1538,7 +1555,7 @@ def _post_plot_logic(self): class LinePlot(MPLPlot): - + _kind = 'line' _default_rot = 0 orientation = 'vertical' @@ -1550,71 +1567,35 @@ def __init__(self, data, **kwargs): if 'x_compat' in self.kwds: self.x_compat = bool(self.kwds.pop('x_compat')) - def _index_freq(self): - freq = getattr(self.data.index, 'freq', None) - if freq is None: - freq = getattr(self.data.index, 'inferred_freq', None) - if freq == 'B': - weekdays = np.unique(self.data.index.dayofweek) - if (5 in weekdays) or (6 in weekdays): - freq = None - return freq - - def _is_dynamic_freq(self, freq): - if isinstance(freq, DateOffset): - freq = freq.rule_code - else: - freq = frequencies.get_base_alias(freq) - freq = frequencies.get_period_alias(freq) - return freq is not None and self._no_base(freq) - - def _no_base(self, freq): - # hack this for 0.10.1, creating more technical debt...sigh - if isinstance(self.data.index, DatetimeIndex): - base = frequencies.get_freq(freq) - x = self.data.index - if (base <= frequencies.FreqGroup.FR_DAY): - return x[:1].is_normalized - - return Period(x[0], freq).to_timestamp(tz=x.tz) == x[0] - return True - - def _use_dynamic_x(self): - freq = self._index_freq() - - ax = self._get_ax(0) - ax_freq = getattr(ax, 'freq', None) - if freq is None: # convert irregular if axes has freq info - freq = ax_freq - else: # do not use tsplot if irregular was plotted first - if (ax_freq is None) and (len(ax.get_lines()) > 0): - return False - - return (freq is not None) and self._is_dynamic_freq(freq) - def _is_ts_plot(self): # this is slightly deceptive return not self.x_compat and self.use_index and self._use_dynamic_x() - def _make_plot(self): - self._initialize_prior(len(self.data)) + def _use_dynamic_x(self): + from pandas.tseries.plotting import _use_dynamic_x + return _use_dynamic_x(self._get_ax(0), self.data) + def _make_plot(self): if self._is_ts_plot(): - data = self._maybe_convert_index(self.data) + from pandas.tseries.plotting import _maybe_convert_index + data = _maybe_convert_index(self._get_ax(0), self.data) + x = data.index # dummy, not used - plotf = self._get_ts_plot_function() + plotf = self._ts_plot it = self._iter_data(data=data, keep_index=True) else: x = self._get_xticks(convert_period=True) - plotf = self._get_plot_function() + plotf = self._plot it = self._iter_data() + stacking_id = self._get_stacking_id() + is_errorbar = any(e is not None for e in self.errors.values()) + colors = self._get_colors() for i, (label, y) in enumerate(it): ax = self._get_ax(i) - style = self._get_style(i, label) kwds = self.kwds.copy() - self._maybe_add_color(colors, kwds, style, i) + style, kwds = self._apply_style_colors(colors, kwds, i, label) errors = self._get_errorbars(label=label, index=i) kwds = dict(kwds, **errors) @@ -1622,84 +1603,87 @@ def _make_plot(self): label = com.pprint_thing(label) # .encode('utf-8') kwds['label'] = label - newlines = plotf(ax, x, y, style=style, column_num=i, **kwds) + newlines = plotf(ax, x, y, style=style, column_num=i, + stacking_id=stacking_id, + is_errorbar=is_errorbar, + **kwds) self._add_legend_handle(newlines[0], label, index=i) lines = _get_all_lines(ax) left, right = _get_xlim(lines) ax.set_xlim(left, right) - def _get_stacked_values(self, y, label): + @classmethod + def _plot(cls, ax, x, y, style=None, column_num=None, + stacking_id=None, **kwds): + # column_num is used to get the target column from protf in line and area plots + if column_num == 0: + cls._initialize_stacker(ax, stacking_id, len(y)) + y_values = cls._get_stacked_values(ax, stacking_id, y, kwds['label']) + lines = MPLPlot._plot(ax, x, y_values, style=style, **kwds) + cls._update_stacker(ax, stacking_id, y) + return lines + + @classmethod + def _ts_plot(cls, ax, x, data, style=None, **kwds): + from pandas.tseries.plotting import (_maybe_resample, + _decorate_axes, + format_dateaxis) + # accept x to be consistent with normal plot func, + # x is not passed to tsplot as it uses data.index as x coordinate + # column_num must be in kwds for stacking purpose + freq, data = _maybe_resample(data, ax, kwds) + + # Set ax with freq info + _decorate_axes(ax, freq, kwds) + ax._plot_data.append((data, cls._kind, kwds)) + + lines = cls._plot(ax, data.index, data.values, style=style, **kwds) + # set date formatter, locators and rescale limits + format_dateaxis(ax, ax.freq) + return lines + + def _get_stacking_id(self): if self.stacked: - if (y >= 0).all(): - return self._pos_prior + y - elif (y <= 0).all(): - return self._neg_prior + y - else: - raise ValueError('When stacked is True, each column must be either all positive or negative.' - '{0} contains both positive and negative values'.format(label)) + return id(self.data) else: - return y - - def _get_plot_function(self): - f = MPLPlot._get_plot_function(self) - def plotf(ax, x, y, style=None, column_num=None, **kwds): - # column_num is used to get the target column from protf in line and area plots - if column_num == 0: - self._initialize_prior(len(self.data)) - y_values = self._get_stacked_values(y, kwds['label']) - lines = f(ax, x, y_values, style=style, **kwds) - self._update_prior(y) - return lines - return plotf - - def _get_ts_plot_function(self): - from pandas.tseries.plotting import tsplot - plotf = self._get_plot_function() - def _plot(ax, x, data, style=None, **kwds): - # accept x to be consistent with normal plot func, - # x is not passed to tsplot as it uses data.index as x coordinate - lines = tsplot(data, plotf, ax=ax, style=style, **kwds) - return lines - return _plot - - def _initialize_prior(self, n): - self._pos_prior = np.zeros(n) - self._neg_prior = np.zeros(n) - - def _update_prior(self, y): - if self.stacked and not self.subplots: - # tsplot resample may changedata length - if len(self._pos_prior) != len(y): - self._initialize_prior(len(y)) - if (y >= 0).all(): - self._pos_prior += y - elif (y <= 0).all(): - self._neg_prior += y - - def _maybe_convert_index(self, data): - # tsplot converts automatically, but don't want to convert index - # over and over for DataFrames - if isinstance(data.index, DatetimeIndex): - freq = getattr(data.index, 'freq', None) - - if freq is None: - freq = getattr(data.index, 'inferred_freq', None) - if isinstance(freq, DateOffset): - freq = freq.rule_code - - if freq is None: - ax = self._get_ax(0) - freq = getattr(ax, 'freq', None) - - if freq is None: - raise ValueError('Could not get frequency alias for plotting') - - freq = frequencies.get_base_alias(freq) - freq = frequencies.get_period_alias(freq) - - data.index = data.index.to_period(freq=freq) - return data + return None + + @classmethod + def _initialize_stacker(cls, ax, stacking_id, n): + if stacking_id is None: + return + if not hasattr(ax, '_stacker_pos_prior'): + ax._stacker_pos_prior = {} + if not hasattr(ax, '_stacker_neg_prior'): + ax._stacker_neg_prior = {} + ax._stacker_pos_prior[stacking_id] = np.zeros(n) + ax._stacker_neg_prior[stacking_id] = np.zeros(n) + + @classmethod + def _get_stacked_values(cls, ax, stacking_id, values, label): + if stacking_id is None: + return values + if not hasattr(ax, '_stacker_pos_prior'): + # stacker may not be initialized for subplots + cls._initialize_stacker(ax, stacking_id, len(values)) + + if (values >= 0).all(): + return ax._stacker_pos_prior[stacking_id] + values + elif (values <= 0).all(): + return ax._stacker_neg_prior[stacking_id] + values + + raise ValueError('When stacked is True, each column must be either all positive or negative.' + '{0} contains both positive and negative values'.format(label)) + + @classmethod + def _update_stacker(cls, ax, stacking_id, values): + if stacking_id is None: + return + if (values >= 0).all(): + ax._stacker_pos_prior[stacking_id] += values + elif (values <= 0).all(): + ax._stacker_neg_prior[stacking_id] += values def _post_plot_logic(self): df = self.data @@ -1724,6 +1708,7 @@ def _post_plot_logic(self): class AreaPlot(LinePlot): + _kind = 'area' def __init__(self, data, **kwargs): kwargs.setdefault('stacked', True) @@ -1734,35 +1719,36 @@ def __init__(self, data, **kwargs): # use smaller alpha to distinguish overlap self.kwds.setdefault('alpha', 0.5) - def _get_plot_function(self): if self.logy or self.loglog: raise ValueError("Log-y scales are not supported in area plot") - else: - f = MPLPlot._get_plot_function(self) - def plotf(ax, x, y, style=None, column_num=None, **kwds): - if column_num == 0: - self._initialize_prior(len(self.data)) - y_values = self._get_stacked_values(y, kwds['label']) - lines = f(ax, x, y_values, style=style, **kwds) - - # get data from the line to get coordinates for fill_between - xdata, y_values = lines[0].get_data(orig=False) - - if (y >= 0).all(): - start = self._pos_prior - elif (y <= 0).all(): - start = self._neg_prior - else: - start = np.zeros(len(y)) - if not 'color' in kwds: - kwds['color'] = lines[0].get_color() + @classmethod + def _plot(cls, ax, x, y, style=None, column_num=None, + stacking_id=None, is_errorbar=False, **kwds): + if column_num == 0: + cls._initialize_stacker(ax, stacking_id, len(y)) + y_values = cls._get_stacked_values(ax, stacking_id, y, kwds['label']) + lines = MPLPlot._plot(ax, x, y_values, style=style, **kwds) + + # get data from the line to get coordinates for fill_between + xdata, y_values = lines[0].get_data(orig=False) + + # unable to use ``_get_stacked_values`` here to get starting point + if stacking_id is None: + start = np.zeros(len(y)) + elif (y >= 0).all(): + start = ax._stacker_pos_prior[stacking_id] + elif (y <= 0).all(): + start = ax._stacker_neg_prior[stacking_id] + else: + start = np.zeros(len(y)) - self.plt.Axes.fill_between(ax, xdata, start, y_values, **kwds) - self._update_prior(y) - return lines + if not 'color' in kwds: + kwds['color'] = lines[0].get_color() - return plotf + ax.fill_between(xdata, start, y_values, **kwds) + cls._update_stacker(ax, stacking_id, y) + return lines def _add_legend_handle(self, handle, label, index=None): from matplotlib.patches import Rectangle @@ -1785,8 +1771,9 @@ def _post_plot_logic(self): class BarPlot(MPLPlot): - - _default_rot = {'bar': 90, 'barh': 0} + _kind = 'bar' + _default_rot = 90 + orientation = 'vertical' def __init__(self, data, **kwargs): self.bar_width = kwargs.pop('width', 0.5) @@ -1823,20 +1810,13 @@ def _args_adjust(self): if com.is_list_like(self.left): self.left = np.array(self.left) - def _get_plot_function(self): - if self.kind == 'bar': - def f(ax, x, y, w, start=None, **kwds): - start = start + self.bottom - return ax.bar(x, y, w, bottom=start, log=self.log, **kwds) - elif self.kind == 'barh': - - def f(ax, x, y, w, start=None, log=self.log, **kwds): - start = start + self.left - return ax.barh(x, y, w, left=start, log=self.log, **kwds) - else: - raise ValueError("BarPlot kind must be either 'bar' or 'barh'") + @classmethod + def _plot(cls, ax, x, y, w, start=0, log=False, **kwds): + return ax.bar(x, y, w, bottom=start, log=log, **kwds) - return f + @property + def _start_base(self): + return self.bottom def _make_plot(self): import matplotlib as mpl @@ -1844,7 +1824,6 @@ def _make_plot(self): colors = self._get_colors() ncolors = len(colors) - bar_f = self._get_plot_function() pos_prior = neg_prior = np.zeros(len(self.data)) K = self.nseries @@ -1865,24 +1844,25 @@ def _make_plot(self): start = 0 if self.log and (y >= 1).all(): start = 1 + start = start + self._start_base if self.subplots: w = self.bar_width / 2 - rect = bar_f(ax, self.ax_pos + w, y, self.bar_width, - start=start, label=label, **kwds) + rect = self._plot(ax, self.ax_pos + w, y, self.bar_width, + start=start, label=label, log=self.log, **kwds) ax.set_title(label) elif self.stacked: mask = y > 0 - start = np.where(mask, pos_prior, neg_prior) + start = np.where(mask, pos_prior, neg_prior) + self._start_base w = self.bar_width / 2 - rect = bar_f(ax, self.ax_pos + w, y, self.bar_width, - start=start, label=label, **kwds) + rect = self._plot(ax, self.ax_pos + w, y, self.bar_width, + start=start, label=label, log=self.log, **kwds) pos_prior = pos_prior + np.where(mask, y, 0) neg_prior = neg_prior + np.where(mask, 0, y) else: w = self.bar_width / K - rect = bar_f(ax, self.ax_pos + (i + 0.5) * w, y, w, - start=start, label=label, **kwds) + rect = self._plot(ax, self.ax_pos + (i + 0.5) * w, y, w, + start=start, label=label, log=self.log, **kwds) self._add_legend_handle(rect, label, index=i) def _post_plot_logic(self): @@ -1897,33 +1877,40 @@ def _post_plot_logic(self): s_edge = self.ax_pos[0] - 0.25 + self.lim_offset e_edge = self.ax_pos[-1] + 0.25 + self.bar_width + self.lim_offset - if self.kind == 'bar': - ax.set_xlim((s_edge, e_edge)) - ax.set_xticks(self.tick_pos) - ax.set_xticklabels(str_index) - if name is not None and self.use_index: - ax.set_xlabel(name) - elif self.kind == 'barh': - # horizontal bars - ax.set_ylim((s_edge, e_edge)) - ax.set_yticks(self.tick_pos) - ax.set_yticklabels(str_index) - if name is not None and self.use_index: - ax.set_ylabel(name) - else: - raise NotImplementedError(self.kind) + self._decorate_ticks(ax, name, str_index, s_edge, e_edge) + + def _decorate_ticks(self, ax, name, ticklabels, start_edge, end_edge): + ax.set_xlim((start_edge, end_edge)) + ax.set_xticks(self.tick_pos) + ax.set_xticklabels(ticklabels) + if name is not None and self.use_index: + ax.set_xlabel(name) + + +class BarhPlot(BarPlot): + _kind = 'barh' + _default_rot = 0 + orientation = 'horizontal' @property - def orientation(self): - if self.kind == 'bar': - return 'vertical' - elif self.kind == 'barh': - return 'horizontal' - else: - raise NotImplementedError(self.kind) + def _start_base(self): + return self.left + + @classmethod + def _plot(cls, ax, x, y, w, start=0, log=False, **kwds): + return ax.barh(x, y, w, left=start, log=log, **kwds) + + def _decorate_ticks(self, ax, name, ticklabels, start_edge, end_edge): + # horizontal bars + ax.set_ylim((start_edge, end_edge)) + ax.set_yticks(self.tick_pos) + ax.set_yticklabels(ticklabels) + if name is not None and self.use_index: + ax.set_ylabel(name) class HistPlot(LinePlot): + _kind = 'hist' def __init__(self, data, bins=10, bottom=0, **kwargs): self.bins = bins # use mpl default @@ -1934,7 +1921,8 @@ def __init__(self, data, bins=10, bottom=0, **kwargs): def _args_adjust(self): if com.is_integer(self.bins): # create common bin edge - values = self.data.convert_objects()._get_numeric_data() + values = (self.data.convert_objects(datetime=True) + ._get_numeric_data()) values = np.ravel(values) values = values[~com.isnull(values)] @@ -1945,44 +1933,55 @@ def _args_adjust(self): if com.is_list_like(self.bottom): self.bottom = np.array(self.bottom) - def _get_plot_function(self): - def plotf(ax, y, style=None, column_num=None, **kwds): - if column_num == 0: - self._initialize_prior(len(self.bins) - 1) - y = y[~com.isnull(y)] - bottom = self._pos_prior + self.bottom - # ignore style - n, bins, patches = self.plt.Axes.hist(ax, y, bins=self.bins, - bottom=bottom, **kwds) - self._update_prior(n) - return patches - return plotf + @classmethod + def _plot(cls, ax, y, style=None, bins=None, bottom=0, column_num=0, + stacking_id=None, **kwds): + if column_num == 0: + cls._initialize_stacker(ax, stacking_id, len(bins) - 1) + y = y[~com.isnull(y)] + + base = np.zeros(len(bins) - 1) + bottom = bottom + cls._get_stacked_values(ax, stacking_id, base, kwds['label']) + # ignore style + n, bins, patches = ax.hist(y, bins=bins, bottom=bottom, **kwds) + cls._update_stacker(ax, stacking_id, n) + return patches def _make_plot(self): - plotf = self._get_plot_function() colors = self._get_colors() + stacking_id = self._get_stacking_id() + for i, (label, y) in enumerate(self._iter_data()): ax = self._get_ax(i) - style = self._get_style(i, label) - label = com.pprint_thing(label) kwds = self.kwds.copy() + + label = com.pprint_thing(label) kwds['label'] = label - self._maybe_add_color(colors, kwds, style, i) + style, kwds = self._apply_style_colors(colors, kwds, i, label) if style is not None: kwds['style'] = style - artists = plotf(ax, y, column_num=i, **kwds) + kwds = self._make_plot_keywords(kwds, y) + artists = self._plot(ax, y, column_num=i, + stacking_id=stacking_id, **kwds) self._add_legend_handle(artists[0], label, index=i) + def _make_plot_keywords(self, kwds, y): + """merge BoxPlot/KdePlot properties to passed kwds""" + # y is required for KdePlot + kwds['bottom'] = self.bottom + kwds['bins'] = self.bins + return kwds + def _post_plot_logic(self): if self.orientation == 'horizontal': for ax in self.axes: - ax.set_xlabel('Degree') + ax.set_xlabel('Frequency') else: for ax in self.axes: - ax.set_ylabel('Degree') + ax.set_ylabel('Frequency') @property def orientation(self): @@ -1993,6 +1992,7 @@ def orientation(self): class KdePlot(HistPlot): + _kind = 'kde' orientation = 'vertical' def __init__(self, data, bw_method=None, ind=None, **kwargs): @@ -2012,26 +2012,31 @@ def _get_ind(self, y): ind = self.ind return ind - def _get_plot_function(self): + @classmethod + def _plot(cls, ax, y, style=None, bw_method=None, ind=None, + column_num=None, stacking_id=None, **kwds): from scipy.stats import gaussian_kde from scipy import __version__ as spv - f = MPLPlot._get_plot_function(self) - def plotf(ax, y, style=None, column_num=None, **kwds): - y = remove_na(y) - if LooseVersion(spv) >= '0.11.0': - gkde = gaussian_kde(y, bw_method=self.bw_method) - else: - gkde = gaussian_kde(y) - if self.bw_method is not None: - msg = ('bw_method was added in Scipy 0.11.0.' + - ' Scipy version in use is %s.' % spv) - warnings.warn(msg) - - ind = self._get_ind(y) - y = gkde.evaluate(ind) - lines = f(ax, ind, y, style=style, **kwds) - return lines - return plotf + + y = remove_na(y) + + if LooseVersion(spv) >= '0.11.0': + gkde = gaussian_kde(y, bw_method=bw_method) + else: + gkde = gaussian_kde(y) + if bw_method is not None: + msg = ('bw_method was added in Scipy 0.11.0.' + + ' Scipy version in use is %s.' % spv) + warnings.warn(msg) + + y = gkde.evaluate(ind) + lines = MPLPlot._plot(ax, ind, y, style=style, **kwds) + return lines + + def _make_plot_keywords(self, kwds, y): + kwds['bw_method'] = self.bw_method + kwds['ind'] = self._get_ind(y) + return kwds def _post_plot_logic(self): for ax in self.axes: @@ -2039,6 +2044,7 @@ def _post_plot_logic(self): class PiePlot(MPLPlot): + _kind = 'pie' _layout_type = 'horizontal' def __init__(self, data, kind=None, **kwargs): @@ -2057,8 +2063,8 @@ def _validate_color_args(self): pass def _make_plot(self): - self.kwds.setdefault('colors', self._get_colors(num_colors=len(self.data), - color_kwds='colors')) + colors = self._get_colors(num_colors=len(self.data), color_kwds='colors') + self.kwds.setdefault('colors', colors) for i, (label, y) in enumerate(self._iter_data()): ax = self._get_ax(i) @@ -2103,6 +2109,7 @@ def blank_labeler(label, value): class BoxPlot(LinePlot): + _kind = 'box' _layout_type = 'horizontal' _valid_return_types = (None, 'axes', 'dict', 'both') @@ -2125,25 +2132,24 @@ def _args_adjust(self): else: self.sharey = False - def _get_plot_function(self): - def plotf(ax, y, column_num=None, **kwds): - if y.ndim == 2: - y = [remove_na(v) for v in y] - # Boxplot fails with empty arrays, so need to add a NaN - # if any cols are empty - # GH 8181 - y = [v if v.size > 0 else np.array([np.nan]) for v in y] - else: - y = remove_na(y) - bp = ax.boxplot(y, **kwds) + @classmethod + def _plot(cls, ax, y, column_num=None, return_type=None, **kwds): + if y.ndim == 2: + y = [remove_na(v) for v in y] + # Boxplot fails with empty arrays, so need to add a NaN + # if any cols are empty + # GH 8181 + y = [v if v.size > 0 else np.array([np.nan]) for v in y] + else: + y = remove_na(y) + bp = ax.boxplot(y, **kwds) - if self.return_type == 'dict': - return bp, bp - elif self.return_type == 'both': - return self.BP(ax=ax, lines=bp), bp - else: - return ax, bp - return plotf + if return_type == 'dict': + return bp, bp + elif return_type == 'both': + return cls.BP(ax=ax, lines=bp), bp + else: + return ax, bp def _validate_color_args(self): if 'color' in self.kwds: @@ -2197,7 +2203,6 @@ def maybe_color_bp(self, bp): setp(bp['caps'], color=caps, alpha=1) def _make_plot(self): - plotf = self._get_plot_function() if self.subplots: self._return_obj = compat.OrderedDict() @@ -2205,7 +2210,8 @@ def _make_plot(self): ax = self._get_ax(i) kwds = self.kwds.copy() - ret, bp = plotf(ax, y, column_num=i, **kwds) + ret, bp = self._plot(ax, y, column_num=i, + return_type=self.return_type, **kwds) self.maybe_color_bp(bp) self._return_obj[label] = ret @@ -2216,7 +2222,8 @@ def _make_plot(self): ax = self._get_ax(0) kwds = self.kwds.copy() - ret, bp = plotf(ax, y, column_num=0, **kwds) + ret, bp = self._plot(ax, y, column_num=0, + return_type=self.return_type, **kwds) self.maybe_color_bp(bp) self._return_obj = ret @@ -2261,10 +2268,12 @@ def result(self): _series_kinds = ['pie'] _all_kinds = _common_kinds + _dataframe_kinds + _series_kinds -_plot_klass = {'line': LinePlot, 'bar': BarPlot, 'barh': BarPlot, - 'kde': KdePlot, 'hist': HistPlot, 'box': BoxPlot, - 'scatter': ScatterPlot, 'hexbin': HexBinPlot, - 'area': AreaPlot, 'pie': PiePlot} +_klasses = [LinePlot, BarPlot, BarhPlot, KdePlot, HistPlot, BoxPlot, + ScatterPlot, HexBinPlot, AreaPlot, PiePlot] + +_plot_klass = {} +for klass in _klasses: + _plot_klass[klass._kind] = klass def _plot(data, x=None, y=None, subplots=False, diff --git a/pandas/tools/rplot.py b/pandas/tools/rplot.py index c3c71ab749536..5996fceff8877 100644 --- a/pandas/tools/rplot.py +++ b/pandas/tools/rplot.py @@ -363,7 +363,7 @@ def work(self, fig=None, ax=None): else: ax = fig.gca() for index in range(len(self.data)): - row = self.data.irow(index) + row = self.data.iloc[index] x = row[self.aes['x']] y = row[self.aes['y']] size_scaler = self.aes['size'] diff --git a/pandas/tools/tests/test_merge.py b/pandas/tools/tests/test_merge.py index 7b322b0d311de..ee83b9632bd4b 100644 --- a/pandas/tools/tests/test_merge.py +++ b/pandas/tools/tests/test_merge.py @@ -737,6 +737,88 @@ def test_left_merge_empty_dataframe(self): result = merge(right, left, on='key', how='right') assert_frame_equal(result, left) + def test_merge_left_empty_right_empty(self): + # GH 10824 + left = pd.DataFrame([], columns=['a', 'b', 'c']) + right = pd.DataFrame([], columns=['x', 'y', 'z']) + + exp_in = pd.DataFrame([], columns=['a', 'b', 'c', 'x', 'y', 'z'], + dtype=object) + + for kwarg in [dict(left_index=True, right_index=True), + dict(left_index=True, right_on='x'), + dict(left_on='a', right_index=True), + dict(left_on='a', right_on='x')]: + + result = pd.merge(left, right, how='inner', **kwarg) + tm.assert_frame_equal(result, exp_in) + result = pd.merge(left, right, how='left', **kwarg) + tm.assert_frame_equal(result, exp_in) + result = pd.merge(left, right, how='right', **kwarg) + tm.assert_frame_equal(result, exp_in) + result = pd.merge(left, right, how='outer', **kwarg) + tm.assert_frame_equal(result, exp_in) + + def test_merge_left_empty_right_notempty(self): + # GH 10824 + left = pd.DataFrame([], columns=['a', 'b', 'c']) + right = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], + columns=['x', 'y', 'z']) + + exp_out = pd.DataFrame({'a': np.array([np.nan]*3, dtype=object), + 'b': np.array([np.nan]*3, dtype=object), + 'c': np.array([np.nan]*3, dtype=object), + 'x': [1, 4, 7], + 'y': [2, 5, 8], + 'z': [3, 6, 9]}, + columns=['a', 'b', 'c', 'x', 'y', 'z']) + exp_in = exp_out[0:0] # make empty DataFrame keeping dtype + + for kwarg in [dict(left_index=True, right_index=True), + dict(left_index=True, right_on='x'), + dict(left_on='a', right_index=True), + dict(left_on='a', right_on='x')]: + + result = pd.merge(left, right, how='inner', **kwarg) + tm.assert_frame_equal(result, exp_in) + result = pd.merge(left, right, how='left', **kwarg) + tm.assert_frame_equal(result, exp_in) + + result = pd.merge(left, right, how='right', **kwarg) + tm.assert_frame_equal(result, exp_out) + result = pd.merge(left, right, how='outer', **kwarg) + tm.assert_frame_equal(result, exp_out) + + def test_merge_left_notempty_right_empty(self): + # GH 10824 + left = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], + columns=['a', 'b', 'c']) + right = pd.DataFrame([], columns=['x', 'y', 'z']) + + exp_out = pd.DataFrame({'a': [1, 4, 7], + 'b': [2, 5, 8], + 'c': [3, 6, 9], + 'x': np.array([np.nan]*3, dtype=object), + 'y': np.array([np.nan]*3, dtype=object), + 'z': np.array([np.nan]*3, dtype=object)}, + columns=['a', 'b', 'c', 'x', 'y', 'z']) + exp_in = exp_out[0:0] # make empty DataFrame keeping dtype + + for kwarg in [dict(left_index=True, right_index=True), + dict(left_index=True, right_on='x'), + dict(left_on='a', right_index=True), + dict(left_on='a', right_on='x')]: + + result = pd.merge(left, right, how='inner', **kwarg) + tm.assert_frame_equal(result, exp_in) + result = pd.merge(left, right, how='right', **kwarg) + tm.assert_frame_equal(result, exp_in) + + result = pd.merge(left, right, how='left', **kwarg) + tm.assert_frame_equal(result, exp_out) + result = pd.merge(left, right, how='outer', **kwarg) + tm.assert_frame_equal(result, exp_out) + def test_merge_nosort(self): # #2098, anything to do? @@ -790,7 +872,7 @@ def _constructor(self): nad = NotADataFrame(self.df) result = nad.merge(self.df2, on='key1') - tm.assert_isinstance(result, NotADataFrame) + tm.assertIsInstance(result, NotADataFrame) def test_append_dtype_coerce(self): @@ -843,7 +925,6 @@ def test_join_append_timedeltas(self): assert_frame_equal(result, expected) def test_overlapping_columns_error_message(self): - # #2649 df = DataFrame({'key': [1, 2, 3], 'v1': [4, 5, 6], 'v2': [7, 8, 9]}) @@ -853,7 +934,16 @@ def test_overlapping_columns_error_message(self): df.columns = ['key', 'foo', 'foo'] df2.columns = ['key', 'bar', 'bar'] - + expected = DataFrame({'key': [1, 2, 3], + 'v1': [4, 5, 6], + 'v2': [7, 8, 9], + 'v3': [4, 5, 6], + 'v4': [7, 8, 9]}) + expected.columns = ['key', 'foo', 'foo', 'bar', 'bar'] + assert_frame_equal(merge(df, df2), expected) + + # #2649, #10639 + df2.columns = ['key1', 'foo', 'foo'] self.assertRaises(ValueError, merge, df, df2) def _check_merge(x, y): @@ -1994,6 +2084,13 @@ def test_dups_index(self): result = df.append(df) assert_frame_equal(result, expected) + def test_with_mixed_tuples(self): + # 10697 + # columns have mixed tuples, so handle properly + df1 = DataFrame({ u'A' : 'foo', (u'B',1) : 'bar' },index=range(2)) + df2 = DataFrame({ u'B' : 'foo', (u'B',1) : 'bar' },index=range(2)) + result = concat([df1,df2]) + def test_join_dups(self): # joining dups @@ -2535,8 +2632,25 @@ def _constructor(self): nad = NotADataFrame(self.left) result = nad.merge(self.right, on='key') - tm.assert_isinstance(result, NotADataFrame) - + tm.assertIsInstance(result, NotADataFrame) + + def test_empty_sequence_concat(self): + # GH 9157 + empty_pat = "[Nn]o objects" + none_pat = "objects.*None" + test_cases = [ + ((), empty_pat), + ([], empty_pat), + ({}, empty_pat), + ([None], none_pat), + ([None, None], none_pat) + ] + for df_seq, pattern in test_cases: + assertRaisesRegexp(ValueError, pattern, pd.concat, df_seq) + + pd.concat([pd.DataFrame()]) + pd.concat([None, pd.DataFrame()]) + pd.concat([pd.DataFrame(), None]) if __name__ == '__main__': nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], diff --git a/pandas/tools/tests/test_pivot.py b/pandas/tools/tests/test_pivot.py index bb95234657ec2..34789a3c52cb7 100644 --- a/pandas/tools/tests/test_pivot.py +++ b/pandas/tools/tests/test_pivot.py @@ -268,7 +268,7 @@ def _check_output(res, col, index=['A', 'B'], columns=['C']): # no rows rtable = self.data.pivot_table(columns=['AA', 'BB'], margins=True, aggfunc=np.mean) - tm.assert_isinstance(rtable, Series) + tm.assertIsInstance(rtable, Series) for item in ['DD', 'EE', 'FF']: gmarg = table[item]['All', ''] self.assertEqual(gmarg, self.data[item].mean()) diff --git a/pandas/tools/tests/test_tile.py b/pandas/tools/tests/test_tile.py index 4a0218bef6001..eac6973bffb25 100644 --- a/pandas/tools/tests/test_tile.py +++ b/pandas/tools/tests/test_tile.py @@ -13,8 +13,6 @@ from pandas.tools.tile import cut, qcut import pandas.tools.tile as tmod -from numpy.testing import assert_equal, assert_almost_equal - class TestCut(tm.TestCase): @@ -22,31 +20,31 @@ def test_simple(self): data = np.ones(5) result = cut(data, 4, labels=False) desired = [1, 1, 1, 1, 1] - assert_equal(result, desired) + tm.assert_numpy_array_equal(result, desired) def test_bins(self): data = np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]) result, bins = cut(data, 3, retbins=True) - assert_equal(result.codes, [0, 0, 0, 1, 2, 0]) - assert_almost_equal(bins, [0.1905, 3.36666667, 6.53333333, 9.7]) + tm.assert_numpy_array_equal(result.codes, [0, 0, 0, 1, 2, 0]) + tm.assert_almost_equal(bins, [0.1905, 3.36666667, 6.53333333, 9.7]) def test_right(self): data = np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1, 2.575]) result, bins = cut(data, 4, right=True, retbins=True) - assert_equal(result.codes, [0, 0, 0, 2, 3, 0, 0]) - assert_almost_equal(bins, [0.1905, 2.575, 4.95, 7.325, 9.7]) + tm.assert_numpy_array_equal(result.codes, [0, 0, 0, 2, 3, 0, 0]) + tm.assert_almost_equal(bins, [0.1905, 2.575, 4.95, 7.325, 9.7]) def test_noright(self): data = np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1, 2.575]) result, bins = cut(data, 4, right=False, retbins=True) - assert_equal(result.codes, [0, 0, 0, 2, 3, 0, 1]) - assert_almost_equal(bins, [0.2, 2.575, 4.95, 7.325, 9.7095]) + tm.assert_numpy_array_equal(result.codes, [0, 0, 0, 2, 3, 0, 1]) + tm.assert_almost_equal(bins, [0.2, 2.575, 4.95, 7.325, 9.7095]) def test_arraylike(self): data = [.2, 1.4, 2.5, 6.2, 9.7, 2.1] result, bins = cut(data, 3, retbins=True) - assert_equal(result.codes, [0, 0, 0, 1, 2, 0]) - assert_almost_equal(bins, [0.1905, 3.36666667, 6.53333333, 9.7]) + tm.assert_numpy_array_equal(result.codes, [0, 0, 0, 1, 2, 0]) + tm.assert_almost_equal(bins, [0.1905, 3.36666667, 6.53333333, 9.7]) def test_bins_not_monotonic(self): data = [.2, 1.4, 2.5, 6.2, 9.7, 2.1] @@ -68,7 +66,7 @@ def test_cut_out_of_range_more(self): s = Series([0, -1, 0, 1, -3]) ind = cut(s, [0, 1], labels=False) exp = [np.nan, np.nan, np.nan, 0, np.nan] - assert_almost_equal(ind, exp) + tm.assert_almost_equal(ind, exp) def test_labels(self): arr = np.tile(np.arange(0, 1.01, 0.1), 4) @@ -122,8 +120,8 @@ def test_inf_handling(self): ex_categories = ['(-inf, 2]', '(2, 4]', '(4, inf]'] - np.testing.assert_array_equal(result.categories, ex_categories) - np.testing.assert_array_equal(result_ser.cat.categories, ex_categories) + tm.assert_numpy_array_equal(result.categories, ex_categories) + tm.assert_numpy_array_equal(result_ser.cat.categories, ex_categories) self.assertEqual(result[5], '(4, inf]') self.assertEqual(result[0], '(-inf, 2]') self.assertEqual(result_ser[5], '(4, inf]') @@ -134,7 +132,7 @@ def test_qcut(self): labels, bins = qcut(arr, 4, retbins=True) ex_bins = quantile(arr, [0, .25, .5, .75, 1.]) - assert_almost_equal(bins, ex_bins) + tm.assert_almost_equal(bins, ex_bins) ex_levels = cut(arr, ex_bins, include_lowest=True) self.assert_numpy_array_equal(labels, ex_levels) @@ -252,12 +250,12 @@ def test_series_retbins(self): # GH 8589 s = Series(np.arange(4)) result, bins = cut(s, 2, retbins=True) - assert_equal(result.cat.codes.values, [0, 0, 1, 1]) - assert_almost_equal(bins, [-0.003, 1.5, 3]) + tm.assert_numpy_array_equal(result.cat.codes.values, [0, 0, 1, 1]) + tm.assert_almost_equal(bins, [-0.003, 1.5, 3]) result, bins = qcut(s, 2, retbins=True) - assert_equal(result.cat.codes.values, [0, 0, 1, 1]) - assert_almost_equal(bins, [0, 1.5, 3]) + tm.assert_numpy_array_equal(result.cat.codes.values, [0, 0, 1, 1]) + tm.assert_almost_equal(bins, [0, 1.5, 3]) def curpath(): diff --git a/pandas/tools/tests/test_util.py b/pandas/tools/tests/test_util.py index 9480ea7ee5bf8..1adf47e946a96 100644 --- a/pandas/tools/tests/test_util.py +++ b/pandas/tools/tests/test_util.py @@ -43,8 +43,7 @@ def setUpClass(cls): if not cls.locales: raise nose.SkipTest("No locales found") - if os.name == 'nt': # we're on windows - raise nose.SkipTest("Running on Windows") + tm._skip_if_windows() @classmethod def tearDownClass(cls): diff --git a/pandas/tools/tile.py b/pandas/tools/tile.py index 6830919d9c09f..416addfcf2ad5 100644 --- a/pandas/tools/tile.py +++ b/pandas/tools/tile.py @@ -217,7 +217,7 @@ def _bins_to_cuts(x, bins, right=True, labels=None, retbins=False, levels = np.asarray(levels, dtype=object) np.putmask(ids, na_mask, 0) - fac = Categorical(ids - 1, levels, ordered=True, name=name, fastpath=True) + fac = Categorical(ids - 1, levels, ordered=True, fastpath=True) else: fac = ids - 1 if has_nas: @@ -225,7 +225,7 @@ def _bins_to_cuts(x, bins, right=True, labels=None, retbins=False, np.putmask(fac, na_mask, np.nan) if x_is_series: - fac = Series(fac, index=series_index) + fac = Series(fac, index=series_index, name=name) if not retbins: return fac diff --git a/pandas/tseries/base.py b/pandas/tseries/base.py index 71ff0f6c9c56c..c353e66bc2dbb 100644 --- a/pandas/tseries/base.py +++ b/pandas/tseries/base.py @@ -17,6 +17,29 @@ import pandas.algos as _algos + +class DatelikeOps(object): + """ common ops for DatetimeIndex/PeriodIndex, but not TimedeltaIndex """ + + def strftime(self, date_format): + """ + Return an array of formatted strings specified by date_format, which + supports the same string format as the python standard library. Details + of the string format can be found in the `python string format doc + `__ + + Parameters + ---------- + date_format : str + date format string (e.g. "%Y-%m-%d") + + Returns + ------- + ndarray of formatted strings + """ + return np.asarray(self.format(date_format=date_format)) + + class DatetimeIndexOpsMixin(object): """ common ops mixin to support a unified inteface datetimelike Index """ @@ -140,20 +163,31 @@ def order(self, return_indexer=False, ascending=True): return sorted_index, _as else: sorted_values = np.sort(self.values) + attribs = self._get_attributes_dict() + freq = attribs['freq'] + from pandas.tseries.period import PeriodIndex + if freq is not None and not isinstance(self, PeriodIndex): + if freq.n > 0 and not ascending: + freq = freq * -1 + elif freq.n < 0 and ascending: + freq = freq * -1 + attribs['freq'] = freq + if not ascending: sorted_values = sorted_values[::-1] - attribs = self._get_attributes_dict() - attribs['freq'] = None + return self._simple_new(sorted_values, **attribs) def take(self, indices, axis=0): """ Analogous to ndarray.take """ - maybe_slice = lib.maybe_indices_to_slice(com._ensure_int64(indices)) + indices = com._ensure_int64(indices) + maybe_slice = lib.maybe_indices_to_slice(indices, len(self)) if isinstance(maybe_slice, slice): return self[maybe_slice] - return super(DatetimeIndexOpsMixin, self).take(indices, axis) + taken = self.asi8.take(com._ensure_platform_int(indices)) + return self._shallow_copy(taken, freq=None) def get_duplicates(self): values = Index.get_duplicates(self) @@ -169,6 +203,14 @@ def asobject(self): from pandas.core.index import Index return Index(self._box_values(self.asi8), name=self.name, dtype=object) + def _convert_tolerance(self, tolerance): + try: + return tslib.Timedelta(tolerance).to_timedelta64() + except ValueError: + raise ValueError('tolerance argument for %s must be convertible ' + 'to Timedelta: %r' + % (type(self).__name__, tolerance)) + def _maybe_mask_results(self, result, fill_value=None, convert=None): """ Parameters @@ -318,8 +360,7 @@ def resolution(self): """ Returns day, hour, minute, second, millisecond or microsecond """ - from pandas.tseries.frequencies import get_reso_string - return get_reso_string(self._resolution) + return Resolution.get_str(self._resolution) def _convert_scalar_indexer(self, key, kind=None): """ @@ -450,7 +491,7 @@ def isin(self, values): return self.asobject.isin(values) value_set = set(values.asi8) - return lib.ismember(self.asi8, value_set) + return lib.ismember_int64(self.asi8, value_set) def shift(self, n, freq=None): """ diff --git a/pandas/tseries/common.py b/pandas/tseries/common.py index c273906ef3d05..a4d5939d386ae 100644 --- a/pandas/tseries/common.py +++ b/pandas/tseries/common.py @@ -125,7 +125,7 @@ def to_pydatetime(self): accessors=DatetimeIndex._datetimelike_ops, typ='property') DatetimeProperties._add_delegate_accessors(delegate=DatetimeIndex, - accessors=["to_period","tz_localize","tz_convert","normalize"], + accessors=["to_period","tz_localize","tz_convert","normalize","strftime"], typ='method') class TimedeltaProperties(Properties): @@ -181,6 +181,9 @@ class PeriodProperties(Properties): PeriodProperties._add_delegate_accessors(delegate=PeriodIndex, accessors=PeriodIndex._datetimelike_ops, typ='property') +PeriodProperties._add_delegate_accessors(delegate=PeriodIndex, + accessors=["strftime"], + typ='method') class CombinedDatetimelikeProperties(DatetimeProperties, TimedeltaProperties): diff --git a/pandas/tseries/frequencies.py b/pandas/tseries/frequencies.py index 4af8c68110978..85de5e083d6d9 100644 --- a/pandas/tseries/frequencies.py +++ b/pandas/tseries/frequencies.py @@ -32,6 +32,8 @@ class FreqGroup(object): class Resolution(object): + # defined in period.pyx + # note that these are different from freq codes RESO_US = period.US_RESO RESO_MS = period.MS_RESO RESO_SEC = period.S_RESO @@ -65,30 +67,104 @@ class Resolution(object): @classmethod def get_str(cls, reso): + """ + Return resolution str against resolution code. + + Example + ------- + >>> Resolution.get_str(Resolution.RESO_SEC) + 'second' + """ return cls._reso_str_map.get(reso, 'day') @classmethod def get_reso(cls, resostr): + """ + Return resolution str against resolution code. + + Example + ------- + >>> Resolution.get_reso('second') + 2 + + >>> Resolution.get_reso('second') == Resolution.RESO_SEC + True + """ return cls._str_reso_map.get(resostr, cls.RESO_DAY) + @classmethod + def get_freq_group(cls, resostr): + """ + Return frequency str against resolution str. + + Example + ------- + >>> f.Resolution.get_freq_group('day') + 4000 + """ + return get_freq_group(cls.get_freq(resostr)) + @classmethod def get_freq(cls, resostr): + """ + Return frequency str against resolution str. + + Example + ------- + >>> f.Resolution.get_freq('day') + 'D' + """ return cls._reso_freq_map[resostr] @classmethod def get_str_from_freq(cls, freq): + """ + Return resolution str against frequency str. + + Example + ------- + >>> Resolution.get_str_from_freq('H') + 'hour' + """ return cls._freq_reso_map.get(freq, 'day') @classmethod def get_reso_from_freq(cls, freq): - return cls.get_reso(cls.get_str_from_freq(freq)) + """ + Return resolution code against frequency str. + Example + ------- + >>> Resolution.get_reso_from_freq('H') + 4 -def get_reso_string(reso): - return Resolution.get_str(reso) + >>> Resolution.get_reso_from_freq('H') == Resolution.RESO_HR + True + """ + return cls.get_reso(cls.get_str_from_freq(freq)) def get_to_timestamp_base(base): + """ + Return frequency code group used for base of to_timestamp against + frequency code. + + Example + ------- + # Return day freq code against longer freq than day + >>> get_to_timestamp_base(get_freq_code('D')[0]) + 6000 + >>> get_to_timestamp_base(get_freq_code('W')[0]) + 6000 + >>> get_to_timestamp_base(get_freq_code('M')[0]) + 6000 + + # Return second freq code against hour between second + >>> get_to_timestamp_base(get_freq_code('H')[0]) + 9000 + >>> get_to_timestamp_base(get_freq_code('S')[0]) + 9000 + """ if base < FreqGroup.FR_BUS: return FreqGroup.FR_DAY if FreqGroup.FR_HR <= base <= FreqGroup.FR_SEC: @@ -97,6 +173,17 @@ def get_to_timestamp_base(base): def get_freq_group(freq): + """ + Return frequency code group of given frequency str. + + Example + ------- + >>> get_freq_group('W-MON') + 4000 + + >>> get_freq_group('W-FRI') + 4000 + """ if isinstance(freq, compat.string_types): base, mult = get_freq_code(freq) freq = base @@ -104,6 +191,18 @@ def get_freq_group(freq): def get_freq(freq): + """ + Return frequency code of given frequency str. + If input is not string, return input as it is. + + Example + ------- + >>> get_freq('A') + 1000 + + >>> get_freq('3A') + 1000 + """ if isinstance(freq, compat.string_types): base, mult = get_freq_code(freq) freq = base @@ -112,15 +211,29 @@ def get_freq(freq): def get_freq_code(freqstr): """ + Return freq str or tuple to freq code and stride (mult) Parameters ---------- + freqstr : str or tuple Returns ------- + return : tuple of base frequency code and stride (mult) + + Example + ------- + >>> get_freq_code('3D') + (6000, 3) + + >>> get_freq_code('D') + (6000, 1) + + >>> get_freq_code(('D', 3)) + (6000, 3) """ if isinstance(freqstr, DateOffset): - freqstr = (get_offset_name(freqstr), freqstr.n) + freqstr = (freqstr.rule_code, freqstr.n) if isinstance(freqstr, tuple): if (com.is_integer(freqstr[0]) and @@ -201,14 +314,12 @@ def _get_freq_str(base, mult=1): } need_suffix = ['QS', 'BQ', 'BQS', 'AS', 'BA', 'BAS'] -_months = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', - 'OCT', 'NOV', 'DEC'] for __prefix in need_suffix: - for _m in _months: + for _m in tslib._MONTHS: _offset_to_period_map['%s-%s' % (__prefix, _m)] = \ _offset_to_period_map[__prefix] for __prefix in ['A', 'Q']: - for _m in _months: + for _m in tslib._MONTHS: _alias = '%s-%s' % (__prefix, _m) _offset_to_period_map[_alias] = _alias @@ -386,6 +497,7 @@ def get_base_alias(freqstr): """ return _base_and_stride(freqstr)[0] + _dont_uppercase = set(('MS', 'ms')) @@ -637,14 +749,6 @@ def _period_alias_dictionary(): return alias_dict -def _infer_period_group(freqstr): - return _period_group(Resolution._reso_freq_map[freqstr]) - - -def _period_group(freqstr): - base, mult = get_freq_code(freqstr) - return base // 1000 * 1000 - _period_alias_dict = _period_alias_dictionary() @@ -671,7 +775,7 @@ def _period_str_to_code(freqstr): def infer_freq(index, warn=True): """ Infer the most likely frequency given the input index. If the frequency is - uncertain, a warning will be printed. + uncertain, a warning will be printed. Parameters ---------- @@ -1082,12 +1186,7 @@ def is_superperiod(source, target): return target in ['N'] -def _get_rule_month(source, default='DEC'): - source = source.upper() - if '-' not in source: - return default - else: - return source.split('-')[1] +_get_rule_month = tslib._get_rule_month def _is_annual(rule): @@ -1118,15 +1217,10 @@ def _is_weekly(rule): DAYS = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'] -MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', - 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'] - -_month_numbers = dict((k, i) for i, k in enumerate(MONTHS)) - - +MONTHS = tslib._MONTHS +_month_numbers = tslib._MONTH_NUMBERS +_month_aliases = tslib._MONTH_ALIASES _weekday_rule_aliases = dict((k, v) for k, v in enumerate(DAYS)) -_month_aliases = dict((k + 1, v) for k, v in enumerate(MONTHS)) - def _is_multiple(us, mult): return us % mult == 0 diff --git a/pandas/tseries/holiday.py b/pandas/tseries/holiday.py index f55569302ca05..e98c5dd93e68a 100644 --- a/pandas/tseries/holiday.py +++ b/pandas/tseries/holiday.py @@ -405,15 +405,15 @@ def merge(self, other, inplace=False): else: return holidays -USMemorialDay = Holiday('MemorialDay', month=5, day=24, - offset=DateOffset(weekday=MO(1))) +USMemorialDay = Holiday('MemorialDay', month=5, day=31, + offset=DateOffset(weekday=MO(-1))) USLaborDay = Holiday('Labor Day', month=9, day=1, offset=DateOffset(weekday=MO(1))) USColumbusDay = Holiday('Columbus Day', month=10, day=1, offset=DateOffset(weekday=MO(2))) USThanksgivingDay = Holiday('Thanksgiving', month=11, day=1, offset=DateOffset(weekday=TH(4))) -USMartinLutherKingJr = Holiday('Dr. Martin Luther King Jr.', month=1, day=1, +USMartinLutherKingJr = Holiday('Dr. Martin Luther King Jr.', start_date=datetime(1986,1,1), month=1, day=1, offset=DateOffset(weekday=MO(3))) USPresidentsDay = Holiday('President''s Day', month=2, day=1, offset=DateOffset(weekday=MO(3))) diff --git a/pandas/tseries/index.py b/pandas/tseries/index.py index 1a0d87c0d26d3..0525a29ef3fd0 100644 --- a/pandas/tseries/index.py +++ b/pandas/tseries/index.py @@ -1,20 +1,24 @@ # pylint: disable=E1101 import operator +import warnings from datetime import time, datetime from datetime import timedelta import numpy as np from pandas.core.common import (_NS_DTYPE, _INT64_DTYPE, _values_from_object, _maybe_box, - ABCSeries, is_integer, is_float) + ABCSeries, is_integer, is_float, + is_object_dtype, is_datetime64_dtype) +from pandas.io.common import PerformanceWarning from pandas.core.index import Index, Int64Index, Float64Index import pandas.compat as compat from pandas.compat import u from pandas.tseries.frequencies import ( to_offset, get_period_alias, Resolution) -from pandas.tseries.base import DatetimeIndexOpsMixin +from pandas.tseries.base import DatelikeOps, DatetimeIndexOpsMixin from pandas.tseries.offsets import DateOffset, generate_range, Tick, CDay from pandas.tseries.tools import parse_time_string, normalize_date +from pandas.tseries.timedeltas import to_timedelta from pandas.util.decorators import cache_readonly, deprecate_kwarg import pandas.core.common as com import pandas.tseries.offsets as offsets @@ -116,7 +120,7 @@ def _new_DatetimeIndex(cls, d): result.tz = tz return result -class DatetimeIndex(DatetimeIndexOpsMixin, Int64Index): +class DatetimeIndex(DatelikeOps, DatetimeIndexOpsMixin, Int64Index): """ Immutable ndarray of datetime64 data, represented internally as int64, and which can be boxed to Timestamp objects that are subclasses of datetime and @@ -179,8 +183,8 @@ def _join_i8_wrapper(joinf, **kwargs): tz = None offset = None - _comparables = ['name','freqstr','tz'] - _attributes = ['name','freq','tz'] + _comparables = ['name', 'freqstr', 'tz'] + _attributes = ['name', 'freq', 'tz'] _datetimelike_ops = ['year','month','day','hour','minute','second', 'weekofyear','week','dayofweek','weekday','dayofyear','quarter', 'days_in_month', 'daysinmonth', 'date','time','microsecond','nanosecond','is_month_start','is_month_end', @@ -239,8 +243,9 @@ def __new__(cls, data=None, # try a few ways to make it datetime64 if lib.is_string_array(data): - data = _str_to_dt_array(data, freq, dayfirst=dayfirst, - yearfirst=yearfirst) + data = tslib.parse_str_array_to_datetime(data, freq=freq, + dayfirst=dayfirst, + yearfirst=yearfirst) else: data = tools.to_datetime(data, errors='raise') data.offset = freq @@ -254,8 +259,9 @@ def __new__(cls, data=None, return data if issubclass(data.dtype.type, compat.string_types): - data = _str_to_dt_array(data, freq, dayfirst=dayfirst, - yearfirst=yearfirst) + data = tslib.parse_str_array_to_datetime(data, freq=freq, + dayfirst=dayfirst, + yearfirst=yearfirst) if issubclass(data.dtype.type, np.datetime64): if isinstance(data, ABCSeries): @@ -288,8 +294,9 @@ def __new__(cls, data=None, values = data if lib.is_string_array(values): - subarr = _str_to_dt_array(values, freq, dayfirst=dayfirst, - yearfirst=yearfirst) + subarr = tslib.parse_str_array_to_datetime(values, freq=freq, dayfirst=dayfirst, + yearfirst=yearfirst) + else: try: subarr = tools.to_datetime(data, box=False) @@ -298,11 +305,11 @@ def __new__(cls, data=None, if isinstance(subarr, ABCSeries): subarr = subarr.values if subarr.dtype == np.object_: - subarr = tools.to_datetime(subarr, box=False) + subarr = tools._to_datetime(subarr, box=False) except ValueError: # tz aware - subarr = tools.to_datetime(data, box=False, utc=True) + subarr = tools._to_datetime(data, box=False, utc=True) if not np.issubdtype(subarr.dtype, np.datetime64): raise ValueError('Unable to convert %s to datetime dtype' @@ -332,7 +339,7 @@ def __new__(cls, data=None, if inferred != freq.freqstr: on_freq = cls._generate(subarr[0], None, len(subarr), None, freq, tz=tz) if not np.array_equal(subarr.asi8, on_freq.asi8): - raise ValueError('Inferred frequency {0} from passed dates does not' + raise ValueError('Inferred frequency {0} from passed dates does not ' 'conform to passed frequency {1}'.format(inferred, freq.freqstr)) if freq_infer: @@ -491,9 +498,16 @@ def _local_timestamps(self): @classmethod def _simple_new(cls, values, name=None, freq=None, tz=None, **kwargs): + """ + we require the we have a dtype compat for the values + if we are passed a non-dtype compat, then coerce using the constructor + """ + if not getattr(values,'dtype',None): values = np.array(values,copy=False) - if values.dtype != _NS_DTYPE: + if is_object_dtype(values): + return cls(values, name=name, freq=freq, tz=tz, **kwargs).values + elif not is_datetime64_dtype(values): values = com._ensure_int64(values).view(_NS_DTYPE) result = object.__new__(cls) @@ -534,7 +548,7 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None, xdr = generate_range(offset=offset, start=_CACHE_START, end=_CACHE_END) - arr = tools.to_datetime(list(xdr), box=False) + arr = tools._to_datetime(list(xdr), box=False) cachedRange = DatetimeIndex._simple_new(arr) cachedRange.offset = offset @@ -661,8 +675,11 @@ def _add_delta(self, delta): new_values = self._add_delta_tdi(delta) # update name when delta is Index name = com._maybe_match_name(self, delta) + elif isinstance(delta, DateOffset): + new_values = self._add_offset(delta).asi8 else: new_values = self.astype('O') + delta + tz = 'UTC' if self.tz is not None else None result = DatetimeIndex(new_values, tz=tz, name=name, freq='infer') utc = _utc() @@ -670,6 +687,14 @@ def _add_delta(self, delta): result = result.tz_convert(self.tz) return result + def _add_offset(self, offset): + try: + return offset.apply_index(self) + except NotImplementedError: + warnings.warn("Non-vectorized DateOffset being applied to Series or DatetimeIndex", + PerformanceWarning) + return self.astype('O') + offset + def _format_native_types(self, na_rep=u('NaT'), date_format=None, **kwargs): from pandas.core.format import _get_format_datetime64_from_values @@ -823,6 +848,24 @@ def union(self, other): result.offset = to_offset(result.inferred_freq) return result + def to_perioddelta(self, freq): + """ + Calcuates TimedeltaIndex of difference between index + values and index converted to PeriodIndex at specified + freq. Used for vectorized offsets + + .. versionadded:: 0.17.0 + + Parameters + ---------- + freq : Period frequency + + Returns + ------- + y : TimedeltaIndex + """ + return to_timedelta(self.asi8 - self.to_period(freq).to_timestamp().asi8) + def union_many(self, others): """ A bit of a hack to accelerate unioning a collection of indexes @@ -1227,7 +1270,7 @@ def get_value_maybe_box(self, series, key): values = self._engine.get_value(_values_from_object(series), key) return _maybe_box(self, values, series, key) - def get_loc(self, key, method=None): + def get_loc(self, key, method=None, tolerance=None): """ Get integer location for requested label @@ -1235,10 +1278,15 @@ def get_loc(self, key, method=None): ------- loc : int """ + if tolerance is not None: + # try converting tolerance now, so errors don't get swallowed by + # the try/except clauses below + tolerance = self._convert_tolerance(tolerance) + if isinstance(key, datetime): # needed to localize naive datetimes key = Timestamp(key, tz=self.tz) - return Index.get_loc(self, key, method=method) + return Index.get_loc(self, key, method, tolerance) if isinstance(key, time): if method is not None: @@ -1247,7 +1295,7 @@ def get_loc(self, key, method=None): return self.indexer_at_time(key) try: - return Index.get_loc(self, key, method=method) + return Index.get_loc(self, key, method, tolerance) except (KeyError, ValueError, TypeError): try: return self._get_string_slice(key) @@ -1256,7 +1304,7 @@ def get_loc(self, key, method=None): try: stamp = Timestamp(key, tz=self.tz) - return Index.get_loc(self, stamp, method=method) + return Index.get_loc(self, stamp, method, tolerance) except (KeyError, ValueError): raise KeyError(key) @@ -1389,7 +1437,8 @@ def time(self): """ # can't call self.map() which tries to treat func as ufunc # and causes recursion warnings on python 2.6 - return self._maybe_mask_results(_algos.arrmap_object(self.asobject.values, lambda x: x.time())) + return self._maybe_mask_results(_algos.arrmap_object(self.asobject.values, + lambda x: np.nan if x is tslib.NaT else x.time())) @property def date(self): @@ -1497,7 +1546,7 @@ def insert(self, loc, item): if zone != izone: raise ValueError('Passed item and index have different timezone') # check freq can be preserved on edge cases - if self.freq is not None: + if self.size and self.freq is not None: if (loc == 0 or loc == -len(self)) and item + self.freq == self[0]: freq = self.freq elif (loc == len(self)) and item - self.freq == self[-1]: @@ -1538,7 +1587,7 @@ def delete(self, loc): freq = self.freq else: if com.is_list_like(loc): - loc = lib.maybe_indices_to_slice(com._ensure_int64(np.array(loc))) + loc = lib.maybe_indices_to_slice(com._ensure_int64(np.array(loc)), len(self)) if isinstance(loc, slice) and loc.step in (1, None): if (loc.start in (0, None) or loc.stop in (len(self), None)): freq = self.freq @@ -1926,17 +1975,6 @@ def _to_m8(key, tz=None): return np.int64(tslib.pydt_to_i8(key)).view(_NS_DTYPE) -def _str_to_dt_array(arr, offset=None, dayfirst=None, yearfirst=None): - def parser(x): - result = parse_time_string(x, offset, dayfirst=dayfirst, - yearfirst=yearfirst) - return result[0] - - arr = np.asarray(arr, dtype=object) - data = _algos.arrmap_object(arr, parser) - return tools.to_datetime(data) - - _CACHE_START = Timestamp(datetime(1950, 1, 1)) _CACHE_END = Timestamp(datetime(2030, 1, 1)) diff --git a/pandas/tseries/offsets.py b/pandas/tseries/offsets.py index 3bebd0daa6d29..33faac153cce0 100644 --- a/pandas/tseries/offsets.py +++ b/pandas/tseries/offsets.py @@ -4,6 +4,8 @@ import numpy as np from pandas.tseries.tools import to_datetime +from pandas.tseries.timedeltas import to_timedelta +from pandas.core.common import ABCSeries, ABCDatetimeIndex # import after tools, dateutil check from dateutil.relativedelta import relativedelta, weekday @@ -93,6 +95,15 @@ def wrapper(self, other): return wrapper +def apply_index_wraps(func): + @functools.wraps(func) + def wrapper(self, other): + result = func(self, other) + if self.normalize: + result = result.to_period('D').to_timestamp() + return result + return wrapper + def _is_normalized(dt): if (dt.hour != 0 or dt.minute != 0 or dt.second != 0 or dt.microsecond != 0 or getattr(dt, 'nanosecond', 0) != 0): @@ -221,6 +232,67 @@ def apply(self, other): else: return other + timedelta(self.n) + @apply_index_wraps + def apply_index(self, i): + """ + Vectorized apply of DateOffset to DatetimeIndex, + raises NotImplentedError for offsets without a + vectorized implementation + + .. versionadded:: 0.17.0 + + Parameters + ---------- + i : DatetimeIndex + + Returns + ------- + y : DatetimeIndex + """ + + if not type(self) is DateOffset: + raise NotImplementedError("DateOffset subclass %s " + "does not have a vectorized " + "implementation" + % (self.__class__.__name__,)) + relativedelta_fast = set(['years', 'months', 'weeks', + 'days', 'hours', 'minutes', + 'seconds', 'microseconds']) + # relativedelta/_offset path only valid for base DateOffset + if (self._use_relativedelta and + set(self.kwds).issubset(relativedelta_fast)): + months = ((self.kwds.get('years', 0) * 12 + + self.kwds.get('months', 0)) * self.n) + if months: + base = (i.to_period('M') + months).to_timestamp() + time = i.to_perioddelta('D') + days = i.to_perioddelta('M') - time + # minimum prevents month-end from wrapping + day_offset = np.minimum(days, + to_timedelta(base.days_in_month - 1, unit='D')) + i = base + day_offset + time + + weeks = (self.kwds.get('weeks', 0)) * self.n + if weeks: + i = (i.to_period('W') + weeks).to_timestamp() + i.to_perioddelta('W') + + timedelta_kwds = dict((k,v) for k,v in self.kwds.items() + if k in ['days','hours','minutes', + 'seconds','microseconds']) + if timedelta_kwds: + delta = Timedelta(**timedelta_kwds) + i = i + (self.n * delta) + return i + elif not self._use_relativedelta and hasattr(self, '_offset'): + # timedelta + return i + (self._offset * self.n) + else: + # relativedelta with other keywords + raise NotImplementedError("DateOffset with relativedelta " + "keyword(s) %s not able to be " + "applied vectorized" % + (set(self.kwds) - relativedelta_fast),) + def isAnchored(self): return (self.n == 1) @@ -307,6 +379,8 @@ def __call__(self, other): return self.apply(other) def __add__(self, other): + if isinstance(other, (ABCDatetimeIndex, ABCSeries)): + return other + self try: return self.apply(other) except ApplyTypeError: @@ -324,6 +398,8 @@ def __sub__(self, other): return NotImplemented def __rsub__(self, other): + if isinstance(other, (ABCDatetimeIndex, ABCSeries)): + return other - self return self.__class__(-self.n, normalize=self.normalize, **self.kwds) + other def __mul__(self, someInt): @@ -363,6 +439,37 @@ def onOffset(self, dt): b = ((dt + self) - self) return a == b + # helpers for vectorized offsets + def _beg_apply_index(self, i, freq): + """Offsets index to beginning of Period frequency""" + + off = i.to_perioddelta('D') + base_period = i.to_period(freq) + if self.n < 0: + # when subtracting, dates on start roll to prior + roll = np.where(base_period.to_timestamp() == i - off, + self.n, self.n + 1) + else: + roll = self.n + + base = (base_period + roll).to_timestamp() + return base + off + + def _end_apply_index(self, i, freq): + """Offsets index to end of Period frequency""" + + off = i.to_perioddelta('D') + base_period = i.to_period(freq) + if self.n > 0: + # when adding, dtates on end roll to next + roll = np.where(base_period.to_timestamp(how='end') == i - off, + self.n, self.n - 1) + else: + roll = self.n + + base = (base_period + roll).to_timestamp(how='end') + return base + off + # way to get around weirdness with rule_code @property def _prefix(self): @@ -529,6 +636,19 @@ def apply(self, other): raise ApplyTypeError('Only know how to combine business day with ' 'datetime or timedelta.') + @apply_index_wraps + def apply_index(self, i): + time = i.to_perioddelta('D') + # to_period rolls forward to next BDay; track and + # reduce n where it does when rolling forward + shifted = (i.to_perioddelta('B') - time).asi8 != 0 + if self.n > 0: + roll = np.where(shifted, self.n - 1, self.n) + else: + roll = self.n + + return (i.to_period('B') + roll).to_timestamp() + time + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -902,6 +1022,9 @@ def apply(self, other): raise ApplyTypeError('Only know how to combine trading day with ' 'datetime, datetime64 or timedelta.') + def apply_index(self, i): + raise NotImplementedError + @staticmethod def _to_dt64(dt, dtype='datetime64'): # Currently @@ -949,6 +1072,10 @@ def apply(self, other): other = other + relativedelta(months=n, day=31) return other + @apply_index_wraps + def apply_index(self, i): + return self._end_apply_index(i, 'M') + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -970,6 +1097,10 @@ def apply(self, other): return other + relativedelta(months=n, day=1) + @apply_index_wraps + def apply_index(self, i): + return self._beg_apply_index(i, 'M') + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -1211,6 +1342,13 @@ def apply(self, other): base.hour, base.minute, base.second, base.microsecond) return other + @apply_index_wraps + def apply_index(self, i): + if self.weekday is None: + return (i.to_period('W') + self.n).to_timestamp() + i.to_perioddelta('W') + else: + return self._end_apply_index(i, self.freqstr) + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -1508,22 +1646,7 @@ def onOffset(self, dt): modMonth = (dt.month - self.startingMonth) % 3 return BMonthEnd().onOffset(dt) and modMonth == 0 - -_int_to_month = { - 1: 'JAN', - 2: 'FEB', - 3: 'MAR', - 4: 'APR', - 5: 'MAY', - 6: 'JUN', - 7: 'JUL', - 8: 'AUG', - 9: 'SEP', - 10: 'OCT', - 11: 'NOV', - 12: 'DEC' -} - +_int_to_month = tslib._MONTH_ALIASES _month_to_int = dict((v, k) for k, v in _int_to_month.items()) @@ -1602,6 +1725,10 @@ def apply(self, other): other = other + relativedelta(months=monthsToGo + 3 * n, day=31) return other + @apply_index_wraps + def apply_index(self, i): + return self._end_apply_index(i, self.freqstr) + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -1636,6 +1763,11 @@ def apply(self, other): other = other + relativedelta(months=3 * n - monthsSince, day=1) return other + @apply_index_wraps + def apply_index(self, i): + freq_month = 12 if self.startingMonth == 1 else self.startingMonth - 1 + freqstr = 'Q-%s' % (_int_to_month[freq_month],) + return self._beg_apply_index(i, freqstr) class YearOffset(DateOffset): """DateOffset that just needs a month""" @@ -1779,6 +1911,11 @@ def _rollf(date): result = _rollf(result) return result + @apply_index_wraps + def apply_index(self, i): + # convert month anchor to annual period tuple + return self._end_apply_index(i, self.freqstr) + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -1824,6 +1961,12 @@ def _rollf(date): result = _rollf(result) return result + @apply_index_wraps + def apply_index(self, i): + freq_month = 12 if self.month == 1 else self.month - 1 + freqstr = 'A-%s' % (_int_to_month[freq_month],) + return self._beg_apply_index(i, freqstr) + def onOffset(self, dt): if self.normalize and not _is_normalized(dt): return False @@ -2326,6 +2469,7 @@ def apply(self, other): _prefix = 'undefined' + def isAnchored(self): return False @@ -2450,12 +2594,12 @@ def generate_range(start=None, end=None, periods=None, if start and not offset.onOffset(start): start = offset.rollforward(start) - if end and not offset.onOffset(end): + elif end and not offset.onOffset(end): end = offset.rollback(end) - if periods is None and end < start: - end = None - periods = 0 + if periods is None and end < start: + end = None + periods = 0 if end is None: end = start + (periods - 1) * offset @@ -2465,7 +2609,6 @@ def generate_range(start=None, end=None, periods=None, cur = start - next_date = cur while cur <= end: yield cur diff --git a/pandas/tseries/period.py b/pandas/tseries/period.py index 95bbc5016237c..56d7d45120fdc 100644 --- a/pandas/tseries/period.py +++ b/pandas/tseries/period.py @@ -4,7 +4,7 @@ import pandas.tseries.frequencies as frequencies from pandas.tseries.frequencies import get_freq_code as _gfc from pandas.tseries.index import DatetimeIndex, Int64Index, Index -from pandas.tseries.base import DatetimeIndexOpsMixin +from pandas.tseries.base import DatelikeOps, DatetimeIndexOpsMixin from pandas.tseries.tools import parse_time_string import pandas.tseries.offsets as offsets @@ -19,8 +19,10 @@ import pandas.core.common as com from pandas.core.common import (isnull, _INT64_DTYPE, _maybe_box, _values_from_object, ABCSeries, - is_integer, is_float) + is_integer, is_float, is_object_dtype) from pandas import compat +from pandas.util.decorators import cache_readonly + from pandas.lib import Timestamp, Timedelta import pandas.lib as lib import pandas.tslib as tslib @@ -92,7 +94,7 @@ def wrapper(self, other): return wrapper -class PeriodIndex(DatetimeIndexOpsMixin, Int64Index): +class PeriodIndex(DatelikeOps, DatetimeIndexOpsMixin, Int64Index): """ Immutable ndarray holding ordinal values indicating regular periods in time such as particular years, quarters, months, etc. A value of 1 is the @@ -259,13 +261,36 @@ def _from_arraylike(cls, data, freq, tz): @classmethod def _simple_new(cls, values, name=None, freq=None, **kwargs): + if not getattr(values,'dtype',None): + values = np.array(values,copy=False) + if is_object_dtype(values): + return PeriodIndex(values, name=name, freq=freq, **kwargs) + result = object.__new__(cls) result._data = values result.name = name + + if freq is None: + raise ValueError('freq not specified') result.freq = freq + result._reset_identity() return result + def _shallow_copy(self, values=None, infer=False, **kwargs): + """ we always want to return a PeriodIndex """ + return super(PeriodIndex, self)._shallow_copy(values=values, infer=False, **kwargs) + + def _coerce_scalar_to_index(self, item): + """ + we need to coerce a scalar to a compat for our index type + + Parameters + ---------- + item : scalar item to coerce + """ + return PeriodIndex([item], **self._get_attributes_dict()) + @property def _na_value(self): return self._box_func(tslib.iNaT) @@ -477,22 +502,26 @@ def to_timestamp(self, freq=None, how='start'): new_data = period.periodarr_to_dt64arr(new_data.values, base) return DatetimeIndex(new_data, freq='infer', name=self.name) - def _add_delta(self, other): + def _maybe_convert_timedelta(self, other): if isinstance(other, (timedelta, np.timedelta64, offsets.Tick, Timedelta)): offset = frequencies.to_offset(self.freq) if isinstance(offset, offsets.Tick): nanos = tslib._delta_to_nanoseconds(other) offset_nanos = tslib._delta_to_nanoseconds(offset) if nanos % offset_nanos == 0: - return self.shift(nanos // offset_nanos) + return nanos // offset_nanos elif isinstance(other, offsets.DateOffset): freqstr = frequencies.get_standard_freq(other) base = frequencies.get_base_alias(freqstr) if base == self.freq: - return self.shift(other.n) + return other.n raise ValueError("Input has different freq from PeriodIndex(freq={0})".format(self.freq)) + def _add_delta(self, other): + ordinal_delta = self._maybe_convert_timedelta(other) + return self.shift(ordinal_delta) + def shift(self, n): """ Specialized shift which produces an PeriodIndex @@ -511,6 +540,11 @@ def shift(self, n): values[mask] = tslib.iNaT return PeriodIndex(data=values, name=self.name, freq=self.freq) + @cache_readonly + def dtype_str(self): + """ return the dtype str of the underlying data """ + return self.inferred_type + @property def inferred_type(self): # b/c data is represented as ints make sure we can't have ambiguous @@ -528,8 +562,8 @@ def get_value(self, series, key): except (KeyError, IndexError): try: asdt, parsed, reso = parse_time_string(key, self.freq) - grp = frequencies._infer_period_group(reso) - freqn = frequencies._period_group(self.freq) + grp = frequencies.Resolution.get_freq_group(reso) + freqn = frequencies.get_freq_group(self.freq) vals = self.values @@ -556,13 +590,13 @@ def get_value(self, series, key): key = Period(key, self.freq).ordinal return _maybe_box(self, self._engine.get_value(s, key), series, key) - def get_indexer(self, target, method=None, limit=None): + def get_indexer(self, target, method=None, limit=None, tolerance=None): if hasattr(target, 'freq') and target.freq != self.freq: raise ValueError('target and index have different freq: ' '(%s, %s)' % (target.freq, self.freq)) - return Index.get_indexer(self, target, method, limit) + return Index.get_indexer(self, target, method, limit, tolerance) - def get_loc(self, key, method=None): + def get_loc(self, key, method=None, tolerance=None): """ Get integer location for requested label @@ -584,7 +618,7 @@ def get_loc(self, key, method=None): key = Period(key, self.freq) try: - return Index.get_loc(self, key.ordinal, method=method) + return Index.get_loc(self, key.ordinal, method, tolerance) except KeyError: raise KeyError(key) @@ -655,8 +689,8 @@ def _get_string_slice(self, key): key, parsed, reso = parse_time_string(key, self.freq) - grp = frequencies._infer_period_group(reso) - freqn = frequencies._period_group(self.freq) + grp = frequencies.Resolution.get_freq_group(reso) + freqn = frequencies.get_freq_group(self.freq) if reso in ['day', 'hour', 'minute', 'second'] and not grp < freqn: raise KeyError(key) @@ -664,6 +698,10 @@ def _get_string_slice(self, key): return slice(self.searchsorted(t1.ordinal, side='left'), self.searchsorted(t2.ordinal, side='right')) + def _convert_tolerance(self, tolerance): + tolerance = DatetimeIndexOpsMixin._convert_tolerance(self, tolerance) + return self._maybe_convert_timedelta(tolerance) + def join(self, other, how='left', level=None, return_indexers=False): """ See Index.join @@ -718,14 +756,18 @@ def __getitem__(self, key): return PeriodIndex(result, name=self.name, freq=self.freq) - def _format_native_types(self, na_rep=u('NaT'), **kwargs): + def _format_native_types(self, na_rep=u('NaT'), date_format=None, **kwargs): values = np.array(list(self), dtype=object) mask = isnull(self.values) values[mask] = na_rep - imask = ~mask - values[imask] = np.array([u('%s') % dt for dt in values[imask]]) + + if date_format: + formatter = lambda dt: dt.strftime(date_format) + else: + formatter = lambda dt: u('%s') % dt + values[imask] = np.array([formatter(dt) for dt in values[imask]]) return values def __array_finalize__(self, obj): diff --git a/pandas/tseries/plotting.py b/pandas/tseries/plotting.py index 9d28fa11f646f..ad27b412cddb9 100644 --- a/pandas/tseries/plotting.py +++ b/pandas/tseries/plotting.py @@ -4,12 +4,16 @@ """ #!!! TODO: Use the fact that axis can have units to simplify the process + +import numpy as np + from matplotlib import pylab from pandas.tseries.period import Period from pandas.tseries.offsets import DateOffset import pandas.tseries.frequencies as frequencies from pandas.tseries.index import DatetimeIndex import pandas.core.common as com +import pandas.compat as compat from pandas.tseries.converter import (TimeSeries_DateLocator, TimeSeries_DateFormatter) @@ -18,7 +22,7 @@ # Plotting functions and monkey patches -def tsplot(series, plotf, **kwargs): +def tsplot(series, plotf, ax=None, **kwargs): """ Plots a Series on the given Matplotlib axes or the current axes @@ -33,46 +37,33 @@ def tsplot(series, plotf, **kwargs): """ # Used inferred freq is possible, need a test case for inferred - if 'ax' in kwargs: - ax = kwargs.pop('ax') - else: + if ax is None: import matplotlib.pyplot as plt ax = plt.gca() - freq = _get_freq(ax, series) - # resample against axes freq if necessary - if freq is None: # pragma: no cover - raise ValueError('Cannot use dynamic axis without frequency info') - else: - # Convert DatetimeIndex to PeriodIndex - if isinstance(series.index, DatetimeIndex): - series = series.to_period(freq=freq) - freq, ax_freq, series = _maybe_resample(series, ax, freq, plotf, - kwargs) + freq, series = _maybe_resample(series, ax, kwargs) # Set ax with freq info _decorate_axes(ax, freq, kwargs) - - # how to make sure ax.clear() flows through? - if not hasattr(ax, '_plot_data'): - ax._plot_data = [] ax._plot_data.append((series, plotf, kwargs)) lines = plotf(ax, series.index._mpl_repr(), series.values, **kwargs) # set date formatter, locators and rescale limits format_dateaxis(ax, ax.freq) + return lines - # x and y coord info - ax.format_coord = lambda t, y: ("t = {0} " - "y = {1:8f}".format(Period(ordinal=int(t), - freq=ax.freq), - y)) - return lines +def _maybe_resample(series, ax, kwargs): + # resample against axes freq if necessary + freq, ax_freq = _get_freq(ax, series) + + if freq is None: # pragma: no cover + raise ValueError('Cannot use dynamic axis without frequency info') + # Convert DatetimeIndex to PeriodIndex + if isinstance(series.index, DatetimeIndex): + series = series.to_period(freq=freq) -def _maybe_resample(series, ax, freq, plotf, kwargs): - ax_freq = _get_ax_freq(ax) if ax_freq is not None and freq != ax_freq: if frequencies.is_superperiod(freq, ax_freq): # upsample input series = series.copy() @@ -84,21 +75,11 @@ def _maybe_resample(series, ax, freq, plotf, kwargs): series = series.resample(ax_freq, how=how).dropna() freq = ax_freq elif frequencies.is_subperiod(freq, ax_freq) or _is_sub(freq, ax_freq): - _upsample_others(ax, freq, plotf, kwargs) + _upsample_others(ax, freq, kwargs) ax_freq = freq else: # pragma: no cover raise ValueError('Incompatible frequency conversion') - return freq, ax_freq, series - - -def _get_ax_freq(ax): - ax_freq = getattr(ax, 'freq', None) - if ax_freq is None: - if hasattr(ax, 'left_ax'): - ax_freq = getattr(ax.left_ax, 'freq', None) - elif hasattr(ax, 'right_ax'): - ax_freq = getattr(ax.right_ax, 'freq', None) - return ax_freq + return freq, series def _is_sub(f1, f2): @@ -111,9 +92,10 @@ def _is_sup(f1, f2): (f2.startswith('W') and frequencies.is_superperiod(f1, 'D'))) -def _upsample_others(ax, freq, plotf, kwargs): +def _upsample_others(ax, freq, kwargs): legend = ax.get_legend() lines, labels = _replot_ax(ax, freq, kwargs) + _replot_ax(ax, freq, kwargs) other_ax = None if hasattr(ax, 'left_ax'): @@ -136,8 +118,11 @@ def _upsample_others(ax, freq, plotf, kwargs): def _replot_ax(ax, freq, kwargs): data = getattr(ax, '_plot_data', None) + + # clear current axes and data ax._plot_data = [] ax.clear() + _decorate_axes(ax, freq, kwargs) lines = [] @@ -147,7 +132,13 @@ def _replot_ax(ax, freq, kwargs): series = series.copy() idx = series.index.asfreq(freq, how='S') series.index = idx - ax._plot_data.append(series) + ax._plot_data.append((series, plotf, kwds)) + + # for tsplot + if isinstance(plotf, compat.string_types): + from pandas.tools.plotting import _plot_klass + plotf = _plot_klass[plotf]._plot + lines.append(plotf(ax, series.index._mpl_repr(), series.values, **kwds)[0]) labels.append(com.pprint_thing(series.name)) @@ -155,6 +146,10 @@ def _replot_ax(ax, freq, kwargs): def _decorate_axes(ax, freq, kwargs): + """Initialize axes for time-series plotting""" + if not hasattr(ax, '_plot_data'): + ax._plot_data = [] + ax.freq = freq xaxis = ax.get_xaxis() xaxis.freq = freq @@ -173,6 +168,11 @@ def _get_freq(ax, series): freq = getattr(series.index, 'inferred_freq', None) ax_freq = getattr(ax, 'freq', None) + if ax_freq is None: + if hasattr(ax, 'left_ax'): + ax_freq = getattr(ax.left_ax, 'freq', None) + elif hasattr(ax, 'right_ax'): + ax_freq = getattr(ax.right_ax, 'freq', None) # use axes freq if no data freq if freq is None: @@ -185,10 +185,76 @@ def _get_freq(ax, series): freq = frequencies.get_base_alias(freq) freq = frequencies.get_period_alias(freq) + return freq, ax_freq + + +def _use_dynamic_x(ax, data): + freq = _get_index_freq(data) + ax_freq = getattr(ax, 'freq', None) + + if freq is None: # convert irregular if axes has freq info + freq = ax_freq + else: # do not use tsplot if irregular was plotted first + if (ax_freq is None) and (len(ax.get_lines()) > 0): + return False + + if freq is None: + return False + + if isinstance(freq, DateOffset): + freq = freq.rule_code + else: + freq = frequencies.get_base_alias(freq) + freq = frequencies.get_period_alias(freq) + if freq is None: + return False + + # hack this for 0.10.1, creating more technical debt...sigh + if isinstance(data.index, DatetimeIndex): + base = frequencies.get_freq(freq) + x = data.index + if (base <= frequencies.FreqGroup.FR_DAY): + return x[:1].is_normalized + return Period(x[0], freq).to_timestamp(tz=x.tz) == x[0] + return True + + +def _get_index_freq(data): + freq = getattr(data.index, 'freq', None) + if freq is None: + freq = getattr(data.index, 'inferred_freq', None) + if freq == 'B': + weekdays = np.unique(data.index.dayofweek) + if (5 in weekdays) or (6 in weekdays): + freq = None return freq +def _maybe_convert_index(ax, data): + # tsplot converts automatically, but don't want to convert index + # over and over for DataFrames + if isinstance(data.index, DatetimeIndex): + freq = getattr(data.index, 'freq', None) + + if freq is None: + freq = getattr(data.index, 'inferred_freq', None) + if isinstance(freq, DateOffset): + freq = freq.rule_code + + if freq is None: + freq = getattr(ax, 'freq', None) + + if freq is None: + raise ValueError('Could not get frequency alias for plotting') + + freq = frequencies.get_base_alias(freq) + freq = frequencies.get_period_alias(freq) + + data = data.to_period(freq=freq) + return data + + # Patch methods for subplot. Only format_dateaxis is currently used. # Do we need the rest for convenience? @@ -219,4 +285,9 @@ def format_dateaxis(subplot, freq): plot_obj=subplot) subplot.xaxis.set_major_formatter(majformatter) subplot.xaxis.set_minor_formatter(minformatter) + + # x and y coord info + subplot.format_coord = lambda t, y: ("t = {0} " + "y = {1:8f}".format(Period(ordinal=int(t), freq=freq), y)) + pylab.draw_if_interactive() diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 53c1292204f71..0ecdb43895f07 100644 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -238,6 +238,10 @@ def _get_time_delta_bins(self, ax): end_stamps = labels + 1 bins = ax.searchsorted(end_stamps, side='left') + # Addresses GH #10530 + if self.base > 0: + labels += type(self.freq)(self.base) + return binner, bins, labels def _get_time_period_bins(self, ax): diff --git a/pandas/tseries/tdi.py b/pandas/tseries/tdi.py index f1871e78e21a1..b0c9d8852f8c9 100644 --- a/pandas/tseries/tdi.py +++ b/pandas/tseries/tdi.py @@ -126,8 +126,8 @@ def _join_i8_wrapper(joinf, **kwargs): _engine_type = _index.TimedeltaEngine - _comparables = ['name','freq'] - _attributes = ['name','freq'] + _comparables = ['name', 'freq'] + _attributes = ['name', 'freq'] _is_numeric_dtype = True freq = None @@ -645,7 +645,7 @@ def get_value_maybe_box(self, series, key): values = self._engine.get_value(_values_from_object(series), key) return _maybe_box(self, values, series, key) - def get_loc(self, key, method=None): + def get_loc(self, key, method=None, tolerance=None): """ Get integer location for requested label @@ -653,12 +653,17 @@ def get_loc(self, key, method=None): ------- loc : int """ + if tolerance is not None: + # try converting tolerance now, so errors don't get swallowed by + # the try/except clauses below + tolerance = self._convert_tolerance(tolerance) + if _is_convertible_to_td(key): key = Timedelta(key) - return Index.get_loc(self, key, method=method) + return Index.get_loc(self, key, method, tolerance) try: - return Index.get_loc(self, key, method=method) + return Index.get_loc(self, key, method, tolerance) except (KeyError, ValueError, TypeError): try: return self._get_string_slice(key) @@ -667,7 +672,7 @@ def get_loc(self, key, method=None): try: stamp = Timedelta(key) - return Index.get_loc(self, stamp, method=method) + return Index.get_loc(self, stamp, method, tolerance) except (KeyError, ValueError): raise KeyError(key) @@ -853,7 +858,7 @@ def delete(self, loc): freq = self.freq else: if com.is_list_like(loc): - loc = lib.maybe_indices_to_slice(com._ensure_int64(np.array(loc))) + loc = lib.maybe_indices_to_slice(com._ensure_int64(np.array(loc)), len(self)) if isinstance(loc, slice) and loc.step in (1, None): if (loc.start in (0, None) or loc.stop in (len(self), None)): freq = self.freq diff --git a/pandas/tseries/tests/test_base.py b/pandas/tseries/tests/test_base.py index fc432d5236f62..3d9e80f351c44 100644 --- a/pandas/tseries/tests/test_base.py +++ b/pandas/tseries/tests/test_base.py @@ -4,10 +4,11 @@ import numpy as np import pandas as pd from pandas.tseries.base import DatetimeIndexOpsMixin -from pandas.util.testing import assertRaisesRegexp, assert_isinstance +from pandas.util.testing import assertRaisesRegexp, assertIsInstance from pandas.tseries.common import is_datetimelike from pandas import (Series, Index, Int64Index, Timestamp, DatetimeIndex, PeriodIndex, TimedeltaIndex, Timedelta, timedelta_range, date_range, Float64Index) +import pandas.tseries.offsets as offsets import pandas.tslib as tslib import nose @@ -297,6 +298,72 @@ def test_nonunique_contains(self): ['2015', '2015', '2016'], ['2015', '2015', '2014'])): tm.assertIn(idx[0], idx) + def test_order(self): + # with freq + idx1 = DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03'], freq='D', name='idx') + idx2 = DatetimeIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00'], + freq='H', tz='Asia/Tokyo', name='tzidx') + + for idx in [idx1, idx2]: + ordered = idx.order() + self.assert_index_equal(ordered, idx) + self.assertEqual(ordered.freq, idx.freq) + + ordered = idx.order(ascending=False) + expected = idx[::-1] + self.assert_index_equal(ordered, expected) + self.assertEqual(ordered.freq, expected.freq) + self.assertEqual(ordered.freq.n, -1) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, idx) + self.assert_numpy_array_equal(indexer, np.array([0, 1, 2])) + self.assertEqual(ordered.freq, idx.freq) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + expected = idx[::-1] + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 0])) + self.assertEqual(ordered.freq, expected.freq) + self.assertEqual(ordered.freq.n, -1) + + # without freq + idx1 = DatetimeIndex(['2011-01-01', '2011-01-03', '2011-01-05', + '2011-01-02', '2011-01-01'], name='idx1') + exp1 = DatetimeIndex(['2011-01-01', '2011-01-01', '2011-01-02', + '2011-01-03', '2011-01-05'], name='idx1') + + idx2 = DatetimeIndex(['2011-01-01', '2011-01-03', '2011-01-05', + '2011-01-02', '2011-01-01'], + tz='Asia/Tokyo', name='idx2') + exp2 = DatetimeIndex(['2011-01-01', '2011-01-01', '2011-01-02', + '2011-01-03', '2011-01-05'], + tz='Asia/Tokyo', name='idx2') + + idx3 = DatetimeIndex([pd.NaT, '2011-01-03', '2011-01-05', + '2011-01-02', pd.NaT], name='idx3') + exp3 = DatetimeIndex([pd.NaT, pd.NaT, '2011-01-02', '2011-01-03', + '2011-01-05'], name='idx3') + + for idx, expected in [(idx1, exp1), (idx1, exp1), (idx1, exp1)]: + ordered = idx.order() + self.assert_index_equal(ordered, expected) + self.assertIsNone(ordered.freq) + + ordered = idx.order(ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assertIsNone(ordered.freq) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([0, 4, 3, 1, 2])) + self.assertIsNone(ordered.freq) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 3, 4, 0])) + self.assertIsNone(ordered.freq) + def test_getitem(self): idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx') idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D', tz='Asia/Tokyo', name='idx') @@ -318,7 +385,7 @@ def test_getitem(self): self.assertEqual(result.freq, expected.freq) result = idx[-20:-5:3] - expected = pd.date_range('2011-01-12', '2011-01-25', freq='3D', + expected = pd.date_range('2011-01-12', '2011-01-24', freq='3D', tz=idx.tz, name='idx') self.assert_index_equal(result, expected) self.assertEqual(result.freq, expected.freq) @@ -330,6 +397,59 @@ def test_getitem(self): self.assert_index_equal(result, expected) self.assertEqual(result.freq, expected.freq) + def test_drop_duplicates_metadata(self): + #GH 10115 + idx = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx') + result = idx.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertEqual(idx.freq, result.freq) + + idx_dup = idx.append(idx) + self.assertIsNone(idx_dup.freq) # freq is reset + result = idx_dup.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertIsNone(result.freq) + + def test_take(self): + #GH 10295 + idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx') + idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D', tz='Asia/Tokyo', name='idx') + + for idx in [idx1, idx2]: + result = idx.take([0]) + self.assertEqual(result, pd.Timestamp('2011-01-01', tz=idx.tz)) + + result = idx.take([0, 1, 2]) + expected = pd.date_range('2011-01-01', '2011-01-03', freq='D', + tz=idx.tz, name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([0, 2, 4]) + expected = pd.date_range('2011-01-01', '2011-01-05', freq='2D', + tz=idx.tz, name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([7, 4, 1]) + expected = pd.date_range('2011-01-08', '2011-01-02', freq='-3D', + tz=idx.tz, name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([3, 2, 5]) + expected = DatetimeIndex(['2011-01-04', '2011-01-03', '2011-01-06'], + freq=None, tz=idx.tz, name='idx') + self.assert_index_equal(result, expected) + self.assertIsNone(result.freq) + + result = idx.take([-3, 2, 5]) + expected = DatetimeIndex(['2011-01-29', '2011-01-03', '2011-01-06'], + freq=None, tz=idx.tz, name='idx') + self.assert_index_equal(result, expected) + self.assertIsNone(result.freq) + + class TestTimedeltaIndexOps(Ops): def setUp(self): @@ -748,7 +868,7 @@ def test_value_counts_unique(self): tm.assert_index_equal(idx.unique(), expected) idx = TimedeltaIndex(['1 days 09:00:00', '1 days 09:00:00', '1 days 09:00:00', - '1 days 08:00:00', '1 days 08:00:00', pd.NaT]) + '1 days 08:00:00', '1 days 08:00:00', pd.NaT]) exp_idx = TimedeltaIndex(['1 days 09:00:00', '1 days 08:00:00']) expected = Series([3, 2], index=exp_idx) @@ -774,6 +894,66 @@ def test_unknown_attribute(self): self.assertNotIn('foo',ts.__dict__.keys()) self.assertRaises(AttributeError,lambda : ts.foo) + def test_order(self): + #GH 10295 + idx1 = TimedeltaIndex(['1 day', '2 day', '3 day'], freq='D', name='idx') + idx2 = TimedeltaIndex(['1 hour', '2 hour', '3 hour'], freq='H', name='idx') + + for idx in [idx1, idx2]: + ordered = idx.order() + self.assert_index_equal(ordered, idx) + self.assertEqual(ordered.freq, idx.freq) + + ordered = idx.order(ascending=False) + expected = idx[::-1] + self.assert_index_equal(ordered, expected) + self.assertEqual(ordered.freq, expected.freq) + self.assertEqual(ordered.freq.n, -1) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, idx) + self.assert_numpy_array_equal(indexer, np.array([0, 1, 2])) + self.assertEqual(ordered.freq, idx.freq) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, idx[::-1]) + self.assertEqual(ordered.freq, expected.freq) + self.assertEqual(ordered.freq.n, -1) + + idx1 = TimedeltaIndex(['1 hour', '3 hour', '5 hour', + '2 hour ', '1 hour'], name='idx1') + exp1 = TimedeltaIndex(['1 hour', '1 hour', '2 hour', + '3 hour', '5 hour'], name='idx1') + + idx2 = TimedeltaIndex(['1 day', '3 day', '5 day', + '2 day', '1 day'], name='idx2') + exp2 = TimedeltaIndex(['1 day', '1 day', '2 day', + '3 day', '5 day'], name='idx2') + + idx3 = TimedeltaIndex([pd.NaT, '3 minute', '5 minute', + '2 minute', pd.NaT], name='idx3') + exp3 = TimedeltaIndex([pd.NaT, pd.NaT, '2 minute', '3 minute', + '5 minute'], name='idx3') + + for idx, expected in [(idx1, exp1), (idx1, exp1), (idx1, exp1)]: + ordered = idx.order() + self.assert_index_equal(ordered, expected) + self.assertIsNone(ordered.freq) + + ordered = idx.order(ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assertIsNone(ordered.freq) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([0, 4, 3, 1, 2])) + self.assertIsNone(ordered.freq) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 3, 4, 0])) + self.assertIsNone(ordered.freq) + def test_getitem(self): idx1 = pd.timedelta_range('1 day', '31 day', freq='D', name='idx') @@ -792,7 +972,7 @@ def test_getitem(self): self.assertEqual(result.freq, expected.freq) result = idx[-20:-5:3] - expected = pd.timedelta_range('12 day', '25 day', freq='3D', name='idx') + expected = pd.timedelta_range('12 day', '24 day', freq='3D', name='idx') self.assert_index_equal(result, expected) self.assertEqual(result.freq, expected.freq) @@ -802,6 +982,56 @@ def test_getitem(self): self.assert_index_equal(result, expected) self.assertEqual(result.freq, expected.freq) + def test_drop_duplicates_metadata(self): + #GH 10115 + idx = pd.timedelta_range('1 day', '31 day', freq='D', name='idx') + result = idx.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertEqual(idx.freq, result.freq) + + idx_dup = idx.append(idx) + self.assertIsNone(idx_dup.freq) # freq is reset + result = idx_dup.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertIsNone(result.freq) + + def test_take(self): + #GH 10295 + idx1 = pd.timedelta_range('1 day', '31 day', freq='D', name='idx') + + for idx in [idx1]: + result = idx.take([0]) + self.assertEqual(result, pd.Timedelta('1 day')) + + result = idx.take([-1]) + self.assertEqual(result, pd.Timedelta('31 day')) + + result = idx.take([0, 1, 2]) + expected = pd.timedelta_range('1 day', '3 day', freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([0, 2, 4]) + expected = pd.timedelta_range('1 day', '5 day', freq='2D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([7, 4, 1]) + expected = pd.timedelta_range('8 day', '2 day', freq='-3D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([3, 2, 5]) + expected = TimedeltaIndex(['4 day', '3 day', '6 day'], name='idx') + self.assert_index_equal(result, expected) + self.assertIsNone(result.freq) + + result = idx.take([-3, 2, 5]) + expected = TimedeltaIndex(['29 day', '3 day', '6 day'], name='idx') + self.assert_index_equal(result, expected) + self.assertIsNone(result.freq) + + class TestPeriodIndexOps(Ops): def setUp(self): @@ -1228,6 +1458,221 @@ def test_value_counts_unique(self): tm.assert_index_equal(idx.unique(), exp_idx) + def test_drop_duplicates_metadata(self): + #GH 10115 + idx = pd.period_range('2011-01-01', '2011-01-31', freq='D', name='idx') + result = idx.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertEqual(idx.freq, result.freq) + + idx_dup = idx.append(idx) # freq will not be reset + result = idx_dup.drop_duplicates() + self.assert_index_equal(idx, result) + self.assertEqual(idx.freq, result.freq) + + def test_order_compat(self): + + def _check_freq(index, expected_index): + if isinstance(index, PeriodIndex): + self.assertEqual(index.freq, expected_index.freq) + + pidx = PeriodIndex(['2011', '2012', '2013'], name='pidx', freq='A') + # for compatibility check + iidx = Index([2011, 2012, 2013], name='idx') + for idx in [pidx, iidx]: + ordered = idx.order() + self.assert_index_equal(ordered, idx) + _check_freq(ordered, idx) + + ordered = idx.order(ascending=False) + self.assert_index_equal(ordered, idx[::-1]) + _check_freq(ordered, idx[::-1]) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, idx) + self.assert_numpy_array_equal(indexer, np.array([0, 1, 2])) + _check_freq(ordered, idx) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, idx[::-1]) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 0])) + _check_freq(ordered, idx[::-1]) + + pidx = PeriodIndex(['2011', '2013', '2015', '2012', '2011'], name='pidx', freq='A') + pexpected = PeriodIndex(['2011', '2011', '2012', '2013', '2015'], name='pidx', freq='A') + # for compatibility check + iidx = Index([2011, 2013, 2015, 2012, 2011], name='idx') + iexpected = Index([2011, 2011, 2012, 2013, 2015], name='idx') + for idx, expected in [(pidx, pexpected), (iidx, iexpected)]: + ordered = idx.order() + self.assert_index_equal(ordered, expected) + _check_freq(ordered, idx) + + ordered = idx.order(ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + _check_freq(ordered, idx) + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([0, 4, 3, 1, 2])) + _check_freq(ordered, idx) + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 3, 4, 0])) + _check_freq(ordered, idx) + + pidx = PeriodIndex(['2011', '2013', 'NaT', '2011'], name='pidx', freq='D') + + result = pidx.order() + expected = PeriodIndex(['NaT', '2011', '2011', '2013'], name='pidx', freq='D') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, 'D') + + result = pidx.order(ascending=False) + expected = PeriodIndex(['2013', '2011', '2011', 'NaT'], name='pidx', freq='D') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, 'D') + + def test_order(self): + idx1 = PeriodIndex(['2011-01-01', '2011-01-02', '2011-01-03'], + freq='D', name='idx') + + for idx in [idx1]: + ordered = idx.order() + self.assert_index_equal(ordered, idx) + self.assertEqual(ordered.freq, idx.freq) + + ordered = idx.order(ascending=False) + expected = idx[::-1] + self.assert_index_equal(ordered, expected) + self.assertEqual(ordered.freq, 'D') + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, idx) + self.assert_numpy_array_equal(indexer, np.array([0, 1, 2])) + self.assertEqual(ordered.freq, 'D') + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + expected = idx[::-1] + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 0])) + self.assertEqual(ordered.freq, 'D') + + idx1 = PeriodIndex(['2011-01-01', '2011-01-03', '2011-01-05', + '2011-01-02', '2011-01-01'], freq='D', name='idx1') + exp1 = PeriodIndex(['2011-01-01', '2011-01-01', '2011-01-02', + '2011-01-03', '2011-01-05'], freq='D', name='idx1') + + idx2 = PeriodIndex(['2011-01-01', '2011-01-03', '2011-01-05', + '2011-01-02', '2011-01-01'], + freq='D', name='idx2') + exp2 = PeriodIndex(['2011-01-01', '2011-01-01', '2011-01-02', + '2011-01-03', '2011-01-05'], + freq='D', name='idx2') + + idx3 = PeriodIndex([pd.NaT, '2011-01-03', '2011-01-05', + '2011-01-02', pd.NaT], freq='D', name='idx3') + exp3 = PeriodIndex([pd.NaT, pd.NaT, '2011-01-02', '2011-01-03', + '2011-01-05'], freq='D', name='idx3') + + for idx, expected in [(idx1, exp1), (idx1, exp1), (idx1, exp1)]: + ordered = idx.order() + self.assert_index_equal(ordered, expected) + self.assertEqual(ordered.freq, 'D') + + ordered = idx.order(ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assertEqual(ordered.freq, 'D') + + ordered, indexer = idx.order(return_indexer=True) + self.assert_index_equal(ordered, expected) + self.assert_numpy_array_equal(indexer, np.array([0, 4, 3, 1, 2])) + self.assertEqual(ordered.freq, 'D') + + ordered, indexer = idx.order(return_indexer=True, ascending=False) + self.assert_index_equal(ordered, expected[::-1]) + self.assert_numpy_array_equal(indexer, np.array([2, 1, 3, 4, 0])) + self.assertEqual(ordered.freq, 'D') + + def test_getitem(self): + idx1 = pd.period_range('2011-01-01', '2011-01-31', freq='D', name='idx') + + for idx in [idx1]: + result = idx[0] + self.assertEqual(result, pd.Period('2011-01-01', freq='D')) + + result = idx[-1] + self.assertEqual(result, pd.Period('2011-01-31', freq='D')) + + result = idx[0:5] + expected = pd.period_range('2011-01-01', '2011-01-05', freq='D', + name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx[0:10:2] + expected = pd.PeriodIndex(['2011-01-01', '2011-01-03', '2011-01-05', + '2011-01-07', '2011-01-09'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx[-20:-5:3] + expected = pd.PeriodIndex(['2011-01-12', '2011-01-15', '2011-01-18', + '2011-01-21', '2011-01-24'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx[4::-1] + expected = PeriodIndex(['2011-01-05', '2011-01-04', '2011-01-03', + '2011-01-02', '2011-01-01'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + def test_take(self): + #GH 10295 + idx1 = pd.period_range('2011-01-01', '2011-01-31', freq='D', name='idx') + + for idx in [idx1]: + result = idx.take([0]) + self.assertEqual(result, pd.Period('2011-01-01', freq='D')) + + result = idx.take([5]) + self.assertEqual(result, pd.Period('2011-01-06', freq='D')) + + result = idx.take([0, 1, 2]) + expected = pd.period_range('2011-01-01', '2011-01-03', freq='D', + name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([0, 2, 4]) + expected = pd.PeriodIndex(['2011-01-01', '2011-01-03', '2011-01-05'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([7, 4, 1]) + expected = pd.PeriodIndex(['2011-01-08', '2011-01-05', '2011-01-02'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([3, 2, 5]) + expected = PeriodIndex(['2011-01-04', '2011-01-03', '2011-01-06'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + + result = idx.take([-3, 2, 5]) + expected = PeriodIndex(['2011-01-29', '2011-01-03', '2011-01-06'], + freq='D', name='idx') + self.assert_index_equal(result, expected) + self.assertEqual(result.freq, expected.freq) + if __name__ == '__main__': import nose diff --git a/pandas/tseries/tests/test_daterange.py b/pandas/tseries/tests/test_daterange.py index 69b1d84670d45..86e0f7162c545 100644 --- a/pandas/tseries/tests/test_daterange.py +++ b/pandas/tseries/tests/test_daterange.py @@ -1,7 +1,6 @@ from datetime import datetime from pandas.compat import range import nose -import sys import numpy as np from pandas.core.index import Index @@ -16,11 +15,6 @@ import pandas.util.testing as tm -def _skip_if_windows_python_3(): - if sys.version_info > (3,) and sys.platform == 'win32': - raise nose.SkipTest("not used on python 3/win32") - - def eq_gen_range(kwargs, expected): rng = generate_range(**kwargs) assert(np.array_equal(list(rng), expected)) @@ -57,6 +51,26 @@ def test_3(self): end=datetime(2008, 1, 6)), []) + def test_precision_finer_than_offset(self): + # GH 9907 + result1 = DatetimeIndex(start='2015-04-15 00:00:03', + end='2016-04-22 00:00:00', freq='Q') + result2 = DatetimeIndex(start='2015-04-15 00:00:03', + end='2015-06-22 00:00:04', freq='W') + expected1_list = ['2015-06-30 00:00:03', '2015-09-30 00:00:03', + '2015-12-31 00:00:03', '2016-03-31 00:00:03'] + expected2_list = ['2015-04-19 00:00:03', '2015-04-26 00:00:03', + '2015-05-03 00:00:03', '2015-05-10 00:00:03', + '2015-05-17 00:00:03', '2015-05-24 00:00:03', + '2015-05-31 00:00:03', '2015-06-07 00:00:03', + '2015-06-14 00:00:03', '2015-06-21 00:00:03'] + expected1 = DatetimeIndex(expected1_list, dtype='datetime64[ns]', + freq='Q-DEC', tz=None) + expected2 = DatetimeIndex(expected2_list, dtype='datetime64[ns]', + freq='W-SUN', tz=None) + self.assertTrue(result1.equals(expected1)) + self.assertTrue(result2.equals(expected2)) + class TestDateRange(tm.TestCase): @@ -138,7 +152,7 @@ def test_getitem(self): fancy_indexed = self.rng[[4, 3, 2, 1, 0]] self.assertEqual(len(fancy_indexed), 5) - tm.assert_isinstance(fancy_indexed, DatetimeIndex) + tm.assertIsInstance(fancy_indexed, DatetimeIndex) self.assertIsNone(fancy_indexed.freq) # 32-bit vs. 64-bit platforms @@ -176,21 +190,21 @@ def test_union(self): right = self.rng[5:10] the_union = left.union(right) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) # non-overlapping, gap in middle left = self.rng[:5] right = self.rng[10:] the_union = left.union(right) - tm.assert_isinstance(the_union, Index) + tm.assertIsInstance(the_union, Index) # non-overlapping, no gap left = self.rng[:5] right = self.rng[5:10] the_union = left.union(right) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) # order does not matter self.assert_numpy_array_equal(right.union(left), the_union) @@ -199,7 +213,7 @@ def test_union(self): rng = date_range(START, END, freq=datetools.bmonthEnd) the_union = self.rng.union(rng) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) def test_outer_join(self): # should just behave as union @@ -209,14 +223,14 @@ def test_outer_join(self): right = self.rng[5:10] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) # non-overlapping, gap in middle left = self.rng[:5] right = self.rng[10:] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) self.assertIsNone(the_join.freq) # non-overlapping, no gap @@ -224,13 +238,13 @@ def test_outer_join(self): right = self.rng[5:10] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) # overlapping, but different offset rng = date_range(START, END, freq=datetools.bmonthEnd) the_join = self.rng.join(rng, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) self.assertIsNone(the_join.freq) def test_union_not_cacheable(self): @@ -253,7 +267,7 @@ def test_intersection(self): the_int = rng1.intersection(rng2) expected = rng[10:25] self.assertTrue(the_int.equals(expected)) - tm.assert_isinstance(the_int, DatetimeIndex) + tm.assertIsInstance(the_int, DatetimeIndex) self.assertEqual(the_int.offset, rng.offset) the_int = rng1.intersection(rng2.view(DatetimeIndex)) @@ -333,7 +347,7 @@ def test_daterange_bug_456(self): rng2.offset = datetools.BDay() result = rng1.union(rng2) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) def test_error_with_zero_monthends(self): self.assertRaises(ValueError, date_range, '1/1/2000', '1/1/2001', @@ -439,7 +453,7 @@ def test_month_range_union_tz_pytz(self): early_dr.union(late_dr) def test_month_range_union_tz_dateutil(self): - _skip_if_windows_python_3() + tm._skip_if_windows_python_3() tm._skip_if_no_dateutil() from pandas.tslib import _dateutil_gettz as timezone tz = timezone('US/Eastern') @@ -535,7 +549,7 @@ def test_getitem(self): fancy_indexed = self.rng[[4, 3, 2, 1, 0]] self.assertEqual(len(fancy_indexed), 5) - tm.assert_isinstance(fancy_indexed, DatetimeIndex) + tm.assertIsInstance(fancy_indexed, DatetimeIndex) self.assertIsNone(fancy_indexed.freq) # 32-bit vs. 64-bit platforms @@ -573,21 +587,21 @@ def test_union(self): right = self.rng[5:10] the_union = left.union(right) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) # non-overlapping, gap in middle left = self.rng[:5] right = self.rng[10:] the_union = left.union(right) - tm.assert_isinstance(the_union, Index) + tm.assertIsInstance(the_union, Index) # non-overlapping, no gap left = self.rng[:5] right = self.rng[5:10] the_union = left.union(right) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) # order does not matter self.assert_numpy_array_equal(right.union(left), the_union) @@ -596,7 +610,7 @@ def test_union(self): rng = date_range(START, END, freq=datetools.bmonthEnd) the_union = self.rng.union(rng) - tm.assert_isinstance(the_union, DatetimeIndex) + tm.assertIsInstance(the_union, DatetimeIndex) def test_outer_join(self): # should just behave as union @@ -606,14 +620,14 @@ def test_outer_join(self): right = self.rng[5:10] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) # non-overlapping, gap in middle left = self.rng[:5] right = self.rng[10:] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) self.assertIsNone(the_join.freq) # non-overlapping, no gap @@ -621,13 +635,13 @@ def test_outer_join(self): right = self.rng[5:10] the_join = left.join(right, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) # overlapping, but different offset rng = date_range(START, END, freq=datetools.bmonthEnd) the_join = self.rng.join(rng, how='outer') - tm.assert_isinstance(the_join, DatetimeIndex) + tm.assertIsInstance(the_join, DatetimeIndex) self.assertIsNone(the_join.freq) def test_intersection_bug(self): @@ -682,7 +696,7 @@ def test_daterange_bug_456(self): rng2.offset = datetools.CDay() result = rng1.union(rng2) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) def test_cdaterange(self): rng = cdate_range('2013-05-01', periods=3) diff --git a/pandas/tseries/tests/test_frequencies.py b/pandas/tseries/tests/test_frequencies.py index 823c762c692e5..29152551f5ddf 100644 --- a/pandas/tseries/tests/test_frequencies.py +++ b/pandas/tseries/tests/test_frequencies.py @@ -132,6 +132,117 @@ def test_anchored_shortcuts(): expected = frequencies.to_offset('Q-DEC') assert(result == expected) +class TestFrequencyCode(tm.TestCase): + + def test_freq_code(self): + self.assertEqual(frequencies.get_freq('A'), 1000) + self.assertEqual(frequencies.get_freq('3A'), 1000) + self.assertEqual(frequencies.get_freq('-1A'), 1000) + + self.assertEqual(frequencies.get_freq('W'), 4000) + self.assertEqual(frequencies.get_freq('W-MON'), 4001) + self.assertEqual(frequencies.get_freq('W-FRI'), 4005) + + for freqstr, code in compat.iteritems(frequencies._period_code_map): + result = frequencies.get_freq(freqstr) + self.assertEqual(result, code) + + result = frequencies.get_freq_group(freqstr) + self.assertEqual(result, code // 1000 * 1000) + + result = frequencies.get_freq_group(code) + self.assertEqual(result, code // 1000 * 1000) + + def test_get_to_timestamp_base(self): + tsb = frequencies.get_to_timestamp_base + + self.assertEqual(tsb(frequencies.get_freq_code('D')[0]), + frequencies.get_freq_code('D')[0]) + self.assertEqual(tsb(frequencies.get_freq_code('W')[0]), + frequencies.get_freq_code('D')[0]) + self.assertEqual(tsb(frequencies.get_freq_code('M')[0]), + frequencies.get_freq_code('D')[0]) + + self.assertEqual(tsb(frequencies.get_freq_code('S')[0]), + frequencies.get_freq_code('S')[0]) + self.assertEqual(tsb(frequencies.get_freq_code('T')[0]), + frequencies.get_freq_code('S')[0]) + self.assertEqual(tsb(frequencies.get_freq_code('H')[0]), + frequencies.get_freq_code('S')[0]) + + + def test_freq_to_reso(self): + Reso = frequencies.Resolution + + self.assertEqual(Reso.get_str_from_freq('A'), 'year') + self.assertEqual(Reso.get_str_from_freq('Q'), 'quarter') + self.assertEqual(Reso.get_str_from_freq('M'), 'month') + self.assertEqual(Reso.get_str_from_freq('D'), 'day') + self.assertEqual(Reso.get_str_from_freq('H'), 'hour') + self.assertEqual(Reso.get_str_from_freq('T'), 'minute') + self.assertEqual(Reso.get_str_from_freq('S'), 'second') + self.assertEqual(Reso.get_str_from_freq('L'), 'millisecond') + self.assertEqual(Reso.get_str_from_freq('U'), 'microsecond') + self.assertEqual(Reso.get_str_from_freq('N'), 'nanosecond') + + for freq in ['A', 'Q', 'M', 'D', 'H', 'T', 'S', 'L', 'U', 'N']: + # check roundtrip + result = Reso.get_freq(Reso.get_str_from_freq(freq)) + self.assertEqual(freq, result) + + for freq in ['D', 'H', 'T', 'S', 'L', 'U']: + result = Reso.get_freq(Reso.get_str(Reso.get_reso_from_freq(freq))) + self.assertEqual(freq, result) + + def test_get_freq_code(self): + # freqstr + self.assertEqual(frequencies.get_freq_code('A'), + (frequencies.get_freq('A'), 1)) + self.assertEqual(frequencies.get_freq_code('3D'), + (frequencies.get_freq('D'), 3)) + self.assertEqual(frequencies.get_freq_code('-2M'), + (frequencies.get_freq('M'), -2)) + + # tuple + self.assertEqual(frequencies.get_freq_code(('D', 1)), + (frequencies.get_freq('D'), 1)) + self.assertEqual(frequencies.get_freq_code(('A', 3)), + (frequencies.get_freq('A'), 3)) + self.assertEqual(frequencies.get_freq_code(('M', -2)), + (frequencies.get_freq('M'), -2)) + # numeric tuple + self.assertEqual(frequencies.get_freq_code((1000, 1)), (1000, 1)) + + # offsets + self.assertEqual(frequencies.get_freq_code(offsets.Day()), + (frequencies.get_freq('D'), 1)) + self.assertEqual(frequencies.get_freq_code(offsets.Day(3)), + (frequencies.get_freq('D'), 3)) + self.assertEqual(frequencies.get_freq_code(offsets.Day(-2)), + (frequencies.get_freq('D'), -2)) + + self.assertEqual(frequencies.get_freq_code(offsets.MonthEnd()), + (frequencies.get_freq('M'), 1)) + self.assertEqual(frequencies.get_freq_code(offsets.MonthEnd(3)), + (frequencies.get_freq('M'), 3)) + self.assertEqual(frequencies.get_freq_code(offsets.MonthEnd(-2)), + (frequencies.get_freq('M'), -2)) + + self.assertEqual(frequencies.get_freq_code(offsets.Week()), + (frequencies.get_freq('W'), 1)) + self.assertEqual(frequencies.get_freq_code(offsets.Week(3)), + (frequencies.get_freq('W'), 3)) + self.assertEqual(frequencies.get_freq_code(offsets.Week(-2)), + (frequencies.get_freq('W'), -2)) + + # monday is weekday=0 + self.assertEqual(frequencies.get_freq_code(offsets.Week(weekday=1)), + (frequencies.get_freq('W-TUE'), 1)) + self.assertEqual(frequencies.get_freq_code(offsets.Week(3, weekday=0)), + (frequencies.get_freq('W-MON'), 3)) + self.assertEqual(frequencies.get_freq_code(offsets.Week(-2, weekday=4)), + (frequencies.get_freq('W-FRI'), -2)) + _dti = DatetimeIndex @@ -333,7 +444,6 @@ def test_infer_freq_tz_transition(self): for date_pair in date_pairs: for freq in freqs: idx = date_range(date_pair[0], date_pair[1], freq=freq, tz=tz) - print(idx) self.assertEqual(idx.inferred_freq, freq) index = date_range("2013-11-03", periods=5, freq="3H").tz_localize("America/Chicago") diff --git a/pandas/tseries/tests/test_offsets.py b/pandas/tseries/tests/test_offsets.py index a051560617604..d364206017c7e 100644 --- a/pandas/tseries/tests/test_offsets.py +++ b/pandas/tseries/tests/test_offsets.py @@ -19,7 +19,7 @@ get_offset, get_offset_name, get_standard_freq) from pandas import Series -from pandas.tseries.frequencies import _offset_map +from pandas.tseries.frequencies import _offset_map, get_freq_code, _get_freq_str from pandas.tseries.index import _to_m8, DatetimeIndex, _daterange_cache, date_range from pandas.tseries.tools import parse_time_string, DateParseError import pandas.tseries.offsets as offsets @@ -68,7 +68,7 @@ def test_to_datetime1(): # unparseable s = 'Month 1, 1999' - assert to_datetime(s) == s + assert to_datetime(s, errors='ignore') == s def test_normalize_date(): @@ -79,7 +79,7 @@ def test_normalize_date(): def test_to_m8(): valb = datetime(2007, 10, 1) valu = _to_m8(valb) - tm.assert_isinstance(valu, np.datetime64) + tm.assertIsInstance(valu, np.datetime64) # assert valu == np.datetime64(datetime(2007,10,1)) # def test_datetime64_box(): @@ -211,6 +211,27 @@ def test_return_type(self): self.assertTrue(NaT - offset is NaT) self.assertTrue((-offset).apply(NaT) is NaT) + def test_offset_n(self): + for offset_klass in self.offset_types: + offset = self._get_offset(offset_klass) + self.assertEqual(offset.n, 1) + + neg_offset = offset * -1 + self.assertEqual(neg_offset.n, -1) + + mul_offset = offset * 3 + self.assertEqual(mul_offset.n, 3) + + def test_offset_freqstr(self): + for offset_klass in self.offset_types: + offset = self._get_offset(offset_klass) + + freqstr = offset.freqstr + if freqstr not in ('', "", + 'LWOM-SAT', ): + code = get_offset(freqstr) + self.assertEqual(offset.rule_code, code) + def _check_offsetfunc_works(self, offset, funcname, dt, expected, normalize=False): offset_s = self._get_offset(offset, normalize=normalize) @@ -3695,6 +3716,12 @@ def test_rule_code(self): self.assertEqual(alias, get_offset(alias).rule_code) self.assertEqual(alias, (get_offset(alias) * 5).rule_code) + lst = ['M', 'D', 'B', 'H', 'T', 'S', 'L', 'U'] + for k in lst: + code, stride = get_freq_code('3' + k) + self.assertTrue(isinstance(code, int)) + self.assertEqual(stride, 3) + self.assertEqual(k, _get_freq_str(code)) def test_apply_ticks(): result = offsets.Hour(3).apply(offsets.Hour(4)) diff --git a/pandas/tseries/tests/test_period.py b/pandas/tseries/tests/test_period.py index 0218af63ca7d6..b78b5d5ad71d7 100644 --- a/pandas/tseries/tests/test_period.py +++ b/pandas/tseries/tests/test_period.py @@ -6,6 +6,9 @@ """ +import pickle +import os + from datetime import datetime, date, timedelta from numpy.ma.testutils import assert_equal @@ -30,7 +33,6 @@ assertRaisesRegexp) import pandas.util.testing as tm from pandas import compat -from numpy.testing import assert_array_equal class TestPeriodProperties(tm.TestCase): @@ -282,7 +284,7 @@ def test_strftime(self): p = Period('2000-1-1 12:34:12', freq='S') res = p.strftime('%Y-%m-%d %H:%M:%S') self.assertEqual(res, '2000-01-01 12:34:12') - tm.assert_isinstance(res, compat.text_type) # GH3363 + tm.assertIsInstance(res, compat.text_type) # GH3363 def test_sub_delta(self): left, right = Period('2011', freq='A'), Period('2007', freq='A') @@ -1192,7 +1194,7 @@ def test_hash_error(self): def test_make_time_series(self): index = PeriodIndex(freq='A', start='1/1/2001', end='12/1/2009') series = Series(1, index=index) - tm.assert_isinstance(series, TimeSeries) + tm.assertIsInstance(series, TimeSeries) def test_astype(self): idx = period_range('1990', '2009', freq='A') @@ -1350,7 +1352,7 @@ def test_getitem_ndim2(self): result = idx[:, None] # MPL kludge - tm.assert_isinstance(result, PeriodIndex) + tm.assertIsInstance(result, PeriodIndex) def test_getitem_partial(self): rng = period_range('2007-01', periods=50, freq='M') @@ -1442,7 +1444,7 @@ def test_periods_number_check(self): def test_tolist(self): index = PeriodIndex(freq='A', start='1/1/2001', end='12/1/2009') rs = index.tolist() - [tm.assert_isinstance(x, Period) for x in rs] + [tm.assertIsInstance(x, Period) for x in rs] recon = PeriodIndex(rs) self.assertTrue(index.equals(recon)) @@ -1562,7 +1564,7 @@ def test_frame_setitem(self): self.assertTrue(rs.equals(rng)) rs = df.reset_index().set_index('index') - tm.assert_isinstance(rs.index, PeriodIndex) + tm.assertIsInstance(rs.index, PeriodIndex) self.assertTrue(rs.index.equals(rng)) def test_period_set_index_reindex(self): @@ -1979,7 +1981,7 @@ def test_negative_ordinals(self): idx1 = PeriodIndex(ordinal=[-1, 0, 1], freq='A') idx2 = PeriodIndex(ordinal=np.array([-1, 0, 1]), freq='A') - assert_array_equal(idx1,idx2) + tm.assert_numpy_array_equal(idx1,idx2) def test_dti_to_period(self): dti = DatetimeIndex(start='1/1/2005', end='12/1/2005', freq='M') @@ -2212,7 +2214,7 @@ def test_iteration(self): index = PeriodIndex(start='1/1/10', periods=4, freq='B') result = list(index) - tm.assert_isinstance(result[0], Period) + tm.assertIsInstance(result[0], Period) self.assertEqual(result[0].freq, index.freq) def test_take(self): @@ -2226,7 +2228,7 @@ def test_take(self): for taken in [taken1, taken2]: self.assertTrue(taken.equals(expected)) - tm.assert_isinstance(taken, PeriodIndex) + tm.assertIsInstance(taken, PeriodIndex) self.assertEqual(taken.freq, index.freq) self.assertEqual(taken.name, expected.name) @@ -2236,7 +2238,7 @@ def test_joins(self): for kind in ['inner', 'outer', 'left', 'right']: joined = index.join(index[:-5], how=kind) - tm.assert_isinstance(joined, PeriodIndex) + tm.assertIsInstance(joined, PeriodIndex) self.assertEqual(joined.freq, index.freq) def test_join_self(self): @@ -2393,7 +2395,7 @@ def test_map(self): result = index.map(lambda x: x.ordinal) exp = [x.ordinal for x in index] - assert_array_equal(result, exp) + tm.assert_numpy_array_equal(result, exp) def test_map_with_string_constructor(self): raw = [2005, 2007, 2009] @@ -2409,7 +2411,7 @@ def test_map_with_string_constructor(self): res = index.map(t) # should return an array - tm.assert_isinstance(res, np.ndarray) + tm.assertIsInstance(res, np.ndarray) # preserve element types self.assertTrue(all(isinstance(resi, t) for resi in res)) @@ -2418,14 +2420,14 @@ def test_map_with_string_constructor(self): self.assertEqual(res.dtype, np.dtype('object').type) # lastly, values should compare equal - assert_array_equal(res, expected) + tm.assert_numpy_array_equal(res, expected) def test_convert_array_of_periods(self): rng = period_range('1/1/2000', periods=20, freq='D') periods = list(rng) result = pd.Index(periods) - tm.assert_isinstance(result, PeriodIndex) + tm.assertIsInstance(result, PeriodIndex) def test_with_multi_index(self): # #1705 @@ -2434,9 +2436,9 @@ def test_with_multi_index(self): s = Series([0, 1, 2, 3], index_as_arrays) - tm.assert_isinstance(s.index.levels[0], PeriodIndex) + tm.assertIsInstance(s.index.levels[0], PeriodIndex) - tm.assert_isinstance(s.index.values[0][0], Period) + tm.assertIsInstance(s.index.values[0][0], Period) def test_to_datetime_1703(self): index = period_range('1/1/2012', periods=4, freq='D') @@ -2467,7 +2469,7 @@ def test_append_concat(self): # drops index result = pd.concat([s1, s2]) - tm.assert_isinstance(result.index, PeriodIndex) + tm.assertIsInstance(result.index, PeriodIndex) self.assertEqual(result.index[0], s1.index[0]) def test_pickle_freq(self): @@ -2537,6 +2539,14 @@ def test_searchsorted(self): ValueError, 'Different period frequency: H', lambda: pidx.searchsorted(pd.Period('2014-01-01', freq='H'))) + def test_round_trip(self): + + import pickle + p = Period('2000Q1') + + new_p = self.round_trip_pickle(p) + self.assertEqual(new_p, p) + def _permute(obj): return obj.take(np.random.permutation(len(obj))) diff --git a/pandas/tseries/tests/test_plotting.py b/pandas/tseries/tests/test_plotting.py index c5ed8a1ac3e31..39736eef79295 100644 --- a/pandas/tseries/tests/test_plotting.py +++ b/pandas/tseries/tests/test_plotting.py @@ -5,7 +5,6 @@ import numpy as np from numpy.testing.decorators import slow -from numpy.testing import assert_array_equal from pandas import Index, Series, DataFrame @@ -105,6 +104,12 @@ def test_tsplot(self): for s in self.datetime_ser: _check_plot_works(f, s.index.freq.rule_code, ax=ax, series=s) + for s in self.period_ser: + _check_plot_works(s.plot, ax=ax) + + for s in self.datetime_ser: + _check_plot_works(s.plot, ax=ax) + ax = ts.plot(style='k') self.assertEqual((0., 0., 0.), ax.get_lines()[0].get_color()) @@ -151,6 +156,15 @@ def check_format_of_first_point(ax, expected_string): # note this is added to the annual plot already in existence, and changes its freq field daily = Series(1, index=date_range('2014-01-01', periods=3, freq='D')) check_format_of_first_point(daily.plot(), 't = 2014-01-01 y = 1.000000') + tm.close() + + # tsplot + import matplotlib.pyplot as plt + from pandas.tseries.plotting import tsplot + tsplot(annual, plt.Axes.plot) + check_format_of_first_point(plt.gca(), 't = 2014 y = 1.000000') + tsplot(daily, plt.Axes.plot) + check_format_of_first_point(plt.gca(), 't = 2014-01-01 y = 1.000000') @slow def test_line_plot_period_series(self): @@ -306,7 +320,7 @@ def test_dataframe(self): bts = DataFrame({'a': tm.makeTimeSeries()}) ax = bts.plot() idx = ax.get_lines()[0].get_xdata() - assert_array_equal(bts.index.to_period(), PeriodIndex(idx)) + tm.assert_numpy_array_equal(bts.index.to_period(), PeriodIndex(idx)) @slow def test_axis_limits(self): @@ -472,7 +486,7 @@ def test_gaps(self): self.assertEqual(len(lines), 1) l = lines[0] data = l.get_xydata() - tm.assert_isinstance(data, np.ma.core.MaskedArray) + tm.assertIsInstance(data, np.ma.core.MaskedArray) mask = data.mask self.assertTrue(mask[5:25, 1].all()) plt.close(ax.get_figure()) @@ -486,7 +500,7 @@ def test_gaps(self): self.assertEqual(len(lines), 1) l = lines[0] data = l.get_xydata() - tm.assert_isinstance(data, np.ma.core.MaskedArray) + tm.assertIsInstance(data, np.ma.core.MaskedArray) mask = data.mask self.assertTrue(mask[2:5, 1].all()) plt.close(ax.get_figure()) @@ -500,7 +514,7 @@ def test_gaps(self): self.assertEqual(len(lines), 1) l = lines[0] data = l.get_xydata() - tm.assert_isinstance(data, np.ma.core.MaskedArray) + tm.assertIsInstance(data, np.ma.core.MaskedArray) mask = data.mask self.assertTrue(mask[2:5, 1].all()) @@ -518,7 +532,7 @@ def test_gap_upsample(self): self.assertEqual(len(ax.right_ax.get_lines()), 1) l = lines[0] data = l.get_xydata() - tm.assert_isinstance(data, np.ma.core.MaskedArray) + tm.assertIsInstance(data, np.ma.core.MaskedArray) mask = data.mask self.assertTrue(mask[5:25, 1].all()) @@ -642,9 +656,9 @@ def test_mixed_freq_irregular_first(self): self.assertFalse(hasattr(ax, 'freq')) lines = ax.get_lines() x1 = lines[0].get_xdata() - assert_array_equal(x1, s2.index.asobject.values) + tm.assert_numpy_array_equal(x1, s2.index.asobject.values) x2 = lines[1].get_xdata() - assert_array_equal(x2, s1.index.asobject.values) + tm.assert_numpy_array_equal(x2, s1.index.asobject.values) def test_mixed_freq_regular_first_df(self): # GH 9852 @@ -674,9 +688,9 @@ def test_mixed_freq_irregular_first_df(self): self.assertFalse(hasattr(ax, 'freq')) lines = ax.get_lines() x1 = lines[0].get_xdata() - assert_array_equal(x1, s2.index.asobject.values) + tm.assert_numpy_array_equal(x1, s2.index.asobject.values) x2 = lines[1].get_xdata() - assert_array_equal(x2, s1.index.asobject.values) + tm.assert_numpy_array_equal(x2, s1.index.asobject.values) def test_mixed_freq_hf_first(self): idxh = date_range('1/1/1999', periods=365, freq='D') @@ -746,6 +760,15 @@ def test_to_weekly_resampling(self): for l in ax.get_lines(): self.assertTrue(PeriodIndex(data=l.get_xdata()).freq.startswith('W')) + # tsplot + from pandas.tseries.plotting import tsplot + import matplotlib.pyplot as plt + + tsplot(high, plt.Axes.plot) + lines = tsplot(low, plt.Axes.plot) + for l in lines: + self.assertTrue(PeriodIndex(data=l.get_xdata()).freq.startswith('W')) + @slow def test_from_weekly_resampling(self): idxh = date_range('1/1/1999', periods=52, freq='W') @@ -760,7 +783,22 @@ def test_from_weekly_resampling(self): 1553, 1558, 1562]) for l in ax.get_lines(): self.assertTrue(PeriodIndex(data=l.get_xdata()).freq.startswith('W')) + xdata = l.get_xdata(orig=False) + if len(xdata) == 12: # idxl lines + self.assert_numpy_array_equal(xdata, expected_l) + else: + self.assert_numpy_array_equal(xdata, expected_h) + tm.close() + + # tsplot + from pandas.tseries.plotting import tsplot + import matplotlib.pyplot as plt + + tsplot(low, plt.Axes.plot) + lines = tsplot(high, plt.Axes.plot) + for l in lines: + self.assertTrue(PeriodIndex(data=l.get_xdata()).freq.startswith('W')) xdata = l.get_xdata(orig=False) if len(xdata) == 12: # idxl lines self.assert_numpy_array_equal(xdata, expected_l) @@ -1044,7 +1082,7 @@ def test_ax_plot(self): fig = plt.figure() ax = fig.add_subplot(111) lines = ax.plot(x, y, label='Y') - assert_array_equal(DatetimeIndex(lines[0].get_xdata()), x) + tm.assert_numpy_array_equal(DatetimeIndex(lines[0].get_xdata()), x) @slow def test_mpl_nopandas(self): @@ -1063,9 +1101,9 @@ def test_mpl_nopandas(self): ax.plot_date([x.toordinal() for x in dates], values2, **kw) line1, line2 = ax.get_lines() - assert_array_equal(np.array([x.toordinal() for x in dates]), + tm.assert_numpy_array_equal(np.array([x.toordinal() for x in dates]), line1.get_xydata()[:, 0]) - assert_array_equal(np.array([x.toordinal() for x in dates]), + tm.assert_numpy_array_equal(np.array([x.toordinal() for x in dates]), line2.get_xydata()[:, 0]) @slow diff --git a/pandas/tseries/tests/test_resample.py b/pandas/tseries/tests/test_resample.py index 202ccb9438db5..4b3085dc8259f 100644 --- a/pandas/tseries/tests/test_resample.py +++ b/pandas/tseries/tests/test_resample.py @@ -9,7 +9,9 @@ from pandas import (Series, TimeSeries, DataFrame, Panel, Index, isnull, notnull, Timestamp) +from pandas.core.groupby import DataError from pandas.tseries.index import date_range +from pandas.tseries.tdi import timedelta_range from pandas.tseries.offsets import Minute, BDay from pandas.tseries.period import period_range, PeriodIndex, Period from pandas.tseries.resample import DatetimeIndex, TimeGrouper @@ -239,47 +241,47 @@ def test_resample_basic_from_daily(self): self.assertEqual(len(result), 3) self.assertTrue((result.index.dayofweek == [6, 6, 6]).all()) - self.assertEqual(result.irow(0), s['1/2/2005']) - self.assertEqual(result.irow(1), s['1/9/2005']) - self.assertEqual(result.irow(2), s.irow(-1)) + self.assertEqual(result.iloc[0], s['1/2/2005']) + self.assertEqual(result.iloc[1], s['1/9/2005']) + self.assertEqual(result.iloc[2], s.iloc[-1]) result = s.resample('W-MON', how='last') self.assertEqual(len(result), 2) self.assertTrue((result.index.dayofweek == [0, 0]).all()) - self.assertEqual(result.irow(0), s['1/3/2005']) - self.assertEqual(result.irow(1), s['1/10/2005']) + self.assertEqual(result.iloc[0], s['1/3/2005']) + self.assertEqual(result.iloc[1], s['1/10/2005']) result = s.resample('W-TUE', how='last') self.assertEqual(len(result), 2) self.assertTrue((result.index.dayofweek == [1, 1]).all()) - self.assertEqual(result.irow(0), s['1/4/2005']) - self.assertEqual(result.irow(1), s['1/10/2005']) + self.assertEqual(result.iloc[0], s['1/4/2005']) + self.assertEqual(result.iloc[1], s['1/10/2005']) result = s.resample('W-WED', how='last') self.assertEqual(len(result), 2) self.assertTrue((result.index.dayofweek == [2, 2]).all()) - self.assertEqual(result.irow(0), s['1/5/2005']) - self.assertEqual(result.irow(1), s['1/10/2005']) + self.assertEqual(result.iloc[0], s['1/5/2005']) + self.assertEqual(result.iloc[1], s['1/10/2005']) result = s.resample('W-THU', how='last') self.assertEqual(len(result), 2) self.assertTrue((result.index.dayofweek == [3, 3]).all()) - self.assertEqual(result.irow(0), s['1/6/2005']) - self.assertEqual(result.irow(1), s['1/10/2005']) + self.assertEqual(result.iloc[0], s['1/6/2005']) + self.assertEqual(result.iloc[1], s['1/10/2005']) result = s.resample('W-FRI', how='last') self.assertEqual(len(result), 2) self.assertTrue((result.index.dayofweek == [4, 4]).all()) - self.assertEqual(result.irow(0), s['1/7/2005']) - self.assertEqual(result.irow(1), s['1/10/2005']) + self.assertEqual(result.iloc[0], s['1/7/2005']) + self.assertEqual(result.iloc[1], s['1/10/2005']) # to biz day result = s.resample('B', how='last') self.assertEqual(len(result), 7) self.assertTrue((result.index.dayofweek == [4, 0, 1, 2, 3, 4, 0]).all()) - self.assertEqual(result.irow(0), s['1/2/2005']) - self.assertEqual(result.irow(1), s['1/3/2005']) - self.assertEqual(result.irow(5), s['1/9/2005']) + self.assertEqual(result.iloc[0], s['1/2/2005']) + self.assertEqual(result.iloc[1], s['1/3/2005']) + self.assertEqual(result.iloc[5], s['1/9/2005']) self.assertEqual(result.index.name, 'index') def test_resample_upsampling_picked_but_not_correct(self): @@ -406,13 +408,13 @@ def test_resample_ohlc(self): self.assertEqual(len(result), len(expect)) self.assertEqual(len(result.columns), 4) - xs = result.irow(-2) + xs = result.iloc[-2] self.assertEqual(xs['open'], s[-6]) self.assertEqual(xs['high'], s[-6:-1].max()) self.assertEqual(xs['low'], s[-6:-1].min()) self.assertEqual(xs['close'], s[-2]) - xs = result.irow(0) + xs = result.iloc[0] self.assertEqual(xs['open'], s[0]) self.assertEqual(xs['high'], s[:5].max()) self.assertEqual(xs['low'], s[:5].min()) @@ -462,7 +464,7 @@ def test_resample_reresample(self): bs = s.resample('B', closed='right', label='right') result = bs.resample('8H') self.assertEqual(len(result), 22) - tm.assert_isinstance(result.index.freq, offsets.DateOffset) + tm.assertIsInstance(result.index.freq, offsets.DateOffset) self.assertEqual(result.index.freq, offsets.Hour(8)) def test_resample_timestamp_to_period(self): @@ -626,6 +628,21 @@ def test_resample_base(self): freq='5min') self.assertTrue(resampled.index.equals(exp_rng)) + def test_resample_base_with_timedeltaindex(self): + + # GH 10530 + rng = timedelta_range(start = '0s', periods = 25, freq = 's') + ts = Series(np.random.randn(len(rng)), index = rng) + + with_base = ts.resample('2s', base = 5) + without_base = ts.resample('2s') + + exp_without_base = timedelta_range(start = '0s', end = '25s', freq = '2s') + exp_with_base = timedelta_range(start = '5s', end = '29s', freq = '2s') + + self.assertTrue(without_base.index.equals(exp_without_base)) + self.assertTrue(with_base.index.equals(exp_with_base)) + def test_resample_daily_anchored(self): rng = date_range('1/1/2000 0:00:00', periods=10000, freq='T') ts = Series(np.random.randn(len(rng)), index=rng) @@ -660,6 +677,20 @@ def test_resample_empty(self): rs = xp.resample('A') assert_frame_equal(xp, rs) + # Empty series were sometimes causing a segfault (for the functions + # with Cython bounds-checking disabled) or an IndexError. We just run + # them to ensure they no longer do. (GH #10228) + for index in tm.all_timeseries_index_generator(0): + for dtype in (np.float, np.int, np.object, 'datetime64[ns]'): + for how in ('count', 'mean', 'min', 'ohlc', 'last', 'prod'): + empty_series = pd.Series([], index, dtype) + try: + empty_series.resample('d', how) + except DataError: + # Ignore these since some combinations are invalid + # (ex: doing mean with dtype of np.object) + pass + def test_weekly_resample_buglet(self): # #1327 rng = date_range('1/1/2000', freq='B', periods=20) @@ -774,7 +805,7 @@ def test_upsample_apply_functions(self): ts = Series(np.random.randn(len(rng)), index=rng) result = ts.resample('20min', how=['mean', 'sum']) - tm.assert_isinstance(result, DataFrame) + tm.assertIsInstance(result, DataFrame) def test_resample_not_monotonic(self): rng = pd.date_range('2012-06-12', periods=200, freq='h') diff --git a/pandas/tseries/tests/test_timedeltas.py b/pandas/tseries/tests/test_timedeltas.py index 948a0be91b276..5c7d459d3abc4 100644 --- a/pandas/tseries/tests/test_timedeltas.py +++ b/pandas/tseries/tests/test_timedeltas.py @@ -11,7 +11,7 @@ from pandas import (Index, Series, DataFrame, Timestamp, Timedelta, TimedeltaIndex, isnull, notnull, bdate_range, date_range, timedelta_range, Int64Index) import pandas.core.common as com -from pandas.compat import StringIO, lrange, range, zip, u, OrderedDict, long, PY3_2 +from pandas.compat import StringIO, lrange, range, zip, u, OrderedDict, long from pandas import compat, to_timedelta, tslib from pandas.tseries.timedeltas import _coerce_scalar_to_timedelta_type as ct from pandas.util.testing import (assert_series_equal, @@ -109,6 +109,23 @@ def test_construction(self): # currently invalid as it has a - on the hhmmdd part (only allowed on the days) self.assertRaises(ValueError, lambda : Timedelta('-10 days -1 h 1.5m 1s 3us')) + # only leading neg signs are allowed + self.assertRaises(ValueError, lambda : Timedelta('10 days -1 h 1.5m 1s 3us')) + + # no units specified + self.assertRaises(ValueError, lambda : Timedelta('3.1415')) + + # invalid construction + tm.assertRaisesRegexp(ValueError, + "cannot construct a TimeDelta", + lambda : Timedelta()) + tm.assertRaisesRegexp(ValueError, + "unit abbreviation w/o a number", + lambda : Timedelta('foo')) + tm.assertRaisesRegexp(ValueError, + "cannot construct a TimeDelta from the passed arguments, allowed keywords are ", + lambda : Timedelta(day=10)) + # roundtripping both for string and value for v in ['1s', '-1s', @@ -146,17 +163,6 @@ def test_construction(self): self.assertEqual(Timedelta(pd.offsets.Hour(2)),Timedelta('0 days, 02:00:00')) self.assertEqual(Timedelta(pd.offsets.Second(2)),Timedelta('0 days, 00:00:02')) - # invalid - tm.assertRaisesRegexp(ValueError, - "cannot construct a TimeDelta", - lambda : Timedelta()) - tm.assertRaisesRegexp(ValueError, - "cannot create timedelta string convert", - lambda : Timedelta('foo')) - tm.assertRaisesRegexp(ValueError, - "cannot construct a TimeDelta from the passed arguments, allowed keywords are ", - lambda : Timedelta(day=10)) - def test_repr(self): self.assertEqual(repr(Timedelta(10,unit='d')),"Timedelta('10 days 00:00:00')") @@ -601,12 +607,22 @@ def testit(unit, transform): # ms testit('L',lambda x: 'ms') + def test_to_timedelta_invalid(self): + # these will error self.assertRaises(ValueError, lambda : to_timedelta([1,2],unit='foo')) self.assertRaises(ValueError, lambda : to_timedelta(1,unit='foo')) # time not supported ATM self.assertRaises(ValueError, lambda :to_timedelta(time(second=1))) + self.assertTrue(to_timedelta(time(second=1), errors='coerce') is pd.NaT) + + self.assertRaises(ValueError, lambda : to_timedelta(['foo','bar'])) + tm.assert_index_equal(TimedeltaIndex([pd.NaT,pd.NaT]), + to_timedelta(['foo','bar'], errors='coerce')) + + tm.assert_index_equal(TimedeltaIndex(['1 day', pd.NaT, '1 min']), + to_timedelta(['1 day','bar','1 min'], errors='coerce')) def test_to_timedelta_via_apply(self): # GH 5458 @@ -871,7 +887,7 @@ def test_append_join_nondatetimeindex(self): idx = Index(['a', 'b', 'c', 'd']) result = rng.append(idx) - tm.assert_isinstance(result[0], Timedelta) + tm.assertIsInstance(result[0], Timedelta) # it works rng.join(idx, how='outer') @@ -1040,8 +1056,6 @@ def test_comparisons_coverage(self): self.assert_numpy_array_equal(result, exp) def test_comparisons_nat(self): - if PY3_2: - raise nose.SkipTest('nat comparisons on 3.2 broken') tdidx1 = pd.TimedeltaIndex(['1 day', pd.NaT, '1 day 00:00:01', pd.NaT, '1 day 00:00:01', '5 day 00:00:03']) @@ -1099,7 +1113,7 @@ def test_misc_coverage(self): rng = timedelta_range('1 day', periods=5) result = rng.groupby(rng.days) - tm.assert_isinstance(list(result.values())[0][0], Timedelta) + tm.assertIsInstance(list(result.values())[0][0], Timedelta) idx = TimedeltaIndex(['3d','1d','2d']) self.assertTrue(idx.equals(list(idx))) @@ -1305,7 +1319,7 @@ def test_take(self): for taken in [taken1, taken2]: self.assertTrue(taken.equals(expected)) - tm.assert_isinstance(taken, TimedeltaIndex) + tm.assertIsInstance(taken, TimedeltaIndex) self.assertIsNone(taken.freq) self.assertEqual(taken.name, expected.name) @@ -1387,7 +1401,7 @@ def test_partial_slice(self): assert_series_equal(result, expected) result = s['6 days, 23:11:12'] - self.assertEqual(result, s.irow(133)) + self.assertEqual(result, s.iloc[133]) self.assertRaises(KeyError, s.__getitem__, '50 days') @@ -1406,7 +1420,7 @@ def test_partial_slice_high_reso(self): assert_series_equal(result, expected) result = s['1 days, 10:11:12.001001'] - self.assertEqual(result, s.irow(1001)) + self.assertEqual(result, s.iloc[1001]) def test_slice_with_negative_step(self): ts = Series(np.arange(20), diff --git a/pandas/tseries/tests/test_timeseries.py b/pandas/tseries/tests/test_timeseries.py index 09b2bb24714af..e02973136863d 100644 --- a/pandas/tseries/tests/test_timeseries.py +++ b/pandas/tseries/tests/test_timeseries.py @@ -11,7 +11,7 @@ from pandas import (Index, Series, TimeSeries, DataFrame, isnull, date_range, Timestamp, Period, DatetimeIndex, - Int64Index, to_datetime, bdate_range, Float64Index, TimedeltaIndex) + Int64Index, to_datetime, bdate_range, Float64Index, TimedeltaIndex, NaT) import pandas.core.datetools as datetools import pandas.tseries.offsets as offsets @@ -28,10 +28,10 @@ import pandas.index as _index -from pandas.compat import range, long, StringIO, lrange, lmap, zip, product, PY3_2 +from pandas.compat import range, long, StringIO, lrange, lmap, zip, product from numpy.random import rand -from numpy.testing import assert_array_equal from pandas.util.testing import assert_frame_equal +from pandas.io.common import PerformanceWarning import pandas.compat as compat import pandas.core.common as com from pandas import concat @@ -46,14 +46,6 @@ def _skip_if_has_locale(): if lang is not None: raise nose.SkipTest("Specific locale is set {0}".format(lang)) -def _skip_if_windows_python_3(): - if sys.version_info > (3,) and sys.platform == 'win32': - raise nose.SkipTest("not used on python 3/win32") - -def _skip_if_not_windows_python_3(): - if sys.version_info < (3,) or sys.platform != 'win32': - raise nose.SkipTest("only run on python 3/win32") - class TestTimeSeriesDuplicates(tm.TestCase): _multiprocess_can_split_ = True @@ -68,8 +60,8 @@ def setUp(self): self.dups = Series(np.random.randn(len(dates)), index=dates) def test_constructor(self): - tm.assert_isinstance(self.dups, TimeSeries) - tm.assert_isinstance(self.dups.index, DatetimeIndex) + tm.assertIsInstance(self.dups, TimeSeries) + tm.assertIsInstance(self.dups.index, DatetimeIndex) def test_is_unique_monotonic(self): self.assertFalse(self.dups.index.is_unique) @@ -369,13 +361,13 @@ def test_series_box_timestamp(self): rng = date_range('20090415', '20090519', freq='B') s = Series(rng) - tm.assert_isinstance(s[5], Timestamp) + tm.assertIsInstance(s[5], Timestamp) rng = date_range('20090415', '20090519', freq='B') s = Series(rng, index=rng) - tm.assert_isinstance(s[5], Timestamp) + tm.assertIsInstance(s[5], Timestamp) - tm.assert_isinstance(s.iget_value(5), Timestamp) + tm.assertIsInstance(s.iat[5], Timestamp) def test_date_range_ambiguous_arguments(self): # #2538 @@ -417,7 +409,7 @@ def test_timestamp_to_datetime_explicit_pytz(self): self.assertEqual(stamp.tzinfo, dtval.tzinfo) def test_timestamp_to_datetime_explicit_dateutil(self): - _skip_if_windows_python_3() + tm._skip_if_windows_python_3() tm._skip_if_no_dateutil() from pandas.tslib import _dateutil_gettz as gettz rng = date_range('20090415', '20090519', @@ -433,9 +425,9 @@ def test_index_convert_to_datetime_array(self): def _check_rng(rng): converted = rng.to_pydatetime() - tm.assert_isinstance(converted, np.ndarray) + tm.assertIsInstance(converted, np.ndarray) for x, stamp in zip(converted, rng): - tm.assert_isinstance(x, datetime) + tm.assertIsInstance(x, datetime) self.assertEqual(x, stamp.to_pydatetime()) self.assertEqual(x.tzinfo, stamp.tzinfo) @@ -453,9 +445,9 @@ def test_index_convert_to_datetime_array_explicit_pytz(self): def _check_rng(rng): converted = rng.to_pydatetime() - tm.assert_isinstance(converted, np.ndarray) + tm.assertIsInstance(converted, np.ndarray) for x, stamp in zip(converted, rng): - tm.assert_isinstance(x, datetime) + tm.assertIsInstance(x, datetime) self.assertEqual(x, stamp.to_pydatetime()) self.assertEqual(x.tzinfo, stamp.tzinfo) @@ -473,9 +465,9 @@ def test_index_convert_to_datetime_array_dateutil(self): def _check_rng(rng): converted = rng.to_pydatetime() - tm.assert_isinstance(converted, np.ndarray) + tm.assertIsInstance(converted, np.ndarray) for x, stamp in zip(converted, rng): - tm.assert_isinstance(x, datetime) + tm.assertIsInstance(x, datetime) self.assertEqual(x, stamp.to_pydatetime()) self.assertEqual(x.tzinfo, stamp.tzinfo) @@ -856,12 +848,16 @@ def test_string_na_nat_conversion(self): assert_almost_equal(result, expected) result2 = to_datetime(strings) - tm.assert_isinstance(result2, DatetimeIndex) - self.assert_numpy_array_equal(result, result2) + tm.assertIsInstance(result2, DatetimeIndex) + tm.assert_numpy_array_equal(result, result2) malformed = np.array(['1/100/2000', np.nan], dtype=object) - result = to_datetime(malformed) - self.assert_numpy_array_equal(result, malformed) + + # GH 10636, default is now 'raise' + self.assertRaises(ValueError, lambda : to_datetime(malformed, errors='raise')) + + result = to_datetime(malformed, errors='ignore') + tm.assert_numpy_array_equal(result, malformed) self.assertRaises(ValueError, to_datetime, malformed, errors='raise') @@ -927,11 +923,11 @@ def test_to_datetime_with_apply(self): assert_series_equal(result, expected) td = pd.Series(['May 04', 'Jun 02', ''], index=[1,2,3]) - self.assertRaises(ValueError, lambda : pd.to_datetime(td,format='%b %y')) - self.assertRaises(ValueError, lambda : td.apply(pd.to_datetime, format='%b %y')) - expected = pd.to_datetime(td, format='%b %y', coerce=True) + self.assertRaises(ValueError, lambda : pd.to_datetime(td,format='%b %y', errors='raise')) + self.assertRaises(ValueError, lambda : td.apply(pd.to_datetime, format='%b %y', errors='raise')) + expected = pd.to_datetime(td, format='%b %y', errors='coerce') - result = td.apply(lambda x: pd.to_datetime(x, format='%b %y', coerce=True)) + result = td.apply(lambda x: pd.to_datetime(x, format='%b %y', errors='coerce')) assert_series_equal(result, expected) def test_nat_vector_field_access(self): @@ -944,17 +940,39 @@ def test_nat_vector_field_access(self): result = getattr(idx, field) expected = [getattr(x, field) if x is not NaT else np.nan for x in idx] - self.assert_numpy_array_equivalent(result, np.array(expected)) + self.assert_numpy_array_equal(result, np.array(expected)) def test_nat_scalar_field_access(self): fields = ['year', 'quarter', 'month', 'day', 'hour', 'minute', 'second', 'microsecond', 'nanosecond', - 'week', 'dayofyear', 'days_in_month'] + 'week', 'dayofyear', 'days_in_month', 'daysinmonth', + 'dayofweek'] for field in fields: result = getattr(NaT, field) self.assertTrue(np.isnan(result)) - self.assertTrue(np.isnan(NaT.weekday())) + def test_NaT_methods(self): + # GH 9513 + raise_methods = ['astimezone', 'combine', 'ctime', 'dst', 'fromordinal', + 'fromtimestamp', 'isocalendar', 'isoformat', + 'strftime', 'strptime', + 'time', 'timestamp', 'timetuple', 'timetz', + 'toordinal', 'tzname', 'utcfromtimestamp', + 'utcnow', 'utcoffset', 'utctimetuple'] + nat_methods = ['date', 'now', 'replace', 'to_datetime', 'today'] + nan_methods = ['weekday', 'isoweekday'] + + for method in raise_methods: + if hasattr(NaT, method): + self.assertRaises(ValueError, getattr(NaT, method)) + + for method in nan_methods: + if hasattr(NaT, method): + self.assertTrue(np.isnan(getattr(NaT, method)())) + + for method in nat_methods: + if hasattr(NaT, method): + self.assertIs(getattr(NaT, method)(), NaT) def test_to_datetime_types(self): @@ -989,7 +1007,7 @@ def test_to_datetime_types(self): def test_to_datetime_unprocessable_input(self): # GH 4928 self.assert_numpy_array_equal( - to_datetime([1, '1']), + to_datetime([1, '1'], errors='ignore'), np.array([1, '1'], dtype='O') ) self.assertRaises(TypeError, to_datetime, [1, '1'], errors='raise') @@ -1035,7 +1053,7 @@ def test_to_datetime_dt64s(self): for dt in oob_dts: self.assertRaises(ValueError, pd.to_datetime, dt, errors='raise') self.assertRaises(ValueError, tslib.Timestamp, dt) - self.assertIs(pd.to_datetime(dt, coerce=True), NaT) + self.assertIs(pd.to_datetime(dt, errors='coerce'), NaT) def test_to_datetime_array_of_dt64s(self): dts = [ @@ -1057,12 +1075,11 @@ def test_to_datetime_array_of_dt64s(self): ValueError, pd.to_datetime, dts_with_oob, - coerce=False, errors='raise' ) self.assert_numpy_array_equal( - pd.to_datetime(dts_with_oob, box=False, coerce=True), + pd.to_datetime(dts_with_oob, box=False, errors='coerce'), np.array( [ Timestamp(dts_with_oob[0]).asm8, @@ -1073,11 +1090,11 @@ def test_to_datetime_array_of_dt64s(self): ) ) - # With coerce=False and errors='ignore', out of bounds datetime64s + # With errors='ignore', out of bounds datetime64s # are converted to their .item(), which depending on the version of # numpy is either a python datetime.datetime or datetime.date self.assert_numpy_array_equal( - pd.to_datetime(dts_with_oob, box=False, coerce=False), + pd.to_datetime(dts_with_oob, box=False, errors='ignore'), np.array( [dt.item() for dt in dts_with_oob], dtype='O' @@ -1440,6 +1457,25 @@ def test_dti_constructor_preserve_dti_freq(self): rng2 = DatetimeIndex(rng) self.assertEqual(rng.freq, rng2.freq) + def test_dti_constructor_years_only(self): + # GH 6961 + for tz in [None, 'UTC', 'Asia/Tokyo', 'dateutil/US/Pacific']: + rng1 = date_range('2014', '2015', freq='M', tz=tz) + expected1 = date_range('2014-01-31', '2014-12-31', freq='M', tz=tz) + + rng2 = date_range('2014', '2015', freq='MS', tz=tz) + expected2 = date_range('2014-01-01', '2015-01-01', freq='MS', tz=tz) + + rng3 = date_range('2014', '2020', freq='A', tz=tz) + expected3 = date_range('2014-12-31', '2019-12-31', freq='A', tz=tz) + + rng4 = date_range('2014', '2020', freq='AS', tz=tz) + expected4 = date_range('2014-01-01', '2020-01-01', freq='AS', tz=tz) + + for rng, expected in [(rng1, expected1), (rng2, expected2), + (rng3, expected3), (rng4, expected4)]: + tm.assert_index_equal(rng, expected) + def test_normalize(self): rng = date_range('1/1/2000 9:30', periods=10, freq='D') @@ -2092,7 +2128,7 @@ def test_append_join_nondatetimeindex(self): idx = Index(['a', 'b', 'c', 'd']) result = rng.append(idx) - tm.assert_isinstance(result[0], Timestamp) + tm.assertIsInstance(result[0], Timestamp) # it works rng.join(idx, how='outer') @@ -2154,6 +2190,15 @@ def test_constructor_coverage(self): from_ints = DatetimeIndex(expected.asi8) self.assertTrue(from_ints.equals(expected)) + # string with NaT + strings = np.array(['2000-01-01', '2000-01-02', 'NaT']) + result = DatetimeIndex(strings) + expected = DatetimeIndex(strings.astype('O')) + self.assertTrue(result.equals(expected)) + + from_ints = DatetimeIndex(expected.asi8) + self.assertTrue(from_ints.equals(expected)) + # non-conforming self.assertRaises(ValueError, DatetimeIndex, ['2000-01-01', '2000-01-02', '2000-01-04'], @@ -2225,8 +2270,6 @@ def test_comparisons_coverage(self): self.assert_numpy_array_equal(result, exp) def test_comparisons_nat(self): - if PY3_2: - raise nose.SkipTest('nat comparisons on 3.2 broken') fidx1 = pd.Index([1.0, np.nan, 3.0, np.nan, 5.0, 7.0]) fidx2 = pd.Index([2.0, 3.0, np.nan, np.nan, 6.0, 7.0]) @@ -2323,7 +2366,7 @@ def test_map(self): f = lambda x: x.strftime('%Y%m%d') result = rng.map(f) exp = [f(x) for x in rng] - self.assert_numpy_array_equal(result, exp) + tm.assert_almost_equal(result, exp) def test_iteration_preserves_tz(self): @@ -2359,7 +2402,7 @@ def test_iteration_preserves_tz(self): def test_misc_coverage(self): rng = date_range('1/1/2000', periods=5) result = rng.groupby(rng.day) - tm.assert_isinstance(list(result.values())[0][0], Timestamp) + tm.assertIsInstance(list(result.values())[0][0], Timestamp) idx = DatetimeIndex(['2000-01-03', '2000-01-01', '2000-01-02']) self.assertTrue(idx.equals(list(idx))) @@ -2412,6 +2455,91 @@ def test_intersection_bug_1708(self): result = index_1 & index_2 self.assertEqual(len(result), 0) + # GH 10699 + def test_datetime64_with_DateOffset(self): + for klass, assert_func in zip([Series, DatetimeIndex], + [self.assert_series_equal, + tm.assert_index_equal]): + s = klass(date_range('2000-01-01', '2000-01-31')) + result = s + pd.DateOffset(years=1) + result2 = pd.DateOffset(years=1) + s + exp = klass(date_range('2001-01-01', '2001-01-31')) + assert_func(result, exp) + assert_func(result2, exp) + + result = s - pd.DateOffset(years=1) + exp = klass(date_range('1999-01-01', '1999-01-31')) + assert_func(result, exp) + + s = klass([Timestamp('2000-01-15 00:15:00', tz='US/Central'), + pd.Timestamp('2000-02-15', tz='US/Central')]) + result = s + pd.offsets.MonthEnd() + result2 = pd.offsets.MonthEnd() + s + exp = klass([Timestamp('2000-01-31 00:15:00', tz='US/Central'), + Timestamp('2000-02-29', tz='US/Central')]) + assert_func(result, exp) + assert_func(result2, exp) + + # array of offsets - valid for Series only + if klass is Series: + with tm.assert_produces_warning(PerformanceWarning): + s = klass([Timestamp('2000-1-1'), Timestamp('2000-2-1')]) + result = s + Series([pd.offsets.DateOffset(years=1), + pd.offsets.MonthEnd()]) + exp = klass([Timestamp('2001-1-1'), Timestamp('2000-2-29')]) + assert_func(result, exp) + + # same offset + result = s + Series([pd.offsets.DateOffset(years=1), + pd.offsets.DateOffset(years=1)]) + exp = klass([Timestamp('2001-1-1'), Timestamp('2001-2-1')]) + assert_func(result, exp) + + s = klass([Timestamp('2000-01-05 00:15:00'), Timestamp('2000-01-31 00:23:00'), + Timestamp('2000-01-01'), Timestamp('2000-02-29'), Timestamp('2000-12-31')]) + + #DateOffset relativedelta fastpath + relative_kwargs = [('years', 2), ('months', 5), ('days', 3), + ('hours', 5), ('minutes', 10), ('seconds', 2), + ('microseconds', 5)] + for i, kwd in enumerate(relative_kwargs): + op = pd.DateOffset(**dict([kwd])) + assert_func(klass([x + op for x in s]), s + op) + assert_func(klass([x - op for x in s]), s - op) + op = pd.DateOffset(**dict(relative_kwargs[:i+1])) + assert_func(klass([x + op for x in s]), s + op) + assert_func(klass([x - op for x in s]), s - op) + + + # split by fast/slow path to test perf warning + off = {False: + ['YearBegin', ('YearBegin', {'month': 5}), + 'YearEnd', ('YearEnd', {'month': 5}), + 'MonthBegin', 'MonthEnd', 'Week', ('Week', {'weekday': 3}), + 'BusinessDay', 'BDay', 'QuarterEnd', 'QuarterBegin'], + PerformanceWarning: + ['CustomBusinessDay', 'CDay', 'CBMonthEnd','CBMonthBegin', + 'BMonthBegin', 'BMonthEnd', 'BusinessHour', 'BYearBegin', + 'BYearEnd','BQuarterBegin', ('LastWeekOfMonth', {'weekday':2}), + ('FY5253Quarter', {'qtr_with_extra_week': 1, 'startingMonth': 1, + 'weekday': 2, 'variation': 'nearest'}), + ('FY5253',{'weekday': 0, 'startingMonth': 2, 'variation': 'nearest'}), + ('WeekOfMonth', {'weekday': 2, 'week': 2}), 'Easter', + ('DateOffset', {'day': 4}), ('DateOffset', {'month': 5})]} + + for normalize in (True, False): + for warning, offsets in off.items(): + for do in offsets: + if isinstance(do, tuple): + do, kwargs = do + else: + do = do + kwargs = {} + op = getattr(pd.offsets,do)(5, normalize=normalize, **kwargs) + with tm.assert_produces_warning(warning): + assert_func(klass([x + op for x in s]), s + op) + assert_func(klass([x - op for x in s]), s - op) + assert_func(klass([op + x for x in s]), op + s) # def test_add_timedelta64(self): # rng = date_range('1/1/2000', periods=5) # delta = rng.values[3] - rng.values[1] @@ -2645,7 +2773,7 @@ def test_take(self): for taken in [taken1, taken2]: self.assertTrue(taken.equals(expected)) - tm.assert_isinstance(taken, DatetimeIndex) + tm.assertIsInstance(taken, DatetimeIndex) self.assertIsNone(taken.freq) self.assertEqual(taken.tz, expected.tz) self.assertEqual(taken.name, expected.name) @@ -2664,7 +2792,7 @@ def test_groupby_function_tuple_1677(self): monthly_group = df.groupby(lambda x: (x.year, x.month)) result = monthly_group.mean() - tm.assert_isinstance(result.index[0], tuple) + tm.assertIsInstance(result.index[0], tuple) def test_append_numpy_bug_1681(self): # another datetime64 bug @@ -2718,7 +2846,7 @@ def test_does_not_convert_mixed_integer(self): joined = cols.join(df.columns) self.assertEqual(cols.dtype, np.dtype('O')) self.assertEqual(cols.dtype, joined.dtype) - assert_array_equal(cols.values, joined.values) + tm.assert_numpy_array_equal(cols.values, joined.values) def test_slice_keeps_name(self): # GH4226 @@ -3139,11 +3267,11 @@ def test_datetimeindex_union_join_empty(self): empty = Index([]) result = dti.union(empty) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertIs(result, result) result = dti.join(empty) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) def test_series_set_value(self): # #1561 @@ -3249,6 +3377,12 @@ def test_NaT_scalar(self): series[2] = val self.assertTrue(com.isnull(series[2])) + def test_NaT_cast(self): + # GH10747 + result = Series([np.nan]).astype('M8[ns]') + expected = Series([NaT]) + assert_series_equal(result, expected) + def test_set_none_nan(self): self.series[3] = None self.assertIs(self.series[3], NaT) @@ -3502,6 +3636,9 @@ def check(val,unit=None,h=1,s=1,us=0): result = Timestamp(NaT) self.assertIs(result, NaT) + result = Timestamp('NaT') + self.assertIs(result, NaT) + def test_roundtrip(self): # test value to string and back conversions @@ -3809,7 +3946,7 @@ def test_partial_slice(self): assert_series_equal(result, expected) result = s['2005-1-1'] - self.assertEqual(result, s.irow(0)) + self.assertEqual(result, s.iloc[0]) self.assertRaises(Exception, s.__getitem__, '2004-12-31') @@ -4005,8 +4142,8 @@ def test_min_max(self): the_min = rng2.min() the_max = rng2.max() - tm.assert_isinstance(the_min, Timestamp) - tm.assert_isinstance(the_max, Timestamp) + tm.assertIsInstance(the_min, Timestamp) + tm.assertIsInstance(the_max, Timestamp) self.assertEqual(the_min, rng[0]) self.assertEqual(the_max, rng[-1]) @@ -4020,12 +4157,12 @@ def test_min_max_series(self): 'L': lvls}) result = df.TS.max() - exp = Timestamp(df.TS.iget(-1)) + exp = Timestamp(df.TS.iat[-1]) self.assertTrue(isinstance(result, Timestamp)) self.assertEqual(result, exp) result = df.TS.min() - exp = Timestamp(df.TS.iget(0)) + exp = Timestamp(df.TS.iat[0]) self.assertTrue(isinstance(result, Timestamp)) self.assertEqual(result, exp) @@ -4146,14 +4283,28 @@ def test_to_datetime_format_YYYYMMDD(self): # coercion # GH 7930 s = Series([20121231, 20141231, 99991231]) - result = pd.to_datetime(s,format='%Y%m%d') + result = pd.to_datetime(s,format='%Y%m%d',errors='ignore') expected = np.array([ datetime(2012,12,31), datetime(2014,12,31), datetime(9999,12,31) ], dtype=object) self.assert_numpy_array_equal(result, expected) - result = pd.to_datetime(s,format='%Y%m%d', coerce=True) + result = pd.to_datetime(s,format='%Y%m%d', errors='coerce') expected = Series(['20121231','20141231','NaT'],dtype='M8[ns]') assert_series_equal(result, expected) + # GH 10178 + def test_to_datetime_format_integer(self): + s = Series([2000, 2001, 2002]) + expected = Series([ Timestamp(x) for x in s.apply(str) ]) + + result = to_datetime(s,format='%Y') + assert_series_equal(result, expected) + + s = Series([200001, 200105, 200206]) + expected = Series([ Timestamp(x[:4] + '-' + x[4:]) for x in s.apply(str) ]) + + result = to_datetime(s,format='%Y%m') + assert_series_equal(result, expected) + def test_to_datetime_format_microsecond(self): val = '01-Apr-2011 00:00:01.978' format = '%d-%b-%Y %H:%M:%S.%f' @@ -4163,17 +4314,19 @@ def test_to_datetime_format_microsecond(self): def test_to_datetime_format_time(self): data = [ - ['01/10/2010 15:20', '%m/%d/%Y %H:%M', Timestamp('2010-01-10 15:20')], - ['01/10/2010 05:43', '%m/%d/%Y %I:%M', Timestamp('2010-01-10 05:43')], - ['01/10/2010 13:56:01', '%m/%d/%Y %H:%M:%S', Timestamp('2010-01-10 13:56:01')]#, - #['01/10/2010 08:14 PM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 20:14')], - #['01/10/2010 07:40 AM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 07:40')], - #['01/10/2010 09:12:56 AM', '%m/%d/%Y %I:%M:%S %p', Timestamp('2010-01-10 09:12:56')] + ['01/10/2010 15:20', '%m/%d/%Y %H:%M', Timestamp('2010-01-10 15:20')], + ['01/10/2010 05:43', '%m/%d/%Y %I:%M', Timestamp('2010-01-10 05:43')], + ['01/10/2010 13:56:01', '%m/%d/%Y %H:%M:%S', Timestamp('2010-01-10 13:56:01')]#, + #['01/10/2010 08:14 PM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 20:14')], + #['01/10/2010 07:40 AM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 07:40')], + #['01/10/2010 09:12:56 AM', '%m/%d/%Y %I:%M:%S %p', Timestamp('2010-01-10 09:12:56')] ] for s, format, dt in data: self.assertEqual(to_datetime(s, format=format), dt) def test_to_datetime_with_non_exact(self): + # GH 10834 + _skip_if_has_locale() # 8904 # exact kw @@ -4463,6 +4616,40 @@ def test_second(self): self.assertIsInstance(r2, Float64Index) tm.assert_index_equal(r1, r2) +class TestDaysInMonth(tm.TestCase): + + def test_coerce_deprecation(self): + + # deprecation of coerce + with tm.assert_produces_warning(FutureWarning): + to_datetime('2015-02-29', coerce=True) + with tm.assert_produces_warning(FutureWarning): + self.assertRaises(ValueError, lambda : to_datetime('2015-02-29', coerce=False)) + + # multiple arguments + for e, c in zip(['raise','ignore','coerce'],[True,False]): + with tm.assert_produces_warning(FutureWarning): + self.assertRaises(TypeError, lambda : to_datetime('2015-02-29', errors=e, coerce=c)) + + # tests for issue #10154 + def test_day_not_in_month_coerce(self): + self.assertTrue(isnull(to_datetime('2015-02-29', errors='coerce'))) + self.assertTrue(isnull(to_datetime('2015-02-29', format="%Y-%m-%d", errors='coerce'))) + self.assertTrue(isnull(to_datetime('2015-02-32', format="%Y-%m-%d", errors='coerce'))) + self.assertTrue(isnull(to_datetime('2015-04-31', format="%Y-%m-%d", errors='coerce'))) + + def test_day_not_in_month_raise(self): + self.assertRaises(ValueError, to_datetime, '2015-02-29', errors='raise') + self.assertRaises(ValueError, to_datetime, '2015-02-29', errors='raise', format="%Y-%m-%d") + self.assertRaises(ValueError, to_datetime, '2015-02-32', errors='raise', format="%Y-%m-%d") + self.assertRaises(ValueError, to_datetime, '2015-04-31', errors='raise', format="%Y-%m-%d") + + def test_day_not_in_month_ignore(self): + self.assertEqual(to_datetime('2015-02-29', errors='ignore'), '2015-02-29') + self.assertEqual(to_datetime('2015-02-29', errors='ignore', format="%Y-%m-%d"), '2015-02-29') + self.assertEqual(to_datetime('2015-02-32', errors='ignore', format="%Y-%m-%d"), '2015-02-32') + self.assertEqual(to_datetime('2015-04-31', errors='ignore', format="%Y-%m-%d"), '2015-04-31') + if __name__ == '__main__': nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], exit=False) diff --git a/pandas/tseries/tests/test_timeseries_legacy.py b/pandas/tseries/tests/test_timeseries_legacy.py index 1f811af0e24ba..6889f8e2afbb2 100644 --- a/pandas/tseries/tests/test_timeseries_legacy.py +++ b/pandas/tseries/tests/test_timeseries_legacy.py @@ -90,7 +90,7 @@ def test_unpickle_legacy_len0_daterange(self): ex_index = DatetimeIndex([], freq='B') self.assertTrue(result.index.equals(ex_index)) - tm.assert_isinstance(result.index.freq, offsets.BDay) + tm.assertIsInstance(result.index.freq, offsets.BDay) self.assertEqual(len(result), 0) def test_arithmetic_interaction(self): @@ -102,12 +102,12 @@ def test_arithmetic_interaction(self): result = dseries + oseries expected = dseries * 2 - tm.assert_isinstance(result.index, DatetimeIndex) + tm.assertIsInstance(result.index, DatetimeIndex) assert_series_equal(result, expected) result = dseries + oseries[:5] expected = dseries + dseries[:5] - tm.assert_isinstance(result.index, DatetimeIndex) + tm.assertIsInstance(result.index, DatetimeIndex) assert_series_equal(result, expected) def test_join_interaction(self): @@ -119,7 +119,7 @@ def _check_join(left, right, how='inner'): ea, eb, ec = left.join(DatetimeIndex(right), how=how, return_indexers=True) - tm.assert_isinstance(ra, DatetimeIndex) + tm.assertIsInstance(ra, DatetimeIndex) self.assertTrue(ra.equals(ea)) assert_almost_equal(rb, eb) @@ -143,8 +143,8 @@ def test_unpickle_daterange(self): filepath = os.path.join(pth, 'data', 'daterange_073.pickle') rng = read_pickle(filepath) - tm.assert_isinstance(rng[0], datetime) - tm.assert_isinstance(rng.offset, offsets.BDay) + tm.assertIsInstance(rng[0], datetime) + tm.assertIsInstance(rng.offset, offsets.BDay) self.assertEqual(rng.values.dtype, object) def test_setops(self): @@ -153,17 +153,17 @@ def test_setops(self): result = index[:5].union(obj_index[5:]) expected = index - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertTrue(result.equals(expected)) result = index[:10].intersection(obj_index[5:]) expected = index[5:10] - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertTrue(result.equals(expected)) result = index[:10] - obj_index[5:] expected = index[:5] - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertTrue(result.equals(expected)) def test_index_conversion(self): @@ -179,7 +179,7 @@ def test_tolist(self): rng = date_range('1/1/2000', periods=10) result = rng.tolist() - tm.assert_isinstance(result[0], Timestamp) + tm.assertIsInstance(result[0], Timestamp) def test_object_convert_fail(self): idx = DatetimeIndex([NaT]) diff --git a/pandas/tseries/tests/test_timezones.py b/pandas/tseries/tests/test_timezones.py index c7909acca96bb..aa655efc08ca5 100644 --- a/pandas/tseries/tests/test_timezones.py +++ b/pandas/tseries/tests/test_timezones.py @@ -1,7 +1,5 @@ # pylint: disable-msg=E1101,W0612 from datetime import datetime, timedelta, tzinfo, date -import sys -import os import nose import numpy as np @@ -238,7 +236,7 @@ def test_astimezone(self): expected = utc.tz_convert(self.tzstr('US/Eastern')) result = utc.astimezone(self.tzstr('US/Eastern')) self.assertEqual(expected, result) - tm.assert_isinstance(result, Timestamp) + tm.assertIsInstance(result, Timestamp) def test_create_with_tz(self): stamp = Timestamp('3/11/2012 05:00', tz=self.tzstr('US/Eastern')) @@ -837,8 +835,8 @@ def localize(self, tz, x): return x.replace(tzinfo=tz) def test_utc_with_system_utc(self): - if sys.platform == 'win32': - raise nose.SkipTest('Skipped on win32 due to dateutil bug.') + # Skipped on win32 due to dateutil bug + tm._skip_if_windows() from pandas.tslib import maybe_get_tz @@ -1045,11 +1043,11 @@ def test_join_utc_convert(self): for how in ['inner', 'outer', 'left', 'right']: result = left.join(left[:-5], how=how) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertEqual(result.tz, left.tz) result = left.join(right[:-5], how=how) - tm.assert_isinstance(result, DatetimeIndex) + tm.assertIsInstance(result, DatetimeIndex) self.assertEqual(result.tz.zone, 'UTC') def test_join_aware(self): diff --git a/pandas/tseries/tests/test_tslib.py b/pandas/tseries/tests/test_tslib.py index 341450f504e2a..85bae42e7a492 100644 --- a/pandas/tseries/tests/test_tslib.py +++ b/pandas/tseries/tests/test_tslib.py @@ -6,13 +6,15 @@ import pandas._period as period import datetime -from pandas.core.api import Timestamp, Series, Timedelta, Period +from pandas.core.api import Timestamp, Series, Timedelta, Period, to_datetime from pandas.tslib import get_timezone from pandas._period import period_asfreq, period_ordinal -from pandas.tseries.index import date_range +from pandas.tseries.index import date_range, DatetimeIndex from pandas.tseries.frequencies import get_freq +import pandas.tseries.tools as tools import pandas.tseries.offsets as offsets import pandas.util.testing as tm +import pandas.compat as compat from pandas.util.testing import assert_series_equal import pandas.compat as compat @@ -416,6 +418,7 @@ def test_nat_fields(self): class TestDatetimeParsingWrappers(tm.TestCase): + def test_does_not_convert_mixed_integer(self): bad_date_strings = ( '-50000', @@ -444,6 +447,179 @@ def test_does_not_convert_mixed_integer(self): tslib._does_string_look_like_datetime(good_date_string) ) + def test_parsers(self): + cases = {'2011-01-01': datetime.datetime(2011, 1, 1), + '2Q2005': datetime.datetime(2005, 4, 1), + '2Q05': datetime.datetime(2005, 4, 1), + '2005Q1': datetime.datetime(2005, 1, 1), + '05Q1': datetime.datetime(2005, 1, 1), + '2011Q3': datetime.datetime(2011, 7, 1), + '11Q3': datetime.datetime(2011, 7, 1), + '3Q2011': datetime.datetime(2011, 7, 1), + '3Q11': datetime.datetime(2011, 7, 1), + + # quarterly without space + '2000Q4': datetime.datetime(2000, 10, 1), + '00Q4': datetime.datetime(2000, 10, 1), + '4Q2000': datetime.datetime(2000, 10, 1), + '4Q00': datetime.datetime(2000, 10, 1), + '2000q4': datetime.datetime(2000, 10, 1), + + '2000-Q4': datetime.datetime(2000, 10, 1), + '00-Q4': datetime.datetime(2000, 10, 1), + '4Q-2000': datetime.datetime(2000, 10, 1), + '4Q-00': datetime.datetime(2000, 10, 1), + + '2000q4': datetime.datetime(2000, 10, 1), + '00q4': datetime.datetime(2000, 10, 1), + + '2005': datetime.datetime(2005, 1, 1), + '2005-11': datetime.datetime(2005, 11, 1), + '2005 11': datetime.datetime(2005, 11, 1), + '11-2005': datetime.datetime(2005, 11, 1), + '11 2005': datetime.datetime(2005, 11, 1), + '200511': datetime.datetime(2020, 5, 11), + '20051109': datetime.datetime(2005, 11, 9), + + '20051109 10:15': datetime.datetime(2005, 11, 9, 10, 15), + '20051109 08H': datetime.datetime(2005, 11, 9, 8, 0), + + '2005-11-09 10:15': datetime.datetime(2005, 11, 9, 10, 15), + '2005-11-09 08H': datetime.datetime(2005, 11, 9, 8, 0), + '2005/11/09 10:15': datetime.datetime(2005, 11, 9, 10, 15), + '2005/11/09 08H': datetime.datetime(2005, 11, 9, 8, 0), + + "Thu Sep 25 10:36:28 2003": datetime.datetime(2003, 9, 25, 10, 36, 28), + "Thu Sep 25 2003": datetime.datetime(2003, 9, 25), + "Sep 25 2003": datetime.datetime(2003, 9, 25), + "January 1 2014": datetime.datetime(2014, 1, 1), + + # GH 10537 + '2014-06': datetime.datetime(2014, 6, 1), + '06-2014': datetime.datetime(2014, 6, 1), + '2014-6': datetime.datetime(2014, 6, 1), + '6-2014': datetime.datetime(2014, 6, 1), + } + + for date_str, expected in compat.iteritems(cases): + result1, _, _ = tools.parse_time_string(date_str) + result2 = to_datetime(date_str) + result3 = to_datetime([date_str]) + result4 = to_datetime(np.array([date_str], dtype=object)) + result5 = Timestamp(date_str) + result6 = DatetimeIndex([date_str])[0] + result7 = date_range(date_str, freq='S', periods=1) + self.assertEqual(result1, expected) + self.assertEqual(result2, expected) + self.assertEqual(result3, expected) + self.assertEqual(result4, expected) + self.assertEqual(result5, expected) + self.assertEqual(result6, expected) + self.assertEqual(result7, expected) + + # NaT + result1, _, _ = tools.parse_time_string('NaT') + result2 = to_datetime('NaT') + result3 = Timestamp('NaT') + result4 = DatetimeIndex(['NaT'])[0] + self.assertTrue(result1 is tslib.NaT) + self.assertTrue(result1 is tslib.NaT) + self.assertTrue(result1 is tslib.NaT) + self.assertTrue(result1 is tslib.NaT) + + def test_parsers_quarter_invalid(self): + + cases = ['2Q 2005', '2Q-200A', '2Q-200', + '22Q2005', '6Q-20', '2Q200.'] + for case in cases: + self.assertRaises(ValueError, tools.parse_time_string, case) + + def test_parsers_dayfirst_yearfirst(self): + # str : dayfirst, yearfirst, expected + cases = {'10-11-12': [(False, False, datetime.datetime(2012, 10, 11)), + (True, False, datetime.datetime(2012, 11, 10)), + (False, True, datetime.datetime(2010, 11, 12)), + (True, True, datetime.datetime(2010, 11, 12))], + '20/12/21': [(False, False, datetime.datetime(2021, 12, 20)), + (True, False, datetime.datetime(2021, 12, 20)), + (False, True, datetime.datetime(2020, 12, 21)), + (True, True, datetime.datetime(2020, 12, 21))]} + + tm._skip_if_no_dateutil() + from dateutil.parser import parse + for date_str, values in compat.iteritems(cases): + for dayfirst, yearfirst ,expected in values: + result1, _, _ = tools.parse_time_string(date_str, dayfirst=dayfirst, + yearfirst=yearfirst) + + result2 = to_datetime(date_str, dayfirst=dayfirst, + yearfirst=yearfirst) + + result3 = DatetimeIndex([date_str], dayfirst=dayfirst, + yearfirst=yearfirst)[0] + + # Timestamp doesn't support dayfirst and yearfirst + + self.assertEqual(result1, expected) + self.assertEqual(result2, expected) + self.assertEqual(result3, expected) + + # compare with dateutil result + dateutil_result = parse(date_str, dayfirst=dayfirst, yearfirst=yearfirst) + self.assertEqual(dateutil_result, expected) + + def test_parsers_timestring(self): + tm._skip_if_no_dateutil() + from dateutil.parser import parse + + # must be the same as dateutil result + cases = {'10:15': (parse('10:15'), datetime.datetime(1, 1, 1, 10, 15)), + '9:05': (parse('9:05'), datetime.datetime(1, 1, 1, 9, 5)) } + + for date_str, (exp_now, exp_def) in compat.iteritems(cases): + result1, _, _ = tools.parse_time_string(date_str) + result2 = to_datetime(date_str) + result3 = to_datetime([date_str]) + result4 = Timestamp(date_str) + result5 = DatetimeIndex([date_str])[0] + # parse time string return time string based on default date + # others are not, and can't be changed because it is used in + # time series plot + self.assertEqual(result1, exp_def) + self.assertEqual(result2, exp_now) + self.assertEqual(result3, exp_now) + self.assertEqual(result4, exp_now) + self.assertEqual(result5, exp_now) + + def test_parsers_monthfreq(self): + cases = {'201101': datetime.datetime(2011, 1, 1, 0, 0), + '200005': datetime.datetime(2000, 5, 1, 0, 0)} + + for date_str, expected in compat.iteritems(cases): + result1, _, _ = tools.parse_time_string(date_str, freq='M') + result2 = tools._to_datetime(date_str, freq='M') + self.assertEqual(result1, expected) + self.assertEqual(result2, expected) + + def test_parsers_quarterly_with_freq(self): + + msg = 'Incorrect quarterly string is given, quarter must be between 1 and 4: 2013Q5' + with tm.assertRaisesRegexp(tslib.DateParseError, msg): + tools.parse_time_string('2013Q5') + + # GH 5418 + msg = 'Unable to retrieve month information from given freq: INVLD-L-DEC-SAT' + with tm.assertRaisesRegexp(tslib.DateParseError, msg): + tools.parse_time_string('2013Q1', freq='INVLD-L-DEC-SAT') + + cases = {('2013Q2', None): datetime.datetime(2013, 4, 1), + ('2013Q2', 'A-APR'): datetime.datetime(2012, 8, 1), + ('2013-Q2', 'A-DEC'): datetime.datetime(2013, 4, 1)} + + for (date_str, freq), exp in compat.iteritems(cases): + result, _, _ = tools.parse_time_string(date_str, freq=freq) + self.assertEqual(result, exp) + class TestArrayToDatetime(tm.TestCase): def test_parsing_valid_dates(self): @@ -476,10 +652,10 @@ def test_number_looking_strings_not_into_datetime(self): # These strings don't look like datetimes so they shouldn't be # attempted to be converted arr = np.array(['-352.737091', '183.575577'], dtype=object) - self.assert_numpy_array_equal(tslib.array_to_datetime(arr), arr) + self.assert_numpy_array_equal(tslib.array_to_datetime(arr, errors='ignore'), arr) arr = np.array(['1', '2', '3', '4', '5'], dtype=object) - self.assert_numpy_array_equal(tslib.array_to_datetime(arr), arr) + self.assert_numpy_array_equal(tslib.array_to_datetime(arr, errors='ignore'), arr) def test_coercing_dates_outside_of_datetime64_ns_bounds(self): invalid_dates = [ @@ -495,13 +671,12 @@ def test_coercing_dates_outside_of_datetime64_ns_bounds(self): ValueError, tslib.array_to_datetime, np.array([invalid_date], dtype='object'), - coerce=False, - raise_=True, + errors='raise', ) self.assertTrue( np.array_equal( tslib.array_to_datetime( - np.array([invalid_date], dtype='object'), coerce=True + np.array([invalid_date], dtype='object'), errors='coerce', ), np.array([tslib.iNaT], dtype='M8[ns]') ) @@ -509,7 +684,7 @@ def test_coercing_dates_outside_of_datetime64_ns_bounds(self): arr = np.array(['1/1/1000', '1/1/2000'], dtype=object) self.assert_numpy_array_equal( - tslib.array_to_datetime(arr, coerce=True), + tslib.array_to_datetime(arr, errors='coerce'), np.array( [ tslib.iNaT, @@ -524,11 +699,11 @@ def test_coerce_of_invalid_datetimes(self): # Without coercing, the presence of any invalid dates prevents # any values from being converted - self.assert_numpy_array_equal(tslib.array_to_datetime(arr), arr) + self.assert_numpy_array_equal(tslib.array_to_datetime(arr,errors='ignore'), arr) # With coercing, the invalid dates becomes iNaT self.assert_numpy_array_equal( - tslib.array_to_datetime(arr, coerce=True), + tslib.array_to_datetime(arr, errors='coerce'), np.array( [ '2013-01-01T00:00:00.000000000-0000', diff --git a/pandas/tseries/timedeltas.py b/pandas/tseries/timedeltas.py index 624981c5536f5..886d6ff42ced6 100644 --- a/pandas/tseries/timedeltas.py +++ b/pandas/tseries/timedeltas.py @@ -9,8 +9,11 @@ from pandas.core.common import (ABCSeries, is_integer_dtype, is_timedelta64_dtype, is_list_like, isnull, _ensure_object) +from pandas.util.decorators import deprecate_kwarg -def to_timedelta(arg, unit='ns', box=True, coerce=False): +@deprecate_kwarg(old_arg_name='coerce', new_arg_name='errors', + mapping={True: 'coerce', False: 'raise'}) +def to_timedelta(arg, unit='ns', box=True, errors='raise', coerce=None): """ Convert argument to timedelta @@ -19,9 +22,12 @@ def to_timedelta(arg, unit='ns', box=True, coerce=False): arg : string, timedelta, array of strings (with possible NAs) unit : unit of the arg (D,h,m,s,ms,us,ns) denote the unit, which is an integer/float number box : boolean, default True - If True returns a Timedelta/TimedeltaIndex of the results - if False returns a np.timedelta64 or ndarray of values of dtype timedelta64[ns] - coerce : force errors to NaT (False by default) + - If True returns a Timedelta/TimedeltaIndex of the results + - if False returns a np.timedelta64 or ndarray of values of dtype timedelta64[ns] + errors : {'ignore', 'raise', 'coerce'}, default 'raise' + - If 'raise', then invalid parsing will raise an exception + - If 'coerce', then invalid parsing will be set as NaT + - If 'ignore', then invalid parsing will return the input Returns ------- @@ -34,22 +40,13 @@ def _convert_listlike(arg, box, unit): if isinstance(arg, (list,tuple)) or ((hasattr(arg,'__iter__') and not hasattr(arg,'dtype'))): arg = np.array(list(arg), dtype='O') + # these are shortcutable if is_timedelta64_dtype(arg): value = arg.astype('timedelta64[ns]') elif is_integer_dtype(arg): - - # these are shortcutable - value = arg.astype('timedelta64[{0}]'.format(unit)).astype('timedelta64[ns]') + value = arg.astype('timedelta64[{0}]'.format(unit)).astype('timedelta64[ns]', copy=False) else: - try: - value = tslib.array_to_timedelta64(_ensure_object(arg), unit=unit, coerce=coerce) - except: - - # try to process strings fast; may need to fallback - try: - value = np.array([ _get_string_converter(r, unit=unit)() for r in arg ],dtype='m8[ns]') - except: - value = np.array([ _coerce_scalar_to_timedelta_type(r, unit=unit, coerce=coerce) for r in arg ]) + value = tslib.array_to_timedelta64(_ensure_object(arg), unit=unit, errors=errors) value = value.astype('timedelta64[ns]', copy=False) if box: @@ -67,7 +64,7 @@ def _convert_listlike(arg, box, unit): return _convert_listlike(arg, box=box, unit=unit) # ...so it must be a scalar value. Return scalar. - return _coerce_scalar_to_timedelta_type(arg, unit=unit, box=box, coerce=coerce) + return _coerce_scalar_to_timedelta_type(arg, unit=unit, box=box, errors=errors) _unit_map = { 'Y' : 'Y', @@ -95,15 +92,6 @@ def _convert_listlike(arg, box, unit): 'NS' : 'ns', 'ns' : 'ns', } -_unit_scale = { - 'd' : 86400*1e9, - 'h' : 3600*1e9, - 'm' : 60*1e9, - 's' : 1e9, - 'ms' : 1e6, - 'us' : 1e3, - 'ns' : 1, - } def _validate_timedelta_unit(arg): """ provide validation / translation for timedelta short units """ @@ -114,150 +102,11 @@ def _validate_timedelta_unit(arg): return 'ns' raise ValueError("invalid timedelta unit {0} provided".format(arg)) -_short_search = re.compile( - "^\s*(?P-?)\s*(?P\d*\.?\d*)\s*(?Pd|s|ms|us|ns)?\s*$",re.IGNORECASE) -_full_search = re.compile( - "^\s*(?P-?)\s*(?P\d*?\.?\d*?)?\s*(days|d|day)?,?\s*\+?(?P