openclean-logo

Welcome to openclean’s Documentation!

openclean is a Python library for data profiling and data cleaning. The project is motivated by the fact that data preparation is still a major bottleneck for many data science projects. Data preparation requires profiling to gain an understanding of data quality issues, and data manipulation to transform the data into a form that is fit for the intended purpose.

While a large number of different tools and techniques have previously been developed for profiling and cleaning data, one main issue that we see with these tools is the lack of access to them in a single (unified) framework. Existing tools may be implemented in different programming languages and require significant effort to install and interface with. In other cases, promising data cleaning methods have been published in the scientific literature but there is no suitable codebase available for them. We believe that the lack of seamless access to existing work is a major contributor to why data preparation is so time consuming.

The goal of openclean goal is to bring together data cleaning tools in a single environment that is easy and intuitive to use for a data scientist. openclean allows users to compose and execute cleaning pipelines that are built using a variety of different tools. We aim for openclean to be flexible and extensible to allow easy integration of new functionality. To this end, we define a set of primitives and API’s for the different types of operators (actors) in openclean pipelines.

Installation

Users

Install openclean from the Python Package Index (PyPI) using pip with:

pip install openclean-core

Contributors

Install openclean from the github repository using pip with:

pip install git+https://github.com/VIDA-NYU/openclean-core.git

Getting Started

openclean provides useful functionality to identify bugs and anomalous values, make fixes and wrangle datasets. Here, we walkthrough a simple example to get you acquainted with openclean in 10 minutes! Our misspellings dataset contains Street, Neighborhood and Borough names for New York City with a bunch of spelling mistakes. The goal of this exercise is to fix those errors using some tools we have at our disposal.

Loading Data

openclean uses a dataset (a wrapped pandas dataframe) as it’s primary data storage object. It can be created from any source data type accepted by pandas. Compressed Gzip files (.gz) are also accepted. For large datasets, it might be desirable to perform lazy evaluation on the data instead of loading it all to memory. To allow this, openclean lets users stream their datasets. More information on Datasets and Streams is provided in the Data Model section.

import os

path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'misspellings.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Profiling the Dataset

To provide insights about the dataset features, openclean comes with data profiling capabilities. A user can select the default profiler to get basic statistics or plug in their own profilers for advanced computations. More information about profilers is available in the Data Profiling section.

from openclean.profiling.dataset import dataset_profile

# generate a profile
profiles = dataset_profile(ds)

# see all stats
profiles.stats()
total empty distinct uniqueness entropy
Job # 10000 0 9329 0.932900 13.136359
Borough 10000 2 11 0.001100 2.074184
Street Name 10000 0 3691 0.369100 10.990810
GIS_NTA_NAME 10000 29 192 0.019256 7.040698

We see that there exist 11 distinct values in the Borough column whereas there are only 5 Boroughs in New York City and a bunch of them are empty/missing values.

ds['Borough'].value_counts()
MANHATTAN        3442
BROOKLYN         2999
QUEENS           2090
BRONX             932
STATEN ISLAND     529
                    2
BRONKS              1
BOOKLYN             1
MENHATTAN           1
QEENS               1
QUEINS              1
BROOKLIN            1
Name: Borough, dtype: int64

Going into further depth, we see realize there are a few variations for Brooklyn, Queens, Bronx and Manhattan.

Selecting Columns

As discussed earlier, we want to fix the mistakes in the Borough column. We can separate this column from the entire dataset using the select operation. Before we do that, for this example, let’s assume we need to get rid of rows that have missing values. So we’ll use the filter operator and the IsNotEmpty Eval function. Eval functions are explained in Data Model.

from openclean.operator.transform.filter import filter
from openclean.function.eval.null import IsNotEmpty

ds = filter(ds, predicate=IsNotEmpty('Borough'))

ds['Borough'].value_counts()
MANHATTAN        3442
BROOKLYN         2999
QUEENS           2090
BRONX             932
STATEN ISLAND     529
BRONKS              1
BOOKLYN             1
MENHATTAN           1
QEENS               1
QUEINS              1
BROOKLIN            1
Name: Borough, dtype: int64

Now, let’s separate out the column of interest. You can read more on selecting columns and other dataset/stream transformations in the Data Transformation section.

from openclean.operator.transform.select import select

misspelled_data = select(ds, columns=['Borough'], names=['messy_borough'])

misspelled_data['messy_borough'].unique()
array(['MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'STATEN ISLAND',
       'QUEINS', 'BOOKLYN', 'MENHATTAN', 'QEENS', 'BRONKS', 'BROOKLIN'],
      dtype=object)

Downloading and Preparing Master data

With openclean, a user can easily incorporate other datasets to enrich the data cleaning process. For e.g., let’s download an official list of borough names from the Borough Population projections dataset using Socrata to help us with the wrangling. We shall use this as the ground truth for correct spellings. You can read more about master datasets in the Data Enrichment section.

After downloading the master data, we preprocess it a bit to match the case with our input dataset. We use the update transformation from Data Wrangling and Cleaning to achieve this which can accept both: a dictionary or a function as the second argument.

from openclean.data.source.socrata import Socrata
from openclean.operator.transform.update import update

# download the master data and select the relevant column
nyc_boroughs = Socrata().dataset('xywu-7bv9').load()
nyc_boroughs = select(nyc_boroughs, columns=['Borough'])

# uppercase and strip the values to match with the misspelled data
nyc_boroughs = update(nyc_boroughs, 'Borough', str.upper)
nyc_boroughs = update(nyc_boroughs, 'Borough', str.strip)

nyc_boroughs
Borough
0 NYC TOTAL
1 BRONX
2 BROOKLYN
3 MANHATTAN
4 QUEENS
5 STATEN ISLAND

Identifying Fixes

We are now familiar with the mistakes in the data and have a master dataset with corrections available. openclean provides cleaning operators and repair strategies to let users fix their datasets with the minimum amount of coding involved. A list of various cleaning operators available can be accessed in the Data Wrangling and Cleaning section.

Here, we calculate Fuzzy String Similarity between messy_borough and Master data to create a mapping of misspellings to the possible fixes.

from openclean.function.matching.base import DefaultStringMatcher
from openclean.function.matching.fuzzy import FuzzySimilarity
from openclean.data.mapping import Mapping
from pprint import pprint

# the master vocabulary list
VOCABULARY = nyc_boroughs['Borough']

# create a string matcher that uses the provided vocabulary and similarity algorithm
matcher = DefaultStringMatcher(
        vocabulary=VOCABULARY,
        similarity=FuzzySimilarity()
)

# create a mapping to store the fixes
fixes = Mapping()

# look for matches in the vocabulary
for query in set(misspelled_data['messy_borough']):
    fixes.add(query, matcher.find_matches(query))

# print the fixes
pprint(fixes)
Mapping(<class 'list'>,
        {'BOOKLYN': [StringMatch(term='BROOKLYN', score=0.875)],
         'BRONKS': [StringMatch(term='BRONX', score=0.6666666666666667)],
         'BRONX': [StringMatch(term='BRONX', score=1)],
         'BROOKLIN': [StringMatch(term='BROOKLYN', score=0.875)],
         'BROOKLYN': [StringMatch(term='BROOKLYN', score=1)],
         'MANHATTAN': [StringMatch(term='MANHATTAN', score=1)],
         'MENHATTAN': [StringMatch(term='MANHATTAN', score=0.8888888888888888)],
         'QEENS': [StringMatch(term='QUEENS', score=0.8333333333333334)],
         'QUEENS': [StringMatch(term='QUEENS', score=1)],
         'QUEINS': [StringMatch(term='QUEENS', score=0.8333333333333334)],
         'STATEN ISLAND': [StringMatch(term='STATEN ISLAND', score=1)]})

The generated fixes mapping contains messy_borough content as keys and found matches from the vocabulary along with a match score as values.

Making Repairs

The simplest repair strategy here would be to look up messy_borough values in the fixes map and replace them. We achieve this with the update transformation from the Data Wrangling and Cleaning section.

from openclean.operator.transform.update import update

misspelled_data = update(misspelled_data, 'messy_borough', fixes.to_lookup())

misspelled_data['messy_borough'].unique()
array(['MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'STATEN ISLAND'],
      dtype=object)

We fixed it! One can also observe the decrease in uniqueness and entropy.

dataset_profile(misspelled_data).stats()
total empty distinct uniqueness entropy
messy_borough 9998 0 5 0.0005 2.066639

As we saw in this tiny real world example, openclean makes it straightforward to not only load and stream datasets, but also to profile them to identify bugs and provide masterdata alongside providing a toolkit to identify and make fixes.

More Examples

We provide many other Jupyter notebooks as examples to demonstrate different capabilities of openclean. All our notebooks along with the used datasets can be found in the Step by Step Guides.

Data Model

openclean provides useful functionality to identify bugs and anomalous values, make fixes and wrangle datasets. To help illustrate different operations, we use a sample of NYC open data with completed job codes at various locations in New York City.

Datasets and Streams

openclean uses a dataset (a wrapped pandas dataframe) as it’s primary data storage object. It can be created from any source data type accepted by pandas. Compressed Gzip files (.gz) are also accepted.

import os
path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'job_locations.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

For larger datasets, instead of loading the entire dataset into memory as above, openclean provides a streaming operator:

from openclean.pipeline import stream

sm = stream(os.path.join(path_to_file, 'job_locations.csv'))

print(sm)
<openclean.pipeline.DataPipeline object at 0x7f7f84d4fd10>

A dataset stream can directly have operators applied to it and the resulting dataset can computed lazily. We provide a jupyter notebook to demonstrate the streaming functionality further.

Eval Functions

Evaluation functions are used to compute results over rows in a dataset or a data stream. Conceptually, evaluation functions are evaluated over one or more columns for each row in the input data. For each row, the function is expected to generate one (or more) (transformed) value(s) for the column (columns) on which it operates.

Evaluation functions are building blocks for data frame operators as well as data stream pipelines. Each of these two use cases is supported by a different (abstract) method:

  • eval: The eval function is used by data frame operators. The function receives the full data frame as an argument. It returns a data series (or list) of values with one value for each row in the input data frame. Functions that operate over multiple columns will return a list of tuples.

  • prepare: If an evaluation function is used as part of a data stream operator the function needs to be prepared. That is, the function will need to know the schema of the rows in the data frame before streaming starts. The prepare method receives the schema of the data stream as an argument. It returns a callable function that accepts a data stream row as the only argument and that returns a single value or a tuple of values depending on whether the evaluation function operators on one or more columns.

Evaluation functions can be considered as wrappers around callables that store column information and can be passed around through openclean pipelines. The eval and prepare methods execute them. Here is a basic Eval function:

from openclean.function.eval.base import Eval

lower_case = Eval('Borough', str.lower)

print(ds['Borough'].to_list())
print()
print(lower_case.eval(ds))
['MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BRONX', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'BRONX', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BRONX', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'STATEN ISLAND', 'BRONX', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'MANHATTAN', 'BRONX', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'BRONX', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'QUEENS', 'BROOKLYN', 'QUEENS', 'STATEN ISLAND', 'MANHATTAN', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'BRONX', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'MANHATTAN', 'STATEN ISLAND', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'BROOKLYN', 'QUEENS', 'BRONX', 'QUEENS', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'BROOKLYN', 'BROOKLYN', 'BRONX', 'BRONX', 'BROOKLYN', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'STATEN ISLAND', 'QUEENS', 'QUEENS', 'MANHATTAN', 'BROOKLYN', 'MANHATTAN', 'STATEN ISLAND', 'MANHATTAN', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'QUEENS', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'BROOKLYN', 'MANHATTAN', 'MANHATTAN', 'QUEENS', 'BROOKLYN', 'STATEN ISLAND', 'MANHATTAN', 'MANHATTAN', 'BRONX', 'BROOKLYN', 'QUEENS', 'MANHATTAN', 'MANHATTAN', 'MANHATTAN', 'BROOKLYN', 'BRONX', 'BRONX', 'MANHATTAN', 'BROOKLYN']

['manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'bronx', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'queens', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'queens', 'staten island', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'staten island', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'queens', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'bronx', 'manhattan', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'bronx', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'staten island', 'bronx', 'bronx', 'bronx', 'queens', 'brooklyn', 'manhattan', 'bronx', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'queens', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'bronx', 'manhattan', 'queens', 'bronx', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'staten island', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'queens', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'queens', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'staten island', 'staten island', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'queens', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'staten island', 'bronx', 'staten island', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'staten island', 'manhattan', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'staten island', 'staten island', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'staten island', 'bronx', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'staten island', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'staten island', 'manhattan', 'bronx', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'staten island', 'queens', 'manhattan', 'queens', 'bronx', 'bronx', 'queens', 'queens', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'bronx', 'bronx', 'queens', 'manhattan', 'queens', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'bronx', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'bronx', 'bronx', 'bronx', 'bronx', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'bronx', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'staten island', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'bronx', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'bronx', 'queens', 'manhattan', 'queens', 'bronx', 'bronx', 'bronx', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'staten island', 'staten island', 'brooklyn', 'bronx', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'bronx', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'staten island', 'queens', 'queens', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'staten island', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'staten island', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'manhattan', 'queens', 'staten island', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'staten island', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'staten island', 'staten island', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'staten island', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'staten island', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'queens', 'queens', 'staten island', 'bronx', 'manhattan', 'queens', 'bronx', 'bronx', 'brooklyn', 'staten island', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'staten island', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'staten island', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'staten island', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'staten island', 'staten island', 'staten island', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'bronx', 'staten island', 'queens', 'bronx', 'bronx', 'queens', 'bronx', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'staten island', 'staten island', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'manhattan', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'bronx', 'queens', 'manhattan', 'queens', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'staten island', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'queens', 'bronx', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'queens', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'queens', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'staten island', 'queens', 'staten island', 'manhattan', 'manhattan', 'staten island', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'staten island', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'staten island', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'staten island', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'staten island', 'manhattan', 'brooklyn', 'queens', 'queens', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'staten island', 'staten island', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'staten island', 'bronx', 'brooklyn', 'bronx', 'queens', 'manhattan', 'queens', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'queens', 'bronx', 'queens', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'queens', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'queens', 'queens', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'staten island', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'bronx', 'queens', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'bronx', 'queens', 'brooklyn', 'queens', 'queens', 'staten island', 'staten island', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'bronx', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'bronx', 'staten island', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'staten island', 'staten island', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'bronx', 'staten island', 'brooklyn', 'queens', 'queens', 'bronx', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'queens', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'staten island', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'queens', 'manhattan', 'brooklyn', 'queens', 'staten island', 'staten island', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'queens', 'bronx', 'queens', 'bronx', 'queens', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'bronx', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'manhattan', 'staten island', 'bronx', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'staten island', 'bronx', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'staten island', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'bronx', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'queens', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'staten island', 'staten island', 'staten island', 'staten island', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'queens', 'manhattan', 'staten island', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'staten island', 'staten island', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'staten island', 'brooklyn', 'manhattan', 'bronx', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'bronx', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'staten island', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'queens', 'staten island', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'staten island', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'bronx', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'bronx', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'staten island', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'queens', 'staten island', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'bronx', 'queens', 'manhattan', 'bronx', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'staten island', 'queens', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'staten island', 'queens', 'bronx', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'bronx', 'staten island', 'queens', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'bronx', 'queens', 'staten island', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'bronx', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'bronx', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'queens', 'staten island', 'queens', 'queens', 'staten island', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'staten island', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'queens', 'bronx', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'staten island', 'queens', 'queens', 'queens', 'bronx', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'staten island', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'staten island', 'manhattan', 'manhattan', 'queens', 'bronx', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'manhattan', 'bronx', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'staten island', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'staten island', 'manhattan', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'bronx', 'manhattan', 'queens', 'bronx', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'bronx', 'queens', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'staten island', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'staten island', 'brooklyn', 'manhattan', 'staten island', 'queens', 'staten island', 'queens', 'queens', 'manhattan', 'brooklyn', 'staten island', 'queens', 'staten island', 'queens', 'manhattan', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'staten island', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'staten island', 'staten island', 'bronx', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'staten island', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'staten island', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'bronx', 'bronx', 'queens', 'queens', 'brooklyn', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'bronx', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'staten island', 'queens', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'staten island', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'bronx', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'staten island', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'bronx', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'bronx', 'brooklyn', 'queens', 'staten island', 'queens', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'staten island', 'manhattan', 'bronx', 'manhattan', 'staten island', 'queens', 'staten island', 'manhattan', 'bronx', 'queens', 'staten island', 'staten island', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'staten island', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'manhattan', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'staten island', 'bronx', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'queens', 'queens', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'staten island', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'queens', 'bronx', 'bronx', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'queens', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'bronx', 'queens', 'staten island', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'staten island', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'staten island', 'bronx', 'manhattan', 'bronx', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'queens', 'staten island', 'staten island', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'staten island', 'queens', 'staten island', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'bronx', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'staten island', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'staten island', 'manhattan', 'staten island', 'manhattan', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'staten island', 'manhattan', 'queens', 'brooklyn', 'bronx', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'queens', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'manhattan', 'staten island', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'staten island', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'bronx', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'manhattan', 'staten island', 'manhattan', 'queens', 'manhattan', 'bronx', 'bronx', 'bronx', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'staten island', 'staten island', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'queens', 'staten island', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'queens', 'bronx', 'bronx', 'queens', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'staten island', 'queens', 'queens', 'staten island', 'staten island', 'manhattan', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'bronx', 'staten island', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'staten island', 'manhattan', 'staten island', 'queens', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'staten island', 'bronx', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'bronx', 'brooklyn', 'staten island', 'queens', 'bronx', 'queens', 'bronx', 'queens', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'queens', 'queens', 'staten island', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'staten island', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'staten island', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'queens', 'brooklyn', 'staten island', 'staten island', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'staten island', 'staten island', 'staten island', 'manhattan', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'staten island', 'manhattan', 'brooklyn', 'bronx', 'queens', 'brooklyn', 'staten island', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'bronx', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'staten island', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'bronx', 'bronx', 'staten island', 'manhattan', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'staten island', 'queens', 'staten island', 'brooklyn', 'staten island', 'bronx', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'staten island', 'bronx', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'staten island', 'staten island', 'queens', 'bronx', 'manhattan', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'bronx', 'staten island', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'brooklyn', 'queens', 'manhattan', 'staten island', 'manhattan', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'staten island', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'queens', 'bronx', 'staten island', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'bronx', 'staten island', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'staten island', 'queens', 'queens', 'queens', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'bronx', 'manhattan', 'bronx', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'queens', 'queens', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'bronx', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'staten island', 'queens', 'queens', 'bronx', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'bronx', 'manhattan', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'queens', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'bronx', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'queens', 'queens', 'manhattan', 'bronx', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'queens', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'bronx', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'queens', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'staten island', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'queens', 'staten island', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'queens', 'bronx', 'queens', 'staten island', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'bronx', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'queens', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'staten island', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'staten island', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'queens', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'bronx', 'queens', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'staten island', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'queens', 'brooklyn', 'bronx', 'manhattan', 'staten island', 'queens', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'bronx', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'queens', 'manhattan', 'queens', 'staten island', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'brooklyn', 'queens', 'queens', 'brooklyn', 'brooklyn', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'queens', 'brooklyn', 'queens', 'queens', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'staten island', 'bronx', 'manhattan', 'bronx', 'bronx', 'bronx', 'manhattan', 'bronx', 'queens', 'brooklyn', 'queens', 'staten island', 'manhattan', 'queens', 'queens', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'brooklyn', 'brooklyn', 'bronx', 'brooklyn', 'bronx', 'manhattan', 'queens', 'queens', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'brooklyn', 'brooklyn', 'bronx', 'manhattan', 'staten island', 'manhattan', 'bronx', 'bronx', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'brooklyn', 'queens', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'brooklyn', 'staten island', 'queens', 'brooklyn', 'queens', 'staten island', 'manhattan', 'bronx', 'queens', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'brooklyn', 'queens', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'bronx', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'brooklyn', 'manhattan', 'queens', 'manhattan', 'bronx', 'manhattan', 'bronx', 'staten island', 'brooklyn', 'brooklyn', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'queens', 'bronx', 'queens', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'bronx', 'manhattan', 'staten island', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'queens', 'manhattan', 'brooklyn', 'brooklyn', 'queens', 'bronx', 'queens', 'manhattan', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'brooklyn', 'staten island', 'brooklyn', 'brooklyn', 'bronx', 'bronx', 'brooklyn', 'manhattan', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'queens', 'manhattan', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'manhattan', 'manhattan', 'staten island', 'queens', 'queens', 'manhattan', 'brooklyn', 'manhattan', 'staten island', 'manhattan', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'manhattan', 'manhattan', 'queens', 'manhattan', 'queens', 'manhattan', 'bronx', 'brooklyn', 'brooklyn', 'manhattan', 'manhattan', 'queens', 'brooklyn', 'staten island', 'manhattan', 'manhattan', 'bronx', 'brooklyn', 'queens', 'manhattan', 'manhattan', 'manhattan', 'brooklyn', 'bronx', 'bronx', 'manhattan', 'brooklyn']

Some important Eval functions that become building blocks for bigger operations are as follows. The whole range of eval functions and value functions can be accessed in the Eval package of the API Reference and Value package of the API Reference respectively.

Col

Col is an Evaluation function that returns the value from a single column in a data frame.

from openclean.function.eval.base import Col

boro = Col('Borough').eval(ds)

print(boro)
0       MANHATTAN
1        BROOKLYN
2          QUEENS
3        BROOKLYN
4           BRONX
          ...    
9995     BROOKLYN
9996        BRONX
9997        BRONX
9998    MANHATTAN
9999     BROOKLYN
Name: Borough, Length: 10000, dtype: object

Cols

Cols is an Evaluation function that returns the values from a multiple columns in a data frame row. Let’s try to get values from 2 columns together. Multiple columns are returned as a list of tuples:

from openclean.function.eval.base import Cols

job_locations = Cols(['Job #','Borough']).eval(ds)

print(job_locations)
[('140915936', 'MANHATTAN'), ('340737929', 'BROOKLYN'), ('440601733', 'QUEENS'), ('340737901', 'BROOKLYN'), ('240275910', 'BRONX'), ('440601706', 'QUEENS'), ('440601724', 'QUEENS'), ('123921649', 'MANHATTAN'), ('322050748', 'BROOKLYN'), ('440601742', 'QUEENS'), ('140915990', 'MANHATTAN'), ('140915992', 'QUEENS'), ('340737938', 'BROOKLYN'), ('123920622', 'MANHATTAN'), ('140915954', 'MANHATTAN'), ('201204286', 'BRONX'), ('140916025', 'MANHATTAN'), ('401469077', 'QUEENS'), ('401590257', 'QUEENS'), ('410081352', 'QUEENS'), ('140881810', 'MANHATTAN'), ('310123381', 'BROOKLYN'), ('140916007', 'MANHATTAN'), ('402065732', 'QUEENS'), ('402620721', 'QUEENS'), ('320025557', 'BROOKLYN'), ('120122811', 'MANHATTAN'), ('120133131', 'MANHATTAN'), ('420101525', 'QUEENS'), ('220047848', 'BRONX'), ('120315907', 'MANHATTAN'), ('420273420', 'QUEENS'), ('220093627', 'BRONX'), ('120514461', 'MANHATTAN'), ('120514461', 'MANHATTAN'), ('420461039', 'QUEENS'), ('120825759', 'MANHATTAN'), ('120825759', 'MANHATTAN'), ('120828523', 'MANHATTAN'), ('120828523', 'MANHATTAN'), ('420553742', 'QUEENS'), ('121161508', 'MANHATTAN'), ('121161508', 'MANHATTAN'), ('120704513', 'MANHATTAN'), ('520106714', 'STATEN ISLAND'), ('121176770', 'MANHATTAN'), ('302565855', 'BROOKLYN'), ('320586139', 'BROOKLYN'), ('121326172', 'MANHATTAN'), ('121571405', 'MANHATTAN'), ('420827500', 'QUEENS'), ('121326172', 'MANHATTAN'), ('420811090', 'QUEENS'), ('121326172', 'MANHATTAN'), ('220289603', 'BRONX'), ('220322229', 'BRONX'), ('220325413', 'BRONX'), ('220325404', 'BRONX'), ('220324110', 'BRONX'), ('220325440', 'BRONX'), ('121827130', 'MANHATTAN'), ('121848590', 'MANHATTAN'), ('320949649', 'BROOKLYN'), ('320949649', 'BROOKLYN'), ('320949649', 'BROOKLYN'), ('520189331', 'STATEN ISLAND'), ('420967751', 'QUEENS'), ('420986598', 'QUEENS'), ('220391332', 'BRONX'), ('320994607', 'BROOKLYN'), ('220394160', 'BRONX'), ('320936001', 'BROOKLYN'), ('121185528', 'MANHATTAN'), ('122085206', 'MANHATTAN'), ('520137806', 'STATEN ISLAND'), ('321038630', 'BROOKLYN'), ('440195254', 'QUEENS'), ('122262461', 'MANHATTAN'), ('321079435', 'BROOKLYN'), ('321042616', 'BROOKLYN'), ('421073956', 'QUEENS'), ('321023389', 'BROOKLYN'), ('321043385', 'BROOKLYN'), ('321043385', 'BROOKLYN'), ('321140617', 'BROOKLYN'), ('122428346', 'MANHATTAN'), ('122430547', 'MANHATTAN'), ('122430547', 'MANHATTAN'), ('321120666', 'BROOKLYN'), ('320625230', 'BROOKLYN'), ('220427964', 'BRONX'), ('321152827', 'BROOKLYN'), ('520214250', 'STATEN ISLAND'), ('520214250', 'STATEN ISLAND'), ('321205557', 'BROOKLYN'), ('321211871', 'BROOKLYN'), ('321209517', 'BROOKLYN'), ('122479255', 'MANHATTAN'), ('321231412', 'BROOKLYN'), ('140369946', 'MANHATTAN'), ('122481741', 'MANHATTAN'), ('421213181', 'QUEENS'), ('122519088', 'MANHATTAN'), ('122541703', 'MANHATTAN'), ('122542347', 'MANHATTAN'), ('122566712', 'MANHATTAN'), ('120952530', 'MANHATTAN'), ('321211871', 'BROOKLYN'), ('421239733', 'QUEENS'), ('321249957', 'BROOKLYN'), ('321307073', 'BROOKLYN'), ('520263223', 'STATEN ISLAND'), ('103649045', 'MANHATTAN'), ('340364082', 'BROOKLYN'), ('321323509', 'BROOKLYN'), ('321368024', 'BROOKLYN'), ('321368024', 'BROOKLYN'), ('321368024', 'BROOKLYN'), ('220523002', 'BRONX'), ('140520238', 'MANHATTAN'), ('340402200', 'BROOKLYN'), ('321416133', 'BROOKLYN'), ('122877324', 'MANHATTAN'), ('122877324', 'MANHATTAN'), ('220550794', 'BRONX'), ('122886966', 'MANHATTAN'), ('321365018', 'BROOKLYN'), ('321263529', 'BROOKLYN'), ('321195069', 'BROOKLYN'), ('122847241', 'MANHATTAN'), ('440356222', 'QUEENS'), ('340450443', 'BROOKLYN'), ('122938250', 'MANHATTAN'), ('122968262', 'MANHATTAN'), ('122989070', 'MANHATTAN'), ('122982406', 'MANHATTAN'), ('321229826', 'BROOKLYN'), ('421414856', 'QUEENS'), ('421385780', 'QUEENS'), ('122994224', 'MANHATTAN'), ('340466748', 'BROOKLYN'), ('321516962', 'BROOKLYN'), ('321517738', 'BROOKLYN'), ('340474472', 'BROOKLYN'), ('220584008', 'BRONX'), ('520293138', 'STATEN ISLAND'), ('122984841', 'MANHATTAN'), ('321535013', 'BROOKLYN'), ('421454795', 'QUEENS'), ('123040093', 'MANHATTAN'), ('123086659', 'MANHATTAN'), ('321186818', 'BROOKLYN'), ('321539439', 'BROOKLYN'), ('220589487', 'BRONX'), ('421456258', 'QUEENS'), ('123085106', 'MANHATTAN'), ('123037597', 'MANHATTAN'), ('123095033', 'MANHATTAN'), ('123095033', 'MANHATTAN'), ('123095033', 'MANHATTAN'), ('321574649', 'BROOKLYN'), ('421107849', 'QUEENS'), ('121275280', 'MANHATTAN'), ('421480061', 'QUEENS'), ('121242155', 'MANHATTAN'), ('321626692', 'BROOKLYN'), ('321606892', 'BROOKLYN'), ('321587920', 'BROOKLYN'), ('123297761', 'MANHATTAN'), ('421485841', 'QUEENS'), ('321194319', 'BROOKLYN'), ('123308278', 'MANHATTAN'), ('302575185', 'BROOKLYN'), ('340535399', 'BROOKLYN'), ('123110846', 'MANHATTAN'), ('123138700', 'MANHATTAN'), ('321518112', 'BROOKLYN'), ('321194284', 'BROOKLYN'), ('421553090', 'QUEENS'), ('520307668', 'STATEN ISLAND'), ('123180075', 'MANHATTAN'), ('123335417', 'MANHATTAN'), ('123335417', 'MANHATTAN'), ('123336069', 'MANHATTAN'), ('240200386', 'BRONX'), ('321661493', 'BROOKLYN'), ('220620228', 'BRONX'), ('340759423', 'BROOKLYN'), ('321646698', 'BROOKLYN'), ('123077892', 'MANHATTAN'), ('220603693', 'BRONX'), ('421592468', 'QUEENS'), ('123228578', 'MANHATTAN'), ('340561163', 'BROOKLYN'), ('321726469', 'BROOKLYN'), ('421563515', 'QUEENS'), ('340576861', 'BROOKLYN'), ('321780649', 'BROOKLYN'), ('140741151', 'MANHATTAN'), ('201202180', 'BRONX'), ('140752326', 'MANHATTAN'), ('340595485', 'BROOKLYN'), ('140753637', 'MANHATTAN'), ('420663641', 'QUEENS'), ('123426444', 'MANHATTAN'), ('321646698', 'BROOKLYN'), ('302582667', 'BROOKLYN'), ('321750609', 'BROOKLYN'), ('321718432', 'BROOKLYN'), ('321753759', 'BROOKLYN'), ('421104860', 'QUEENS'), ('123216910', 'MANHATTAN'), ('421456258', 'QUEENS'), ('220651694', 'BRONX'), ('321767343', 'BROOKLYN'), ('123553332', 'MANHATTAN'), ('123576576', 'MANHATTAN'), ('340606810', 'BROOKLYN'), ('321774200', 'BROOKLYN'), ('123499945', 'MANHATTAN'), ('123485674', 'MANHATTAN'), ('123485674', 'MANHATTAN'), ('520339964', 'STATEN ISLAND'), ('421105681', 'QUEENS'), ('520304493', 'STATEN ISLAND'), ('123419292', 'MANHATTAN'), ('123419292', 'MANHATTAN'), ('421168701', 'QUEENS'), ('123364723', 'MANHATTAN'), ('123445691', 'MANHATTAN'), ('123561369', 'MANHATTAN'), ('123381544', 'MANHATTAN'), ('321821025', 'BROOKLYN'), ('123383873', 'MANHATTAN'), ('121188829', 'MANHATTAN'), ('123401121', 'MANHATTAN'), ('123401121', 'MANHATTAN'), ('123126143', 'MANHATTAN'), ('123561369', 'MANHATTAN'), ('220664831', 'BRONX'), ('321384159', 'BROOKLYN'), ('123518345', 'MANHATTAN'), ('240240565', 'BRONX'), ('220673616', 'BRONX'), ('220634357', 'BRONX'), ('520356203', 'STATEN ISLAND'), ('321845562', 'BROOKLYN'), ('321072441', 'BROOKLYN'), ('421636723', 'QUEENS'), ('321370725', 'BROOKLYN'), ('420664711', 'QUEENS'), ('123507963', 'MANHATTAN'), ('220678194', 'BRONX'), ('123401121', 'MANHATTAN'), ('421925787', 'QUEENS'), ('421925787', 'QUEENS'), ('340648179', 'BROOKLYN'), ('123591327', 'MANHATTAN'), ('123589508', 'MANHATTAN'), ('421927240', 'QUEENS'), ('520368236', 'STATEN ISLAND'), ('321073137', 'BROOKLYN'), ('421697809', 'QUEENS'), ('322058474', 'BROOKLYN'), ('421689444', 'QUEENS'), ('421719475', 'QUEENS'), ('421721079', 'QUEENS'), ('340655534', 'BROOKLYN'), ('421720873', 'QUEENS'), ('321919992', 'BROOKLYN'), ('321919992', 'BROOKLYN'), ('123511182', 'MANHATTAN'), ('340661242', 'BROOKLYN'), ('321385773', 'BROOKLYN'), ('123680908', 'MANHATTAN'), ('421724398', 'QUEENS'), ('123683576', 'MANHATTAN'), ('123850788', 'MANHATTAN'), ('421897497', 'QUEENS'), ('123827911', 'MANHATTAN'), ('123480740', 'MANHATTAN'), ('340662964', 'BROOKLYN'), ('220689495', 'BRONX'), ('123707408', 'MANHATTAN'), ('520374167', 'STATEN ISLAND'), ('440540443', 'QUEENS'), ('123716835', 'MANHATTAN'), ('123716835', 'MANHATTAN'), ('140839813', 'MANHATTAN'), ('123863195', 'MANHATTAN'), ('321935304', 'BROOKLYN'), ('123418444', 'MANHATTAN'), ('321940959', 'BROOKLYN'), ('140841542', 'MANHATTAN'), ('302586324', 'BROOKLYN'), ('440544323', 'QUEENS'), ('421742662', 'QUEENS'), ('421859965', 'QUEENS'), ('321955390', 'BROOKLYN'), ('210179359', 'BRONX'), ('321992019', 'BROOKLYN'), ('421739523', 'QUEENS'), ('421933153', 'QUEENS'), ('220701970', 'BRONX'), ('220703932', 'BRONX'), ('321776734', 'BROOKLYN'), ('321069197', 'BROOKLYN'), ('140849072', 'MANHATTAN'), ('302586832', 'BROOKLYN'), ('340678939', 'BROOKLYN'), ('121205356', 'MANHATTAN'), ('302586832', 'BROOKLYN'), ('123780499', 'MANHATTAN'), ('240254880', 'BRONX'), ('500875920', 'STATEN ISLAND'), ('123717086', 'MANHATTAN'), ('123723854', 'MANHATTAN'), ('123687581', 'MANHATTAN'), ('123687581', 'MANHATTAN'), ('123897328', 'MANHATTAN'), ('123894278', 'MANHATTAN'), ('123897328', 'MANHATTAN'), ('123897328', 'MANHATTAN'), ('123765498', 'MANHATTAN'), ('220707091', 'BRONX'), ('440550164', 'QUEENS'), ('123897328', 'MANHATTAN'), ('240256824', 'BRONX'), ('220708045', 'BRONX'), ('121205356', 'MANHATTAN'), ('123812384', 'MANHATTAN'), ('123767003', 'MANHATTAN'), ('421393842', 'QUEENS'), ('121205604', 'MANHATTAN'), ('123749015', 'MANHATTAN'), ('421728973', 'QUEENS'), ('220653344', 'BRONX'), ('421732334', 'QUEENS'), ('201202670', 'BRONX'), ('123774718', 'MANHATTAN'), ('421728973', 'QUEENS'), ('321970042', 'BROOKLYN'), ('220651890', 'BRONX'), ('421263714', 'QUEENS'), ('421263714', 'QUEENS'), ('321954186', 'BROOKLYN'), ('123369960', 'MANHATTAN'), ('421735171', 'QUEENS'), ('321594155', 'BROOKLYN'), ('220651881', 'BRONX'), ('321594155', 'BROOKLYN'), ('321961098', 'BROOKLYN'), ('123879954', 'MANHATTAN'), ('123780097', 'MANHATTAN'), ('440558843', 'QUEENS'), ('220712067', 'BRONX'), ('123712465', 'MANHATTAN'), ('240259885', 'BRONX'), ('321594734', 'BROOKLYN'), ('421735803', 'QUEENS'), ('220689039', 'BRONX'), ('322010346', 'BROOKLYN'), ('340693672', 'BROOKLYN'), ('140865776', 'MANHATTAN'), ('123773158', 'MANHATTAN'), ('340693645', 'BROOKLYN'), ('421727901', 'QUEENS'), ('321925725', 'BROOKLYN'), ('123802199', 'MANHATTAN'), ('123814854', 'MANHATTAN'), ('123818459', 'MANHATTAN'), ('421914129', 'QUEENS'), ('340696027', 'BROOKLYN'), ('220712888', 'BRONX'), ('321925725', 'BROOKLYN'), ('321594155', 'BROOKLYN'), ('321985198', 'BROOKLYN'), ('421796266', 'QUEENS'), ('421914156', 'QUEENS'), ('440567012', 'QUEENS'), ('440568477', 'QUEENS'), ('340698203', 'BROOKLYN'), ('520282426', 'STATEN ISLAND'), ('321963023', 'BROOKLYN'), ('220716170', 'BRONX'), ('520378528', 'STATEN ISLAND'), ('220689538', 'BRONX'), ('123705918', 'MANHATTAN'), ('321987436', 'BROOKLYN'), ('421911159', 'QUEENS'), ('123487459', 'MANHATTAN'), ('123787134', 'MANHATTAN'), ('140871885', 'MANHATTAN'), ('220717366', 'BRONX'), ('421909796', 'QUEENS'), ('140873669', 'MANHATTAN'), ('321984126', 'BROOKLYN'), ('421745776', 'QUEENS'), ('421746999', 'QUEENS'), ('220718249', 'BRONX'), ('322002122', 'BROOKLYN'), ('421903408', 'QUEENS'), ('140874098', 'MANHATTAN'), ('123787376', 'MANHATTAN'), ('123844705', 'MANHATTAN'), ('123822756', 'MANHATTAN'), ('123789356', 'MANHATTAN'), ('140876407', 'MANHATTAN'), ('440575842', 'QUEENS'), ('520395126', 'STATEN ISLAND'), ('321595813', 'BROOKLYN'), ('421909028', 'QUEENS'), ('421907191', 'QUEENS'), ('123847962', 'MANHATTAN'), ('421898833', 'QUEENS'), ('321974976', 'BROOKLYN'), ('421905521', 'QUEENS'), ('421907146', 'QUEENS'), ('123865040', 'MANHATTAN'), ('140881669', 'MANHATTAN'), ('421940421', 'QUEENS'), ('220722537', 'BRONX'), ('123726441', 'MANHATTAN'), ('340711563', 'BROOKLYN'), ('140882016', 'MANHATTAN'), ('421942429', 'QUEENS'), ('421907388', 'QUEENS'), ('321596475', 'BROOKLYN'), ('340711741', 'BROOKLYN'), ('520394485', 'STATEN ISLAND'), ('220703424', 'BRONX'), ('321421396', 'BROOKLYN'), ('322022048', 'BROOKLYN'), ('210180542', 'BRONX'), ('421779132', 'QUEENS'), ('220723439', 'BRONX'), ('210180542', 'BRONX'), ('123769662', 'MANHATTAN'), ('123867057', 'MANHATTAN'), ('123699952', 'MANHATTAN'), ('322029194', 'BROOKLYN'), ('322028426', 'BROOKLYN'), ('123797007', 'MANHATTAN'), ('321596858', 'BROOKLYN'), ('421939521', 'QUEENS'), ('321963309', 'BROOKLYN'), ('220724544', 'BRONX'), ('421799414', 'QUEENS'), ('421754774', 'QUEENS'), ('121207096', 'MANHATTAN'), ('421798488', 'QUEENS'), ('321588215', 'BROOKLYN'), ('123360665', 'MANHATTAN'), ('123360665', 'MANHATTAN'), ('210180766', 'BRONX'), ('421800019', 'QUEENS'), ('140886441', 'MANHATTAN'), ('140886628', 'MANHATTAN'), ('321588304', 'BROOKLYN'), ('123700325', 'MANHATTAN'), ('421939503', 'QUEENS'), ('520389259', 'STATEN ISLAND'), ('220726196', 'BRONX'), ('240269160', 'BRONX'), ('240269213', 'BRONX'), ('440586064', 'QUEENS'), ('322030440', 'BROOKLYN'), ('123841977', 'MANHATTAN'), ('210180800', 'BRONX'), ('421755407', 'QUEENS'), ('322041544', 'BROOKLYN'), ('421802473', 'QUEENS'), ('123839739', 'MANHATTAN'), ('322069104', 'BROOKLYN'), ('123840807', 'MANHATTAN'), ('123840807', 'MANHATTAN'), ('123569307', 'MANHATTAN'), ('322042491', 'BROOKLYN'), ('220725516', 'BRONX'), ('322069006', 'BROOKLYN'), ('123842379', 'MANHATTAN'), ('123570778', 'MANHATTAN'), ('322069596', 'BROOKLYN'), ('322071048', 'BROOKLYN'), ('440589132', 'QUEENS'), ('240269491', 'BRONX'), ('322070085', 'BROOKLYN'), ('421757557', 'QUEENS'), ('322071887', 'BROOKLYN'), ('123572730', 'MANHATTAN'), ('123724611', 'MANHATTAN'), ('340720303', 'BROOKLYN'), ('340720349', 'BROOKLYN'), ('421899253', 'QUEENS'), ('421899262', 'QUEENS'), ('322068748', 'BROOKLYN'), ('123865040', 'MANHATTAN'), ('322029194', 'BROOKLYN'), ('421756291', 'QUEENS'), ('123830140', 'MANHATTAN'), ('123855989', 'MANHATTAN'), ('440588428', 'QUEENS'), ('123573846', 'MANHATTAN'), ('123830248', 'MANHATTAN'), ('121207194', 'MANHATTAN'), ('421802687', 'QUEENS'), ('340721909', 'BROOKLYN'), ('340721945', 'BROOKLYN'), ('540174693', 'STATEN ISLAND'), ('123866593', 'MANHATTAN'), ('421959090', 'QUEENS'), ('140891088', 'MANHATTAN'), ('520380294', 'STATEN ISLAND'), ('123832433', 'MANHATTAN'), ('321963675', 'BROOKLYN'), ('421958901', 'QUEENS'), ('340722070', 'BROOKLYN'), ('421958545', 'QUEENS'), ('140901488', 'MANHATTAN'), ('140895672', 'MANHATTAN'), ('421958661', 'QUEENS'), ('520450244', 'STATEN ISLAND'), ('322045844', 'BROOKLYN'), ('240271102', 'BRONX'), ('140894012', 'MANHATTAN'), ('421961087', 'QUEENS'), ('240271549', 'BRONX'), ('220729754', 'BRONX'), ('440590264', 'QUEENS'), ('322040849', 'BROOKLYN'), ('440590120', 'QUEENS'), ('340724700', 'BROOKLYN'), ('340723792', 'BROOKLYN'), ('140894673', 'MANHATTAN'), ('440591361', 'QUEENS'), ('421961103', 'QUEENS'), ('123909191', 'MANHATTAN'), ('420667228', 'QUEENS'), ('140894030', 'MANHATTAN'), ('123843733', 'MANHATTAN'), ('540175193', 'STATEN ISLAND'), ('340724158', 'BROOKLYN'), ('140894986', 'MANHATTAN'), ('123845205', 'MANHATTAN'), ('340724354', 'BROOKLYN'), ('322034963', 'BROOKLYN'), ('340724746', 'BROOKLYN'), ('220729941', 'BRONX'), ('322050748', 'BROOKLYN'), ('123910385', 'MANHATTAN'), ('421961452', 'QUEENS'), ('520452215', 'STATEN ISLAND'), ('322033526', 'BROOKLYN'), ('140896528', 'MANHATTAN'), ('220730779', 'BRONX'), ('140901683', 'MANHATTAN'), ('123830854', 'MANHATTAN'), ('220729068', 'BRONX'), ('340725656', 'BROOKLYN'), ('240272352', 'BRONX'), ('340725727', 'BROOKLYN'), ('340725415', 'BROOKLYN'), ('123845205', 'MANHATTAN'), ('140901736', 'MANHATTAN'), ('140897439', 'MANHATTAN'), ('140897448', 'MANHATTAN'), ('140897475', 'MANHATTAN'), ('140897518', 'MANHATTAN'), ('421734476', 'QUEENS'), ('140897670', 'MANHATTAN'), ('123911712', 'MANHATTAN'), ('340726147', 'BROOKLYN'), ('140897796', 'MANHATTAN'), ('140897643', 'MANHATTAN'), ('140897830', 'MANHATTAN'), ('201204286', 'BRONX'), ('140898429', 'MANHATTAN'), ('421962228', 'QUEENS'), ('421962264', 'QUEENS'), ('201204696', 'BRONX'), ('340726496', 'BROOKLYN'), ('140898544', 'MANHATTAN'), ('322084374', 'BROOKLYN'), ('104213432', 'MANHATTAN'), ('140899259', 'MANHATTAN'), ('140899641', 'MANHATTAN'), ('140899240', 'MANHATTAN'), ('321821025', 'BROOKLYN'), ('140899017', 'MANHATTAN'), ('440593298', 'QUEENS'), ('440593305', 'QUEENS'), ('440593617', 'QUEENS'), ('140900755', 'MANHATTAN'), ('123857013', 'MANHATTAN'), ('123913952', 'MANHATTAN'), ('340727627', 'BROOKLYN'), ('140901040', 'MANHATTAN'), ('201204464', 'BRONX'), ('421961452', 'QUEENS'), ('340728261', 'BROOKLYN'), ('123922201', 'MANHATTAN'), ('210181079', 'BRONX'), ('140901433', 'MANHATTAN'), ('123911026', 'MANHATTAN'), ('420667576', 'QUEENS'), ('140902584', 'MANHATTAN'), ('440594313', 'QUEENS'), ('340728412', 'BROOKLYN'), ('140902655', 'MANHATTAN'), ('140902619', 'MANHATTAN'), ('140902637', 'MANHATTAN'), ('322085970', 'BROOKLYN'), ('123922130', 'MANHATTAN'), ('340728582', 'BROOKLYN'), ('140902897', 'MANHATTAN'), ('322086087', 'BROOKLYN'), ('140902968', 'MANHATTAN'), ('340728699', 'BROOKLYN'), ('123909609', 'MANHATTAN'), ('121208148', 'MANHATTAN'), ('322086513', 'BROOKLYN'), ('220733213', 'BRONX'), ('123791904', 'MANHATTAN'), ('340728751', 'BROOKLYN'), ('321993722', 'BROOKLYN'), ('321590890', 'BROOKLYN'), ('421696463', 'QUEENS'), ('421765450', 'QUEENS'), ('321729787', 'BROOKLYN'), ('140904145', 'MANHATTAN'), ('440594974', 'QUEENS'), ('140903912', 'MANHATTAN'), ('121208157', 'MANHATTAN'), ('140908631', 'MANHATTAN'), ('220732928', 'BRONX'), ('140903805', 'MANHATTAN'), ('322037434', 'BROOKLYN'), ('322037416', 'BROOKLYN'), ('340729466', 'BROOKLYN'), ('220707634', 'BRONX'), ('321588304', 'BROOKLYN'), ('340729563', 'BROOKLYN'), ('322037407', 'BROOKLYN'), ('420667638', 'QUEENS'), ('322012102', 'BROOKLYN'), ('340732274', 'BROOKLYN'), ('440595349', 'QUEENS'), ('240274458', 'BRONX'), ('140904546', 'MANHATTAN'), ('322037693', 'BROOKLYN'), ('140908766', 'MANHATTAN'), ('140904528', 'MANHATTAN'), ('123921346', 'MANHATTAN'), ('140904485', 'MANHATTAN'), ('340729910', 'BROOKLYN'), ('340729885', 'BROOKLYN'), ('140904902', 'MANHATTAN'), ('123819760', 'MANHATTAN'), ('140908819', 'MANHATTAN'), ('240273761', 'BRONX'), ('123913435', 'MANHATTAN'), ('140905055', 'MANHATTAN'), ('240273832', 'BRONX'), ('140905064', 'MANHATTAN'), ('123919974', 'MANHATTAN'), ('421946372', 'QUEENS'), ('340730070', 'BROOKLYN'), ('520398515', 'STATEN ISLAND'), ('321591041', 'BROOKLYN'), ('210181060', 'BRONX'), ('321596983', 'BROOKLYN'), ('123843813', 'MANHATTAN'), ('340730098', 'BROOKLYN'), ('322047405', 'BROOKLYN'), ('322086345', 'BROOKLYN'), ('520184390', 'STATEN ISLAND'), ('123570377', 'MANHATTAN'), ('121208193', 'MANHATTAN'), ('321591050', 'BROOKLYN'), ('121208200', 'MANHATTAN'), ('123910429', 'MANHATTAN'), ('140905091', 'MANHATTAN'), ('140905117', 'MANHATTAN'), ('440595526', 'QUEENS'), ('440595535', 'QUEENS'), ('140905108', 'MANHATTAN'), ('123919938', 'MANHATTAN'), ('140905082', 'MANHATTAN'), ('520394092', 'STATEN ISLAND'), ('440595562', 'QUEENS'), ('322086602', 'BROOKLYN'), ('123919901', 'MANHATTAN'), ('140905126', 'MANHATTAN'), ('123919910', 'MANHATTAN'), ('520394109', 'STATEN ISLAND'), ('322037924', 'BROOKLYN'), ('123919929', 'MANHATTAN'), ('140905135', 'MANHATTAN'), ('322086611', 'BROOKLYN'), ('322086620', 'BROOKLYN'), ('322053228', 'BROOKLYN'), ('322086586', 'BROOKLYN'), ('520452457', 'STATEN ISLAND'), ('322037988', 'BROOKLYN'), ('322086577', 'BROOKLYN'), ('322086568', 'BROOKLYN'), ('322053237', 'BROOKLYN'), ('140905153', 'MANHATTAN'), ('140905162', 'MANHATTAN'), ('322085015', 'BROOKLYN'), ('322085006', 'BROOKLYN'), ('520450556', 'STATEN ISLAND'), ('520396027', 'STATEN ISLAND'), ('520452518', 'STATEN ISLAND'), ('520452992', 'STATEN ISLAND'), ('123921319', 'MANHATTAN'), ('123921319', 'MANHATTAN'), ('140905171', 'MANHATTAN'), ('140905180', 'MANHATTAN'), ('121208013', 'MANHATTAN'), ('123910893', 'MANHATTAN'), ('123912999', 'MANHATTAN'), ('340730105', 'BROOKLYN'), ('123910991', 'MANHATTAN'), ('121208022', 'MANHATTAN'), ('121208031', 'MANHATTAN'), ('121208086', 'MANHATTAN'), ('121208068', 'MANHATTAN'), ('121208004', 'MANHATTAN'), ('322086639', 'BROOKLYN'), ('121208040', 'MANHATTAN'), ('322086648', 'BROOKLYN'), ('123910884', 'MANHATTAN'), ('421766770', 'QUEENS'), ('123921756', 'MANHATTAN'), ('421766878', 'QUEENS'), ('421766832', 'QUEENS'), ('321666452', 'BROOKLYN'), ('322037853', 'BROOKLYN'), ('140905215', 'MANHATTAN'), ('123921765', 'MANHATTAN'), ('421766805', 'QUEENS'), ('421766850', 'QUEENS'), ('421947665', 'QUEENS'), ('421766798', 'QUEENS'), ('123919395', 'MANHATTAN'), ('140905233', 'MANHATTAN'), ('421890216', 'QUEENS'), ('421951007', 'QUEENS'), ('421766869', 'QUEENS'), ('123912784', 'MANHATTAN'), ('123912784', 'MANHATTAN'), ('140905260', 'MANHATTAN'), ('220733142', 'BRONX'), ('240273850', 'BRONX'), ('140905251', 'MANHATTAN'), ('220728443', 'BRONX'), ('140905279', 'MANHATTAN'), ('340730123', 'BROOKLYN'), ('123921783', 'MANHATTAN'), ('123910474', 'MANHATTAN'), ('440595580', 'QUEENS'), ('421745357', 'QUEENS'), ('421767001', 'QUEENS'), ('421767038', 'QUEENS'), ('421766823', 'QUEENS'), ('421766994', 'QUEENS'), ('320912900', 'BROOKLYN'), ('220733151', 'BRONX'), ('421766280', 'QUEENS'), ('421766887', 'QUEENS'), ('421766841', 'QUEENS'), ('421766903', 'QUEENS'), ('421767010', 'QUEENS'), ('140905304', 'MANHATTAN'), ('140905313', 'MANHATTAN'), ('240273869', 'BRONX'), ('421542165', 'QUEENS'), ('421766976', 'QUEENS'), ('421961924', 'QUEENS'), ('421766645', 'QUEENS'), ('421765708', 'QUEENS'), ('340730132', 'BROOKLYN'), ('121207988', 'MANHATTAN'), ('140905331', 'MANHATTAN'), ('322053246', 'BROOKLYN'), ('121207933', 'MANHATTAN'), ('140905359', 'MANHATTAN'), ('121207979', 'MANHATTAN'), ('140905340', 'MANHATTAN'), ('322033928', 'BROOKLYN'), ('240273878', 'BRONX'), ('121207951', 'MANHATTAN'), ('340730141', 'BROOKLYN'), ('440595599', 'QUEENS'), ('210181426', 'BRONX'), ('210181426', 'BRONX'), ('340730150', 'BROOKLYN'), ('340730169', 'BROOKLYN'), ('440595606', 'QUEENS'), ('421958260', 'QUEENS'), ('340730178', 'BROOKLYN'), ('340730187', 'BROOKLYN'), ('340730196', 'BROOKLYN'), ('340730203', 'BROOKLYN'), ('140905377', 'MANHATTAN'), ('340730212', 'BROOKLYN'), ('340730221', 'BROOKLYN'), ('340730230', 'BROOKLYN'), ('340730276', 'BROOKLYN'), ('140905590', 'MANHATTAN'), ('220732857', 'BRONX'), ('140908837', 'MANHATTAN'), ('340730588', 'BROOKLYN'), ('123451727', 'MANHATTAN'), ('440595615', 'QUEENS'), ('140905466', 'MANHATTAN'), ('123538779', 'MANHATTAN'), ('540175807', 'STATEN ISLAND'), ('240274056', 'BRONX'), ('520451323', 'STATEN ISLAND'), ('540175834', 'STATEN ISLAND'), ('123556268', 'MANHATTAN'), ('123876617', 'MANHATTAN'), ('322034213', 'BROOKLYN'), ('440595937', 'QUEENS'), ('140906660', 'MANHATTAN'), ('340731293', 'BROOKLYN'), ('140906125', 'MANHATTAN'), ('340730935', 'BROOKLYN'), ('420667638', 'QUEENS'), ('240274537', 'BRONX'), ('123746517', 'MANHATTAN'), ('140907231', 'MANHATTAN'), ('440596641', 'QUEENS'), ('140907400', 'MANHATTAN'), ('140906713', 'MANHATTAN'), ('140907179', 'MANHATTAN'), ('540176012', 'STATEN ISLAND'), ('140907721', 'MANHATTAN'), ('140908098', 'MANHATTAN'), ('440597472', 'QUEENS'), ('140907909', 'MANHATTAN'), ('340731863', 'BROOKLYN'), ('440597481', 'QUEENS'), ('540176094', 'STATEN ISLAND'), ('140908169', 'MANHATTAN'), ('440597098', 'QUEENS'), ('340732470', 'BROOKLYN'), ('240274412', 'BRONX'), ('140909088', 'MANHATTAN'), ('140909104', 'MANHATTAN'), ('520396401', 'STATEN ISLAND'), ('520398365', 'STATEN ISLAND'), ('140908472', 'MANHATTAN'), ('440597695', 'QUEENS'), ('340732684', 'BROOKLYN'), ('140909426', 'MANHATTAN'), ('340732586', 'BROOKLYN'), ('440597659', 'QUEENS'), ('440597579', 'QUEENS'), ('140909444', 'MANHATTAN'), ('421962228', 'QUEENS'), ('440597891', 'QUEENS'), ('140909658', 'MANHATTAN'), ('440598051', 'QUEENS'), ('440597971', 'QUEENS'), ('340732979', 'BROOKLYN'), ('421962228', 'QUEENS'), ('140909756', 'MANHATTAN'), ('421946648', 'QUEENS'), ('340733022', 'BROOKLYN'), ('340733200', 'BROOKLYN'), ('340733371', 'BROOKLYN'), ('340733166', 'BROOKLYN'), ('340733291', 'BROOKLYN'), ('140909872', 'MANHATTAN'), ('140910245', 'MANHATTAN'), ('140910496', 'MANHATTAN'), ('340733521', 'BROOKLYN'), ('340733479', 'BROOKLYN'), ('440598587', 'QUEENS'), ('140910450', 'MANHATTAN'), ('140910502', 'MANHATTAN'), ('340733610', 'BROOKLYN'), ('240274742', 'BRONX'), ('340733718', 'BROOKLYN'), ('140910833', 'MANHATTAN'), ('340733932', 'BROOKLYN'), ('140910673', 'MANHATTAN'), ('140910824', 'MANHATTAN'), ('440598729', 'QUEENS'), ('140910922', 'MANHATTAN'), ('440598952', 'QUEENS'), ('140910940', 'MANHATTAN'), ('140910977', 'MANHATTAN'), ('440599005', 'QUEENS'), ('321592086', 'BROOKLYN'), ('140911262', 'MANHATTAN'), ('140910968', 'MANHATTAN'), ('140910931', 'MANHATTAN'), ('240275046', 'BRONX'), ('340734281', 'BROOKLYN'), ('140911440', 'MANHATTAN'), ('140911404', 'MANHATTAN'), ('140911468', 'MANHATTAN'), ('240275117', 'BRONX'), ('140911716', 'MANHATTAN'), ('140911592', 'MANHATTAN'), ('340734496', 'BROOKLYN'), ('140911654', 'MANHATTAN'), ('440599121', 'QUEENS'), ('140912001', 'MANHATTAN'), ('140912038', 'MANHATTAN'), ('140911967', 'MANHATTAN'), ('340734995', 'BROOKLYN'), ('340735011', 'BROOKLYN'), ('340735020', 'BROOKLYN'), ('340735208', 'BROOKLYN'), ('340735217', 'BROOKLYN'), ('440599194', 'QUEENS'), ('340735226', 'BROOKLYN'), ('340735235', 'BROOKLYN'), ('340734959', 'BROOKLYN'), ('340734968', 'BROOKLYN'), ('340735244', 'BROOKLYN'), ('340735271', 'BROOKLYN'), ('340735351', 'BROOKLYN'), ('440599407', 'QUEENS'), ('240275233', 'BRONX'), ('340735431', 'BROOKLYN'), ('240275251', 'BRONX'), ('340735583', 'BROOKLYN'), ('321592111', 'BROOKLYN'), ('140912644', 'MANHATTAN'), ('440599559', 'QUEENS'), ('140912476', 'MANHATTAN'), ('340735627', 'BROOKLYN'), ('140912966', 'MANHATTAN'), ('440599880', 'QUEENS'), ('140912939', 'MANHATTAN'), ('123518719', 'MANHATTAN'), ('340735752', 'BROOKLYN'), ('340735823', 'BROOKLYN'), ('140913055', 'MANHATTAN'), ('340735930', 'BROOKLYN'), ('140912813', 'MANHATTAN'), ('340735912', 'BROOKLYN'), ('140913251', 'MANHATTAN'), ('340736010', 'BROOKLYN'), ('240275475', 'BRONX'), ('440600002', 'QUEENS'), ('140913144', 'MANHATTAN'), ('140913288', 'MANHATTAN'), ('340736163', 'BROOKLYN'), ('340736305', 'BROOKLYN'), ('140913661', 'MANHATTAN'), ('140913448', 'MANHATTAN'), ('440600217', 'QUEENS'), ('140913331', 'MANHATTAN'), ('340736270', 'BROOKLYN'), ('440600182', 'QUEENS'), ('140913554', 'MANHATTAN'), ('140913849', 'MANHATTAN'), ('240275652', 'BRONX'), ('440600306', 'QUEENS'), ('140913741', 'MANHATTAN'), ('140913876', 'MANHATTAN'), ('340736617', 'BROOKLYN'), ('340736751', 'BROOKLYN'), ('140914250', 'MANHATTAN'), ('440600734', 'QUEENS'), ('421961103', 'QUEENS'), ('440600538', 'QUEENS'), ('540176986', 'STATEN ISLAND'), ('340736813', 'BROOKLYN'), ('440600752', 'QUEENS'), ('140914410', 'MANHATTAN'), ('140914606', 'MANHATTAN'), ('340737037', 'BROOKLYN'), ('440600869', 'QUEENS'), ('322036649', 'BROOKLYN'), ('340737000', 'BROOKLYN'), ('140914679', 'MANHATTAN'), ('340737144', 'BROOKLYN'), ('140914848', 'MANHATTAN'), ('340737126', 'BROOKLYN'), ('240275778', 'BRONX'), ('140914740', 'MANHATTAN'), ('140914651', 'MANHATTAN'), ('140914624', 'MANHATTAN'), ('440601074', 'QUEENS'), ('140914893', 'MANHATTAN'), ('340737242', 'BROOKLYN'), ('340737251', 'BROOKLYN'), ('440601001', 'QUEENS'), ('140914991', 'MANHATTAN'), ('340737402', 'BROOKLYN'), ('140915080', 'MANHATTAN'), ('140915277', 'MANHATTAN'), ('140915268', 'MANHATTAN'), ('340737395', 'BROOKLYN'), ('340737411', 'BROOKLYN'), ('340737493', 'BROOKLYN'), ('440601190', 'QUEENS'), ('240275849', 'BRONX'), ('540177084', 'STATEN ISLAND'), ('340737518', 'BROOKLYN'), ('340737484', 'BROOKLYN'), ('421778749', 'QUEENS'), ('140915482', 'MANHATTAN'), ('140915678', 'MANHATTAN'), ('340737616', 'BROOKLYN'), ('440601387', 'QUEENS'), ('440601252', 'QUEENS'), ('140915507', 'MANHATTAN'), ('340737705', 'BROOKLYN'), ('340737698', 'BROOKLYN'), ('321592175', 'BROOKLYN'), ('440601323', 'QUEENS'), ('140915632', 'MANHATTAN'), ('340737652', 'BROOKLYN'), ('340737661', 'BROOKLYN'), ('440601582', 'QUEENS'), ('140915909', 'MANHATTAN'), ('140916043', 'MANHATTAN'), ('340737947', 'BROOKLYN'), ('340737956', 'BROOKLYN'), ('140916098', 'MANHATTAN'), ('440601467', 'QUEENS'), ('140916061', 'MANHATTAN'), ('440601751', 'QUEENS'), ('140916070', 'MANHATTAN'), ('340738009', 'BROOKLYN'), ('440601760', 'QUEENS'), ('140916089', 'MANHATTAN'), ('540177128', 'STATEN ISLAND'), ('240275947', 'BRONX'), ('140916114', 'MANHATTAN'), ('420667638', 'QUEENS'), ('340738036', 'BROOKLYN'), ('140916105', 'MANHATTAN'), ('140916132', 'MANHATTAN'), ('340738072', 'BROOKLYN'), ('322036827', 'BROOKLYN'), ('340738063', 'BROOKLYN'), ('123577584', 'MANHATTAN'), ('340738107', 'BROOKLYN'), ('440601797', 'QUEENS'), ('140916150', 'MANHATTAN'), ('140916141', 'MANHATTAN'), ('440601788', 'QUEENS'), ('140916169', 'MANHATTAN'), ('340738116', 'BROOKLYN'), ('440601779', 'QUEENS'), ('440601804', 'QUEENS'), ('440601859', 'QUEENS'), ('440601831', 'QUEENS'), ('140916203', 'MANHATTAN'), ('140916187', 'MANHATTAN'), ('140916196', 'MANHATTAN'), ('440601822', 'QUEENS'), ('440601840', 'QUEENS'), ('123186364', 'MANHATTAN'), ('440601868', 'QUEENS'), ('140916285', 'MANHATTAN'), ('140916276', 'MANHATTAN'), ('440601886', 'QUEENS'), ('140916249', 'MANHATTAN'), ('201204464', 'BRONX'), ('201204464', 'BRONX'), ('140916310', 'MANHATTAN'), ('240275974', 'BRONX'), ('440601902', 'QUEENS'), ('140916329', 'MANHATTAN'), ('321797196', 'BROOKLYN'), ('140916338', 'MANHATTAN'), ('140916374', 'MANHATTAN'), ('540177137', 'STATEN ISLAND'), ('340738134', 'BROOKLYN'), ('140916347', 'MANHATTAN'), ('340738143', 'BROOKLYN'), ('140916356', 'MANHATTAN'), ('340738152', 'BROOKLYN'), ('340738198', 'BROOKLYN'), ('240275992', 'BRONX'), ('240275983', 'BRONX'), ('140916383', 'MANHATTAN'), ('540177155', 'STATEN ISLAND'), ('240276009', 'BRONX'), ('140916409', 'MANHATTAN'), ('440601939', 'QUEENS'), ('140916436', 'MANHATTAN'), ('340738232', 'BROOKLYN'), ('140916427', 'MANHATTAN'), ('340738223', 'BROOKLYN'), ('140916454', 'MANHATTAN'), ('140916472', 'MANHATTAN'), ('340738241', 'BROOKLYN'), ('140916506', 'MANHATTAN'), ('140916463', 'MANHATTAN'), ('440601948', 'QUEENS'), ('140916481', 'MANHATTAN'), ('103786155', 'MANHATTAN'), ('340738250', 'BROOKLYN'), ('140916515', 'MANHATTAN'), ('340738269', 'BROOKLYN'), ('103348959', 'MANHATTAN'), ('340738287', 'BROOKLYN'), ('103332421', 'MANHATTAN'), ('340738278', 'BROOKLYN'), ('104596439', 'MANHATTAN'), ('301095561', 'BROOKLYN'), ('301277482', 'BROOKLYN'), ('301277491', 'BROOKLYN'), ('301302622', 'BROOKLYN'), ('301995553', 'BROOKLYN'), ('301995562', 'BROOKLYN'), ('302016191', 'BROOKLYN'), ('201116470', 'BRONX'), ('104882968', 'MANHATTAN'), ('340738303', 'BROOKLYN'), ('340738330', 'BROOKLYN'), ('140916542', 'MANHATTAN'), ('240276045', 'BRONX'), ('340738312', 'BROOKLYN'), ('421925732', 'QUEENS'), ('240276027', 'BRONX'), ('140916597', 'MANHATTAN'), ('140916560', 'MANHATTAN'), ('140916588', 'MANHATTAN'), ('540177182', 'STATEN ISLAND'), ('140916604', 'MANHATTAN'), ('140916579', 'MANHATTAN'), ('240276054', 'BRONX'), ('140916659', 'MANHATTAN'), ('440601984', 'QUEENS'), ('340738349', 'BROOKLYN'), ('140916631', 'MANHATTAN'), ('140821234', 'MANHATTAN'), ('440601993', 'QUEENS'), ('540177208', 'STATEN ISLAND'), ('140916695', 'MANHATTAN'), ('340738358', 'BROOKLYN'), ('340738367', 'BROOKLYN'), ('140916686', 'MANHATTAN'), ('240276063', 'BRONX'), ('140916711', 'MANHATTAN'), ('440602000', 'QUEENS'), ('140916677', 'MANHATTAN'), ('440602019', 'QUEENS'), ('140916748', 'MANHATTAN'), ('440602028', 'QUEENS'), ('340738376', 'BROOKLYN'), ('540177235', 'STATEN ISLAND'), ('140916720', 'MANHATTAN'), ('240276072', 'BRONX'), ('540177244', 'STATEN ISLAND'), ('340738401', 'BROOKLYN'), ('240276107', 'BRONX'), ('340738394', 'BROOKLYN'), ('240276081', 'BRONX'), ('140916766', 'MANHATTAN'), ('140916757', 'MANHATTAN'), ('140916775', 'MANHATTAN'), ('210181373', 'BRONX'), ('340738410', 'BROOKLYN'), ('140916800', 'MANHATTAN'), ('140916793', 'MANHATTAN'), ('520454516', 'STATEN ISLAND'), ('520454525', 'STATEN ISLAND'), ('440602064', 'QUEENS'), ('140916819', 'MANHATTAN'), ('440602082', 'QUEENS'), ('240276125', 'BRONX'), ('240276143', 'BRONX'), ('440602073', 'QUEENS'), ('440602091', 'QUEENS'), ('540177253', 'STATEN ISLAND'), ('140916864', 'MANHATTAN'), ('340738456', 'BROOKLYN'), ('140916873', 'MANHATTAN'), ('540177262', 'STATEN ISLAND'), ('340738447', 'BROOKLYN'), ('340738465', 'BROOKLYN'), ('140916926', 'MANHATTAN'), ('140916917', 'MANHATTAN'), ('140916935', 'MANHATTAN'), ('440602108', 'QUEENS'), ('340738474', 'BROOKLYN'), ('340738492', 'BROOKLYN'), ('240276161', 'BRONX'), ('440602126', 'QUEENS'), ('140916962', 'MANHATTAN'), ('140916971', 'MANHATTAN'), ('140916944', 'MANHATTAN'), ('140916980', 'MANHATTAN'), ('340738562', 'BROOKLYN'), ('540177280', 'STATEN ISLAND'), ('140916999', 'MANHATTAN'), ('123547251', 'MANHATTAN'), ('140917006', 'MANHATTAN'), ('421713676', 'QUEENS'), ('340738535', 'BROOKLYN'), ('440602144', 'QUEENS'), ('123512430', 'MANHATTAN'), ('440602171', 'QUEENS'), ('140917015', 'MANHATTAN'), ('140917042', 'MANHATTAN'), ('340738580', 'BROOKLYN'), ('140917033', 'MANHATTAN'), ('322036881', 'BROOKLYN'), ('440602162', 'QUEENS'), ('340738599', 'BROOKLYN'), ('340738606', 'BROOKLYN'), ('340738615', 'BROOKLYN'), ('340738624', 'BROOKLYN'), ('140917088', 'MANHATTAN'), ('140917079', 'MANHATTAN'), ('140917097', 'MANHATTAN'), ('140917104', 'MANHATTAN'), ('140917113', 'MANHATTAN'), ('140917122', 'MANHATTAN'), ('140917131', 'MANHATTAN'), ('340738660', 'BROOKLYN'), ('340738651', 'BROOKLYN'), ('302186195', 'BROOKLYN'), ('401132573', 'QUEENS'), ('401390918', 'QUEENS'), ('210121116', 'BRONX'), ('210113900', 'BRONX'), ('420013960', 'QUEENS'), ('110198553', 'MANHATTAN'), ('440602199', 'QUEENS'), ('340738688', 'BROOKLYN'), ('220007622', 'BRONX'), ('220096027', 'BRONX'), ('320448226', 'BROOKLYN'), ('121109576', 'MANHATTAN'), ('340053284', 'BROOKLYN'), ('121328660', 'MANHATTAN'), ('121759365', 'MANHATTAN'), ('121328660', 'MANHATTAN'), ('320384026', 'BROOKLYN'), ('220284083', 'BRONX'), ('121328660', 'MANHATTAN'), ('121328660', 'MANHATTAN'), ('420901947', 'QUEENS'), ('121810479', 'MANHATTAN'), ('121328660', 'MANHATTAN'), ('121891783', 'MANHATTAN'), ('121944030', 'MANHATTAN'), ('121957882', 'MANHATTAN'), ('320933736', 'BROOKLYN'), ('340158992', 'BROOKLYN'), ('402892205', 'QUEENS'), ('340232297', 'BROOKLYN'), ('321093598', 'BROOKLYN'), ('302581597', 'BROOKLYN'), ('321042527', 'BROOKLYN'), ('520236619', 'STATEN ISLAND'), ('402896933', 'QUEENS'), ('103646994', 'MANHATTAN'), ('402895916', 'QUEENS'), ('440234774', 'QUEENS'), ('321166395', 'BROOKLYN'), ('440243835', 'QUEENS'), ('240111213', 'BRONX'), ('440247984', 'QUEENS'), ('421216295', 'QUEENS'), ('122632375', 'MANHATTAN'), ('140408011', 'MANHATTAN'), ('321254209', 'BROOKLYN'), ('440298394', 'QUEENS'), ('440302771', 'QUEENS'), ('420656775', 'QUEENS'), ('421098984', 'QUEENS'), ('321363332', 'BROOKLYN'), ('321357072', 'BROOKLYN'), ('321426293', 'BROOKLYN'), ('220523360', 'BRONX'), ('201196810', 'BRONX'), ('240161882', 'BRONX'), ('220559946', 'BRONX'), ('121191272', 'MANHATTAN'), ('220576721', 'BRONX'), ('220576721', 'BRONX'), ('220576721', 'BRONX'), ('220576721', 'BRONX'), ('421103095', 'QUEENS'), ('122835423', 'MANHATTAN'), ('220577418', 'BRONX'), ('240176518', 'BRONX'), ('123045622', 'MANHATTAN'), ('421475665', 'QUEENS'), ('421480953', 'QUEENS'), ('123045622', 'MANHATTAN'), ('321476014', 'BROOKLYN'), ('421405152', 'QUEENS'), ('122980177', 'MANHATTAN'), ('321193757', 'BROOKLYN'), ('421525558', 'QUEENS'), ('220605138', 'BRONX'), ('302575087', 'BROOKLYN'), ('321587804', 'BROOKLYN'), ('321608131', 'BROOKLYN'), ('421106056', 'QUEENS'), ('421548864', 'QUEENS'), ('321679983', 'BROOKLYN'), ('123257965', 'MANHATTAN'), ('321628869', 'BROOKLYN'), ('321692557', 'BROOKLYN'), ('121204428', 'MANHATTAN'), ('421563748', 'QUEENS'), ('421585323', 'QUEENS'), ('321686396', 'BROOKLYN'), ('123106842', 'MANHATTAN'), ('121204428', 'MANHATTAN'), ('123209777', 'MANHATTAN'), ('121204428', 'MANHATTAN'), ('340582989', 'BROOKLYN'), ('340585343', 'BROOKLYN'), ('123208992', 'MANHATTAN'), ('123360399', 'MANHATTAN'), ('321793902', 'BROOKLYN'), ('421605294', 'QUEENS'), ('520329403', 'STATEN ISLAND'), ('421622220', 'QUEENS'), ('321742799', 'BROOKLYN'), ('321490061', 'BROOKLYN'), ('340600941', 'BROOKLYN'), ('520330455', 'STATEN ISLAND'), ('321679983', 'BROOKLYN'), ('421613999', 'QUEENS'), ('123600077', 'MANHATTAN'), ('121204428', 'MANHATTAN'), ('321773041', 'BROOKLYN'), ('321789114', 'BROOKLYN'), ('321773522', 'BROOKLYN'), ('123477950', 'MANHATTAN'), ('220490252', 'BRONX'), ('320912955', 'BROOKLYN'), ('321717772', 'BROOKLYN'), ('321774237', 'BROOKLYN'), ('302583817', 'BROOKLYN'), ('440502779', 'QUEENS'), ('321807247', 'BROOKLYN'), ('121188678', 'MANHATTAN'), ('220662735', 'BRONX'), ('421624460', 'QUEENS'), ('240232379', 'BRONX'), ('321815522', 'BROOKLYN'), ('321831924', 'BROOKLYN'), ('321815568', 'BROOKLYN'), ('123539545', 'MANHATTAN'), ('321834388', 'BROOKLYN'), ('320911536', 'BROOKLYN'), ('320911545', 'BROOKLYN'), ('520360350', 'STATEN ISLAND'), ('321852223', 'BROOKLYN'), ('421626841', 'QUEENS'), ('321384523', 'BROOKLYN'), ('340641194', 'BROOKLYN'), ('421693019', 'QUEENS'), ('421696953', 'QUEENS'), ('302584889', 'BROOKLYN'), ('520364070', 'STATEN ISLAND'), ('321070265', 'BROOKLYN'), ('421698292', 'QUEENS'), ('302584647', 'BROOKLYN'), ('123597312', 'MANHATTAN'), ('321905015', 'BROOKLYN'), ('220678719', 'BRONX'), ('321906817', 'BROOKLYN'), ('321670152', 'BROOKLYN'), ('421721541', 'QUEENS'), ('220681689', 'BRONX'), ('123404084', 'MANHATTAN'), ('103651095', 'MANHATTAN'), ('140827522', 'MANHATTAN'), ('321921346', 'BROOKLYN'), ('321921346', 'BROOKLYN'), ('220689404', 'BRONX'), ('220689404', 'BRONX'), ('440535048', 'QUEENS'), ('123533765', 'MANHATTAN'), ('123680588', 'MANHATTAN'), ('321908511', 'BROOKLYN'), ('321069197', 'BROOKLYN'), ('140834890', 'MANHATTAN'), ('123852946', 'MANHATTAN'), ('421930389', 'QUEENS'), ('220691847', 'BRONX'), ('421893115', 'QUEENS'), ('220689182', 'BRONX'), ('321929776', 'BROOKLYN'), ('340664249', 'BROOKLYN'), ('421930147', 'QUEENS'), ('140838360', 'MANHATTAN'), ('321930915', 'BROOKLYN'), ('340672436', 'BROOKLYN'), ('123730436', 'MANHATTAN'), ('321954220', 'BROOKLYN'), ('210179260', 'BRONX'), ('321934975', 'BROOKLYN'), ('123808237', 'MANHATTAN'), ('220670030', 'BRONX'), ('321987999', 'BROOKLYN'), ('340676860', 'BROOKLYN'), ('321990958', 'BROOKLYN'), ('321957496', 'BROOKLYN'), ('240255308', 'BRONX'), ('321958501', 'BROOKLYN'), ('500875957', 'STATEN ISLAND'), ('140842818', 'MANHATTAN'), ('123902232', 'MANHATTAN'), ('123902232', 'MANHATTAN'), ('421918483', 'QUEENS'), ('421918483', 'QUEENS'), ('123722258', 'MANHATTAN'), ('123722258', 'MANHATTAN'), ('340681596', 'BROOKLYN'), ('340683433', 'BROOKLYN'), ('123722258', 'MANHATTAN'), ('123753633', 'MANHATTAN'), ('123811394', 'MANHATTAN'), ('123782807', 'MANHATTAN'), ('123774610', 'MANHATTAN'), ('123774610', 'MANHATTAN'), ('220662735', 'BRONX'), ('321974048', 'BROOKLYN'), ('123810439', 'MANHATTAN'), ('421734181', 'QUEENS'), ('220710504', 'BRONX'), ('421736973', 'QUEENS'), ('123880899', 'MANHATTAN'), ('123822961', 'MANHATTAN'), ('321718628', 'BROOKLYN'), ('321594770', 'BROOKLYN'), ('321979043', 'BROOKLYN'), ('421736376', 'QUEENS'), ('340693681', 'BROOKLYN'), ('340694680', 'BROOKLYN'), ('123882469', 'MANHATTAN'), ('240261863', 'BRONX'), ('123818761', 'MANHATTAN'), ('220658740', 'BRONX'), ('321985170', 'BROOKLYN'), ('321941048', 'BROOKLYN'), ('321597991', 'BROOKLYN'), ('421918553', 'QUEENS'), ('340699168', 'BROOKLYN'), ('420666309', 'QUEENS'), ('123884706', 'MANHATTAN'), ('321996989', 'BROOKLYN'), ('321996961', 'BROOKLYN'), ('321969535', 'BROOKLYN'), ('421910187', 'QUEENS'), ('322011951', 'BROOKLYN'), ('321597991', 'BROOKLYN'), ('321999316', 'BROOKLYN'), ('322011265', 'BROOKLYN'), ('421674995', 'QUEENS'), ('440571418', 'QUEENS'), ('321994437', 'BROOKLYN'), ('321963087', 'BROOKLYN'), ('123785243', 'MANHATTAN'), ('421736376', 'QUEENS'), ('421730808', 'QUEENS'), ('520385814', 'STATEN ISLAND'), ('123740210', 'MANHATTAN'), ('421906263', 'QUEENS'), ('321783664', 'BROOKLYN'), ('340705696', 'BROOKLYN'), ('123789873', 'MANHATTAN'), ('123773666', 'MANHATTAN'), ('340708247', 'BROOKLYN'), ('123847249', 'MANHATTAN'), ('321596322', 'BROOKLYN'), ('421779631', 'QUEENS'), ('421778552', 'QUEENS'), ('220721146', 'BRONX'), ('140881357', 'MANHATTAN'), ('140881375', 'MANHATTAN'), ('421780834', 'QUEENS'), ('321596484', 'BROOKLYN'), ('421778400', 'QUEENS'), ('321596484', 'BROOKLYN'), ('220701792', 'BRONX'), ('421780291', 'QUEENS'), ('220722430', 'BRONX'), ('440580578', 'QUEENS'), ('123802251', 'MANHATTAN'), ('421938899', 'QUEENS'), ('210180533', 'BRONX'), ('210180533', 'BRONX'), ('210180533', 'BRONX'), ('421781432', 'QUEENS'), ('322006627', 'BROOKLYN'), ('123728984', 'MANHATTAN'), ('421782459', 'QUEENS'), ('421661160', 'QUEENS'), ('421801214', 'QUEENS'), ('520397516', 'STATEN ISLAND'), ('510114029', 'STATEN ISLAND'), ('322022315', 'BROOKLYN'), ('220724107', 'BRONX'), ('420666791', 'QUEENS'), ('220724508', 'BRONX'), ('322032518', 'BROOKLYN'), ('321588377', 'BROOKLYN'), ('121206970', 'MANHATTAN'), ('321588162', 'BROOKLYN'), ('121207112', 'MANHATTAN'), ('421798184', 'QUEENS'), ('210180720', 'BRONX'), ('440584896', 'QUEENS'), ('421952587', 'QUEENS'), ('321588279', 'BROOKLYN'), ('240268982', 'BRONX'), ('121206970', 'MANHATTAN'), ('322042669', 'BROOKLYN'), ('140887967', 'MANHATTAN'), ('421943231', 'QUEENS'), ('123700511', 'MANHATTAN'), ('322068800', 'BROOKLYN'), ('421912256', 'QUEENS'), ('123844554', 'MANHATTAN'), ('520399097', 'STATEN ISLAND'), ('322071191', 'BROOKLYN'), ('210180846', 'BRONX'), ('322072163', 'BROOKLYN'), ('322044970', 'BROOKLYN'), ('123857184', 'MANHATTAN'), ('123830998', 'MANHATTAN'), ('220728595', 'BRONX'), ('322071510', 'BROOKLYN'), ('421606444', 'QUEENS'), ('421958698', 'QUEENS'), ('220728452', 'BRONX'), ('140891202', 'MANHATTAN'), ('440589392', 'QUEENS'), ('140891694', 'MANHATTAN'), ('322030235', 'BROOKLYN'), ('321589857', 'BROOKLYN'), ('421948879', 'QUEENS'), ('123843485', 'MANHATTAN'), ('520451261', 'STATEN ISLAND'), ('140892862', 'MANHATTAN'), ('140893683', 'MANHATTAN'), ('123833771', 'MANHATTAN'), ('140894922', 'MANHATTAN'), ('123887810', 'MANHATTAN'), ('140893530', 'MANHATTAN'), ('440591076', 'QUEENS'), ('421961425', 'QUEENS'), ('321974048', 'BROOKLYN'), ('421899627', 'QUEENS'), ('420667335', 'QUEENS'), ('140895075', 'MANHATTAN'), ('322034954', 'BROOKLYN'), ('121207425', 'MANHATTAN'), ('240272129', 'BRONX'), ('321589973', 'BROOKLYN'), ('123572384', 'MANHATTAN'), ('123878731', 'MANHATTAN'), ('321589697', 'BROOKLYN'), ('440594000', 'QUEENS'), ('340727958', 'BROOKLYN'), ('140896582', 'MANHATTAN'), ('421944855', 'QUEENS'), ('121207620', 'MANHATTAN'), ('123910642', 'MANHATTAN'), ('322084230', 'BROOKLYN'), ('421902034', 'QUEENS'), ('340725870', 'BROOKLYN'), ('240272307', 'BRONX'), ('421474899', 'QUEENS'), ('140897304', 'MANHATTAN'), ('340725969', 'BROOKLYN'), ('440592495', 'QUEENS'), ('440592510', 'QUEENS'), ('140897652', 'MANHATTAN'), ('440592538', 'QUEENS'), ('140897723', 'MANHATTAN'), ('140898562', 'MANHATTAN'), ('123702939', 'MANHATTAN'), ('322088236', 'BROOKLYN'), ('440592547', 'QUEENS'), ('140898697', 'MANHATTAN'), ('140898820', 'MANHATTAN'), ('140899419', 'MANHATTAN'), ('123913006', 'MANHATTAN'), ('440594091', 'QUEENS'), ('140898866', 'MANHATTAN'), ('140899142', 'MANHATTAN'), ('240272753', 'BRONX'), ('140899767', 'MANHATTAN'), ('240272780', 'BRONX'), ('140899954', 'MANHATTAN'), ('123874110', 'MANHATTAN'), ('140900559', 'MANHATTAN'), ('340727262', 'BROOKLYN'), ('421763540', 'QUEENS'), ('440593500', 'QUEENS'), ('321589973', 'BROOKLYN'), ('140900782', 'MANHATTAN'), ('140900791', 'MANHATTAN'), ('140900862', 'MANHATTAN'), ('140900933', 'MANHATTAN'), ('321589580', 'BROOKLYN'), ('340727798', 'BROOKLYN'), ('140901335', 'MANHATTAN'), ('321589857', 'BROOKLYN'), ('140901095', 'MANHATTAN'), ('140902316', 'MANHATTAN'), ('123569352', 'MANHATTAN'), ('140902290', 'MANHATTAN'), ('340728207', 'BROOKLYN'), ('340728172', 'BROOKLYN'), ('322034972', 'BROOKLYN'), ('140901503', 'MANHATTAN'), ('321589580', 'BROOKLYN'), ('240273191', 'BRONX'), ('140902370', 'MANHATTAN'), ('140902487', 'MANHATTAN'), ('123913569', 'MANHATTAN'), ('421764870', 'QUEENS'), ('322085541', 'BROOKLYN'), ('322044676', 'BROOKLYN'), ('240273440', 'BRONX'), ('440597267', 'QUEENS'), ('140903495', 'MANHATTAN'), ('340729402', 'BROOKLYN'), ('340729395', 'BROOKLYN'), ('340729331', 'BROOKLYN'), ('140944405', 'MANHATTAN'), ('421765156', 'QUEENS'), ('440597374', 'QUEENS'), ('421765272', 'QUEENS'), ('123773666', 'MANHATTAN'), ('140904706', 'MANHATTAN'), ('140904868', 'MANHATTAN'), ('322086363', 'BROOKLYN'), ('123909431', 'MANHATTAN'), ('140905199', 'MANHATTAN'), ('123813221', 'MANHATTAN'), ('420667647', 'QUEENS'), ('322086595', 'BROOKLYN'), ('220732900', 'BRONX'), ('340730560', 'BROOKLYN'), ('140906090', 'MANHATTAN'), ('140906063', 'MANHATTAN'), ('340731042', 'BROOKLYN'), ('421763648', 'QUEENS'), ('140905705', 'MANHATTAN'), ('140905956', 'MANHATTAN'), ('340731319', 'BROOKLYN'), ('440596320', 'QUEENS'), ('340731364', 'BROOKLYN'), ('440596384', 'QUEENS'), ('340731408', 'BROOKLYN'), ('340731417', 'BROOKLYN'), ('140906376', 'MANHATTAN'), ('240274136', 'BRONX'), ('421753604', 'QUEENS'), ('440596482', 'QUEENS'), ('340731541', 'BROOKLYN'), ('440596561', 'QUEENS'), ('440596589', 'QUEENS'), ('440596614', 'QUEENS'), ('440596534', 'QUEENS'), ('440596598', 'QUEENS'), ('440596455', 'QUEENS'), ('440596696', 'QUEENS'), ('140907464', 'MANHATTAN'), ('140907491', 'MANHATTAN'), ('440596758', 'QUEENS'), ('140907776', 'MANHATTAN'), ('440596883', 'QUEENS'), ('440596892', 'QUEENS'), ('140907589', 'MANHATTAN'), ('440596945', 'QUEENS'), ('520398070', 'STATEN ISLAND'), ('440597016', 'QUEENS'), ('440597196', 'QUEENS'), ('340731621', 'BROOKLYN'), ('540176307', 'STATEN ISLAND'), ('140908392', 'MANHATTAN'), ('340732078', 'BROOKLYN'), ('540176183', 'STATEN ISLAND'), ('440597819', 'QUEENS'), ('440597828', 'QUEENS'), ('340733013', 'BROOKLYN'), ('440598097', 'QUEENS'), ('440598079', 'QUEENS'), ('440597640', 'QUEENS'), ('440597935', 'QUEENS'), ('540176316', 'STATEN ISLAND'), ('140910281', 'MANHATTAN'), ('340733415', 'BROOKLYN'), ('140910539', 'MANHATTAN'), ('440598471', 'QUEENS'), ('140909961', 'MANHATTAN'), ('140910209', 'MANHATTAN'), ('140910183', 'MANHATTAN'), ('140910557', 'MANHATTAN'), ('140910566', 'MANHATTAN'), ('140910762', 'MANHATTAN'), ('340733638', 'BROOKLYN'), ('140910575', 'MANHATTAN'), ('321592040', 'BROOKLYN'), ('240274840', 'BRONX'), ('440598596', 'QUEENS'), ('540176575', 'STATEN ISLAND'), ('440598505', 'QUEENS'), ('140911020', 'MANHATTAN'), ('220733534', 'BRONX'), ('240275000', 'BRONX'), ('140911333', 'MANHATTAN'), ('340734325', 'BROOKLYN'), ('140911397', 'MANHATTAN'), ('140911672', 'MANHATTAN'), ('340734478', 'BROOKLYN'), ('140911529', 'MANHATTAN'), ('140911663', 'MANHATTAN'), ('140911538', 'MANHATTAN'), ('440599050', 'QUEENS'), ('140911798', 'MANHATTAN'), ('240275126', 'BRONX'), ('340734584', 'BROOKLYN'), ('140911832', 'MANHATTAN'), ('140912074', 'MANHATTAN'), ('340735093', 'BROOKLYN'), ('340735100', 'BROOKLYN'), ('340734815', 'BROOKLYN'), ('340734833', 'BROOKLYN'), ('340734842', 'BROOKLYN'), ('340734806', 'BROOKLYN'), ('440599363', 'QUEENS'), ('520453465', 'STATEN ISLAND'), ('440599602', 'QUEENS'), ('520453508', 'STATEN ISLAND'), ('340735315', 'BROOKLYN'), ('340735707', 'BROOKLYN'), ('140912261', 'MANHATTAN'), ('140912902', 'MANHATTAN'), ('340735949', 'BROOKLYN'), ('421449043', 'QUEENS'), ('340735967', 'BROOKLYN'), ('340735994', 'BROOKLYN'), ('140913028', 'MANHATTAN'), ('440599719', 'QUEENS'), ('140912788', 'MANHATTAN'), ('440600100', 'QUEENS'), ('440600173', 'QUEENS'), ('140913572', 'MANHATTAN'), ('340736065', 'BROOKLYN'), ('421449052', 'QUEENS'), ('140913304', 'MANHATTAN'), ('421449061', 'QUEENS'), ('421449070', 'QUEENS'), ('340736145', 'BROOKLYN'), ('140913830', 'MANHATTAN'), ('440600404', 'QUEENS'), ('340736421', 'BROOKLYN'), ('140913750', 'MANHATTAN'), ('140913910', 'MANHATTAN'), ('440600360', 'QUEENS'), ('140914027', 'MANHATTAN'), ('440600510', 'QUEENS'), ('440600583', 'QUEENS'), ('440600486', 'QUEENS'), ('340736831', 'BROOKLYN'), ('340736840', 'BROOKLYN'), ('340736733', 'BROOKLYN'), ('421773450', 'QUEENS'), ('440600477', 'QUEENS'), ('440600743', 'QUEENS'), ('140914330', 'MANHATTAN'), ('140914562', 'MANHATTAN'), ('140914704', 'MANHATTAN'), ('140914349', 'MANHATTAN'), ('440600814', 'QUEENS'), ('340736939', 'BROOKLYN'), ('140914660', 'MANHATTAN'), ('340737117', 'BROOKLYN'), ('340737215', 'BROOKLYN'), ('140914820', 'MANHATTAN'), ('140914875', 'MANHATTAN'), ('140915062', 'MANHATTAN'), ('140915106', 'MANHATTAN'), ('140914759', 'MANHATTAN'), ('440600985', 'QUEENS'), ('240275812', 'BRONX'), ('140915348', 'MANHATTAN'), ('140915455', 'MANHATTAN'), ('421773487', 'QUEENS'), ('540177057', 'STATEN ISLAND'), ('140915366', 'MANHATTAN'), ('340737572', 'BROOKLYN'), ('440601555', 'QUEENS'), ('340737723', 'BROOKLYN'), ('140915767', 'MANHATTAN'), ('440601243', 'QUEENS'), ('340737750', 'BROOKLYN'), ('140915838', 'MANHATTAN'), ('440601699', 'QUEENS'), ('440601715', 'QUEENS'), ('340737796', 'BROOKLYN'), ('440601680', 'QUEENS'), ('340737910', 'BROOKLYN'), ('240275956', 'BRONX'), ('340738027', 'BROOKLYN'), ('340738090', 'BROOKLYN'), ('340738054', 'BROOKLYN'), ('220733730', 'BRONX'), ('140916178', 'MANHATTAN'), ('140916212', 'MANHATTAN'), ('140916267', 'MANHATTAN'), ('440601920', 'QUEENS'), ('322036845', 'BROOKLYN'), ('440601911', 'QUEENS'), ('340738170', 'BROOKLYN'), ('140916294', 'MANHATTAN'), ('340738205', 'BROOKLYN'), ('140916418', 'MANHATTAN'), ('140916490', 'MANHATTAN'), ('140916392', 'MANHATTAN'), ('340738214', 'BROOKLYN'), ('421939273', 'QUEENS'), ('240276018', 'BRONX'), ('103764464', 'MANHATTAN'), ('103764464', 'MANHATTAN'), ('200820629', 'BRONX'), ('201001842', 'BRONX'), ('301329015', 'BROOKLYN'), ('140916524', 'MANHATTAN'), ('421765557', 'QUEENS'), ('104756907', 'MANHATTAN'), ('301356510', 'BROOKLYN'), ('540177315', 'STATEN ISLAND'), ('440602206', 'QUEENS'), ('440602215', 'QUEENS'), ('140917168', 'MANHATTAN'), ('140917159', 'MANHATTAN'), ('140917186', 'MANHATTAN'), ('340738704', 'BROOKLYN'), ('340738722', 'BROOKLYN'), ('140917211', 'MANHATTAN'), ('340738731', 'BROOKLYN'), ('340738740', 'BROOKLYN'), ('240276223', 'BRONX'), ('440602224', 'QUEENS'), ('140917195', 'MANHATTAN'), ('140917257', 'MANHATTAN'), ('340738759', 'BROOKLYN'), ('440602251', 'QUEENS'), ('140917266', 'MANHATTAN'), ('140917248', 'MANHATTAN'), ('340738768', 'BROOKLYN'), ('440602279', 'QUEENS'), ('140917284', 'MANHATTAN'), ('440602288', 'QUEENS'), ('140917293', 'MANHATTAN'), ('540177324', 'STATEN ISLAND'), ('540177333', 'STATEN ISLAND'), ('140917319', 'MANHATTAN'), ('440602260', 'QUEENS'), ('340738820', 'BROOKLYN'), ('140917355', 'MANHATTAN'), ('340738811', 'BROOKLYN'), ('440602297', 'QUEENS'), ('340738839', 'BROOKLYN'), ('340738884', 'BROOKLYN'), ('140917364', 'MANHATTAN'), ('340738875', 'BROOKLYN'), ('340738900', 'BROOKLYN'), ('140917382', 'MANHATTAN'), ('240276250', 'BRONX'), ('340738919', 'BROOKLYN'), ('220733598', 'BRONX'), ('140917408', 'MANHATTAN'), ('440602322', 'QUEENS'), ('340738937', 'BROOKLYN'), ('340738928', 'BROOKLYN'), ('500876821', 'STATEN ISLAND'), ('240276269', 'BRONX'), ('240276278', 'BRONX'), ('340738955', 'BROOKLYN'), ('140917444', 'MANHATTAN'), ('140917426', 'MANHATTAN'), ('340738964', 'BROOKLYN'), ('340738946', 'BROOKLYN'), ('140917435', 'MANHATTAN'), ('140917471', 'MANHATTAN'), ('240276287', 'BRONX'), ('140917453', 'MANHATTAN'), ('340738982', 'BROOKLYN'), ('322036916', 'BROOKLYN'), ('321590202', 'BROOKLYN'), ('140917523', 'MANHATTAN'), ('123920613', 'MANHATTAN'), ('140917499', 'MANHATTAN'), ('140917480', 'MANHATTAN'), ('340739017', 'BROOKLYN'), ('140917514', 'MANHATTAN'), ('440602359', 'QUEENS'), ('140917541', 'MANHATTAN'), ('140917462', 'MANHATTAN'), ('440602377', 'QUEENS'), ('440602386', 'QUEENS'), ('340739026', 'BROOKLYN'), ('121207684', 'MANHATTAN'), ('340739035', 'BROOKLYN'), ('440602368', 'QUEENS'), ('121208317', 'MANHATTAN'), ('440602411', 'QUEENS'), ('440602457', 'QUEENS'), ('440602420', 'QUEENS'), ('321595458', 'BROOKLYN'), ('440602402', 'QUEENS'), ('440602439', 'QUEENS'), ('440602395', 'QUEENS'), ('321595458', 'BROOKLYN'), ('340739099', 'BROOKLYN'), ('140917578', 'MANHATTAN'), ('140917569', 'MANHATTAN'), ('140917587', 'MANHATTAN'), ('440602493', 'QUEENS'), ('440602475', 'QUEENS'), ('140944414', 'MANHATTAN'), ('440602509', 'QUEENS'), ('440602527', 'QUEENS'), ('440602536', 'QUEENS'), ('540177351', 'STATEN ISLAND'), ('140917630', 'MANHATTAN'), ('140917603', 'MANHATTAN'), ('140917621', 'MANHATTAN'), ('440602518', 'QUEENS'), ('140917667', 'MANHATTAN'), ('140917649', 'MANHATTAN'), ('140917658', 'MANHATTAN'), ('340739124', 'BROOKLYN'), ('340739115', 'BROOKLYN'), ('440621436', 'QUEENS'), ('340739142', 'BROOKLYN'), ('340739133', 'BROOKLYN'), ('440602581', 'QUEENS'), ('440602590', 'QUEENS'), ('140917676', 'MANHATTAN'), ('440602616', 'QUEENS'), ('140917694', 'MANHATTAN'), ('540177360', 'STATEN ISLAND'), ('440602689', 'QUEENS'), ('340739179', 'BROOKLYN'), ('321592157', 'BROOKLYN'), ('340739160', 'BROOKLYN'), ('440602643', 'QUEENS'), ('440602652', 'QUEENS'), ('140917701', 'MANHATTAN'), ('421773628', 'QUEENS'), ('440602705', 'QUEENS'), ('440602698', 'QUEENS'), ('321592157', 'BROOKLYN'), ('440602750', 'QUEENS'), ('421942116', 'QUEENS'), ('421773691', 'QUEENS'), ('140917710', 'MANHATTAN'), ('140917747', 'MANHATTAN'), ('421773664', 'QUEENS'), ('421773682', 'QUEENS'), ('140917729', 'MANHATTAN'), ('440602803', 'QUEENS'), ('421773646', 'QUEENS'), ('421773673', 'QUEENS'), ('340739204', 'BROOKLYN'), ('340739222', 'BROOKLYN'), ('440602821', 'QUEENS'), ('440602812', 'QUEENS'), ('140917809', 'MANHATTAN'), ('540177379', 'STATEN ISLAND'), ('440602830', 'QUEENS'), ('210050665', 'BRONX'), ('310175306', 'BROOKLYN'), ('320091324', 'BROOKLYN'), ('320091333', 'BROOKLYN'), ('320161123', 'BROOKLYN'), ('120061609', 'MANHATTAN'), ('420025181', 'QUEENS'), ('340739231', 'BROOKLYN'), ('120453339', 'MANHATTAN'), ('120475262', 'MANHATTAN'), ('320284955', 'BROOKLYN'), ('320423591', 'BROOKLYN'), ('320505869', 'BROOKLYN'), ('121407539', 'MANHATTAN'), ('220205221', 'BRONX'), ('220205025', 'BRONX'), ('220240727', 'BRONX'), ('220244705', 'BRONX'), ('140085903', 'MANHATTAN'), ('121708955', 'MANHATTAN'), ('320787573', 'BROOKLYN'), ('121712655', 'MANHATTAN'), ('121712655', 'MANHATTAN'), ('320832952', 'BROOKLYN'), ('320844495', 'BROOKLYN'), ('320844495', 'BROOKLYN'), ('320844529', 'BROOKLYN'), ('320844510', 'BROOKLYN'), ('320844495', 'BROOKLYN'), ('201190718', 'BRONX'), ('201190923', 'BRONX'), ('201190923', 'BRONX'), ('201190923', 'BRONX'), ('201190923', 'BRONX'), ('121870314', 'MANHATTAN'), ('420956399', 'QUEENS'), ('320891077', 'BROOKLYN'), ('320891077', 'BROOKLYN'), ('121997492', 'MANHATTAN'), ('121997492', 'MANHATTAN'), ('121997492', 'MANHATTAN'), ('320961401', 'BROOKLYN'), ('320937251', 'BROOKLYN'), ('402892928', 'QUEENS'), ('122043500', 'MANHATTAN'), ('122043500', 'MANHATTAN'), ('122043500', 'MANHATTAN'), ('122193606', 'MANHATTAN'), ('122187338', 'MANHATTAN'), ('201192636', 'BRONX'), ('320978064', 'BROOKLYN'), ('320627229', 'BROOKLYN'), ('520210469', 'STATEN ISLAND'), ('122205096', 'MANHATTAN'), ('302580589', 'BROOKLYN'), ('102020858', 'MANHATTAN'), ('102020858', 'MANHATTAN'), ('320624240', 'BROOKLYN'), ('320627229', 'BROOKLYN'), ('320627229', 'BROOKLYN'), ('340251738', 'BROOKLYN'), ('321137925', 'BROOKLYN'), ('122423145', 'MANHATTAN'), ('122423145', 'MANHATTAN'), ('421198992', 'QUEENS'), ('421213733', 'QUEENS'), ('340314966', 'BROOKLYN'), ('340314975', 'BROOKLYN'), ('321132289', 'BROOKLYN'), ('220151840', 'BRONX'), ('122620645', 'MANHATTAN'), ('240125538', 'BRONX'), ('321248333', 'BROOKLYN'), ('321249911', 'BROOKLYN'), ('321260210', 'BROOKLYN'), ('321287852', 'BROOKLYN'), ('321369130', 'BROOKLYN'), ('321190545', 'BROOKLYN'), ('122714633', 'MANHATTAN'), ('220511729', 'BRONX'), ('122770180', 'MANHATTAN'), ('122789483', 'MANHATTAN'), ('321197423', 'BROOKLYN'), ('321404832', 'BROOKLYN'), ('321399919', 'BROOKLYN'), ('440317783', 'QUEENS'), ('321414395', 'BROOKLYN'), ('321322966', 'BROOKLYN'), ('321414554', 'BROOKLYN'), ('321414554', 'BROOKLYN'), ('321414554', 'BROOKLYN'), ('421353859', 'QUEENS'), ('220404122', 'BRONX'), ('421325284', 'QUEENS'), ('140536016', 'MANHATTAN'), ('102275360', 'MANHATTAN'), ('421363214', 'QUEENS'), ('421348624', 'QUEENS'), ('340419513', 'BROOKLYN'), ('122885048', 'MANHATTAN'), ('122903297', 'MANHATTAN'), ('520280160', 'STATEN ISLAND'), ('520280160', 'STATEN ISLAND'), ('520280160', 'STATEN ISLAND'), ('321449241', 'BROOKLYN'), ('220551123', 'BRONX'), ('321450274', 'BROOKLYN'), ('520280160', 'STATEN ISLAND'), ('122908620', 'MANHATTAN'), ('321491774', 'BROOKLYN'), ('421405811', 'QUEENS'), ('321515892', 'BROOKLYN'), ('123014200', 'MANHATTAN'), ('421392013', 'QUEENS'), ('122999265', 'MANHATTAN'), ('321516490', 'BROOKLYN'), ('421047147', 'QUEENS'), ('421049038', 'QUEENS'), ('140614235', 'MANHATTAN'), ('220589931', 'BRONX'), ('421464356', 'QUEENS'), ('123059670', 'MANHATTAN'), ('123059670', 'MANHATTAN'), ('321462485', 'BROOKLYN'), ('104212273', 'MANHATTAN'), ('340505938', 'BROOKLYN'), ('240187061', 'BRONX'), ('321630749', 'BROOKLYN'), ('421421429', 'QUEENS'), ('302575103', 'BROOKLYN'), ('321412137', 'BROOKLYN'), ('321622972', 'BROOKLYN'), ('140661068', 'MANHATTAN'), ('321630749', 'BROOKLYN'), ('123353584', 'MANHATTAN'), ('140680537', 'MANHATTAN'), ('321197423', 'BROOKLYN'), ('321630749', 'BROOKLYN'), ('123120470', 'MANHATTAN'), ('123119856', 'MANHATTAN'), ('220609018', 'BRONX'), ('123292347', 'MANHATTAN'), ('440442488', 'QUEENS'), ('440442503', 'QUEENS'), ('520308319', 'STATEN ISLAND'), ('220622048', 'BRONX'), ('123277916', 'MANHATTAN'), ('421574497', 'QUEENS'), ('220618366', 'BRONX'), ('220612022', 'BRONX'), ('321630749', 'BROOKLYN'), ('520321571', 'STATEN ISLAND'), ('220627579', 'BRONX'), ('321692673', 'BROOKLYN'), ('321692673', 'BROOKLYN'), ('520322099', 'STATEN ISLAND'), ('321697026', 'BROOKLYN'), ('421391309', 'QUEENS'), ('421575245', 'QUEENS'), ('123199957', 'MANHATTAN'), ('140738557', 'MANHATTAN'), ('520325210', 'STATEN ISLAND'), ('123363911', 'MANHATTAN'), ('421459193', 'QUEENS'), ('123153559', 'MANHATTAN'), ('220613735', 'BRONX'), ('320911368', 'BROOKLYN'), ('240217289', 'BRONX'), ('140750603', 'MANHATTAN'), ('440472748', 'QUEENS'), ('321732336', 'BROOKLYN'), ('421613686', 'QUEENS'), ('321646910', 'BROOKLYN'), ('201202359', 'BRONX'), ('123457213', 'MANHATTAN'), ('123442211', 'MANHATTAN'), ('321793779', 'BROOKLYN'), ('123355537', 'MANHATTAN'), ('123397225', 'MANHATTAN'), ('320911368', 'BROOKLYN'), ('240223450', 'BRONX'), ('103650283', 'MANHATTAN'), ('421630710', 'QUEENS'), ('123434729', 'MANHATTAN'), ('123551557', 'MANHATTAN'), ('123551557', 'MANHATTAN'), ('123579591', 'MANHATTAN'), ('321798186', 'BROOKLYN'), ('140781401', 'MANHATTAN'), ('321807826', 'BROOKLYN'), ('321232322', 'BROOKLYN'), ('321767548', 'BROOKLYN'), ('321769591', 'BROOKLYN'), ('140788556', 'MANHATTAN'), ('123377194', 'MANHATTAN'), ('421666405', 'QUEENS'), ('440501878', 'QUEENS'), ('201198051', 'BRONX'), ('123533186', 'MANHATTAN'), ('421663293', 'QUEENS'), ('123530358', 'MANHATTAN'), ('123575336', 'MANHATTAN'), ('220654496', 'BRONX'), ('123127874', 'MANHATTAN'), ('123449624', 'MANHATTAN'), ('302584086', 'BROOKLYN'), ('540153965', 'STATEN ISLAND'), ('440507792', 'QUEENS'), ('123465268', 'MANHATTAN'), ('123465268', 'MANHATTAN'), ('321826841', 'BROOKLYN'), ('123235524', 'MANHATTAN'), ('123235524', 'MANHATTAN'), ('220671878', 'BRONX'), ('220651211', 'BRONX'), ('123518434', 'MANHATTAN'), ('123518434', 'MANHATTAN'), ('340641602', 'BROOKLYN'), ('340638475', 'BROOKLYN'), ('321849924', 'BROOKLYN'), ('220674544', 'BRONX'), ('540157104', 'STATEN ISLAND'), ('140815394', 'MANHATTAN'), ('321291936', 'BROOKLYN'), ('440520447', 'QUEENS'), ('220677186', 'BRONX'), ('321291936', 'BROOKLYN'), ('220676374', 'BRONX'), ('321829349', 'BROOKLYN'), ('201198649', 'BRONX'), ('540158372', 'STATEN ISLAND'), ('123594850', 'MANHATTAN'), ('123538699', 'MANHATTAN'), ('123538699', 'MANHATTAN'), ('123558998', 'MANHATTAN'), ('340651869', 'BROOKLYN'), ('220683614', 'BRONX'), ('340653019', 'BROOKLYN'), ('302585566', 'BROOKLYN'), ('421717440', 'QUEENS'), ('123525319', 'MANHATTAN'), ('520367647', 'STATEN ISLAND'), ('321917235', 'BROOKLYN'), ('140828521', 'MANHATTAN'), ('340658229', 'BROOKLYN'), ('421695543', 'QUEENS'), ('123495164', 'MANHATTAN'), ('321923273', 'BROOKLYN'), ('123489359', 'MANHATTAN'), ('123659521', 'MANHATTAN'), ('123679705', 'MANHATTAN'), ('220648020', 'BRONX'), ('123853419', 'MANHATTAN'), ('321930327', 'BROOKLYN'), ('421698933', 'QUEENS'), ('510113351', 'STATEN ISLAND'), ('421890751', 'QUEENS'), ('123755784', 'MANHATTAN'), ('421740129', 'QUEENS'), ('340665916', 'BROOKLYN'), ('140838146', 'MANHATTAN'), ('220618366', 'BRONX'), ('121204963', 'MANHATTAN'), ('121204963', 'MANHATTAN'), ('123714249', 'MANHATTAN'), ('123714944', 'MANHATTAN'), ('520370214', 'STATEN ISLAND'), ('123838133', 'MANHATTAN'), ('123873353', 'MANHATTAN'), ('123737144', 'MANHATTAN'), ('510113495', 'STATEN ISLAND'), ('121204963', 'MANHATTAN'), ('421883377', 'QUEENS'), ('123672631', 'MANHATTAN'), ('321232322', 'BROOKLYN'), ('140846949', 'MANHATTAN'), ('123903696', 'MANHATTAN'), ('321706588', 'BROOKLYN'), ('103651772', 'MANHATTAN'), ('103651772', 'MANHATTAN'), ('103651772', 'MANHATTAN'), ('121204963', 'MANHATTAN'), ('121204963', 'MANHATTAN'), ('421101881', 'QUEENS'), ('140848297', 'MANHATTAN'), ('140848732', 'MANHATTAN'), ('220611461', 'BRONX'), ('220705681', 'BRONX'), ('540164864', 'STATEN ISLAND'), ('123721918', 'MANHATTAN'), ('340677850', 'BROOKLYN'), ('123760858', 'MANHATTAN'), ('421934296', 'QUEENS'), ('421918866', 'QUEENS'), ('321721703', 'BROOKLYN'), ('321963755', 'BROOKLYN'), ('321958119', 'BROOKLYN'), ('123722971', 'MANHATTAN'), ('421918811', 'QUEENS'), ('220677113', 'BRONX'), ('123897453', 'MANHATTAN'), ('123749989', 'MANHATTAN'), ('123767021', 'MANHATTAN'), ('520382381', 'STATEN ISLAND'), ('123768636', 'MANHATTAN'), ('440552787', 'QUEENS'), ('500876055', 'STATEN ISLAND'), ('440553063', 'QUEENS'), ('123687698', 'MANHATTAN'), ('321970550', 'BROOKLYN'), ('322025241', 'BROOKLYN'), ('321970970', 'BROOKLYN'), ('421860668', 'QUEENS'), ('421730498', 'QUEENS'), ('123822122', 'MANHATTAN'), ('321971808', 'BROOKLYN'), ('140857384', 'MANHATTAN'), ('123756097', 'MANHATTAN'), ('322025241', 'BROOKLYN'), ('123810947', 'MANHATTAN'), ('220708839', 'BRONX'), ('123810947', 'MANHATTAN'), ('421731914', 'QUEENS'), ('123777859', 'MANHATTAN'), ('123811063', 'MANHATTAN'), ('421734145', 'QUEENS'), ('421734216', 'QUEENS'), ('340687144', 'BROOKLYN'), ('421736474', 'QUEENS'), ('321977189', 'BROOKLYN'), ('321977170', 'BROOKLYN'), ('123777494', 'MANHATTAN'), ('321978455', 'BROOKLYN'), ('123689794', 'MANHATTAN'), ('123880032', 'MANHATTAN'), ('123883191', 'MANHATTAN'), ('321594743', 'BROOKLYN'), ('140863723', 'MANHATTAN'), ('321988961', 'BROOKLYN'), ('421729525', 'QUEENS'), ('421745302', 'QUEENS'), ('123802527', 'MANHATTAN'), ('440561054', 'QUEENS'), ('123815737', 'MANHATTAN'), ('123805016', 'MANHATTAN'), ('421742403', 'QUEENS'), ('340695563', 'BROOKLYN'), ('520391353', 'STATEN ISLAND'), ('240261845', 'BRONX'), ('123818360', 'MANHATTAN'), ('140868871', 'MANHATTAN'), ('321985697', 'BROOKLYN'), ('123818547', 'MANHATTAN'), ('321977189', 'BROOKLYN'), ('321984448', 'BROOKLYN'), ('321977189', 'BROOKLYN'), ('321977170', 'BROOKLYN'), ('321977170', 'BROOKLYN'), ('421915592', 'QUEENS'), ('123748560', 'MANHATTAN'), ('123747801', 'MANHATTAN'), ('123888784', 'MANHATTAN'), ('321981897', 'BROOKLYN'), ('510113832', 'STATEN ISLAND'), ('520391406', 'STATEN ISLAND'), ('321941182', 'BROOKLYN'), ('321998200', 'BROOKLYN'), ('123495244', 'MANHATTAN'), ('321941191', 'BROOKLYN'), ('140874016', 'MANHATTAN'), ('420666407', 'QUEENS'), ('322001999', 'BROOKLYN'), ('421910846', 'QUEENS'), ('322000936', 'BROOKLYN'), ('321990896', 'BROOKLYN'), ('121206499', 'MANHATTAN'), ('421908369', 'QUEENS'), ('520385823', 'STATEN ISLAND'), ('520385832', 'STATEN ISLAND'), ('123698622', 'MANHATTAN'), ('123698613', 'MANHATTAN'), ('123739400', 'MANHATTAN'), ('321987481', 'BROOKLYN'), ('123788311', 'MANHATTAN'), ('321376792', 'BROOKLYN'), ('321376792', 'BROOKLYN'), ('123689758', 'MANHATTAN'), ('123694387', 'MANHATTAN'), ('123845410', 'MANHATTAN'), ('123786901', 'MANHATTAN'), ('421906780', 'QUEENS'), ('322007868', 'BROOKLYN'), ('520392352', 'STATEN ISLAND'), ('510113921', 'STATEN ISLAND'), ('520390210', 'STATEN ISLAND'), ('520390390', 'STATEN ISLAND'), ('123887749', 'MANHATTAN'), ('440574709', 'QUEENS'), ('440574852', 'QUEENS'), ('440574870', 'QUEENS'), ('421940270', 'QUEENS'), ('220719756', 'BRONX'), ('540171543', 'STATEN ISLAND'), ('421745589', 'QUEENS'), ('220720888', 'BRONX'), ('220664760', 'BRONX'), ('421939326', 'QUEENS'), ('220721208', 'BRONX'), ('421907789', 'QUEENS'), ('421940449', 'QUEENS'), ('220721333', 'BRONX'), ('140879609', 'MANHATTAN'), ('421942786', 'QUEENS'), ('123725530', 'MANHATTAN'), ('123848649', 'MANHATTAN'), ('322016377', 'BROOKLYN'), ('421778366', 'QUEENS'), ('520368352', 'STATEN ISLAND'), ('321972816', 'BROOKLYN'), ('520395714', 'STATEN ISLAND'), ('520368361', 'STATEN ISLAND'), ('123725674', 'MANHATTAN'), ('540172533', 'STATEN ISLAND'), ('123883510', 'MANHATTAN'), ('321596563', 'BROOKLYN'), ('421782618', 'QUEENS'), ('421906744', 'QUEENS'), ('321797169', 'BROOKLYN'), ('321588117', 'BROOKLYN'), ('321596938', 'BROOKLYN'), ('123797392', 'MANHATTAN'), ('322022609', 'BROOKLYN'), ('322017508', 'BROOKLYN'), ('123795241', 'MANHATTAN'), ('340714739', 'BROOKLYN'), ('140884915', 'MANHATTAN'), ('540173239', 'STATEN ISLAND'), ('140885013', 'MANHATTAN'), ('220724893', 'BRONX'), ('322038497', 'BROOKLYN'), ('440583094', 'QUEENS'), ('123855319', 'MANHATTAN'), ('322032448', 'BROOKLYN'), ('220725357', 'BRONX'), ('321588484', 'BROOKLYN'), ('340717371', 'BROOKLYN'), ('123867020', 'MANHATTAN'), ('121207176', 'MANHATTAN'), ('123855747', 'MANHATTAN'), ('322039968', 'BROOKLYN'), ('140886655', 'MANHATTAN'), ('421735590', 'QUEENS'), ('322041205', 'BROOKLYN'), ('123690684', 'MANHATTAN'), ('123791600', 'MANHATTAN'), ('421906735', 'QUEENS'), ('322038371', 'BROOKLYN'), ('340718691', 'BROOKLYN'), ('421756914', 'QUEENS'), ('421756905', 'QUEENS'), ('322069499', 'BROOKLYN'), ('140888494', 'MANHATTAN'), ('123787517', 'MANHATTAN'), ('340719413', 'BROOKLYN'), ('322041287', 'BROOKLYN'), ('421942526', 'QUEENS'), ('520383399', 'STATEN ISLAND'), ('123867020', 'MANHATTAN'), ('220727177', 'BRONX'), ('220727355', 'BRONX'), ('123572339', 'MANHATTAN'), ('322071994', 'BROOKLYN'), ('123572534', 'MANHATTAN'), ('520388321', 'STATEN ISLAND'), ('322072083', 'BROOKLYN'), ('421944891', 'QUEENS'), ('220540396', 'BRONX'), ('322043070', 'BROOKLYN'), ('322043515', 'BROOKLYN'), ('440588561', 'QUEENS'), ('123728190', 'MANHATTAN'), ('322040778', 'BROOKLYN'), ('321975653', 'BROOKLYN'), ('520393039', 'STATEN ISLAND'), ('322043775', 'BROOKLYN'), ('322043775', 'BROOKLYN'), ('340721204', 'BROOKLYN'), ('321762286', 'BROOKLYN'), ('340721507', 'BROOKLYN'), ('322044471', 'BROOKLYN'), ('440588703', 'QUEENS'), ('140890613', 'MANHATTAN'), ('123701798', 'MANHATTAN'), ('123701798', 'MANHATTAN'), ('520388786', 'STATEN ISLAND'), ('321952259', 'BROOKLYN'), ('322042393', 'BROOKLYN'), ('123832594', 'MANHATTAN'), ('520385253', 'STATEN ISLAND'), ('321589385', 'BROOKLYN'), ('322044499', 'BROOKLYN'), ('123573980', 'MANHATTAN'), ('123573971', 'MANHATTAN'), ('123573971', 'MANHATTAN'), ('123573962', 'MANHATTAN'), ('123573962', 'MANHATTAN'), ('123832335', 'MANHATTAN'), ('540174782', 'STATEN ISLAND'), ('220729317', 'BRONX'), ('421958894', 'QUEENS'), ('140891499', 'MANHATTAN'), ('440590031', 'QUEENS'), ('220729692', 'BRONX'), ('340724657', 'BROOKLYN'), ('140893291', 'MANHATTAN'), ('140893978', 'MANHATTAN'), ('121207390', 'MANHATTAN'), ('440590479', 'QUEENS'), ('321968581', 'BROOKLYN'), ('421713355', 'QUEENS'), ('322051391', 'BROOKLYN'), ('520385253', 'STATEN ISLAND'), ('421961354', 'QUEENS'), ('440591913', 'QUEENS'), ('322088110', 'BROOKLYN'), ('421945621', 'QUEENS'), ('340723854', 'BROOKLYN'), ('210181079', 'BRONX'), ('123878429', 'MANHATTAN'), ('123842155', 'MANHATTAN'), ('140901745', 'MANHATTAN'), ('140896895', 'MANHATTAN'), ('322083776', 'BROOKLYN'), ('140897331', 'MANHATTAN'), ('140897377', 'MANHATTAN'), ('322083981', 'BROOKLYN'), ('520399729', 'STATEN ISLAND'), ('322084123', 'BROOKLYN'), ('421959777', 'QUEENS'), ('421959777', 'QUEENS'), ('240272441', 'BRONX'), ('440592468', 'QUEENS'), ('140897689', 'MANHATTAN'), ('321937623', 'BROOKLYN'), ('321590202', 'BROOKLYN'), ('220732036', 'BRONX'), ('220732063', 'BRONX'), ('220732072', 'BRONX'), ('140901825', 'MANHATTAN'), ('321590239', 'BROOKLYN'), ('140898768', 'MANHATTAN'), ('322088281', 'BROOKLYN'), ('220732045', 'BRONX'), ('321590319', 'BROOKLYN'), ('220732054', 'BRONX'), ('140899197', 'MANHATTAN'), ('123856639', 'MANHATTAN'), ('140899703', 'MANHATTAN'), ('340727137', 'BROOKLYN'), ('322084748', 'BROOKLYN'), ('140899133', 'MANHATTAN'), ('340727002', 'BROOKLYN'), ('440593172', 'QUEENS'), ('340727431', 'BROOKLYN'), ('123911151', 'MANHATTAN'), ('420667460', 'QUEENS'), ('140901237', 'MANHATTAN'), ('340727609', 'BROOKLYN'), ('421763185', 'QUEENS'), ('322085426', 'BROOKLYN'), ('322033973', 'BROOKLYN'), ('123909262', 'MANHATTAN'), ('123922274', 'MANHATTAN'), ('500876821', 'STATEN ISLAND'), ('123874129', 'MANHATTAN'), ('420667460', 'QUEENS'), ('420667460', 'QUEENS'), ('140902664', 'MANHATTAN'), ('340728467', 'BROOKLYN'), ('520399211', 'STATEN ISLAND'), ('340728626', 'BROOKLYN'), ('140902977', 'MANHATTAN'), ('140903645', 'MANHATTAN'), ('123801680', 'MANHATTAN'), ('140903217', 'MANHATTAN'), ('440597221', 'QUEENS'), ('440594670', 'QUEENS'), ('123820213', 'MANHATTAN'), ('322037112', 'BROOKLYN'), ('140908579', 'MANHATTAN'), ('140903761', 'MANHATTAN'), ('123912178', 'MANHATTAN'), ('340729064', 'BROOKLYN'), ('322086005', 'BROOKLYN'), ('440594894', 'QUEENS'), ('123912463', 'MANHATTAN'), ('140908668', 'MANHATTAN'), ('322037684', 'BROOKLYN'), ('520450592', 'STATEN ISLAND'), ('440595027', 'QUEENS'), ('140904047', 'MANHATTAN'), ('421961700', 'QUEENS'), ('123780676', 'MANHATTAN'), ('440595250', 'QUEENS'), ('440595278', 'QUEENS'), ('340729974', 'BROOKLYN'), ('340729894', 'BROOKLYN'), ('123830514', 'MANHATTAN'), ('123920533', 'MANHATTAN'), ('322086522', 'BROOKLYN'), ('140904975', 'MANHATTAN'), ('240273823', 'BRONX'), ('123874986', 'MANHATTAN'), ('340730016', 'BROOKLYN'), ('440595633', 'QUEENS'), ('240273887', 'BRONX'), ('123921774', 'MANHATTAN'), ('440595688', 'QUEENS'), ('240273912', 'BRONX'), ('122802271', 'MANHATTAN'), ('322086700', 'BROOKLYN'), ('123741656', 'MANHATTAN'), ('440595740', 'QUEENS'), ('440595811', 'QUEENS'), ('322086728', 'BROOKLYN'), ('440596366', 'QUEENS'), ('123909066', 'MANHATTAN'), ('440596204', 'QUEENS'), ('240274528', 'BRONX'), ('140907115', 'MANHATTAN'), ('340731587', 'BROOKLYN'), ('440596605', 'QUEENS'), ('322036337', 'BROOKLYN'), ('140908187', 'MANHATTAN'), ('520395162', 'STATEN ISLAND'), ('440596874', 'QUEENS'), ('540176192', 'STATEN ISLAND'), ('140907295', 'MANHATTAN'), ('140908132', 'MANHATTAN'), ('520397703', 'STATEN ISLAND'), ('421766967', 'QUEENS'), ('340732666', 'BROOKLYN'), ('440597132', 'QUEENS'), ('140909435', 'MANHATTAN'), ('322071690', 'BROOKLYN'), ('140908356', 'MANHATTAN'), ('140909113', 'MANHATTAN'), ('440598257', 'QUEENS'), ('540176441', 'STATEN ISLAND'), ('440598328', 'QUEENS'), ('440598523', 'QUEENS'), ('340733898', 'BROOKLYN'), ('340734138', 'BROOKLYN'), ('340732951', 'BROOKLYN'), ('340733335', 'BROOKLYN'), ('140909854', 'MANHATTAN'), ('340734101', 'BROOKLYN'), ('123910278', 'MANHATTAN'), ('440598863', 'QUEENS'), ('520398953', 'STATEN ISLAND'), ('440599149', 'QUEENS'), ('340734539', 'BROOKLYN'), ('140911636', 'MANHATTAN'), ('340734469', 'BROOKLYN'), ('140911949', 'MANHATTAN'), ('340734183', 'BROOKLYN'), ('540176735', 'STATEN ISLAND'), ('440599176', 'QUEENS'), ('340735039', 'BROOKLYN'), ('340735066', 'BROOKLYN'), ('340735075', 'BROOKLYN'), ('440599470', 'QUEENS'), ('140912298', 'MANHATTAN'), ('140912332', 'MANHATTAN'), ('140912029', 'MANHATTAN'), ('421773290', 'QUEENS'), ('440599498', 'QUEENS'), ('140912724', 'MANHATTAN'), ('140912449', 'MANHATTAN'), ('140913313', 'MANHATTAN'), ('440599782', 'QUEENS'), ('140912573', 'MANHATTAN'), ('340735761', 'BROOKLYN'), ('340735958', 'BROOKLYN'), ('340736332', 'BROOKLYN'), ('240275634', 'BRONX'), ('340736573', 'BROOKLYN'), ('140913581', 'MANHATTAN'), ('140913858', 'MANHATTAN'), ('440600324', 'QUEENS'), ('140913723', 'MANHATTAN'), ('140913607', 'MANHATTAN'), ('540176922', 'STATEN ISLAND'), ('440600547', 'QUEENS'), ('140914312', 'MANHATTAN'), ('140914223', 'MANHATTAN'), ('140914107', 'MANHATTAN'), ('340736626', 'BROOKLYN'), ('340736644', 'BROOKLYN'), ('340736760', 'BROOKLYN'), ('340737260', 'BROOKLYN'), ('140914429', 'MANHATTAN'), ('140914697', 'MANHATTAN'), ('340737082', 'BROOKLYN'), ('140914900', 'MANHATTAN'), ('520452849', 'STATEN ISLAND'), ('540177048', 'STATEN ISLAND'), ('220733721', 'BRONX'), ('140915044', 'MANHATTAN'), ('440601332', 'QUEENS'), ('140915776', 'MANHATTAN'), ('340737670', 'BROOKLYN'), ('140915730', 'MANHATTAN'), ('140916258', 'MANHATTAN'), ('440601813', 'QUEENS'), ('140915516', 'MANHATTAN'), ('340737803', 'BROOKLYN'), ('340737812', 'BROOKLYN'), ('540177164', 'STATEN ISLAND'), ('540177191', 'STATEN ISLAND'), ('140916668', 'MANHATTAN'), ('340738321', 'BROOKLYN'), ('440601966', 'QUEENS'), ('440601975', 'QUEENS'), ('240276036', 'BRONX'), ('421773637', 'QUEENS'), ('140916828', 'MANHATTAN'), ('440602055', 'QUEENS'), ('140916908', 'MANHATTAN'), ('340738483', 'BROOKLYN'), ('240276170', 'BRONX'), ('440602117', 'QUEENS'), ('140916953', 'MANHATTAN'), ('540177271', 'STATEN ISLAND'), ('240276198', 'BRONX'), ('140916551', 'MANHATTAN'), ('322036854', 'BROOKLYN'), ('140917024', 'MANHATTAN'), ('340738642', 'BROOKLYN'), ('340738544', 'BROOKLYN'), ('340738571', 'BROOKLYN'), ('340738633', 'BROOKLYN'), ('440602153', 'QUEENS'), ('440602180', 'QUEENS'), ('103963276', 'MANHATTAN'), ('104168142', 'MANHATTAN'), ('104316161', 'MANHATTAN'), ('104577003', 'MANHATTAN'), ('301240850', 'BROOKLYN'), ('301271638', 'BROOKLYN'), ('301934593', 'BROOKLYN'), ('104636798', 'MANHATTAN'), ('302007343', 'BROOKLYN'), ('104006488', 'MANHATTAN'), ('240283643', 'BRONX'), ('123876895', 'MANHATTAN'), ('340739268', 'BROOKLYN'), ('340739259', 'BROOKLYN'), ('340739286', 'BROOKLYN'), ('440602858', 'QUEENS'), ('440602849', 'QUEENS'), ('340759441', 'BROOKLYN'), ('140917881', 'MANHATTAN'), ('140917845', 'MANHATTAN'), ('140917827', 'MANHATTAN'), ('540177397', 'STATEN ISLAND'), ('140917818', 'MANHATTAN'), ('440602867', 'QUEENS'), ('340739302', 'BROOKLYN'), ('140917854', 'MANHATTAN'), ('140917836', 'MANHATTAN'), ('340739311', 'BROOKLYN'), ('340739339', 'BROOKLYN'), ('440602901', 'QUEENS'), ('340739348', 'BROOKLYN'), ('140917890', 'MANHATTAN'), ('340739357', 'BROOKLYN'), ('440602894', 'QUEENS'), ('340739320', 'BROOKLYN'), ('140917952', 'MANHATTAN'), ('140917934', 'MANHATTAN'), ('440602938', 'QUEENS'), ('440602947', 'QUEENS'), ('140917925', 'MANHATTAN'), ('540177404', 'STATEN ISLAND'), ('540177422', 'STATEN ISLAND'), ('440602992', 'QUEENS'), ('440602956', 'QUEENS'), ('440602974', 'QUEENS'), ('140917998', 'MANHATTAN'), ('440602983', 'QUEENS'), ('540177413', 'STATEN ISLAND'), ('240276358', 'BRONX'), ('340739384', 'BROOKLYN'), ('240276367', 'BRONX'), ('440603018', 'QUEENS'), ('140918005', 'MANHATTAN'), ('440603027', 'QUEENS'), ('540177431', 'STATEN ISLAND'), ('440603009', 'QUEENS'), ('340739400', 'BROOKLYN'), ('140918032', 'MANHATTAN'), ('140918014', 'MANHATTAN'), ('140918023', 'MANHATTAN'), ('321597786', 'BROOKLYN'), ('440603045', 'QUEENS'), ('220733810', 'BRONX'), ('220733801', 'BRONX'), ('440603036', 'QUEENS'), ('340739455', 'BROOKLYN'), ('340739446', 'BROOKLYN'), ('140918050', 'MANHATTAN'), ('140918041', 'MANHATTAN'), ('520454543', 'STATEN ISLAND'), ('440603081', 'QUEENS'), ('440603063', 'QUEENS'), ('321597786', 'BROOKLYN'), ('140918069', 'MANHATTAN'), ('166003266', 'MANHATTAN'), ('340739473', 'BROOKLYN'), ('440603107', 'QUEENS'), ('340739491', 'BROOKLYN'), ('140918078', 'MANHATTAN'), ('140918096', 'MANHATTAN'), ('140918130', 'MANHATTAN'), ('140918149', 'MANHATTAN'), ('140918103', 'MANHATTAN'), ('540177459', 'STATEN ISLAND'), ('140918121', 'MANHATTAN'), ('140918087', 'MANHATTAN'), ('210181621', 'BRONX'), ('440603134', 'QUEENS'), ('123920962', 'MANHATTAN'), ('440603161', 'QUEENS'), ('240276376', 'BRONX'), ('140918158', 'MANHATTAN'), ('440603189', 'QUEENS'), ('140918167', 'MANHATTAN'), ('123920953', 'MANHATTAN'), ('340739534', 'BROOKLYN'), ('140918176', 'MANHATTAN'), ('140918185', 'MANHATTAN'), ('440603198', 'QUEENS'), ('440603205', 'QUEENS'), ('340739516', 'BROOKLYN'), ('322036989', 'BROOKLYN'), ('240276394', 'BRONX'), ('140918229', 'MANHATTAN'), ('340739525', 'BROOKLYN'), ('322039263', 'BROOKLYN'), ('140918238', 'MANHATTAN'), ('140918201', 'MANHATTAN'), ('440603250', 'QUEENS'), ('140918194', 'MANHATTAN'), ('140918247', 'MANHATTAN'), ('440603296', 'QUEENS'), ('140918265', 'MANHATTAN'), ('140918256', 'MANHATTAN'), ('440603232', 'QUEENS'), ('440603287', 'QUEENS'), ('540177468', 'STATEN ISLAND'), ('140918274', 'MANHATTAN'), ('140918283', 'MANHATTAN'), ('340739570', 'BROOKLYN'), ('240276429', 'BRONX'), ('240276438', 'BRONX'), ('140918292', 'MANHATTAN'), ('240276410', 'BRONX'), ('321592219', 'BROOKLYN'), ('321592200', 'BROOKLYN'), ('240276401', 'BRONX'), ('140918318', 'MANHATTAN'), ('140918327', 'MANHATTAN'), ('240276447', 'BRONX'), ('340739589', 'BROOKLYN'), ('140918363', 'MANHATTAN'), ('401571232', 'QUEENS'), ('402490130', 'QUEENS'), ('220733785', 'BRONX'), ('440603321', 'QUEENS'), ('140918345', 'MANHATTAN'), ('140918354', 'MANHATTAN'), ('540177495', 'STATEN ISLAND'), ('340739605', 'BROOKLYN'), ('500850689', 'STATEN ISLAND'), ('110356454', 'MANHATTAN'), ('120159274', 'MANHATTAN'), ('420470252', 'QUEENS'), ('120795176', 'MANHATTAN'), ('120838638', 'MANHATTAN'), ('520090810', 'STATEN ISLAND'), ('310189569', 'BROOKLYN'), ('520051363', 'STATEN ISLAND'), ('121026683', 'MANHATTAN'), ('121158941', 'MANHATTAN'), ('121175325', 'MANHATTAN'), ('121403374', 'MANHATTAN'), ('121403374', 'MANHATTAN'), ('220239659', 'BRONX'), ('121483830', 'MANHATTAN'), ('320478826', 'BROOKLYN'), ('121327493', 'MANHATTAN'), ('121495104', 'MANHATTAN'), ('121559134', 'MANHATTAN'), ('121595513', 'MANHATTAN'), ('121235485', 'MANHATTAN'), ('201190059', 'BRONX'), ('320492203', 'BROOKLYN'), ('121592302', 'MANHATTAN'), ('220252928', 'BRONX'), ('121507208', 'MANHATTAN'), ('121725703', 'MANHATTAN'), ('220335073', 'BRONX'), ('420649793', 'QUEENS'), ('121811833', 'MANHATTAN'), ('122085162', 'MANHATTAN'), ('320626578', 'BROOKLYN'), ('321018395', 'BROOKLYN'), ('420983430', 'QUEENS'), ('440149475', 'QUEENS'), ('402894365', 'QUEENS'), ('421056252', 'QUEENS'), ('140295721', 'MANHATTAN'), ('140299889', 'MANHATTAN'), ('240088873', 'BRONX'), ('122362932', 'MANHATTAN'), ('122458802', 'MANHATTAN'), ('122458802', 'MANHATTAN'), ('201194652', 'BRONX'), ('201194652', 'BRONX'), ('201194652', 'BRONX'), ('321181680', 'BROOKLYN'), ('321233973', 'BROOKLYN'), ('321248440', 'BROOKLYN'), ('122448011', 'MANHATTAN'), ('122554020', 'MANHATTAN'), ('122561263', 'MANHATTAN'), ('122529022', 'MANHATTAN'), ('220491386', 'BRONX'), ('340344238', 'BROOKLYN'), ('321209857', 'BROOKLYN'), ('421199410', 'QUEENS'), ('421199410', 'QUEENS'), ('321187194', 'BROOKLYN'), ('321307705', 'BROOKLYN'), ('240129552', 'BRONX'), ('122387595', 'MANHATTAN'), ('421255661', 'QUEENS'), ('421255661', 'QUEENS'), ('140519570', 'MANHATTAN'), ('321192366', 'BROOKLYN'), ('122836422', 'MANHATTAN'), ('421098662', 'QUEENS'), ('122877985', 'MANHATTAN'), ('321178284', 'BROOKLYN'), ('122798954', 'MANHATTAN'), ('321456624', 'BROOKLYN'), ('321192366', 'BROOKLYN'), ('421359540', 'QUEENS'), ('321472937', 'BROOKLYN'), ('122898454', 'MANHATTAN'), ('421369398', 'QUEENS'), ('421383568', 'QUEENS'), ('121191325', 'MANHATTAN'), ('121191325', 'MANHATTAN'), ('121191325', 'MANHATTAN'), ('121191325', 'MANHATTAN'), ('121191325', 'MANHATTAN'), ('321192366', 'BROOKLYN'), ('122955445', 'MANHATTAN'), ('122928528', 'MANHATTAN'), ('321184393', 'BROOKLYN'), ('220515592', 'BRONX'), ('321513439', 'BROOKLYN'), ('122372477', 'MANHATTAN'), ('123070292', 'MANHATTAN'), ('340493843', 'BROOKLYN'), ('140645336', 'MANHATTAN'), ('121289836', 'MANHATTAN'), ('140649662', 'MANHATTAN'), ('140649680', 'MANHATTAN'), ('123097497', 'MANHATTAN'), ('321482926', 'BROOKLYN'), ('321193301', 'BROOKLYN'), ('140650481', 'MANHATTAN'), ('140651140', 'MANHATTAN'), ('123097521', 'MANHATTAN'), ('123097521', 'MANHATTAN'), ('340513572', 'BROOKLYN'), ('440413170', 'QUEENS'), ('321612830', 'BROOKLYN'), ('421106109', 'QUEENS'), ('520307999', 'STATEN ISLAND'), ('302575318', 'BROOKLYN'), ('321188308', 'BROOKLYN'), ('421546036', 'QUEENS'), ('421555347', 'QUEENS'), ('201197310', 'BRONX'), ('201197310', 'BRONX'), ('321586707', 'BROOKLYN'), ('321641826', 'BROOKLYN'), ('220605879', 'BRONX'), ('421555365', 'QUEENS'), ('123184552', 'MANHATTAN'), ('123184909', 'MANHATTAN'), ('123173813', 'MANHATTAN'), ('123173813', 'MANHATTAN'), ('220618393', 'BRONX'), ('220620610', 'BRONX'), ('321497082', 'BROOKLYN'), ('321191580', 'BROOKLYN'), ('220624331', 'BRONX'), ('201201751', 'BRONX'), ('123240386', 'MANHATTAN'), ('500870854', 'STATEN ISLAND'), ('123297226', 'MANHATTAN'), ('123147120', 'MANHATTAN'), ('123265947', 'MANHATTAN'), ('321654928', 'BROOKLYN'), ('220629639', 'BRONX'), ('421457293', 'QUEENS'), ('220632162', 'BRONX'), ('123152444', 'MANHATTAN'), ('421602028', 'QUEENS'), ('321727887', 'BROOKLYN'), ('321795036', 'BROOKLYN'), ('321795036', 'BROOKLYN'), ('321795036', 'BROOKLYN'), ('122996062', 'MANHATTAN'), ('123206477', 'MANHATTAN'), ('340591648', 'BROOKLYN'), ('421612286', 'QUEENS'), ('123388244', 'MANHATTAN'), ('123388244', 'MANHATTAN'), ('123214921', 'MANHATTAN'), ('123458926', 'MANHATTAN'), ('123433739', 'MANHATTAN'), ('123430689', 'MANHATTAN'), ('520333559', 'STATEN ISLAND'), ('123600638', 'MANHATTAN'), ('123600638', 'MANHATTAN'), ('123600638', 'MANHATTAN'), ('421361163', 'QUEENS'), ('421390051', 'QUEENS'), ('123600558', 'MANHATTAN'), ('140766678', 'MANHATTAN'), ('321761768', 'BROOKLYN'), ('421632790', 'QUEENS'), ('140773054', 'MANHATTAN'), ('440492174', 'QUEENS'), ('140781321', 'MANHATTAN'), ('321644128', 'BROOKLYN'), ('340617960', 'BROOKLYN'), ('321727887', 'BROOKLYN'), ('123459426', 'MANHATTAN'), ('123461930', 'MANHATTAN'), ('520333559', 'STATEN ISLAND'), ('421639141', 'QUEENS'), ('321717718', 'BROOKLYN'), ('421658405', 'QUEENS'), ('123471796', 'MANHATTAN'), ('321824576', 'BROOKLYN'), ('340629341', 'BROOKLYN'), ('421361163', 'QUEENS'), ('421390051', 'QUEENS'), ('520333559', 'STATEN ISLAND'), ('321817414', 'BROOKLYN'), ('123530786', 'MANHATTAN'), ('123399161', 'MANHATTAN'), ('140805886', 'MANHATTAN'), ('421681969', 'QUEENS'), ('123414723', 'MANHATTAN'), ('240242046', 'BRONX'), ('140816669', 'MANHATTAN'), ('421624193', 'QUEENS'), ('321837438', 'BROOKLYN'), ('320912857', 'BROOKLYN'), ('520363455', 'STATEN ISLAND'), ('421925117', 'QUEENS'), ('440526398', 'QUEENS'), ('123337219', 'MANHATTAN'), ('140824188', 'MANHATTAN'), ('321779786', 'BROOKLYN'), ('321383766', 'BROOKLYN'), ('421722853', 'QUEENS'), ('140828530', 'MANHATTAN'), ('322052265', 'BROOKLYN'), ('220684285', 'BRONX'), ('140828549', 'MANHATTAN'), ('220684310', 'BRONX'), ('421925983', 'QUEENS'), ('421681004', 'QUEENS'), ('520373140', 'STATEN ISLAND'), ('240249398', 'BRONX'), ('123682808', 'MANHATTAN'), ('321386059', 'BROOKLYN'), ('321925100', 'BROOKLYN'), ('240249520', 'BRONX'), ('123827378', 'MANHATTAN'), ('340664132', 'BROOKLYN'), ('321929954', 'BROOKLYN'), ('123675166', 'MANHATTAN'), ('220684310', 'BRONX'), ('440621445', 'QUEENS'), ('123851288', 'MANHATTAN'), ('240250241', 'BRONX'), ('240250250', 'BRONX'), ('123714481', 'MANHATTAN'), ('420665391', 'QUEENS'), ('123661304', 'MANHATTAN'), ('321930229', 'BROOKLYN'), ('140839653', 'MANHATTAN'), ('123861838', 'MANHATTAN'), ('421949262', 'QUEENS'), ('123554288', 'MANHATTAN'), ('123661313', 'MANHATTAN'), ('321814587', 'BROOKLYN'), ('220695326', 'BRONX'), ('421896407', 'QUEENS'), ('123717273', 'MANHATTAN'), ('123733380', 'MANHATTAN'), ('123804605', 'MANHATTAN'), ('421931253', 'QUEENS'), ('123804570', 'MANHATTAN'), ('421862531', 'QUEENS'), ('321992634', 'BROOKLYN'), ('321947505', 'BROOKLYN'), ('302586681', 'BROOKLYN'), ('302586681', 'BROOKLYN'), ('220700659', 'BRONX'), ('302586681', 'BROOKLYN'), ('302586681', 'BROOKLYN'), ('321992322', 'BROOKLYN'), ('321952142', 'BROOKLYN'), ('340680294', 'BROOKLYN'), ('123783986', 'MANHATTAN'), ('321948666', 'BROOKLYN'), ('123687368', 'MANHATTAN'), ('321779786', 'BROOKLYN'), ('321963513', 'BROOKLYN'), ('123768137', 'MANHATTAN'), ('321964326', 'BROOKLYN'), ('321966896', 'BROOKLYN'), ('321963853', 'BROOKLYN'), ('123668968', 'MANHATTAN'), ('121205481', 'MANHATTAN'), ('321948666', 'BROOKLYN'), ('123759940', 'MANHATTAN'), ('421728438', 'QUEENS'), ('340683825', 'BROOKLYN'), ('121205481', 'MANHATTAN'), ('421729927', 'QUEENS'), ('421729981', 'QUEENS'), ('321971826', 'BROOKLYN'), ('121205481', 'MANHATTAN'), ('421729927', 'QUEENS'), ('121205481', 'MANHATTAN'), ('121205481', 'MANHATTAN'), ('421732799', 'QUEENS'), ('340685413', 'BROOKLYN'), ('102697100', 'MANHATTAN'), ('123758102', 'MANHATTAN'), ('123758102', 'MANHATTAN'), ('123686680', 'MANHATTAN'), ('421724003', 'QUEENS'), ('321727887', 'BROOKLYN'), ('123686680', 'MANHATTAN'), ('123684334', 'MANHATTAN'), ('321068170', 'BROOKLYN'), ('440556015', 'QUEENS'), ('421891992', 'QUEENS'), ('440557425', 'QUEENS'), ('321594324', 'BROOKLYN'), ('520385388', 'STATEN ISLAND'), ('321641826', 'BROOKLYN'), ('321977973', 'BROOKLYN'), ('321993465', 'BROOKLYN'), ('421737623', 'QUEENS'), ('123691433', 'MANHATTAN'), ('440560144', 'QUEENS'), ('321594645', 'BROOKLYN'), ('140865295', 'MANHATTAN'), ('123802466', 'MANHATTAN'), ('421731638', 'QUEENS'), ('421794972', 'QUEENS'), ('123779900', 'MANHATTAN'), ('340694074', 'BROOKLYN'), ('123902731', 'MANHATTAN'), ('340694485', 'BROOKLYN'), ('140867827', 'MANHATTAN'), ('321981021', 'BROOKLYN'), ('440565318', 'QUEENS'), ('440565336', 'QUEENS'), ('123770455', 'MANHATTAN'), ('123817398', 'MANHATTAN'), ('123745171', 'MANHATTAN'), ('440566567', 'QUEENS'), ('123784333', 'MANHATTAN'), ('220715858', 'BRONX'), ('420666256', 'QUEENS'), ('321597688', 'BROOKLYN'), ('220712780', 'BRONX'), ('321995258', 'BROOKLYN'), ('520365783', 'STATEN ISLAND'), ('321595118', 'BROOKLYN'), ('340700959', 'BROOKLYN'), ('123879240', 'MANHATTAN'), ('201203223', 'BRONX'), ('321595270', 'BROOKLYN'), ('321595092', 'BROOKLYN'), ('520392511', 'STATEN ISLAND'), ('123786867', 'MANHATTAN'), ('220717320', 'BRONX'), ('123746759', 'MANHATTAN'), ('321595387', 'BROOKLYN'), ('220717721', 'BRONX'), ('421605579', 'QUEENS'), ('321983939', 'BROOKLYN'), ('421912531', 'QUEENS'), ('123696269', 'MANHATTAN'), ('123741139', 'MANHATTAN'), ('123742450', 'MANHATTAN'), ('123744859', 'MANHATTAN'), ('520394680', 'STATEN ISLAND'), ('220719765', 'BRONX'), ('321595387', 'BROOKLYN'), ('321596064', 'BROOKLYN'), ('140878441', 'MANHATTAN'), ('123844144', 'MANHATTAN'), ('421908788', 'QUEENS'), ('340707756', 'BROOKLYN'), ('123867066', 'MANHATTAN'), ('123790157', 'MANHATTAN'), ('322014690', 'BROOKLYN'), ('421906227', 'QUEENS'), ('123791058', 'MANHATTAN'), ('421935945', 'QUEENS'), ('420666693', 'QUEENS'), ('123867958', 'MANHATTAN'), ('440577314', 'QUEENS'), ('322018865', 'BROOKLYN'), ('321737108', 'BROOKLYN'), ('340710662', 'BROOKLYN'), ('520396250', 'STATEN ISLAND'), ('123724817', 'MANHATTAN'), ('322019597', 'BROOKLYN'), ('322020905', 'BROOKLYN'), ('123724773', 'MANHATTAN'), ('123796794', 'MANHATTAN'), ('140919718', 'MANHATTAN'), ('322028042', 'BROOKLYN'), ('340711091', 'BROOKLYN'), ('140883328', 'MANHATTAN'), ('540173051', 'STATEN ISLAND'), ('421801376', 'QUEENS'), ('220716376', 'BRONX'), ('123798113', 'MANHATTAN'), ('123700192', 'MANHATTAN'), ('123794545', 'MANHATTAN'), ('421781058', 'QUEENS'), ('123701093', 'MANHATTAN'), ('321588242', 'BROOKLYN'), ('520394305', 'STATEN ISLAND'), ('421798530', 'QUEENS'), ('220725213', 'BRONX'), ('321588340', 'BROOKLYN'), ('123858389', 'MANHATTAN'), ('322038068', 'BROOKLYN'), ('340717683', 'BROOKLYN'), ('123842173', 'MANHATTAN'), ('322042302', 'BROOKLYN'), ('220725543', 'BRONX'), ('322014690', 'BROOKLYN'), ('123798042', 'MANHATTAN'), ('421754952', 'QUEENS'), ('340716540', 'BROOKLYN'), ('421756344', 'QUEENS'), ('220726454', 'BRONX'), ('140888421', 'MANHATTAN'), ('322018197', 'BROOKLYN'), ('123725718', 'MANHATTAN'), ('322069890', 'BROOKLYN'), ('421757325', 'QUEENS'), ('322069275', 'BROOKLYN'), ('322070717', 'BROOKLYN'), ('322070708', 'BROOKLYN'), ('421943632', 'QUEENS'), ('421778482', 'QUEENS'), ('321977973', 'BROOKLYN'), ('421943865', 'QUEENS'), ('123791030', 'MANHATTAN'), ('340719574', 'BROOKLYN'), ('322071226', 'BROOKLYN'), ('322071217', 'BROOKLYN'), ('220727328', 'BRONX'), ('140889377', 'MANHATTAN'), ('340720232', 'BROOKLYN'), ('340720198', 'BROOKLYN'), ('440588044', 'QUEENS'), ('340720456', 'BROOKLYN'), ('322071128', 'BROOKLYN'), ('123573196', 'MANHATTAN'), ('123573819', 'MANHATTAN'), ('123835038', 'MANHATTAN'), ('322068739', 'BROOKLYN'), ('421754961', 'QUEENS'), ('321913514', 'BROOKLYN'), ('123829429', 'MANHATTAN'), ('123791931', 'MANHATTAN'), ('520394831', 'STATEN ISLAND'), ('322032929', 'BROOKLYN'), ('123868822', 'MANHATTAN'), ('140891168', 'MANHATTAN'), ('123865157', 'MANHATTAN'), ('123360102', 'MANHATTAN'), ('440589310', 'QUEENS'), ('520396134', 'STATEN ISLAND'), ('321589223', 'BROOKLYN'), ('220515592', 'BRONX'), ('421944123', 'QUEENS'), ('340722310', 'BROOKLYN'), ('123573258', 'MANHATTAN'), ('340722622', 'BROOKLYN'), ('123833325', 'MANHATTAN'), ('140901512', 'MANHATTAN'), ('421778598', 'QUEENS'), ('322033456', 'BROOKLYN'), ('421959517', 'QUEENS'), ('123876485', 'MANHATTAN'), ('140894628', 'MANHATTAN'), ('340724390', 'BROOKLYN'), ('321589535', 'BROOKLYN'), ('140892684', 'MANHATTAN'), ('123702332', 'MANHATTAN'), ('520450627', 'STATEN ISLAND'), ('140896476', 'MANHATTAN'), ('340727994', 'BROOKLYN'), ('240272227', 'BRONX'), ('322034767', 'BROOKLYN'), ('140896341', 'MANHATTAN'), ('340724782', 'BROOKLYN'), ('240272067', 'BRONX'), ('140897171', 'MANHATTAN'), ('140897206', 'MANHATTAN'), ('140897224', 'MANHATTAN'), ('140897260', 'MANHATTAN'), ('322083428', 'BROOKLYN'), ('322034874', 'BROOKLYN'), ('321590140', 'BROOKLYN'), ('220729291', 'BRONX'), ('440592556', 'QUEENS'), ('140897732', 'MANHATTAN'), ('123832843', 'MANHATTAN'), ('140897974', 'MANHATTAN'), ('322083749', 'BROOKLYN'), ('240272414', 'BRONX'), ('421947380', 'QUEENS'), ('121207737', 'MANHATTAN'), ('421764139', 'QUEENS'), ('140898447', 'MANHATTAN'), ('140899482', 'MANHATTAN'), ('140899543', 'MANHATTAN'), ('140899605', 'MANHATTAN'), ('140899632', 'MANHATTAN'), ('210181300', 'BRONX'), ('340726977', 'BROOKLYN'), ('121207737', 'MANHATTAN'), ('340728047', 'BROOKLYN'), ('140899687', 'MANHATTAN'), ('140899785', 'MANHATTAN'), ('123913319', 'MANHATTAN'), ('140900176', 'MANHATTAN'), ('420667433', 'QUEENS'), ('340727146', 'BROOKLYN'), ('421947736', 'QUEENS'), ('340727280', 'BROOKLYN'), ('123867495', 'MANHATTAN'), ('140900149', 'MANHATTAN'), ('421763372', 'QUEENS'), ('421861854', 'QUEENS'), ('340727592', 'BROOKLYN'), ('123910740', 'MANHATTAN'), ('321990235', 'BROOKLYN'), ('321990235', 'BROOKLYN'), ('520453170', 'STATEN ISLAND'), ('340727663', 'BROOKLYN'), ('123909011', 'MANHATTAN'), ('123909002', 'MANHATTAN'), ('322046095', 'BROOKLYN'), ('322085756', 'BROOKLYN'), ('220732642', 'BRONX'), ('140902325', 'MANHATTAN'), ('210181373', 'BRONX'), ('140902334', 'MANHATTAN'), ('123911044', 'MANHATTAN'), ('421764914', 'QUEENS'), ('340728369', 'BROOKLYN'), ('123910330', 'MANHATTAN'), ('340728555', 'BROOKLYN'), ('322085907', 'BROOKLYN'), ('440594625', 'QUEENS'), ('240273431', 'BRONX'), ('140903459', 'MANHATTAN'), ('140903529', 'MANHATTAN'), ('140903636', 'MANHATTAN'), ('321590907', 'BROOKLYN'), ('440597285', 'QUEENS'), ('321610262', 'BROOKLYN'), ('440595189', 'QUEENS'), ('123919251', 'MANHATTAN'), ('123874977', 'MANHATTAN'), ('340729689', 'BROOKLYN'), ('220733099', 'BRONX'), ('123912793', 'MANHATTAN'), ('340732354', 'BROOKLYN'), ('340732363', 'BROOKLYN'), ('340732372', 'BROOKLYN'), ('140905288', 'MANHATTAN'), ('421766985', 'QUEENS'), ('421765717', 'QUEENS'), ('340730597', 'BROOKLYN'), ('340732345', 'BROOKLYN'), ('440595624', 'QUEENS'), ('140908980', 'MANHATTAN'), ('340731024', 'BROOKLYN'), ('421302058', 'QUEENS'), ('340732416', 'BROOKLYN'), ('240273994', 'BRONX'), ('421773101', 'QUEENS'), ('140906438', 'MANHATTAN'), ('540175932', 'STATEN ISLAND'), ('140909024', 'MANHATTAN'), ('121208282', 'MANHATTAN'), ('140906580', 'MANHATTAN'), ('421767163', 'QUEENS'), ('140906688', 'MANHATTAN'), ('420667683', 'QUEENS'), ('123922657', 'MANHATTAN'), ('440596981', 'QUEENS'), ('321591979', 'BROOKLYN'), ('240274305', 'BRONX'), ('140907945', 'MANHATTAN'), ('140908249', 'MANHATTAN'), ('340732381', 'BROOKLYN'), ('140909202', 'MANHATTAN'), ('140909328', 'MANHATTAN'), ('140909284', 'MANHATTAN'), ('340732540', 'BROOKLYN'), ('140909159', 'MANHATTAN'), ('440597784', 'QUEENS'), ('140909943', 'MANHATTAN'), ('340733031', 'BROOKLYN'), ('440598113', 'QUEENS'), ('321591997', 'BROOKLYN'), ('340732942', 'BROOKLYN'), ('140909890', 'MANHATTAN'), ('140910897', 'MANHATTAN'), ('340734058', 'BROOKLYN'), ('322085907', 'BROOKLYN'), ('440598854', 'QUEENS'), ('240275028', 'BRONX'), ('340759469', 'BROOKLYN'), ('340733380', 'BROOKLYN'), ('321592022', 'BROOKLYN'), ('440598934', 'QUEENS'), ('440598694', 'QUEENS'), ('240275153', 'BRONX'), ('140912190', 'MANHATTAN'), ('140911805', 'MANHATTAN'), ('140911280', 'MANHATTAN'), ('321592120', 'BROOKLYN'), ('240275171', 'BRONX'), ('140912993', 'MANHATTAN'), ('140913135', 'MANHATTAN'), ('340736458', 'BROOKLYN'), ('340736216', 'BROOKLYN'), ('421765290', 'QUEENS'), ('240275368', 'BRONX'), ('440600128', 'QUEENS'), ('340735841', 'BROOKLYN'), ('340736519', 'BROOKLYN'), ('340736662', 'BROOKLYN'), ('440600379', 'QUEENS'), ('210181612', 'BRONX'), ('340736868', 'BROOKLYN'), ('240275670', 'BRONX'), ('440600556', 'QUEENS'), ('210181621', 'BRONX'), ('440600789', 'QUEENS'), ('440600878', 'QUEENS'), ('321592139', 'BROOKLYN'), ('140914358', 'MANHATTAN'), ('220733712', 'BRONX'), ('240275732', 'BRONX'), ('140914303', 'MANHATTAN'), ('140915197', 'MANHATTAN'), ('340737448', 'BROOKLYN'), ('140914928', 'MANHATTAN'), ('340737297', 'BROOKLYN'), ('340737064', 'BROOKLYN'), ('340737359', 'BROOKLYN'), ('140915641', 'MANHATTAN'), ('140915400', 'MANHATTAN'), ('340737536', 'BROOKLYN'), ('140915856', 'MANHATTAN'), ('340737581', 'BROOKLYN'), ('440601412', 'QUEENS'), ('240275858', 'BRONX'), ('322036818', 'BROOKLYN'), ('240275965', 'BRONX'), ('140916640', 'MANHATTAN'), ('140916702', 'MANHATTAN'), ('340738018', 'BROOKLYN'), ('340738045', 'BROOKLYN'), ('240276090', 'BRONX'), ('340738438', 'BROOKLYN'), ('240276134', 'BRONX'), ('140916882', 'MANHATTAN'), ('140916784', 'MANHATTAN'), ('322036890', 'BROOKLYN'), ('440602037', 'QUEENS'), ('340738713', 'BROOKLYN'), ('340738526', 'BROOKLYN'), ('140916891', 'MANHATTAN'), ('340738679', 'BROOKLYN'), ('340738517', 'BROOKLYN'), ('140917220', 'MANHATTAN'), ('140917275', 'MANHATTAN'), ('340738777', 'BROOKLYN'), ('340738786', 'BROOKLYN'), ('140917337', 'MANHATTAN'), ('240276241', 'BRONX'), ('140917202', 'MANHATTAN'), ('440602242', 'QUEENS'), ('340738893', 'BROOKLYN'), ('340738866', 'BROOKLYN'), ('140917346', 'MANHATTAN'), ('340738848', 'BROOKLYN'), ('440602313', 'QUEENS'), ('340738973', 'BROOKLYN'), ('340738991', 'BROOKLYN'), ('240276296', 'BRONX'), ('321592022', 'BROOKLYN'), ('440602331', 'QUEENS'), ('322084846', 'BROOKLYN'), ('140917596', 'MANHATTAN'), ('340739062', 'BROOKLYN'), ('440621463', 'QUEENS'), ('340739080', 'BROOKLYN'), ('240276303', 'BRONX'), ('440602484', 'QUEENS'), ('440621454', 'QUEENS'), ('140917774', 'MANHATTAN'), ('240276321', 'BRONX'), ('340759478', 'BROOKLYN'), ('140917738', 'MANHATTAN'), ('440602634', 'QUEENS'), ('421773619', 'QUEENS'), ('340739197', 'BROOKLYN'), ('440602661', 'QUEENS'), ('103348316', 'MANHATTAN'), ('103436266', 'MANHATTAN'), ('103510979', 'MANHATTAN'), ('104131057', 'MANHATTAN'), ('104435452', 'MANHATTAN'), ('103582543', 'MANHATTAN'), ('104464875', 'MANHATTAN'), ('103257663', 'MANHATTAN'), ('140917792', 'MANHATTAN'), ('104867146', 'MANHATTAN'), ('201096278', 'BRONX'), ('301506984', 'BROOKLYN'), ('140944441', 'MANHATTAN'), ('140944478', 'MANHATTAN'), ('200922788', 'BRONX'), ('240283661', 'BRONX'), ('240283652', 'BRONX'), ('402118123', 'QUEENS'), ('302360157', 'BROOKLYN'), ('402065723', 'QUEENS'), ('410012837', 'QUEENS'), ('500405019', 'STATEN ISLAND'), ('500405028', 'STATEN ISLAND'), ('500827368', 'STATEN ISLAND'), ('410057290', 'QUEENS'), ('310105052', 'BROOKLYN'), ('310152330', 'BROOKLYN'), ('310302909', 'BROOKLYN'), ('510035061', 'STATEN ISLAND'), ('420097451', 'QUEENS'), ('120203760', 'MANHATTAN'), ('120203779', 'MANHATTAN'), ('120203813', 'MANHATTAN'), ('120244486', 'MANHATTAN'), ('120203751', 'MANHATTAN'), ('120203751', 'MANHATTAN'), ('120203751', 'MANHATTAN'), ('220045868', 'BRONX'), ('320151063', 'BROOKLYN'), ('120504533', 'MANHATTAN'), ('420277523', 'QUEENS'), ('320243090', 'BROOKLYN'), ('120539952', 'MANHATTAN'), ('320143894', 'BROOKLYN'), ('120561659', 'MANHATTAN'), ('120573539', 'MANHATTAN'), ('120579061', 'MANHATTAN'), ('120622219', 'MANHATTAN'), ('120604426', 'MANHATTAN'), ('120625644', 'MANHATTAN'), ('120682680', 'MANHATTAN'), ('120682671', 'MANHATTAN'), ('420376630', 'QUEENS'), ('120761167', 'MANHATTAN'), ('120761185', 'MANHATTAN'), ('420460138', 'QUEENS'), ('320339175', 'BROOKLYN'), ('120820120', 'MANHATTAN'), ('120841633', 'MANHATTAN'), ('120873965', 'MANHATTAN'), ('120922984', 'MANHATTAN'), ('320351962', 'BROOKLYN'), ('121106338', 'MANHATTAN'), ('121147124', 'MANHATTAN'), ('120844195', 'MANHATTAN'), ('320572037', 'BROOKLYN'), ('121456496', 'MANHATTAN'), ('140046885', 'MANHATTAN'), ('121573038', 'MANHATTAN'), ('121557412', 'MANHATTAN'), ('121557403', 'MANHATTAN'), ('121557396', 'MANHATTAN'), ('121557396', 'MANHATTAN'), ('340053818', 'BROOKLYN'), ('121594774', 'MANHATTAN'), ('121594765', 'MANHATTAN'), ('121481100', 'MANHATTAN'), ('320712868', 'BROOKLYN'), ('121611997', 'MANHATTAN'), ('320759657', 'BROOKLYN'), ('320765686', 'BROOKLYN'), ('121633367', 'MANHATTAN'), ('121686684', 'MANHATTAN'), ('121686648', 'MANHATTAN'), ('121686620', 'MANHATTAN'), ('121686639', 'MANHATTAN'), ('121686611', 'MANHATTAN'), ('121686602', 'MANHATTAN'), ('420648053', 'QUEENS'), ('121725874', 'MANHATTAN'), ('121714449', 'MANHATTAN'), ('320828146', 'BROOKLYN'), ('121714430', 'MANHATTAN'), ('121707894', 'MANHATTAN'), ('121707876', 'MANHATTAN'), ('121707867', 'MANHATTAN'), ('121707885', 'MANHATTAN'), ('121707901', 'MANHATTAN'), ('121707910', 'MANHATTAN'), ('121707947', 'MANHATTAN'), ('121707938', 'MANHATTAN'), ('121707929', 'MANHATTAN'), ('121773688', 'MANHATTAN'), ('121799919', 'MANHATTAN'), ('121799919', 'MANHATTAN'), ('320838224', 'BROOKLYN'), ('320830829', 'BROOKLYN'), ('121847822', 'MANHATTAN'), ('320836388', 'BROOKLYN'), ('420648053', 'QUEENS'), ('320836388', 'BROOKLYN'), ('220350616', 'BRONX'), ('520198045', 'STATEN ISLAND'), ('122039230', 'MANHATTAN'), ('302571483', 'BROOKLYN'), ('321158377', 'BROOKLYN'), ('140213775', 'MANHATTAN'), ('340145480', 'BROOKLYN'), ('140195893', 'MANHATTAN'), ('140242734', 'MANHATTAN'), ('122122069', 'MANHATTAN'), ('420652582', 'QUEENS'), ('122162845', 'MANHATTAN'), ('302580142', 'BROOKLYN'), ('440183383', 'QUEENS'), ('140279222', 'MANHATTAN'), ('421057162', 'QUEENS'), ('122219722', 'MANHATTAN'), ('122219722', 'MANHATTAN'), ('122219722', 'MANHATTAN'), ('122258957', 'MANHATTAN'), ('122339228', 'MANHATTAN'), ('321062443', 'BROOKLYN'), ('320623884', 'BROOKLYN'), ('122420512', 'MANHATTAN'), ('122424288', 'MANHATTAN'), ('220464539', 'BRONX'), ('220451419', 'BRONX'), ('220446211', 'BRONX'), ('201194572', 'BRONX'), ('320863687', 'BROOKLYN'), ('220474323', 'BRONX'), ('122505020', 'MANHATTAN'), ('220479220', 'BRONX'), ('122538138', 'MANHATTAN'), ('140419624', 'MANHATTAN'), ('321270236', 'BROOKLYN'), ('321242204', 'BROOKLYN'), ('440285031', 'QUEENS'), ('220473262', 'BRONX'), ('340350694', 'BROOKLYN'), ('340354609', 'BROOKLYN'), ('321242204', 'BROOKLYN'), ('340350140', 'BROOKLYN'), ('421303654', 'QUEENS'), ('321310648', 'BROOKLYN'), ('440305858', 'QUEENS'), ('321242204', 'BROOKLYN'), ('340377666', 'BROOKLYN'), ('421321983', 'QUEENS'), ('122734434', 'MANHATTAN'), ('421316908', 'QUEENS'), ('421299918', 'QUEENS'), ('321362690', 'BROOKLYN'), ('321399447', 'BROOKLYN'), ('220534580', 'BRONX'), ('220152279', 'BRONX'), ('321399447', 'BROOKLYN'), ('122879723', 'MANHATTAN'), ('321435737', 'BROOKLYN'), ('220547111', 'BRONX'), ('220547111', 'BRONX'), ('321195513', 'BROOKLYN'), ('321195513', 'BROOKLYN'), ('321195513', 'BROOKLYN'), ('122908880', 'MANHATTAN'), ('440353458', 'QUEENS'), ('321465981', 'BROOKLYN'), ('421392978', 'QUEENS'), ('520280491', 'STATEN ISLAND'), ('321481758', 'BROOKLYN'), ('240169571', 'BRONX'), ('122967021', 'MANHATTAN'), ('440380936', 'QUEENS'), ('140570889', 'MANHATTAN'), ('240163005', 'BRONX'), ('321471233', 'BROOKLYN'), ('421428832', 'QUEENS'), ('321486860', 'BROOKLYN'), ('123031361', 'MANHATTAN'), ('321184918', 'BROOKLYN'), ('520289642', 'STATEN ISLAND'), ('220547111', 'BRONX'), ('520294958', 'STATEN ISLAND'), ('520294976', 'STATEN ISLAND'), ('123057538', 'MANHATTAN'), ('123053701', 'MANHATTAN'), ('340484595', 'BROOKLYN'), ('321512760', 'BROOKLYN'), ('440395617', 'QUEENS'), ('321470350', 'BROOKLYN'), ('520275229', 'STATEN ISLAND'), ('520276736', 'STATEN ISLAND'), ('520276736', 'STATEN ISLAND'), ('321186747', 'BROOKLYN'), ('421476236', 'QUEENS'), ('321186747', 'BROOKLYN'), ('321186747', 'BROOKLYN'), ('421356552', 'QUEENS'), ('220152634', 'BRONX'), ('220585329', 'BRONX'), ('520300647', 'STATEN ISLAND'), ('321605303', 'BROOKLYN'), ('421356552', 'QUEENS'), ('421394725', 'QUEENS'), ('220585338', 'BRONX'), ('440413189', 'QUEENS'), ('321399447', 'BROOKLYN'), ('122992137', 'MANHATTAN'), ('122992137', 'MANHATTAN'), ('321606348', 'BROOKLYN'), ('421263938', 'QUEENS'), ('123325687', 'MANHATTAN'), ('220601695', 'BRONX'), ('220604246', 'BRONX'), ('340533836', 'BROOKLYN'), ('140685827', 'MANHATTAN'), ('321644538', 'BROOKLYN'), ('240196051', 'BRONX'), ('123136560', 'MANHATTAN'), ('123104194', 'MANHATTAN'), ('321647615', 'BROOKLYN'), ('321647615', 'BROOKLYN'), ('123179103', 'MANHATTAN'), ('123345576', 'MANHATTAN'), ('123185383', 'MANHATTAN'), ('220621762', 'BRONX'), ('140710639', 'MANHATTAN'), ('123142679', 'MANHATTAN'), ('240206273', 'BRONX'), ('440450094', 'QUEENS'), ('421559995', 'QUEENS'), ('123142679', 'MANHATTAN'), ('220628248', 'BRONX'), ('220628248', 'BRONX'), ('321697302', 'BROOKLYN'), ('321698579', 'BROOKLYN'), ('340575149', 'BROOKLYN'), ('123264403', 'MANHATTAN'), ('240208994', 'BRONX'), ('421574718', 'QUEENS'), ('123198994', 'MANHATTAN'), ('321726325', 'BROOKLYN'), ('321726325', 'BROOKLYN'), ('321726307', 'BROOKLYN'), ('321726307', 'BROOKLYN'), ('321726307', 'BROOKLYN'), ('321726325', 'BROOKLYN'), ('220601695', 'BRONX'), ('321726307', 'BROOKLYN'), ('123152890', 'MANHATTAN'), ('421591520', 'QUEENS'), ('320911144', 'BROOKLYN'), ('123363760', 'MANHATTAN'), ('440467424', 'QUEENS'), ('123446921', 'MANHATTAN'), ('123446921', 'MANHATTAN'), ('340592273', 'BROOKLYN'), ('421611884', 'QUEENS'), ('220645318', 'BRONX'), ('340590934', 'BROOKLYN'), ('421544323', 'QUEENS'), ('340594075', 'BROOKLYN'), ('420663730', 'QUEENS'), ('102553602', 'MANHATTAN'), ('321707756', 'BROOKLYN'), ('421615595', 'QUEENS'), ('321741709', 'BROOKLYN'), ('421627270', 'QUEENS'), ('321750404', 'BROOKLYN'), ('321750404', 'BROOKLYN'), ('123388280', 'MANHATTAN'), ('123431198', 'MANHATTAN'), ('421636475', 'QUEENS'), ('123431198', 'MANHATTAN'), ('321689534', 'BROOKLYN'), ('421635145', 'QUEENS'), ('340608408', 'BROOKLYN'), ('421642529', 'QUEENS'), ('320911144', 'BROOKLYN'), ('320911144', 'BROOKLYN'), ('321773684', 'BROOKLYN'), ('123431081', 'MANHATTAN'), ('123184972', 'MANHATTAN'), ('123184972', 'MANHATTAN'), ('321774549', 'BROOKLYN'), ('421640175', 'QUEENS'), ('123475211', 'MANHATTAN'), ('123582792', 'MANHATTAN'), ('421655694', 'QUEENS'), ('321791913', 'BROOKLYN'), ('421641691', 'QUEENS'), ('321807755', 'BROOKLYN'), ('123473892', 'MANHATTAN'), ('440496697', 'QUEENS'), ('220661987', 'BRONX'), ('220661987', 'BRONX'), ('220661987', 'BRONX'), ('220617955', 'BRONX'), ('220611988', 'BRONX'), ('140792248', 'MANHATTAN'), ('421668724', 'QUEENS'), ('123545663', 'MANHATTAN'), ('321830284', 'BROOKLYN'), ('321836867', 'BROOKLYN'), ('123546591', 'MANHATTAN'), ('123542256', 'MANHATTAN'), ('520358130', 'STATEN ISLAND'), ('123515286', 'MANHATTAN'), ('340637289', 'BROOKLYN'), ('302584371', 'BROOKLYN'), ('140807786', 'MANHATTAN'), ('321843270', 'BROOKLYN'), ('123496822', 'MANHATTAN'), ('321846990', 'BROOKLYN'), ('123496822', 'MANHATTAN'), ('520294958', 'STATEN ISLAND'), ('520294976', 'STATEN ISLAND'), ('520275229', 'STATEN ISLAND'), ('321764122', 'BROOKLYN'), ('321833370', 'BROOKLYN'), ('123482212', 'MANHATTAN'), ('321075331', 'BROOKLYN'), ('421694599', 'QUEENS'), ('440520232', 'QUEENS'), ('140816589', 'MANHATTAN'), ('421686278', 'QUEENS'), ('340645984', 'BROOKLYN'), ('421712203', 'QUEENS'), ('123494940', 'MANHATTAN'), ('340649383', 'BROOKLYN'), ('421700868', 'QUEENS'), ('321383766', 'BROOKLYN'), ('123490230', 'MANHATTAN'), ('520364999', 'STATEN ISLAND'), ('123155254', 'MANHATTAN'), ('520362358', 'STATEN ISLAND'), ('321919215', 'BROOKLYN'), ('340658498', 'BROOKLYN'), ('340649542', 'BROOKLYN'), ('321691852', 'BROOKLYN'), ('123594958', 'MANHATTAN'), ('220672742', 'BRONX'), ('421719199', 'QUEENS'), ('321072691', 'BROOKLYN'), ('421725128', 'QUEENS'), ('340661108', 'BROOKLYN'), ('321926706', 'BROOKLYN'), ('321926706', 'BROOKLYN'), ('321926706', 'BROOKLYN'), ('340661625', 'BROOKLYN'), ('321908183', 'BROOKLYN'), ('321908183', 'BROOKLYN'), ('321903678', 'BROOKLYN'), ('321908860', 'BROOKLYN'), ('123851064', 'MANHATTAN'), ('520359264', 'STATEN ISLAND'), ('520359255', 'STATEN ISLAND'), ('123597973', 'MANHATTAN'), ('321908860', 'BROOKLYN'), ('123715710', 'MANHATTAN'), ('421950188', 'QUEENS'), ('421950188', 'QUEENS'), ('520369066', 'STATEN ISLAND'), ('421925313', 'QUEENS'), ('421950188', 'QUEENS'), ('321937268', 'BROOKLYN'), ('321386567', 'BROOKLYN'), ('340663598', 'BROOKLYN'), ('321386380', 'BROOKLYN'), ('123378120', 'MANHATTAN'), ('321935064', 'BROOKLYN'), ('123704704', 'MANHATTAN'), ('140841659', 'MANHATTAN'), ('123870702', 'MANHATTAN'), ('421640139', 'QUEENS'), ('340669351', 'BROOKLYN'), ('321937268', 'BROOKLYN'), ('240251115', 'BRONX'), ('421739293', 'QUEENS'), ('321943876', 'BROOKLYN'), ('421858378', 'QUEENS'), ('240252873', 'BRONX'), ('123708648', 'MANHATTAN'), ('421739293', 'QUEENS'), ('321946551', 'BROOKLYN'), ('123734218', 'MANHATTAN'), ('321956371', 'BROOKLYN'), ('321943938', 'BROOKLYN'), ('321730203', 'BROOKLYN'), ('440546269', 'QUEENS'), ('340676735', 'BROOKLYN'), ('340678127', 'BROOKLYN'), ('321948238', 'BROOKLYN'), ('321593101', 'BROOKLYN'), ('302586654', 'BROOKLYN'), ('421858378', 'QUEENS'), ('421936392', 'QUEENS'), ('321958510', 'BROOKLYN'), ('123554322', 'MANHATTAN'), ('421299516', 'QUEENS'), ('421541503', 'QUEENS'), ('520379475', 'STATEN ISLAND'), ('321922568', 'BROOKLYN'), ('421918330', 'QUEENS'), ('123554331', 'MANHATTAN'), ('123764863', 'MANHATTAN'), ('321593502', 'BROOKLYN'), ('123783129', 'MANHATTAN'), ('123783129', 'MANHATTAN'), ('123783165', 'MANHATTAN'), ('123851858', 'MANHATTAN'), ('421918072', 'QUEENS'), ('321966066', 'BROOKLYN'), ('302587225', 'BROOKLYN'), ('123686920', 'MANHATTAN'), ('123686920', 'MANHATTAN'), ('123764541', 'MANHATTAN'), ('421729972', 'QUEENS'), ('321593824', 'BROOKLYN'), ('321581944', 'BROOKLYN'), ('421729972', 'QUEENS'), ('321969287', 'BROOKLYN'), ('321969287', 'BROOKLYN'), ('321969287', 'BROOKLYN'), ('321969287', 'BROOKLYN'), ('123782763', 'MANHATTAN'), ('123782763', 'MANHATTAN'), ('321593897', 'BROOKLYN'), ('321593897', 'BROOKLYN'), ('321934270', 'BROOKLYN'), ('321970578', 'BROOKLYN'), ('520386109', 'STATEN ISLAND'), ('321974832', 'BROOKLYN'), ('321974832', 'BROOKLYN'), ('321974841', 'BROOKLYN'), ('123776235', 'MANHATTAN'), ('340686449', 'BROOKLYN'), ('421734653', 'QUEENS'), ('340685486', 'BROOKLYN'), ('321989425', 'BROOKLYN'), ('321976723', 'BROOKLYN'), ('321952026', 'BROOKLYN'), ('123811839', 'MANHATTAN'), ('220711344', 'BRONX'), ('123823728', 'MANHATTAN'), ('140862092', 'MANHATTAN'), ('140862458', 'MANHATTAN'), ('340687983', 'BROOKLYN'), ('421736982', 'QUEENS'), ('440559496', 'QUEENS'), ('220711941', 'BRONX'), ('321933869', 'BROOKLYN'), ('321952035', 'BROOKLYN'), ('321963087', 'BROOKLYN'), ('520390050', 'STATEN ISLAND'), ('440563757', 'QUEENS'), ('440564088', 'QUEENS'), ('321976420', 'BROOKLYN'), ('123713339', 'MANHATTAN'), ('321660939', 'BROOKLYN'), ('421913932', 'QUEENS'), ('140870270', 'MANHATTAN'), ('240261989', 'BRONX'), ('440566004', 'QUEENS'), ('421915477', 'QUEENS'), ('440566512', 'QUEENS'), ('123414411', 'MANHATTAN'), ('123817959', 'MANHATTAN'), ('102721226', 'MANHATTAN'), ('321984153', 'BROOKLYN'), ('123884494', 'MANHATTAN'), ('240263497', 'BRONX'), ('322011899', 'BROOKLYN'), ('340701182', 'BROOKLYN'), ('421908546', 'QUEENS'), ('321947532', 'BROOKLYN'), ('321995819', 'BROOKLYN'), ('123712303', 'MANHATTAN'), ('421903015', 'QUEENS'), ('123740256', 'MANHATTAN'), ('421904899', 'QUEENS'), ('440572818', 'QUEENS'), ('123596732', 'MANHATTAN'), ('322003853', 'BROOKLYN'), ('140878977', 'MANHATTAN'), ('440576173', 'QUEENS'), ('322007056', 'BROOKLYN'), ('340710369', 'BROOKLYN'), ('421950801', 'QUEENS'), ('421941956', 'QUEENS'), ('421941965', 'QUEENS'), ('123695812', 'MANHATTAN'), ('421778909', 'QUEENS'), ('421780442', 'QUEENS'), ('321596554', 'BROOKLYN'), ('520360430', 'STATEN ISLAND'), ('322018856', 'BROOKLYN'), ('421778017', 'QUEENS'), ('340709816', 'BROOKLYN'), ('421781584', 'QUEENS'), ('421781343', 'QUEENS'), ('321926895', 'BROOKLYN'), ('240276615', 'BRONX'), ('123794000', 'MANHATTAN'), ('123848827', 'MANHATTAN'), ('123818093', 'MANHATTAN'), ('322022949', 'BROOKLYN'), ('421802703', 'QUEENS'), ('421907967', 'QUEENS'), ('421802008', 'QUEENS'), ('322008135', 'BROOKLYN'), ('123780694', 'MANHATTAN'), ('520371589', 'STATEN ISLAND'), ('123892975', 'MANHATTAN'), ('210180668', 'BRONX'), ('322020086', 'BROOKLYN'), ('123795474', 'MANHATTAN'), ('140886147', 'MANHATTAN'), ('220725400', 'BRONX'), ('321968858', 'BROOKLYN'), ('321737117', 'BROOKLYN'), ('421779917', 'QUEENS'), ('520383941', 'STATEN ISLAND'), ('220725240', 'BRONX'), ('123703796', 'MANHATTAN'), ('321984581', 'BROOKLYN'), ('440584967', 'QUEENS'), ('322041401', 'BROOKLYN'), ('421755513', 'QUEENS'), ('440585403', 'QUEENS'), ('322040313', 'BROOKLYN'), ('123841405', 'MANHATTAN'), ('421755489', 'QUEENS'), ('123841398', 'MANHATTAN'), ('321997185', 'BROOKLYN'), ('322039281', 'BROOKLYN'), ('421757860', 'QUEENS'), ('123692646', 'MANHATTAN'), ('123728635', 'MANHATTAN'), ('123717754', 'MANHATTAN'), ('421907921', 'QUEENS'), ('520386555', 'STATEN ISLAND'), ('322041447', 'BROOKLYN'), ('322069391', 'BROOKLYN'), ('123830346', 'MANHATTAN'), ('123830346', 'MANHATTAN'), ('440587795', 'QUEENS'), ('421944329', 'QUEENS'), ('322067151', 'BROOKLYN'), ('121207210', 'MANHATTAN'), ('421944846', 'QUEENS'), ('322071182', 'BROOKLYN'), ('421735581', 'QUEENS'), ('340720367', 'BROOKLYN'), ('123573588', 'MANHATTAN'), ('340720679', 'BROOKLYN'), ('322004237', 'BROOKLYN'), ('421944677', 'QUEENS'), ('322043613', 'BROOKLYN'), ('340720321', 'BROOKLYN'), ('421756558', 'QUEENS'), ('520450770', 'STATEN ISLAND'), ('322045087', 'BROOKLYN'), ('421757441', 'QUEENS'), ('421958947', 'QUEENS'), ('421782315', 'QUEENS'), ('123772202', 'MANHATTAN'), ('123743921', 'MANHATTAN'), ('421958064', 'QUEENS'), ('421959081', 'QUEENS'), ('540174737', 'STATEN ISLAND'), ('520397892', 'STATEN ISLAND'), ('322046077', 'BROOKLYN'), ('322045853', 'BROOKLYN'), ('321966066', 'BROOKLYN'), ('440590004', 'QUEENS'), ('123832914', 'MANHATTAN'), ('420667200', 'QUEENS'), ('440589338', 'QUEENS'), ('123829045', 'MANHATTAN'), ('240271068', 'BRONX'), ('123874012', 'MANHATTAN'), ('123874539', 'MANHATTAN'), ('140893415', 'MANHATTAN'), ('121207489', 'MANHATTAN'), ('421959553', 'QUEENS'), ('121207381', 'MANHATTAN'), ('140893709', 'MANHATTAN'), ('440591389', 'QUEENS'), ('340724069', 'BROOKLYN'), ('123874753', 'MANHATTAN'), ('322033474', 'BROOKLYN'), ('440591352', 'QUEENS'), ('140894708', 'MANHATTAN'), ('440590932', 'QUEENS'), ('340724032', 'BROOKLYN'), ('140895253', 'MANHATTAN'), ('340724540', 'BROOKLYN'), ('123865273', 'MANHATTAN'), ('322034268', 'BROOKLYN'), ('520398926', 'STATEN ISLAND'), ('421946540', 'QUEENS'), ('123831041', 'MANHATTAN'), ('340724504', 'BROOKLYN'), ('421780228', 'QUEENS'), ('520451485', 'STATEN ISLAND'), ('500876803', 'STATEN ISLAND'), ('340725718', 'BROOKLYN'), ('520450565', 'STATEN ISLAND'), ('140897340', 'MANHATTAN'), ('322084212', 'BROOKLYN'), ('421962585', 'QUEENS'), ('322083525', 'BROOKLYN'), ('340725790', 'BROOKLYN'), ('123911320', 'MANHATTAN'), ('123911437', 'MANHATTAN'), ('140897929', 'MANHATTAN'), ('140897947', 'MANHATTAN'), ('440592627', 'QUEENS'), ('440592636', 'QUEENS'), ('340726183', 'BROOKLYN'), ('340726227', 'BROOKLYN'), ('240272469', 'BRONX'), ('340726263', 'BROOKLYN'), ('140898116', 'MANHATTAN'), ('340726325', 'BROOKLYN'), ('140898198', 'MANHATTAN'), ('140898205', 'MANHATTAN'), ('340726389', 'BROOKLYN'), ('440592930', 'QUEENS'), ('340726762', 'BROOKLYN'), ('140899008', 'MANHATTAN'), ('322071351', 'BROOKLYN'), ('140899927', 'MANHATTAN'), ('140899918', 'MANHATTAN'), ('322045951', 'BROOKLYN'), ('340727155', 'BROOKLYN'), ('520453456', 'STATEN ISLAND'), ('140899464', 'MANHATTAN'), ('140900728', 'MANHATTAN'), ('440593760', 'QUEENS'), ('421962923', 'QUEENS'), ('322085220', 'BROOKLYN'), ('140900586', 'MANHATTAN'), ('140901424', 'MANHATTAN'), ('421899681', 'QUEENS'), ('123856657', 'MANHATTAN'), ('340727743', 'BROOKLYN'), ('421765021', 'QUEENS'), ('240273039', 'BRONX'), ('123875967', 'MANHATTAN'), ('123911838', 'MANHATTAN'), ('220732651', 'BRONX'), ('440594554', 'QUEENS'), ('140903182', 'MANHATTAN'), ('123910508', 'MANHATTAN'), ('321905060', 'BROOKLYN'), ('322086489', 'BROOKLYN'), ('140902735', 'MANHATTAN'), ('123780408', 'MANHATTAN'), ('322086504', 'BROOKLYN'), ('140903431', 'MANHATTAN'), ('140903404', 'MANHATTAN'), ('123909716', 'MANHATTAN'), ('140904056', 'MANHATTAN'), ('123874968', 'MANHATTAN'), ('140904270', 'MANHATTAN'), ('140904289', 'MANHATTAN'), ('140904038', 'MANHATTAN'), ('140903823', 'MANHATTAN'), ('321590989', 'BROOKLYN'), ('123569389', 'MANHATTAN'), ('140905947', 'MANHATTAN'), ('421959447', 'QUEENS'), ('421773094', 'QUEENS'), ('123846641', 'MANHATTAN'), ('421767984', 'QUEENS'), ('140906321', 'MANHATTAN'), ('520454339', 'STATEN ISLAND'), ('340731248', 'BROOKLYN'), ('322036042', 'BROOKLYN'), ('421802730', 'QUEENS'), ('440595820', 'QUEENS'), ('440595857', 'QUEENS'), ('421696436', 'QUEENS'), ('322036097', 'BROOKLYN'), ('140906241', 'MANHATTAN'), ('340731453', 'BROOKLYN'), ('220733375', 'BRONX'), ('340731569', 'BROOKLYN'), ('340732443', 'BROOKLYN'), ('140907142', 'MANHATTAN'), ('123791913', 'MANHATTAN'), ('440597052', 'QUEENS'), ('440597150', 'QUEENS'), ('340732513', 'BROOKLYN'), ('340732522', 'BROOKLYN'), ('340732595', 'BROOKLYN'), ('340732639', 'BROOKLYN'), ('140908418', 'MANHATTAN'), ('123886884', 'MANHATTAN'), ('340732808', 'BROOKLYN'), ('421186558', 'QUEENS'), ('440598275', 'QUEENS'), ('440598514', 'QUEENS'), ('440598621', 'QUEENS'), ('440598676', 'QUEENS'), ('340733406', 'BROOKLYN'), ('440598603', 'QUEENS'), ('140910593', 'MANHATTAN'), ('340733353', 'BROOKLYN'), ('340733941', 'BROOKLYN'), ('540176600', 'STATEN ISLAND'), ('140910913', 'MANHATTAN'), ('140911413', 'MANHATTAN'), ('140911011', 'MANHATTAN'), ('340734094', 'BROOKLYN'), ('140910708', 'MANHATTAN'), ('540176511', 'STATEN ISLAND'), ('340734227', 'BROOKLYN'), ('340734851', 'BROOKLYN'), ('340734860', 'BROOKLYN'), ('340734879', 'BROOKLYN'), ('340734888', 'BROOKLYN'), ('340734897', 'BROOKLYN'), ('340734913', 'BROOKLYN'), ('340734931', 'BROOKLYN'), ('340734940', 'BROOKLYN'), ('240275091', 'BRONX'), ('340734753', 'BROOKLYN'), ('340735146', 'BROOKLYN'), ('440599639', 'QUEENS'), ('340735690', 'BROOKLYN'), ('140913233', 'MANHATTAN'), ('440600048', 'QUEENS'), ('340735681', 'BROOKLYN'), ('140912396', 'MANHATTAN'), ('340736127', 'BROOKLYN'), ('240275527', 'BRONX'), ('140914054', 'MANHATTAN'), ('140914198', 'MANHATTAN'), ('140914385', 'MANHATTAN'), ('140914465', 'MANHATTAN'), ('140914438', 'MANHATTAN'), ('440601207', 'QUEENS'), ('440601546', 'QUEENS'), ('540177075', 'STATEN ISLAND'), ('340737279', 'BROOKLYN'), ('440601145', 'QUEENS'), ('322084604', 'BROOKLYN'), ('140915071', 'MANHATTAN'), ('340737509', 'BROOKLYN'), ('440601877', 'QUEENS'), ('140916622', 'MANHATTAN'), ('140916739', 'MANHATTAN'), ('140916301', 'MANHATTAN'), ('440601895', 'QUEENS'), ('322028042', 'BROOKLYN'), ('340738385', 'BROOKLYN'), ('140916533', 'MANHATTAN'), ('340738189', 'BROOKLYN'), ('340738553', 'BROOKLYN'), ('140917177', 'MANHATTAN'), ('140917239', 'MANHATTAN'), ('340738795', 'BROOKLYN'), ('140917300', 'MANHATTAN'), ('340738697', 'BROOKLYN'), ('340738857', 'BROOKLYN'), ('240276152', 'BRONX'), ('540177299', 'STATEN ISLAND'), ('440602304', 'QUEENS'), ('340739044', 'BROOKLYN'), ('140917532', 'MANHATTAN'), ('140917505', 'MANHATTAN'), ('520332248', 'STATEN ISLAND'), ('140917417', 'MANHATTAN'), ('322036925', 'BROOKLYN'), ('140917765', 'MANHATTAN'), ('340739188', 'BROOKLYN'), ('340739053', 'BROOKLYN'), ('140917783', 'MANHATTAN'), ('140917863', 'MANHATTAN'), ('240276312', 'BRONX'), ('340739106', 'BROOKLYN'), ('440602929', 'QUEENS'), ('140917970', 'MANHATTAN'), ('340739437', 'BROOKLYN'), ('340739428', 'BROOKLYN'), ('440603054', 'QUEENS'), ('340739419', 'BROOKLYN'), ('140917961', 'MANHATTAN'), ('340739375', 'BROOKLYN'), ('540177440', 'STATEN ISLAND'), ('440603090', 'QUEENS'), ('340739464', 'BROOKLYN'), ('123919224', 'MANHATTAN'), ('140918112', 'MANHATTAN'), ('440603072', 'QUEENS'), ('140918210', 'MANHATTAN'), ('340739623', 'BROOKLYN'), ('240276385', 'BRONX'), ('440603223', 'QUEENS'), ('240276465', 'BRONX'), ('440603241', 'QUEENS'), ('240276492', 'BRONX'), ('440603349', 'QUEENS'), ('240276483', 'BRONX'), ('440603367', 'QUEENS'), ('340739650', 'BROOKLYN'), ('340739632', 'BROOKLYN'), ('340739641', 'BROOKLYN'), ('140918390', 'MANHATTAN'), ('420667754', 'QUEENS'), ('420667763', 'QUEENS'), ('121208344', 'MANHATTAN'), ('340739678', 'BROOKLYN'), ('140918416', 'MANHATTAN'), ('440603376', 'QUEENS'), ('240276508', 'BRONX'), ('121207862', 'MANHATTAN'), ('420667772', 'QUEENS'), ('201204865', 'BRONX'), ('420667781', 'QUEENS'), ('420667790', 'QUEENS'), ('420667807', 'QUEENS'), ('420667816', 'QUEENS'), ('420667825', 'QUEENS'), ('420667834', 'QUEENS'), ('321591050', 'BROOKLYN'), ('121207862', 'MANHATTAN'), ('420667843', 'QUEENS'), ('420667852', 'QUEENS'), ('420667861', 'QUEENS'), ('140918434', 'MANHATTAN'), ('340739703', 'BROOKLYN'), ('140918425', 'MANHATTAN'), ('140918443', 'MANHATTAN'), ('140918452', 'MANHATTAN'), ('140918461', 'MANHATTAN'), ('321591755', 'BROOKLYN'), ('440603385', 'QUEENS'), ('140918504', 'MANHATTAN'), ('440603394', 'QUEENS'), ('140918489', 'MANHATTAN'), ('140918498', 'MANHATTAN'), ('340739730', 'BROOKLYN'), ('421902169', 'QUEENS'), ('421902169', 'QUEENS'), ('340739749', 'BROOKLYN'), ('440603410', 'QUEENS'), ('140918513', 'MANHATTAN'), ('420667870', 'QUEENS'), ('340739712', 'BROOKLYN'), ('540177529', 'STATEN ISLAND'), ('340739758', 'BROOKLYN'), ('140918522', 'MANHATTAN'), ('340739767', 'BROOKLYN'), ('240276526', 'BRONX'), ('140918531', 'MANHATTAN'), ('322087013', 'BROOKLYN'), ('340739776', 'BROOKLYN'), ('321592255', 'BROOKLYN'), ('440603447', 'QUEENS'), ('321920953', 'BROOKLYN'), ('140918586', 'MANHATTAN'), ('440603438', 'QUEENS'), ('121208362', 'MANHATTAN'), ('140918577', 'MANHATTAN'), ('440603429', 'QUEENS'), ('140918595', 'MANHATTAN'), ('140918602', 'MANHATTAN'), ('240276535', 'BRONX'), ('440603465', 'QUEENS'), ('440603456', 'QUEENS'), ('340739794', 'BROOKLYN'), ('340739801', 'BROOKLYN'), ('340739829', 'BROOKLYN'), ('421737400', 'QUEENS'), ('421802151', 'QUEENS'), ('140918639', 'MANHATTAN'), ('421773726', 'QUEENS'), ('421782565', 'QUEENS'), ('440603474', 'QUEENS'), ('440603517', 'QUEENS'), ('140918666', 'MANHATTAN'), ('440603508', 'QUEENS'), ('240276553', 'BRONX'), ('140918648', 'MANHATTAN'), ('440603526', 'QUEENS'), ('140918684', 'MANHATTAN'), ('140918675', 'MANHATTAN'), ('340739865', 'BROOKLYN'), ('140918693', 'MANHATTAN'), ('140918700', 'MANHATTAN'), ('340739874', 'BROOKLYN'), ('340739856', 'BROOKLYN'), ('140918728', 'MANHATTAN'), ('140918773', 'MANHATTAN'), ('340739892', 'BROOKLYN'), ('140918746', 'MANHATTAN'), ('340739883', 'BROOKLYN'), ('240276562', 'BRONX'), ('240276580', 'BRONX'), ('140918755', 'MANHATTAN'), ('140918817', 'MANHATTAN'), ('540177574', 'STATEN ISLAND'), ('240276599', 'BRONX'), ('140918782', 'MANHATTAN'), ('140918791', 'MANHATTAN'), ('440603562', 'QUEENS'), ('440603544', 'QUEENS'), ('440603553', 'QUEENS'), ('440603571', 'QUEENS'), ('440603580', 'QUEENS'), ('140918835', 'MANHATTAN'), ('140918826', 'MANHATTAN'), ('540177592', 'STATEN ISLAND'), ('340739927', 'BROOKLYN'), ('340739936', 'BROOKLYN'), ('140918853', 'MANHATTAN'), ('140918844', 'MANHATTAN'), ('140918871', 'MANHATTAN'), ('340739972', 'BROOKLYN'), ('340739954', 'BROOKLYN'), ('140918880', 'MANHATTAN'), ('140918933', 'MANHATTAN'), ('140918906', 'MANHATTAN'), ('440603642', 'QUEENS'), ('140918924', 'MANHATTAN'), ('440603651', 'QUEENS'), ('340739981', 'BROOKLYN'), ('340739561', 'BROOKLYN'), ('140918309', 'MANHATTAN'), ('240276651', 'BRONX'), ('240276456', 'BRONX'), ('140918336', 'MANHATTAN'), ('103546539', 'MANHATTAN'), ('301094009', 'BROOKLYN'), ('301172781', 'BROOKLYN'), ('301537905', 'BROOKLYN'), ('340739614', 'BROOKLYN'), ('540177477', 'STATEN ISLAND'), ('440603679', 'QUEENS'), ('340740005', 'BROOKLYN'), ('140918960', 'MANHATTAN'), ('440603688', 'QUEENS'), ('440603697', 'QUEENS'), ('240276660', 'BRONX'), ('340740023', 'BROOKLYN'), ('140918951', 'MANHATTAN'), ('440603704', 'QUEENS'), ('340740032', 'BROOKLYN'), ('302289921', 'BROOKLYN'), ('302344452', 'BROOKLYN'), ('302382062', 'BROOKLYN'), ('302382062', 'BROOKLYN'), ('302382062', 'BROOKLYN'), ('401100296', 'QUEENS'), ('401111122', 'QUEENS'), ('401498875', 'QUEENS'), ('401498875', 'QUEENS'), ('310060377', 'BROOKLYN'), ('310103036', 'BROOKLYN'), ('310103036', 'BROOKLYN'), ('401498875', 'QUEENS'), ('401562377', 'QUEENS'), ('401566854', 'QUEENS'), ('401619735', 'QUEENS'), ('401846428', 'QUEENS'), ('401510824', 'QUEENS'), ('401568638', 'QUEENS'), ('402061629', 'QUEENS'), ('402105690', 'QUEENS'), ('402117507', 'QUEENS'), ('402404796', 'QUEENS'), ('310127957', 'BROOKLYN'), ('310140237', 'BROOKLYN'), ('310163033', 'BROOKLYN'), ('310182879', 'BROOKLYN'), ('110338803', 'MANHATTAN'), ('310295463', 'BROOKLYN'), ('320231557', 'BROOKLYN'), ('320485710', 'BROOKLYN'), ('420568326', 'QUEENS'), ('420255743', 'QUEENS'), ('320210277', 'BROOKLYN'), ('320235385', 'BROOKLYN'), ('320295514', 'BROOKLYN'), ('320486684', 'BROOKLYN'), ('420634479', 'QUEENS'), ('420778448', 'QUEENS'), ('320748125', 'BROOKLYN'), ('320706401', 'BROOKLYN'), ('420792253', 'QUEENS'), ('340054568', 'BROOKLYN'), ('320769165', 'BROOKLYN'), ('340119810', 'BROOKLYN'), ('340119865', 'BROOKLYN'), ('320932648', 'BROOKLYN'), ('320626435', 'BROOKLYN'), ('440183908', 'QUEENS'), ('440183917', 'QUEENS'), ('440185309', 'QUEENS'), ('320913856', 'BROOKLYN'), ('340220433', 'BROOKLYN'), ('321060445', 'BROOKLYN'), ('340238772', 'BROOKLYN'), ('320913856', 'BROOKLYN'), ('321098110', 'BROOKLYN'), ('340276944', 'BROOKLYN'), ('140395677', 'MANHATTAN'), ('140403016', 'MANHATTAN'), ('421225123', 'QUEENS'), ('340315386', 'BROOKLYN'), ('420902410', 'QUEENS'), ('420902410', 'QUEENS'), ('421231278', 'QUEENS'), ('321047577', 'BROOKLYN'), ('321301097', 'BROOKLYN'), ('321301088', 'BROOKLYN'), ('340354299', 'BROOKLYN'), ('321447261', 'BROOKLYN'), ('321447261', 'BROOKLYN'), ('321447252', 'BROOKLYN'), ('321447252', 'BROOKLYN'), ('321447243', 'BROOKLYN'), ('321447243', 'BROOKLYN'), ('421269086', 'QUEENS'), ('321442284', 'BROOKLYN'), ('122896991', 'MANHATTAN'), ('321453645', 'BROOKLYN'), ('440344968', 'QUEENS'), ('340427675', 'BROOKLYN'), ('421384914', 'QUEENS'), ('321455135', 'BROOKLYN'), ('321453690', 'BROOKLYN'), ('321478502', 'BROOKLYN'), ('321478511', 'BROOKLYN'), ('321423447', 'BROOKLYN'), ('421395751', 'QUEENS'), ('440373418', 'QUEENS'), ('440376095', 'QUEENS'), ('340475952', 'BROOKLYN'), ('421369236', 'QUEENS'), ('520293913', 'STATEN ISLAND'), ('220586266', 'BRONX'), ('123009350', 'MANHATTAN'), ('440390113', 'QUEENS'), ('340481909', 'BROOKLYN'), ('140621423', 'MANHATTAN'), ('421369236', 'QUEENS'), ('220595194', 'BRONX'), ('123082840', 'MANHATTAN'), ('123082840', 'MANHATTAN'), ('340513901', 'BROOKLYN'), ('321605330', 'BROOKLYN'), ('321605991', 'BROOKLYN'), ('440419735', 'QUEENS'), ('440421811', 'QUEENS'), ('321629332', 'BROOKLYN'), ('421568244', 'QUEENS'), ('321726094', 'BROOKLYN'), ('321671188', 'BROOKLYN'), ('321554331', 'BROOKLYN'), ('421593733', 'QUEENS'), ('321717905', 'BROOKLYN'), ('321717905', 'BROOKLYN'), ('321721142', 'BROOKLYN'), ('321721142', 'BROOKLYN'), ('421631693', 'QUEENS'), ('520325942', 'STATEN ISLAND'), ('421616987', 'QUEENS'), ('440474899', 'QUEENS'), ('321773309', 'BROOKLYN'), ('321807773', 'BROOKLYN'), ('321739543', 'BROOKLYN'), ('220656109', 'BRONX'), ('220668793', 'BRONX'), ('321654811', 'BROOKLYN'), ('340628271', 'BROOKLYN'), ('220589085', 'BRONX'), ('220589101', 'BRONX'), ('322059552', 'BROOKLYN'), ('322059552', 'BROOKLYN'), ('322059561', 'BROOKLYN'), ('322059570', 'BROOKLYN'), ('322059570', 'BROOKLYN'), ('321077883', 'BROOKLYN'), ('321070032', 'BROOKLYN'), ('322059561', 'BROOKLYN'), ('321789775', 'BROOKLYN'), ('321789766', 'BROOKLYN'), ('440530418', 'QUEENS'), ('520377020', 'STATEN ISLAND'), ('520377039', 'STATEN ISLAND'), ('321961374', 'BROOKLYN'), ('321963372', 'BROOKLYN'), ('321963372', 'BROOKLYN'), ('123527120', 'MANHATTAN'), ('340679000', 'BROOKLYN'), ('321989407', 'BROOKLYN'), ('321989407', 'BROOKLYN'), ('520383102', 'STATEN ISLAND'), ('520383111', 'STATEN ISLAND'), ('321973085', 'BROOKLYN'), ('421737035', 'QUEENS'), ('321995034', 'BROOKLYN'), ('321998914', 'BROOKLYN'), ('321962266', 'BROOKLYN'), ('321964807', 'BROOKLYN'), ('123733601', 'MANHATTAN'), ('421912309', 'QUEENS'), ('322021398', 'BROOKLYN'), ('322004898', 'BROOKLYN'), ('421800652', 'QUEENS'), ('321907077', 'BROOKLYN'), ('140898367', 'MANHATTAN'), ('440592690', 'QUEENS'), ('340726575', 'BROOKLYN'), ('440592832', 'QUEENS'), ('340726584', 'BROOKLYN'), ('140898713', 'MANHATTAN'), ('140898740', 'MANHATTAN'), ('340726655', 'BROOKLYN'), ('140904564', 'MANHATTAN'), ('440597980', 'QUEENS'), ('440592994', 'QUEENS'), ('321592228', 'BROOKLYN'), ('440593029', 'QUEENS'), ('210181667', 'BRONX'), ('140918470', 'MANHATTAN'), ('140918942', 'MANHATTAN'), ('340739721', 'BROOKLYN'), ('340739990', 'BROOKLYN'), ('301030220', 'BROOKLYN'), ('301131790', 'BROOKLYN'), ('301377294', 'BROOKLYN'), ('301238319', 'BROOKLYN'), ('240283670', 'BRONX'), ('140944487', 'MANHATTAN'), ('140944496', 'MANHATTAN'), ('240276697', 'BRONX'), ('340740050', 'BROOKLYN'), ('240276688', 'BRONX'), ('340740041', 'BROOKLYN'), ('340740078', 'BROOKLYN'), ('340740087', 'BROOKLYN'), ('310229295', 'BROOKLYN'), ('122773203', 'MANHATTAN'), ('321836411', 'BROOKLYN'), ('301197826', 'BROOKLYN'), ('123742478', 'MANHATTAN'), ('123900350', 'MANHATTAN'), ('321675932', 'BROOKLYN'), ('440592896', 'QUEENS'), ('140898786', 'MANHATTAN'), ('140898795', 'MANHATTAN'), ('240272628', 'BRONX'), ('140898964', 'MANHATTAN'), ('321590435', 'BROOKLYN'), ('320716800', 'BROOKLYN'), ('140918657', 'MANHATTAN'), ('440621481', 'QUEENS'), ('140919022', 'MANHATTAN'), ('140919031', 'MANHATTAN'), ('322036792', 'BROOKLYN'), ('140919086', 'MANHATTAN'), ('420667549', 'QUEENS'), ('321590364', 'BROOKLYN'), ('321590480', 'BROOKLYN'), ('301967913', 'BROOKLYN'), ('240276713', 'BRONX'), ('140919068', 'MANHATTAN'), ('140919077', 'MANHATTAN'), ('220732919', 'BRONX'), ('140919095', 'MANHATTAN'), ('340740112', 'BROOKLYN'), ('440603722', 'QUEENS'), ('540177618', 'STATEN ISLAND'), ('220729282', 'BRONX'), ('240283689', 'BRONX'), ('140919111', 'MANHATTAN'), ('340740121', 'BROOKLYN'), ('420667889', 'QUEENS'), ('321497126', 'BROOKLYN'), ('340740130', 'BROOKLYN'), ('340740149', 'BROOKLYN'), ('140919139', 'MANHATTAN'), ('140919157', 'MANHATTAN'), ('340740158', 'BROOKLYN'), ('321847445', 'BROOKLYN'), ('440603731', 'QUEENS'), ('140919120', 'MANHATTAN'), ('321386460', 'BROOKLYN'), ('140919193', 'MANHATTAN'), ('440603768', 'QUEENS'), ('440603740', 'QUEENS'), ('540177627', 'STATEN ISLAND'), ('140919184', 'MANHATTAN'), ('123920846', 'MANHATTAN'), ('140919219', 'MANHATTAN'), ('240276722', 'BRONX'), ('340740201', 'BROOKLYN'), ('340740210', 'BROOKLYN'), ('140919228', 'MANHATTAN'), ('140919237', 'MANHATTAN'), ('340740194', 'BROOKLYN'), ('340740185', 'BROOKLYN'), ('321386843', 'BROOKLYN'), ('140919273', 'MANHATTAN'), ('140919255', 'MANHATTAN'), ('240276731', 'BRONX'), ('140919264', 'MANHATTAN'), ('220628532', 'BRONX'), ('340740265', 'BROOKLYN'), ('440603795', 'QUEENS'), ('340740229', 'BROOKLYN'), ('340740309', 'BROOKLYN'), ('140919282', 'MANHATTAN'), ('440603802', 'QUEENS'), ('340740345', 'BROOKLYN'), ('440603811', 'QUEENS'), ('440603820', 'QUEENS'), ('240276740', 'BRONX'), ('140919308', 'MANHATTAN'), ('210181505', 'BRONX'), ('440603875', 'QUEENS'), ('440603848', 'QUEENS'), ('440603866', 'QUEENS'), ('340740372', 'BROOKLYN'), ('140919326', 'MANHATTAN'), ('140919344', 'MANHATTAN'), ('540177636', 'STATEN ISLAND'), ('440603893', 'QUEENS'), ('140919335', 'MANHATTAN'), ('240276777', 'BRONX'), ('240276759', 'BRONX'), ('140919353', 'MANHATTAN'), ('140919362', 'MANHATTAN'), ('340740434', 'BROOKLYN'), ('340740416', 'BROOKLYN'), ('140919371', 'MANHATTAN'), ('340740381', 'BROOKLYN'), ('340740407', 'BROOKLYN'), ('140919013', 'MANHATTAN'), ('140919406', 'MANHATTAN'), ('240276704', 'BRONX'), ('140919040', 'MANHATTAN'), ('340740096', 'BROOKLYN'), ('540177609', 'STATEN ISLAND'), ('321592273', 'BROOKLYN'), ('140919415', 'MANHATTAN'), ('440603919', 'QUEENS'), ('140919442', 'MANHATTAN'), ('140919451', 'MANHATTAN'), ('140919424', 'MANHATTAN'), ('240276795', 'BRONX'), ('140919433', 'MANHATTAN'), ('140919479', 'MANHATTAN'), ('140919460', 'MANHATTAN'), ('440603937', 'QUEENS'), ('340740498', 'BROOKLYN'), ('340740443', 'BROOKLYN'), ('240276811', 'BRONX'), ('104213931', 'MANHATTAN'), ('340740522', 'BROOKLYN'), ('340740531', 'BROOKLYN'), ('140919503', 'MANHATTAN'), ('340740513', 'BROOKLYN'), ('140919521', 'MANHATTAN'), ('440603955', 'QUEENS'), ('140919530', 'MANHATTAN'), ('140919497', 'MANHATTAN'), ('140919585', 'MANHATTAN'), ('340740540', 'BROOKLYN'), ('440603964', 'QUEENS'), ('240276820', 'BRONX'), ('340740559', 'BROOKLYN'), ('140919567', 'MANHATTAN'), ('421766949', 'QUEENS'), ('302167250', 'BROOKLYN'), ('302072441', 'BROOKLYN'), ('140919549', 'MANHATTAN'), ('340740568', 'BROOKLYN'), ('140919601', 'MANHATTAN'), ('440603982', 'QUEENS'), ('140919594', 'MANHATTAN'), ('310001789', 'BROOKLYN'), ('401271486', 'QUEENS'), ('401584576', 'QUEENS'), ('401584576', 'QUEENS'), ('401625327', 'QUEENS'), ('402069621', 'QUEENS'), ('402278566', 'QUEENS'), ('421773968', 'QUEENS'), ('402279896', 'QUEENS'), ('402282490', 'QUEENS'), ('402319601', 'QUEENS'), ('402516540', 'QUEENS'), ('402521767', 'QUEENS'), ('402608362', 'QUEENS'), ('402669199', 'QUEENS'), ('410012533', 'QUEENS'), ('410014069', 'QUEENS'), ('410021051', 'QUEENS'), ('410022657', 'QUEENS'), ('410022666', 'QUEENS'), ('410025422', 'QUEENS'), ('410042181', 'QUEENS'), ('500811142', 'STATEN ISLAND'), ('500818341', 'STATEN ISLAND'), ('500818341', 'STATEN ISLAND'), ('500869633', 'STATEN ISLAND'), ('510007626', 'STATEN ISLAND'), ('510013218', 'STATEN ISLAND'), ('310129465', 'BROOKLYN'), ('310134173', 'BROOKLYN'), ('510035061', 'STATEN ISLAND'), ('310153384', 'BROOKLYN'), ('310164782', 'BROOKLYN'), ('410131566', 'QUEENS'), ('410131575', 'QUEENS'), ('310162533', 'BROOKLYN'), ('310239621', 'BROOKLYN'), ('120085433', 'MANHATTAN'), ('520013119', 'STATEN ISLAND'), ('520013841', 'STATEN ISLAND'), ('320057834', 'BROOKLYN'), ('320055140', 'BROOKLYN'), ('310239621', 'BROOKLYN'), ('420074715', 'QUEENS'), ('310239621', 'BROOKLYN'), ('120244725', 'MANHATTAN'), ('120255758', 'MANHATTAN'), ('320159449', 'BROOKLYN'), ('120395474', 'MANHATTAN'), ('520042221', 'STATEN ISLAND'), ('520062011', 'STATEN ISLAND'), ('402885419', 'QUEENS'), ('120694971', 'MANHATTAN'), ('520066963', 'STATEN ISLAND'), ('520072670', 'STATEN ISLAND'), ('320336356', 'BROOKLYN'), ('120803844', 'MANHATTAN'), ('120770754', 'MANHATTAN'), ('120803835', 'MANHATTAN'), ('320389842', 'BROOKLYN'), ('420603010', 'QUEENS'), ('420577548', 'QUEENS'), ('121142931', 'MANHATTAN'), ('520107205', 'STATEN ISLAND'), ('120927667', 'MANHATTAN'), ('120840625', 'MANHATTAN'), ('320377383', 'BROOKLYN'), ('220230729', 'BRONX'), ('320377383', 'BROOKLYN'), ('320377383', 'BROOKLYN'), ('420605964', 'QUEENS'), ('420605964', 'QUEENS'), ('320712822', 'BROOKLYN'), ('121571398', 'MANHATTAN'), ('121643953', 'MANHATTAN'), ('121696174', 'MANHATTAN'), ('520145664', 'STATEN ISLAND'), ('121701122', 'MANHATTAN'), ('240031130', 'BRONX'), ('240031470', 'BRONX'), ('320836388', 'BROOKLYN'), ('320876575', 'BROOKLYN'), ('320879563', 'BROOKLYN'), ('320613573', 'BROOKLYN'), ('320896768', 'BROOKLYN'), ('320876575', 'BROOKLYN'), ('320594120', 'BROOKLYN'), ('340115351', 'BROOKLYN'), ('320594120', 'BROOKLYN'), ('121857099', 'MANHATTAN'), ('320883709', 'BROOKLYN'), ('320594120', 'BROOKLYN'), ('320594120', 'BROOKLYN'), ('320594120', 'BROOKLYN'), ('140168850', 'MANHATTAN'), ('340131217', 'BROOKLYN'), ('340135712', 'BROOKLYN'), ('340135721', 'BROOKLYN'), ('340135730', 'BROOKLYN'), ('420983939', 'QUEENS'), ('320917754', 'BROOKLYN'), ('121967880', 'MANHATTAN'), ('340152088', 'BROOKLYN'), ('140232120', 'MANHATTAN'), ('140235145', 'MANHATTAN'), ('320945466', 'BROOKLYN'), ('320917754', 'BROOKLYN'), ('320917754', 'BROOKLYN'), ('122128786', 'MANHATTAN'), ('320627595', 'BROOKLYN'), ('320627639', 'BROOKLYN'), ('421037933', 'QUEENS'), ('421037933', 'QUEENS'), ('320914150', 'BROOKLYN'), ('122186687', 'MANHATTAN'), ('320596538', 'BROOKLYN'), ('140283495', 'MANHATTAN'), ('340211274', 'BROOKLYN'), ('140292118', 'MANHATTAN'), ('520199384', 'STATEN ISLAND'), ('122229604', 'MANHATTAN'), ('122222488', 'MANHATTAN'), ('340222743', 'BROOKLYN'), ('340222761', 'BROOKLYN'), ('321060668', 'BROOKLYN'), ('340227356', 'BROOKLYN'), ('320627639', 'BROOKLYN'), ('320627639', 'BROOKLYN'), ('122329621', 'MANHATTAN'), ('122350008', 'MANHATTAN'), ('121192967', 'MANHATTAN'), ('321111337', 'BROOKLYN'), ('340249822', 'BROOKLYN'), ('140328777', 'MANHATTAN'), ('321095685', 'BROOKLYN'), ('321115226', 'BROOKLYN'), ('121192967', 'MANHATTAN'), ('121192967', 'MANHATTAN'), ('320627639', 'BROOKLYN'), ('520240114', 'STATEN ISLAND'), ('520243166', 'STATEN ISLAND'), ('122433964', 'MANHATTAN'), ('320625720', 'BROOKLYN'), ('122459525', 'MANHATTAN'), ('340283963', 'BROOKLYN'), ('122484800', 'MANHATTAN'), ('320908684', 'BROOKLYN'), ('321115226', 'BROOKLYN'), ('540081285', 'STATEN ISLAND'), ('421013058', 'QUEENS'), ('140376297', 'MANHATTAN'), ('140387276', 'MANHATTAN'), ('321115226', 'BROOKLYN'), ('321207920', 'BROOKLYN'), ('321206440', 'BROOKLYN'), ('321115226', 'BROOKLYN'), ('321115226', 'BROOKLYN'), ('340294489', 'BROOKLYN'), ('421197804', 'QUEENS'), ('340300007', 'BROOKLYN'), ('140400965', 'MANHATTAN'), ('122363628', 'MANHATTAN'), ('321241802', 'BROOKLYN'), ('421188850', 'QUEENS'), ('340315331', 'BROOKLYN'), ('321257885', 'BROOKLYN'), ('321269337', 'BROOKLYN'), ('340325525', 'BROOKLYN'), ('421218827', 'QUEENS'), ('321190787', 'BROOKLYN'), ('340329978', 'BROOKLYN'), ('520259185', 'STATEN ISLAND'), ('321282606', 'BROOKLYN'), ('321274553', 'BROOKLYN'), ('421218818', 'QUEENS'), ('421197804', 'QUEENS'), ('421197804', 'QUEENS'), ('321241802', 'BROOKLYN'), ('122656973', 'MANHATTAN'), ('421267578', 'QUEENS'), ('122691701', 'MANHATTAN'), ('340355458', 'BROOKLYN'), ('340358776', 'BROOKLYN'), ('321320860', 'BROOKLYN'), ('321372260', 'BROOKLYN'), ('421300620', 'QUEENS'), ('440311066', 'QUEENS'), ('321317455', 'BROOKLYN'), ('321388146', 'BROOKLYN'), ('121190754', 'MANHATTAN'), ('140497086', 'MANHATTAN'), ('321372260', 'BROOKLYN'), ('520227184', 'STATEN ISLAND'), ('340389010', 'BROOKLYN'), ('122803984', 'MANHATTAN'), ('121190754', 'MANHATTAN'), ('440331295', 'QUEENS'), ('340386086', 'BROOKLYN'), ('220547745', 'BRONX'), ('340419256', 'BROOKLYN'), ('321180360', 'BROOKLYN'), ('421375087', 'QUEENS'), ('321449232', 'BROOKLYN'), ('321195309', 'BROOKLYN'), ('421375559', 'QUEENS'), ('121191110', 'MANHATTAN'), ('121191110', 'MANHATTAN'), ('121191110', 'MANHATTAN'), ('121191110', 'MANHATTAN'), ('122489388', 'MANHATTAN'), ('520272295', 'STATEN ISLAND'), ('520272302', 'STATEN ISLAND'), ('520272286', 'STATEN ISLAND'), ('121191110', 'MANHATTAN'), ('421384843', 'QUEENS'), ('122925068', 'MANHATTAN'), ('122925068', 'MANHATTAN'), ('122925068', 'MANHATTAN'), ('321184151', 'BROOKLYN'), ('140599671', 'MANHATTAN'), ('440386976', 'QUEENS'), ('321455536', 'BROOKLYN'), ('321256369', 'BROOKLYN'), ('140591848', 'MANHATTAN'), ('123052935', 'MANHATTAN'), ('123047354', 'MANHATTAN'), ('321527102', 'BROOKLYN'), ('121187802', 'MANHATTAN'), ('421467727', 'QUEENS'), ('140634393', 'MANHATTAN'), ('123053667', 'MANHATTAN'), ('321193034', 'BROOKLYN'), ('321193043', 'BROOKLYN'), ('123093142', 'MANHATTAN'), ('321569058', 'BROOKLYN'), ('123078828', 'MANHATTAN'), ('340512939', 'BROOKLYN'), ('321611341', 'BROOKLYN'), ('220562193', 'BRONX'), ('321605330', 'BROOKLYN'), ('421514105', 'QUEENS'), ('240183868', 'BRONX'), ('421522579', 'QUEENS'), ('421522579', 'QUEENS'), ('421522579', 'QUEENS'), ('140662824', 'MANHATTAN'), ('220597824', 'BRONX'), ('123024379', 'MANHATTAN'), ('220589227', 'BRONX'), ('121203991', 'MANHATTAN'), ('121203991', 'MANHATTAN'), ('121203991', 'MANHATTAN'), ('420661965', 'QUEENS'), ('121203991', 'MANHATTAN'), ('121203991', 'MANHATTAN'), ('340535022', 'BROOKLYN'), ('121204080', 'MANHATTAN'), ('123140779', 'MANHATTAN'), ('302575559', 'BROOKLYN'), ('123353664', 'MANHATTAN'), ('302575256', 'BROOKLYN'), ('421537901', 'QUEENS'), ('220589708', 'BRONX'), ('220589717', 'BRONX'), ('321543120', 'BROOKLYN'), ('123161274', 'MANHATTAN'), ('321670713', 'BROOKLYN'), ('420662795', 'QUEENS'), ('420662795', 'QUEENS'), ('321555269', 'BROOKLYN'), ('420662795', 'QUEENS'), ('121204428', 'MANHATTAN'), ('201201859', 'BRONX'), ('421586126', 'QUEENS'), ('123228578', 'MANHATTAN'), ('123228578', 'MANHATTAN'), ('240211132', 'BRONX'), ('321726281', 'BROOKLYN'), ('320910190', 'BROOKLYN'), ('321783272', 'BROOKLYN'), ('421586251', 'QUEENS'), ('421593804', 'QUEENS'), ('321726281', 'BROOKLYN'), ('321723293', 'BROOKLYN'), ('321783272', 'BROOKLYN'), ('302576718', 'BROOKLYN'), ('123206039', 'MANHATTAN'), ('123206039', 'MANHATTAN'), ('123206039', 'MANHATTAN'), ('123207831', 'MANHATTAN'), ('140738101', 'MANHATTAN'), ('520325675', 'STATEN ISLAND'), ('520325103', 'STATEN ISLAND'), ('123147246', 'MANHATTAN'), ('123147246', 'MANHATTAN'), ('321731079', 'BROOKLYN'), ('321740782', 'BROOKLYN'), ('520323962', 'STATEN ISLAND'), ('321739847', 'BROOKLYN'), ('321722356', 'BROOKLYN'), ('321733442', 'BROOKLYN'), ('321749881', 'BROOKLYN'), ('123603010', 'MANHATTAN'), ('321765274', 'BROOKLYN'), ('123421314', 'MANHATTAN'), ('240224235', 'BRONX'), ('421626093', 'QUEENS'), ('421628180', 'QUEENS'), ('421625101', 'QUEENS'), ('520338983', 'STATEN ISLAND'), ('321762847', 'BROOKLYN'), ('123238594', 'MANHATTAN'), ('240226180', 'BRONX'), ('421649602', 'QUEENS'), ('421649586', 'QUEENS'), ('321789542', 'BROOKLYN'), ('421647775', 'QUEENS'), ('340616621', 'BROOKLYN'), ('420664070', 'QUEENS'), ('321803893', 'BROOKLYN'), ('123381768', 'MANHATTAN'), ('321731079', 'BROOKLYN'), ('421389385', 'QUEENS'), ('440500174', 'QUEENS'), ('421664951', 'QUEENS'), ('123531197', 'MANHATTAN'), ('440501841', 'QUEENS'), ('321731079', 'BROOKLYN'), ('123850163', 'MANHATTAN'), ('123366712', 'MANHATTAN'), ('140800097', 'MANHATTAN'), ('321199840', 'BROOKLYN'), ('123585478', 'MANHATTAN'), ('123403888', 'MANHATTAN'), ('123381866', 'MANHATTAN'), ('123381866', 'MANHATTAN'), ('520353581', 'STATEN ISLAND'), ('123450540', 'MANHATTAN'), ('321835635', 'BROOKLYN'), ('123320888', 'MANHATTAN'), ('123320888', 'MANHATTAN'), ('123483505', 'MANHATTAN'), ('123489910', 'MANHATTAN'), ('140814162', 'MANHATTAN'), ('421100203', 'QUEENS'), ('123372625', 'MANHATTAN'), ('321077295', 'BROOKLYN'), ('123547750', 'MANHATTAN'), ('123536548', 'MANHATTAN'), ('123370360', 'MANHATTAN'), ('123538270', 'MANHATTAN'), ('421712374', 'QUEENS'), ('123557846', 'MANHATTAN'), ('123580730', 'MANHATTAN'), ('123595617', 'MANHATTAN'), ('123558051', 'MANHATTAN'), ('440521080', 'QUEENS'), ('123495477', 'MANHATTAN'), ('123495477', 'MANHATTAN'), ('123592629', 'MANHATTAN'), ('140824491', 'MANHATTAN'), ('140824507', 'MANHATTAN'), ('121189230', 'MANHATTAN'), ('321385078', 'BROOKLYN'), ('321730374', 'BROOKLYN'), ('240245409', 'BRONX'), ('421700449', 'QUEENS'), ('421700449', 'QUEENS'), ('421715996', 'QUEENS'), ('123663008', 'MANHATTAN'), ('123671534', 'MANHATTAN'), ('302585593', 'BROOKLYN'), ('220656243', 'BRONX'), ('321795802', 'BROOKLYN'), ('123826208', 'MANHATTAN'), ('123664098', 'MANHATTAN'), ('123850859', 'MANHATTAN'), ('102646442', 'MANHATTAN'), ('123853437', 'MANHATTAN'), ('123827591', 'MANHATTAN'), ('123656800', 'MANHATTAN'), ('421894686', 'QUEENS'), ('321911650', 'BROOKLYN'), ('140836825', 'MANHATTAN'), ('140839323', 'MANHATTAN'), ('123731532', 'MANHATTAN'), ('421952729', 'QUEENS'), ('321915987', 'BROOKLYN'), ('421890500', 'QUEENS'), ('140839412', 'MANHATTAN'), ('321938739', 'BROOKLYN'), ('321938739', 'BROOKLYN'), ('220695353', 'BRONX'), ('123853473', 'MANHATTAN'), ('123554297', 'MANHATTAN'), ('123554313', 'MANHATTAN'), ('340670722', 'BROOKLYN'), ('321944508', 'BROOKLYN'), ('123804320', 'MANHATTAN'), ('340674693', 'BROOKLYN'), ('440545475', 'QUEENS'), ('123759780', 'MANHATTAN'), ('123763837', 'MANHATTAN'), ('123763837', 'MANHATTAN'), ('123738358', 'MANHATTAN'), ('220700070', 'BRONX'), ('421741440', 'QUEENS'), ('210179581', 'BRONX'), ('340678092', 'BROOKLYN'), ('421934492', 'QUEENS'), ('123584335', 'MANHATTAN'), ('340679992', 'BROOKLYN'), ('340677921', 'BROOKLYN'), ('321951170', 'BROOKLYN'), ('123894544', 'MANHATTAN'), ('321992974', 'BROOKLYN'), ('123894544', 'MANHATTAN'), ('321952507', 'BROOKLYN'), ('201199844', 'BRONX'), ('123889836', 'MANHATTAN'), ('123804482', 'MANHATTAN'), ('321959127', 'BROOKLYN'), ('440550262', 'QUEENS'), ('220705217', 'BRONX'), ('321966967', 'BROOKLYN'), ('421102210', 'QUEENS'), ('140854608', 'MANHATTAN'), ('123684496', 'MANHATTAN'), ('123684496', 'MANHATTAN'), ('123804455', 'MANHATTAN'), ('340684511', 'BROOKLYN'), ('123478539', 'MANHATTAN'), ('421729712', 'QUEENS'), ('321952507', 'BROOKLYN'), ('421739211', 'QUEENS'), ('421950302', 'QUEENS'), ('121205588', 'MANHATTAN'), ('121205588', 'MANHATTAN'), ('321975939', 'BROOKLYN'), ('421735484', 'QUEENS'), ('421735475', 'QUEENS'), ('140859079', 'MANHATTAN'), ('421735616', 'QUEENS'), ('123780355', 'MANHATTAN'), ('123776903', 'MANHATTAN'), ('421102531', 'QUEENS'), ('421102568', 'QUEENS'), ('421102559', 'QUEENS'), ('123883486', 'MANHATTAN'), ('421746267', 'QUEENS'), ('123693066', 'MANHATTAN'), ('123773247', 'MANHATTAN'), ('123690568', 'MANHATTAN'), ('123819074', 'MANHATTAN'), ('240259108', 'BRONX'), ('123773247', 'MANHATTAN'), ('440563926', 'QUEENS'), ('321926243', 'BROOKLYN'), ('440564220', 'QUEENS'), ('321985722', 'BROOKLYN'), ('240261818', 'BRONX'), ('321597198', 'BROOKLYN'), ('421922691', 'QUEENS'), ('321985713', 'BROOKLYN'), ('321985704', 'BROOKLYN'), ('421547357', 'QUEENS'), ('321595010', 'BROOKLYN'), ('421911952', 'QUEENS'), ('321597884', 'BROOKLYN'), ('322011933', 'BROOKLYN'), ('322011924', 'BROOKLYN'), ('421916225', 'QUEENS'), ('321597964', 'BROOKLYN'), ('121206337', 'MANHATTAN'), ('123885705', 'MANHATTAN'), ('123785760', 'MANHATTAN'), ('321595010', 'BROOKLYN'), ('540170152', 'STATEN ISLAND'), ('123771409', 'MANHATTAN'), ('421743885', 'QUEENS'), ('321597884', 'BROOKLYN'), ('340703563', 'BROOKLYN'), ('421909698', 'QUEENS'), ('321595243', 'BROOKLYN'), ('340707970', 'BROOKLYN'), ('322003416', 'BROOKLYN'), ('210179581', 'BRONX'), ('322013254', 'BROOKLYN'), ('322005593', 'BROOKLYN'), ('421906762', 'QUEENS'), ('321773602', 'BROOKLYN'), ('421908387', 'QUEENS'), ('123787081', 'MANHATTAN'), ('123844126', 'MANHATTAN'), ('520386216', 'STATEN ISLAND'), ('321596171', 'BROOKLYN'), ('440577715', 'QUEENS'), ('123848195', 'MANHATTAN'), ('123846589', 'MANHATTAN'), ('322017385', 'BROOKLYN'), ('322004781', 'BROOKLYN'), ('123844126', 'MANHATTAN'), ('322018142', 'BROOKLYN'), ('421898931', 'QUEENS'), ('140882551', 'MANHATTAN'), ('540172472', 'STATEN ISLAND'), ('123726272', 'MANHATTAN'), ('421860533', 'QUEENS'), ('322021272', 'BROOKLYN'), ('421782556', 'QUEENS'), ('321596607', 'BROOKLYN'), ('340712795', 'BROOKLYN'), ('440581381', 'QUEENS'), ('123727921', 'MANHATTAN'), ('421802721', 'QUEENS'), ('220723331', 'BRONX'), ('123796525', 'MANHATTAN'), ('421802133', 'QUEENS'), ('140884158', 'MANHATTAN'), ('421802320', 'QUEENS'), ('540173364', 'STATEN ISLAND'), ('322030789', 'BROOKLYN'), ('140944502', 'MANHATTAN'), ('421801410', 'QUEENS'), ('421802552', 'QUEENS'), ('340759496', 'BROOKLYN'), ('123797445', 'MANHATTAN'), ('123789034', 'MANHATTAN'), ('440584501', 'QUEENS'), ('340716979', 'BROOKLYN'), ('123843403', 'MANHATTAN'), ('321596607', 'BROOKLYN'), ('123840095', 'MANHATTAN'), ('123840095', 'MANHATTAN'), ('421414320', 'QUEENS'), ('123697767', 'MANHATTAN'), ('123697767', 'MANHATTAN'), ('123697767', 'MANHATTAN'), ('420667031', 'QUEENS'), ('421756870', 'QUEENS'), ('140888724', 'MANHATTAN'), ('123745153', 'MANHATTAN'), ('421753141', 'QUEENS'), ('421753123', 'QUEENS'), ('322072500', 'BROOKLYN'), ('140889741', 'MANHATTAN'), ('321926449', 'BROOKLYN'), ('123829125', 'MANHATTAN'), ('421946041', 'QUEENS'), ('421757398', 'QUEENS'), ('520399658', 'STATEN ISLAND'), ('421945382', 'QUEENS'), ('123858423', 'MANHATTAN'), ('340722089', 'BROOKLYN'), ('123829063', 'MANHATTAN'), ('440589793', 'QUEENS'), ('421912005', 'QUEENS'), ('220728728', 'BRONX'), ('322044621', 'BROOKLYN'), ('240271987', 'BRONX'), ('421936720', 'QUEENS'), ('340723195', 'BROOKLYN'), ('440590594', 'QUEENS'), ('340723621', 'BROOKLYN'), ('421944178', 'QUEENS'), ('123876010', 'MANHATTAN'), ('123874806', 'MANHATTAN'), ('240271923', 'BRONX'), ('123724498', 'MANHATTAN'), ('220726775', 'BRONX'), ('340725317', 'BROOKLYN'), ('440590291', 'QUEENS'), ('140896797', 'MANHATTAN'), ('140896234', 'MANHATTAN'), ('140897046', 'MANHATTAN'), ('322088021', 'BROOKLYN'), ('123855998', 'MANHATTAN'), ('140897420', 'MANHATTAN'), ('121207746', 'MANHATTAN'), ('322088263', 'BROOKLYN'), ('140897812', 'MANHATTAN'), ('123856960', 'MANHATTAN'), ('220731901', 'BRONX'), ('240272272', 'BRONX'), ('421926492', 'QUEENS'), ('140897563', 'MANHATTAN'), ('140898731', 'MANHATTAN'), ('340726851', 'BROOKLYN'), ('140899106', 'MANHATTAN'), ('140899115', 'MANHATTAN'), ('340726913', 'BROOKLYN'), ('140899213', 'MANHATTAN'), ('140899188', 'MANHATTAN'), ('140898848', 'MANHATTAN'), ('240283698', 'BRONX'), ('340726904', 'BROOKLYN'), ('240272726', 'BRONX'), ('123830569', 'MANHATTAN'), ('322070192', 'BROOKLYN'), ('421947530', 'QUEENS'), ('210181453', 'BRONX'), ('140899507', 'MANHATTAN'), ('123911927', 'MANHATTAN'), ('140899776', 'MANHATTAN'), ('140900452', 'MANHATTAN'), ('440593751', 'QUEENS'), ('220732624', 'BRONX'), ('321590603', 'BROOKLYN'), ('140902012', 'MANHATTAN'), ('421764870', 'QUEENS'), ('321590729', 'BROOKLYN'), ('220731830', 'BRONX'), ('140901353', 'MANHATTAN'), ('340727752', 'BROOKLYN'), ('210181300', 'BRONX'), ('520452965', 'STATEN ISLAND'), ('340728804', 'BROOKLYN'), ('421755461', 'QUEENS'), ('340728608', 'BROOKLYN'), ('123912962', 'MANHATTAN'), ('322043971', 'BROOKLYN'), ('140904207', 'MANHATTAN'), ('322037256', 'BROOKLYN'), ('340728644', 'BROOKLYN'), ('140908702', 'MANHATTAN'), ('140944511', 'MANHATTAN'), ('421765780', 'QUEENS'), ('440595116', 'QUEENS'), ('421765771', 'QUEENS'), ('322086719', 'BROOKLYN'), ('421798987', 'QUEENS'), ('440621490', 'QUEENS'), ('210180579', 'BRONX'), ('210181523', 'BRONX'), ('322037871', 'BROOKLYN'), ('123919830', 'MANHATTAN'), ('321773602', 'BROOKLYN'), ('322037933', 'BROOKLYN'), ('140904715', 'MANHATTAN'), ('322037498', 'BROOKLYN'), ('440595704', 'QUEENS'), ('140906991', 'MANHATTAN'), ('440596446', 'QUEENS'), ('421943909', 'QUEENS'), ('421216972', 'QUEENS'), ('321590729', 'BROOKLYN'), ('340731266', 'BROOKLYN'), ('340731097', 'BROOKLYN'), ('140907106', 'MANHATTAN'), ('140907437', 'MANHATTAN'), ('440596865', 'QUEENS'), ('140907614', 'MANHATTAN'), ('321591880', 'BROOKLYN'), ('240274109', 'BRONX'), ('220732973', 'BRONX'), ('322037602', 'BROOKLYN'), ('340731756', 'BROOKLYN'), ('140910227', 'MANHATTAN'), ('340733772', 'BROOKLYN'), ('140910904', 'MANHATTAN'), ('140911173', 'MANHATTAN'), ('440598916', 'QUEENS'), ('340733816', 'BROOKLYN'), ('340733139', 'BROOKLYN'), ('340736528', 'BROOKLYN'), ('340736788', 'BROOKLYN'), ('140911734', 'MANHATTAN'), ('140911743', 'MANHATTAN'), ('240275199', 'BRONX'), ('140912243', 'MANHATTAN'), ('340736591', 'BROOKLYN'), ('421940216', 'QUEENS'), ('440601396', 'QUEENS'), ('140915543', 'MANHATTAN'), ('440600930', 'QUEENS'), ('140914232', 'MANHATTAN'), ('240275885', 'BRONX'), ('140915874', 'MANHATTAN'), ('140915696', 'MANHATTAN'), ('140914777', 'MANHATTAN'), ('440601644', 'QUEENS'), ('140916016', 'MANHATTAN'), ('340737992', 'BROOKLYN'), ('540177388', 'STATEN ISLAND'), ('540177306', 'STATEN ISLAND'), ('540177119', 'STATEN ISLAND'), ('322036907', 'BROOKLYN'), ('140917391', 'MANHATTAN'), ('440602135', 'QUEENS'), ('440603116', 'QUEENS'), ('440603125', 'QUEENS'), ('440603143', 'QUEENS'), ('440603152', 'QUEENS'), ('440603170', 'QUEENS'), ('340739277', 'BROOKLYN'), ('140917907', 'MANHATTAN'), ('140917943', 'MANHATTAN'), ('440602965', 'QUEENS'), ('340739482', 'BROOKLYN'), ('340739295', 'BROOKLYN'), ('140918407', 'MANHATTAN'), ('440603330', 'QUEENS'), ('340739543', 'BROOKLYN'), ('440603278', 'QUEENS'), ('540177501', 'STATEN ISLAND'), ('440603358', 'QUEENS'), ('340739552', 'BROOKLYN'), ('140918540', 'MANHATTAN'), ('140918559', 'MANHATTAN'), ('140918568', 'MANHATTAN'), ('240276544', 'BRONX'), ('340739810', 'BROOKLYN'), ('440603492', 'QUEENS'), ('540177547', 'STATEN ISLAND'), ('140918620', 'MANHATTAN'), ('440603615', 'QUEENS'), ('140918862', 'MANHATTAN'), ('440603633', 'QUEENS'), ('340739847', 'BROOKLYN'), ('240276606', 'BRONX'), ('440603624', 'QUEENS'), ('140918808', 'MANHATTAN'), ('240276633', 'BRONX'), ('421766958', 'QUEENS'), ('340739918', 'BROOKLYN'), ('140918915', 'MANHATTAN'), ('140918899', 'MANHATTAN'), ('240276624', 'BRONX'), ('240276642', 'BRONX'), ('340740595', 'BROOKLYN'), ('140919647', 'MANHATTAN'), ('102832909', 'MANHATTAN'), ('440604017', 'QUEENS'), ('440603991', 'QUEENS'), ('140919610', 'MANHATTAN'), ('440604008', 'QUEENS'), ('340740602', 'BROOKLYN'), ('102877344', 'MANHATTAN'), ('103238747', 'MANHATTAN'), ('103238747', 'MANHATTAN'), ('103777539', 'MANHATTAN'), ('104552182', 'MANHATTAN'), ('104115011', 'MANHATTAN'), ('110081900', 'MANHATTAN'), ('200911790', 'BRONX'), ('301178124', 'BROOKLYN'), ('301400678', 'BROOKLYN'), ('301417982', 'BROOKLYN'), ('301604315', 'BROOKLYN'), ('301604315', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('301911956', 'BROOKLYN'), ('301919501', 'BROOKLYN'), ('301925852', 'BROOKLYN'), ('301852234', 'BROOKLYN'), ('301779396', 'BROOKLYN'), ('302010464', 'BROOKLYN'), ('440604044', 'QUEENS'), ('540177645', 'STATEN ISLAND'), ('520454678', 'STATEN ISLAND'), ('440604062', 'QUEENS'), ('440604080', 'QUEENS'), ('440604053', 'QUEENS'), ('240276848', 'BRONX'), ('340740728', 'BROOKLYN'), ('340740693', 'BROOKLYN'), ('440604142', 'QUEENS'), ('140919790', 'MANHATTAN'), ('440604151', 'QUEENS'), ('322087031', 'BROOKLYN'), ('440604222', 'QUEENS'), ('140919861', 'MANHATTAN'), ('440604204', 'QUEENS'), ('440604197', 'QUEENS'), ('322087040', 'BROOKLYN'), ('440604295', 'QUEENS'), ('440604348', 'QUEENS'), ('140919923', 'MANHATTAN'), ('440604311', 'QUEENS'), ('440604320', 'QUEENS'), ('420667905', 'QUEENS'), ('540177725', 'STATEN ISLAND'), ('440604375', 'QUEENS'), ('240276973', 'BRONX'), ('540177743', 'STATEN ISLAND'), ('340740915', 'BROOKLYN'), ('140919996', 'MANHATTAN'), ('140919978', 'MANHATTAN'), ('140920038', 'MANHATTAN'), ('240276991', 'BRONX'), ('440604384', 'QUEENS'), ('340740951', 'BROOKLYN'), ('240277017', 'BRONX'), ('440604455', 'QUEENS'), ('440604464', 'QUEENS'), ('240277008', 'BRONX'), ('540177789', 'STATEN ISLAND'), ('440604446', 'QUEENS'), ('340740979', 'BROOKLYN'), ('140920047', 'MANHATTAN'), ('240277026', 'BRONX'), ('140920056', 'MANHATTAN'), ('240277044', 'BRONX'), ('340740988', 'BROOKLYN'), ('440604482', 'QUEENS'), ('140920065', 'MANHATTAN'), ('440604473', 'QUEENS'), ('421801287', 'QUEENS'), ('421773352', 'QUEENS'), ('340741013', 'BROOKLYN'), ('421774048', 'QUEENS'), ('140920092', 'MANHATTAN'), ('340740997', 'BROOKLYN'), ('140920109', 'MANHATTAN'), ('340741004', 'BROOKLYN'), ('340741022', 'BROOKLYN'), ('440604507', 'QUEENS'), ('340741059', 'BROOKLYN'), ('140920154', 'MANHATTAN'), ('140920145', 'MANHATTAN'), ('540177805', 'STATEN ISLAND'), ('140920136', 'MANHATTAN'), ('140920127', 'MANHATTAN'), ('340741068', 'BROOKLYN'), ('440604534', 'QUEENS'), ('340741086', 'BROOKLYN'), ('440604525', 'QUEENS'), ('340741077', 'BROOKLYN'), ('240277071', 'BRONX'), ('240277099', 'BRONX'), ('440604552', 'QUEENS'), ('540177814', 'STATEN ISLAND'), ('440604561', 'QUEENS'), ('104213940', 'MANHATTAN'), ('140920181', 'MANHATTAN'), ('340741102', 'BROOKLYN'), ('520346019', 'STATEN ISLAND'), ('440604570', 'QUEENS'), ('140920163', 'MANHATTAN'), ('140920172', 'MANHATTAN'), ('340741095', 'BROOKLYN'), ('440604598', 'QUEENS'), ('340741166', 'BROOKLYN'), ('140920190', 'MANHATTAN'), ('440604589', 'QUEENS'), ('340741175', 'BROOKLYN'), ('540177823', 'STATEN ISLAND'), ('340741148', 'BROOKLYN'), ('140920207', 'MANHATTAN'), ('340741139', 'BROOKLYN'), ('440604605', 'QUEENS'), ('340741219', 'BROOKLYN'), ('340741193', 'BROOKLYN'), ('240277106', 'BRONX'), ('321588055', 'BROOKLYN'), ('440604703', 'QUEENS'), ('240277115', 'BRONX'), ('321592246', 'BROOKLYN'), ('440604650', 'QUEENS'), ('440604678', 'QUEENS'), ('440604669', 'QUEENS'), ('140920216', 'MANHATTAN'), ('440604641', 'QUEENS'), ('440604696', 'QUEENS'), ('540177832', 'STATEN ISLAND'), ('340741228', 'BROOKLYN'), ('123852955', 'MANHATTAN'), ('123920837', 'MANHATTAN'), ('340741246', 'BROOKLYN'), ('340741237', 'BROOKLYN'), ('123725727', 'MANHATTAN'), ('440604712', 'QUEENS'), ('440604721', 'QUEENS'), ('340741282', 'BROOKLYN'), ('240277133', 'BRONX'), ('440604749', 'QUEENS'), ('340741255', 'BROOKLYN'), ('140920261', 'MANHATTAN'), ('440604785', 'QUEENS'), ('440604829', 'QUEENS'), ('140920289', 'MANHATTAN'), ('440604801', 'QUEENS'), ('440604767', 'QUEENS'), ('140920270', 'MANHATTAN'), ('240277142', 'BRONX'), ('240277151', 'BRONX'), ('440604838', 'QUEENS'), ('440604856', 'QUEENS'), ('440604847', 'QUEENS'), ('140920298', 'MANHATTAN'), ('140920305', 'MANHATTAN'), ('440604927', 'QUEENS'), ('440604918', 'QUEENS'), ('140920323', 'MANHATTAN'), ('240277179', 'BRONX'), ('440604874', 'QUEENS'), ('322053317', 'BROOKLYN'), ('322053317', 'BROOKLYN'), ('440604936', 'QUEENS'), ('340741362', 'BROOKLYN'), ('140920350', 'MANHATTAN'), ('340741353', 'BROOKLYN'), ('140920378', 'MANHATTAN'), ('340741380', 'BROOKLYN'), ('340741406', 'BROOKLYN'), ('140920396', 'MANHATTAN'), ('340741399', 'BROOKLYN'), ('440604963', 'QUEENS'), ('440604945', 'QUEENS'), ('140920387', 'MANHATTAN'), ('440604972', 'QUEENS'), ('140920421', 'MANHATTAN'), ('140920430', 'MANHATTAN'), ('340741424', 'BROOKLYN'), ('240277188', 'BRONX'), ('421764200', 'QUEENS'), ('340741433', 'BROOKLYN'), ('440604981', 'QUEENS'), ('340741442', 'BROOKLYN'), ('140920458', 'MANHATTAN'), ('440605016', 'QUEENS'), ('140920467', 'MANHATTAN'), ('440604990', 'QUEENS'), ('240277197', 'BRONX'), ('421764255', 'QUEENS'), ('440605007', 'QUEENS'), ('302205940', 'BROOKLYN'), ('401622473', 'QUEENS'), ('402275266', 'QUEENS'), ('340741460', 'BROOKLYN'), ('140920494', 'MANHATTAN'), ('140920476', 'MANHATTAN'), ('440605025', 'QUEENS'), ('340741479', 'BROOKLYN'), ('402642574', 'QUEENS'), ('210049348', 'BRONX'), ('420115789', 'QUEENS'), ('120310742', 'MANHATTAN'), ('420212978', 'QUEENS'), ('500812052', 'STATEN ISLAND'), ('420070997', 'QUEENS'), ('420066154', 'QUEENS'), ('500780737', 'STATEN ISLAND'), ('220075219', 'BRONX'), ('120526225', 'MANHATTAN'), ('420212978', 'QUEENS'), ('320326027', 'BROOKLYN'), ('420552654', 'QUEENS'), ('420618406', 'QUEENS'), ('420365982', 'QUEENS'), ('121396809', 'MANHATTAN'), ('120599085', 'MANHATTAN'), ('420783281', 'QUEENS'), ('420783227', 'QUEENS'), ('201029314', 'BRONX'), ('121577515', 'MANHATTAN'), ('420839169', 'QUEENS'), ('421520134', 'QUEENS'), ('440103291', 'QUEENS'), ('420896775', 'QUEENS'), ('121798091', 'MANHATTAN'), ('520168648', 'STATEN ISLAND'), ('220240709', 'BRONX'), ('320591178', 'BROOKLYN'), ('201191192', 'BRONX'), ('121868782', 'MANHATTAN'), ('402894640', 'QUEENS'), ('140235813', 'MANHATTAN'), ('420940931', 'QUEENS'), ('220404122', 'BRONX'), ('121861137', 'MANHATTAN'), ('421031010', 'QUEENS'), ('421031010', 'QUEENS'), ('420983350', 'QUEENS'), ('421042650', 'QUEENS'), ('320621993', 'BROOKLYN'), ('220405121', 'BRONX'), ('320621993', 'BROOKLYN'), ('320621993', 'BROOKLYN'), ('121191986', 'MANHATTAN'), ('140300332', 'MANHATTAN'), ('320621993', 'BROOKLYN'), ('402896960', 'QUEENS'), ('103647706', 'MANHATTAN'), ('321042590', 'BROOKLYN'), ('402897139', 'QUEENS'), ('320621993', 'BROOKLYN'), ('220451400', 'BRONX'), ('440216240', 'QUEENS'), ('440216259', 'QUEENS'), ('122385828', 'MANHATTAN'), ('440216277', 'QUEENS'), ('320621993', 'BROOKLYN'), ('402898174', 'QUEENS'), ('240104917', 'BRONX'), ('140369722', 'MANHATTAN'), ('421186638', 'QUEENS'), ('420654508', 'QUEENS'), ('340272350', 'BROOKLYN'), ('122475963', 'MANHATTAN'), ('121189775', 'MANHATTAN'), ('321210202', 'BROOKLYN'), ('220151948', 'BRONX'), ('340301827', 'BROOKLYN'), ('122537184', 'MANHATTAN'), ('321276542', 'BROOKLYN'), ('321249966', 'BROOKLYN'), ('240124735', 'BRONX'), ('321179274', 'BROOKLYN'), ('321295200', 'BROOKLYN'), ('240129589', 'BRONX'), ('421254216', 'QUEENS'), ('420947015', 'QUEENS'), ('420656052', 'QUEENS'), ('421098065', 'QUEENS'), ('420656873', 'QUEENS'), ('321361352', 'BROOKLYN'), ('121190549', 'MANHATTAN'), ('220536686', 'BRONX'), ('321380910', 'BROOKLYN'), ('421098500', 'QUEENS'), ('240147836', 'BRONX'), ('421355651', 'QUEENS'), ('440331482', 'QUEENS'), ('440331516', 'QUEENS'), ('440331570', 'QUEENS'), ('140530977', 'MANHATTAN'), ('140531538', 'MANHATTAN'), ('421354607', 'QUEENS'), ('421370910', 'QUEENS'), ('340420887', 'BROOKLYN'), ('121190549', 'MANHATTAN'), ('121190549', 'MANHATTAN'), ('220152420', 'BRONX'), ('121190549', 'MANHATTAN'), ('121190549', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('140582233', 'MANHATTAN'), ('201197203', 'BRONX'), ('321511565', 'BROOKLYN'), ('321511565', 'BROOKLYN'), ('421427566', 'QUEENS'), ('520290961', 'STATEN ISLAND'), ('520291041', 'STATEN ISLAND'), ('421390694', 'QUEENS'), ('421392558', 'QUEENS'), ('421436529', 'QUEENS'), ('220585953', 'BRONX'), ('201200075', 'BRONX'), ('123054728', 'MANHATTAN'), ('421473079', 'QUEENS'), ('421480917', 'QUEENS'), ('302574042', 'BROOKLYN'), ('321522394', 'BROOKLYN'), ('321433579', 'BROOKLYN'), ('421462045', 'QUEENS'), ('121276591', 'MANHATTAN'), ('121226734', 'MANHATTAN'), ('302573668', 'BROOKLYN'), ('321583041', 'BROOKLYN'), ('421460788', 'QUEENS'), ('321193766', 'BROOKLYN'), ('140645201', 'MANHATTAN'), ('123095471', 'MANHATTAN'), ('123095471', 'MANHATTAN'), ('123095471', 'MANHATTAN'), ('421044872', 'QUEENS'), ('121203893', 'MANHATTAN'), ('140665493', 'MANHATTAN'), ('123325197', 'MANHATTAN'), ('121203919', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('121191138', 'MANHATTAN'), ('421488385', 'QUEENS'), ('321523810', 'BROOKLYN'), ('123304263', 'MANHATTAN'), ('540132462', 'STATEN ISLAND'), ('421532899', 'QUEENS'), ('340529672', 'BROOKLYN'), ('123353922', 'MANHATTAN'), ('440425791', 'QUEENS'), ('421485645', 'QUEENS'), ('321493282', 'BROOKLYN'), ('240198022', 'BRONX'), ('321651039', 'BROOKLYN'), ('421554008', 'QUEENS'), ('321657514', 'BROOKLYN'), ('123142955', 'MANHATTAN'), ('123142937', 'MANHATTAN'), ('123141135', 'MANHATTAN'), ('123142321', 'MANHATTAN'), ('302575693', 'BROOKLYN'), ('220475661', 'BRONX'), ('321651039', 'BROOKLYN'), ('321657514', 'BROOKLYN'), ('421569083', 'QUEENS'), ('220623314', 'BRONX'), ('421517102', 'QUEENS'), ('340551842', 'BROOKLYN'), ('123256403', 'MANHATTAN'), ('421578251', 'QUEENS'), ('140720469', 'MANHATTAN'), ('121203893', 'MANHATTAN'), ('500870863', 'STATEN ISLAND'), ('140725696', 'MANHATTAN'), ('421584592', 'QUEENS'), ('321651039', 'BROOKLYN'), ('123199653', 'MANHATTAN'), ('421515499', 'QUEENS'), ('220631476', 'BRONX'), ('220630770', 'BRONX'), ('140732358', 'MANHATTAN'), ('302576665', 'BROOKLYN'), ('123153041', 'MANHATTAN'), ('421044872', 'QUEENS'), ('340582765', 'BROOKLYN'), ('123175795', 'MANHATTAN'), ('123175795', 'MANHATTAN'), ('340585566', 'BROOKLYN'), ('340585940', 'BROOKLYN'), ('140743809', 'MANHATTAN'), ('220619212', 'BRONX'), ('321736877', 'BROOKLYN'), ('220633688', 'BRONX'), ('421601715', 'QUEENS'), ('321701477', 'BROOKLYN'), ('421609361', 'QUEENS'), ('321669654', 'BROOKLYN'), ('123361913', 'MANHATTAN'), ('123197539', 'MANHATTAN'), ('123130218', 'MANHATTAN'), ('520334022', 'STATEN ISLAND'), ('421104593', 'QUEENS'), ('320912278', 'BROOKLYN'), ('320911938', 'BROOKLYN'), ('421567842', 'QUEENS'), ('520332024', 'STATEN ISLAND'), ('520332033', 'STATEN ISLAND'), ('123501987', 'MANHATTAN'), ('123218641', 'MANHATTAN'), ('421637768', 'QUEENS'), ('210178065', 'BRONX'), ('520336155', 'STATEN ISLAND'), ('103650201', 'MANHATTAN'), ('123397314', 'MANHATTAN'), ('103650229', 'MANHATTAN'), ('321523810', 'BROOKLYN'), ('321788883', 'BROOKLYN'), ('321788776', 'BROOKLYN'), ('421649871', 'QUEENS'), ('321701477', 'BROOKLYN'), ('520136031', 'STATEN ISLAND'), ('321383150', 'BROOKLYN'), ('123579608', 'MANHATTAN'), ('210178243', 'BRONX'), ('123584941', 'MANHATTAN'), ('123461690', 'MANHATTAN'), ('321753018', 'BROOKLYN'), ('123380867', 'MANHATTAN'), ('123380867', 'MANHATTAN'), ('123521536', 'MANHATTAN'), ('340623052', 'BROOKLYN'), ('420664196', 'QUEENS'), ('321383604', 'BROOKLYN'), ('123430199', 'MANHATTAN'), ('240232075', 'BRONX'), ('123552468', 'MANHATTAN'), ('123547313', 'MANHATTAN'), ('123552468', 'MANHATTAN'), ('201198122', 'BRONX'), ('123547876', 'MANHATTAN'), ('123547634', 'MANHATTAN'), ('340628333', 'BROOKLYN'), ('421668635', 'QUEENS'), ('520136031', 'STATEN ISLAND'), ('321384195', 'BROOKLYN'), ('123357223', 'MANHATTAN'), ('240238603', 'BRONX'), ('421099830', 'QUEENS'), ('321833398', 'BROOKLYN'), ('220670735', 'BRONX'), ('123451512', 'MANHATTAN'), ('123451497', 'MANHATTAN'), ('421675173', 'QUEENS'), ('421695552', 'QUEENS'), ('123491596', 'MANHATTAN'), ('321850546', 'BROOKLYN'), ('220670744', 'BRONX'), ('220670959', 'BRONX'), ('321850546', 'BROOKLYN'), ('220670897', 'BRONX'), ('220670753', 'BRONX'), ('321829385', 'BROOKLYN'), ('123557061', 'MANHATTAN'), ('421693180', 'QUEENS'), ('440524185', 'QUEENS'), ('322062496', 'BROOKLYN'), ('240244213', 'BRONX'), ('123554395', 'MANHATTAN'), ('123508579', 'MANHATTAN'), ('140822028', 'MANHATTAN'), ('421713382', 'QUEENS'), ('240244963', 'BRONX'), ('520367852', 'STATEN ISLAND'), ('321906504', 'BROOKLYN'), ('121189230', 'MANHATTAN'), ('421722906', 'QUEENS'), ('421926571', 'QUEENS'), ('340653484', 'BROOKLYN'), ('240244972', 'BRONX'), ('123482891', 'MANHATTAN'), ('321916254', 'BROOKLYN'), ('421722283', 'QUEENS'), ('421930502', 'QUEENS'), ('421931645', 'QUEENS'), ('321918751', 'BROOKLYN'), ('421929042', 'QUEENS'), ('321695260', 'BROOKLYN'), ('421609361', 'QUEENS'), ('123654740', 'MANHATTAN'), ('340658434', 'BROOKLYN'), ('440534049', 'QUEENS'), ('321922853', 'BROOKLYN'), ('321922853', 'BROOKLYN'), ('321926760', 'BROOKLYN'), ('220690349', 'BRONX'), ('123480973', 'MANHATTAN'), ('123826896', 'MANHATTAN'), ('140835452', 'MANHATTAN'), ('123827270', 'MANHATTAN'), ('321386843', 'BROOKLYN'), ('123514303', 'MANHATTAN'), ('321387058', 'BROOKLYN'), ('321932879', 'BROOKLYN'), ('321930014', 'BROOKLYN'), ('123850332', 'MANHATTAN'), ('121190549', 'MANHATTAN'), ('123708835', 'MANHATTAN'), ('421885669', 'QUEENS'), ('140841506', 'MANHATTAN'), ('421740806', 'QUEENS'), ('122955551', 'MANHATTAN'), ('520365300', 'STATEN ISLAND'), ('123870203', 'MANHATTAN'), ('421891830', 'QUEENS'), ('220663495', 'BRONX'), ('321954710', 'BROOKLYN'), ('321954774', 'BROOKLYN'), ('321956736', 'BROOKLYN'), ('321945099', 'BROOKLYN'), ('123736145', 'MANHATTAN'), ('440545322', 'QUEENS'), ('421861578', 'QUEENS'), ('440546296', 'QUEENS'), ('321593067', 'BROOKLYN'), ('321949308', 'BROOKLYN'), ('321992466', 'BROOKLYN'), ('240253220', 'BRONX'), ('421860775', 'QUEENS'), ('421862158', 'QUEENS'), ('340678118', 'BROOKLYN'), ('123760849', 'MANHATTAN'), ('123760849', 'MANHATTAN'), ('123671972', 'MANHATTAN'), ('220669113', 'BRONX'), ('421934054', 'QUEENS'), ('321951973', 'BROOKLYN'), ('520380196', 'STATEN ISLAND'), ('340680276', 'BROOKLYN'), ('321961926', 'BROOKLYN'), ('123898826', 'MANHATTAN'), ('520385002', 'STATEN ISLAND'), ('123782674', 'MANHATTAN'), ('321964326', 'BROOKLYN'), ('123687983', 'MANHATTAN'), ('340680980', 'BROOKLYN'), ('321936447', 'BROOKLYN'), ('240256450', 'BRONX'), ('123860866', 'MANHATTAN'), ('123860866', 'MANHATTAN'), ('321970097', 'BROOKLYN'), ('321970284', 'BROOKLYN'), ('321965995', 'BROOKLYN'), ('321593833', 'BROOKLYN'), ('140855509', 'MANHATTAN'), ('321966841', 'BROOKLYN'), ('321970596', 'BROOKLYN'), ('123821454', 'MANHATTAN'), ('123750262', 'MANHATTAN'), ('123774665', 'MANHATTAN'), ('210179821', 'BRONX'), ('210179821', 'BRONX'), ('210179821', 'BRONX'), ('123821454', 'MANHATTAN'), ('421560242', 'QUEENS'), ('210179821', 'BRONX'), ('123689464', 'MANHATTAN'), ('321593833', 'BROOKLYN'), ('421733627', 'QUEENS'), ('123761394', 'MANHATTAN'), ('421730238', 'QUEENS'), ('123709503', 'MANHATTAN'), ('321593833', 'BROOKLYN'), ('123689464', 'MANHATTAN'), ('123881665', 'MANHATTAN'), ('421744170', 'QUEENS'), ('321718646', 'BROOKLYN'), ('510113798', 'STATEN ISLAND'), ('123770491', 'MANHATTAN'), ('321594949', 'BROOKLYN'), ('123688704', 'MANHATTAN'), ('421926571', 'QUEENS'), ('322023957', 'BROOKLYN'), ('123814667', 'MANHATTAN'), ('220714225', 'BRONX'), ('440565023', 'QUEENS'), ('510113814', 'STATEN ISLAND'), ('321982887', 'BROOKLYN'), ('123816709', 'MANHATTAN'), ('140867970', 'MANHATTAN'), ('140869139', 'MANHATTAN'), ('421915459', 'QUEENS'), ('420666292', 'QUEENS'), ('321995114', 'BROOKLYN'), ('321962836', 'BROOKLYN'), ('123787697', 'MANHATTAN'), ('321984705', 'BROOKLYN'), ('421910551', 'QUEENS'), ('140872447', 'MANHATTAN'), ('123747589', 'MANHATTAN'), ('421746203', 'QUEENS'), ('440572177', 'QUEENS'), ('123740817', 'MANHATTAN'), ('421906245', 'QUEENS'), ('240263576', 'BRONX'), ('322002097', 'BROOKLYN'), ('322005539', 'BROOKLYN'), ('340705525', 'BROOKLYN'), ('520394840', 'STATEN ISLAND'), ('340707998', 'BROOKLYN'), ('123844732', 'MANHATTAN'), ('123846071', 'MANHATTAN'), ('421940207', 'QUEENS'), ('340707131', 'BROOKLYN'), ('123870711', 'MANHATTAN'), ('140877362', 'MANHATTAN'), ('123792404', 'MANHATTAN'), ('421917411', 'QUEENS'), ('421941377', 'QUEENS'), ('321750850', 'BROOKLYN'), ('123793207', 'MANHATTAN'), ('123758451', 'MANHATTAN'), ('421940216', 'QUEENS'), ('322014477', 'BROOKLYN'), ('421905512', 'QUEENS'), ('440579973', 'QUEENS'), ('421690101', 'QUEENS'), ('123883119', 'MANHATTAN'), ('123724256', 'MANHATTAN'), ('421906423', 'QUEENS'), ('123844867', 'MANHATTAN'), ('220719809', 'BRONX'), ('123794313', 'MANHATTAN'), ('440581078', 'QUEENS'), ('421782976', 'QUEENS'), ('322020022', 'BROOKLYN'), ('421802641', 'QUEENS'), ('123700423', 'MANHATTAN'), ('421802990', 'QUEENS'), ('123725246', 'MANHATTAN'), ('322014510', 'BROOKLYN'), ('421940886', 'QUEENS'), ('540173088', 'STATEN ISLAND'), ('340714427', 'BROOKLYN'), ('220722136', 'BRONX'), ('220685729', 'BRONX'), ('123702617', 'MANHATTAN'), ('240271898', 'BRONX'), ('123854196', 'MANHATTAN'), ('140885941', 'MANHATTAN'), ('140884103', 'MANHATTAN'), ('322029247', 'BROOKLYN'), ('340716256', 'BROOKLYN'), ('123727985', 'MANHATTAN'), ('322040518', 'BROOKLYN'), ('123839775', 'MANHATTAN'), ('520398855', 'STATEN ISLAND'), ('340717004', 'BROOKLYN'), ('520240230', 'STATEN ISLAND'), ('123855051', 'MANHATTAN'), ('540173863', 'STATEN ISLAND'), ('123700977', 'MANHATTAN'), ('322028747', 'BROOKLYN'), ('322068016', 'BROOKLYN'), ('123701137', 'MANHATTAN'), ('220726123', 'BRONX'), ('421779604', 'QUEENS'), ('123857656', 'MANHATTAN'), ('123855097', 'MANHATTAN'), ('140887565', 'MANHATTAN'), ('140887994', 'MANHATTAN'), ('421757147', 'QUEENS'), ('340719057', 'BROOKLYN'), ('123570260', 'MANHATTAN'), ('321922292', 'BROOKLYN'), ('421943295', 'QUEENS'), ('421782565', 'QUEENS'), ('140888001', 'MANHATTAN'), ('123844545', 'MANHATTAN'), ('440586965', 'QUEENS'), ('220727113', 'BRONX'), ('440587278', 'QUEENS'), ('220727113', 'BRONX'), ('322044872', 'BROOKLYN'), ('322019249', 'BROOKLYN'), ('140889420', 'MANHATTAN'), ('210180864', 'BRONX'), ('520222492', 'STATEN ISLAND'), ('321589063', 'BROOKLYN'), ('123727100', 'MANHATTAN'), ('520240230', 'STATEN ISLAND'), ('421782896', 'QUEENS'), ('520450903', 'STATEN ISLAND'), ('440588311', 'QUEENS'), ('440588393', 'QUEENS'), ('123829937', 'MANHATTAN'), ('321589125', 'BROOKLYN'), ('510115527', 'STATEN ISLAND'), ('421236479', 'QUEENS'), ('520452091', 'STATEN ISLAND'), ('421629615', 'QUEENS'), ('123874879', 'MANHATTAN'), ('220730733', 'BRONX'), ('421958714', 'QUEENS'), ('123797926', 'MANHATTAN'), ('123841888', 'MANHATTAN'), ('140894398', 'MANHATTAN'), ('340724176', 'BROOKLYN'), ('123866619', 'MANHATTAN'), ('421959633', 'QUEENS'), ('340724265', 'BROOKLYN'), ('340724997', 'BROOKLYN'), ('340727949', 'BROOKLYN'), ('123866619', 'MANHATTAN'), ('123910367', 'MANHATTAN'), ('500876723', 'STATEN ISLAND'), ('321589802', 'BROOKLYN'), ('510113814', 'STATEN ISLAND'), ('321590033', 'BROOKLYN'), ('123910349', 'MANHATTAN'), ('340725521', 'BROOKLYN'), ('421764004', 'QUEENS'), ('520451298', 'STATEN ISLAND'), ('123833806', 'MANHATTAN'), ('123877304', 'MANHATTAN'), ('340725772', 'BROOKLYN'), ('520368496', 'STATEN ISLAND'), ('140900103', 'MANHATTAN'), ('421763130', 'QUEENS'), ('322085079', 'BROOKLYN'), ('322016572', 'BROOKLYN'), ('421730130', 'QUEENS'), ('322084828', 'BROOKLYN'), ('340726646', 'BROOKLYN'), ('140900773', 'MANHATTAN'), ('140901120', 'MANHATTAN'), ('440594304', 'QUEENS'), ('123913523', 'MANHATTAN'), ('340727690', 'BROOKLYN'), ('322086318', 'BROOKLYN'), ('322037247', 'BROOKLYN'), ('440597249', 'QUEENS'), ('440603713', 'QUEENS'), ('140902682', 'MANHATTAN'), ('123717834', 'MANHATTAN'), ('322084061', 'BROOKLYN'), ('440594224', 'QUEENS'), ('240273324', 'BRONX'), ('340729288', 'BROOKLYN'), ('322070227', 'BROOKLYN'), ('421765012', 'QUEENS'), ('121207522', 'MANHATTAN'), ('121207522', 'MANHATTAN'), ('421766627', 'QUEENS'), ('520398980', 'STATEN ISLAND'), ('140905876', 'MANHATTAN'), ('322070254', 'BROOKLYN'), ('520454222', 'STATEN ISLAND'), ('520399220', 'STATEN ISLAND'), ('520399266', 'STATEN ISLAND'), ('121208219', 'MANHATTAN'), ('340731382', 'BROOKLYN'), ('140906474', 'MANHATTAN'), ('140908105', 'MANHATTAN'), ('123688394', 'MANHATTAN'), ('322037130', 'BROOKLYN'), ('321591078', 'BROOKLYN'), ('540176281', 'STATEN ISLAND'), ('440597944', 'QUEENS'), ('340731738', 'BROOKLYN'), ('340733282', 'BROOKLYN'), ('140910691', 'MANHATTAN'), ('240274831', 'BRONX'), ('440598818', 'QUEENS'), ('140911208', 'MANHATTAN'), ('540176655', 'STATEN ISLAND'), ('140911048', 'MANHATTAN'), ('321589125', 'BROOKLYN'), ('340734557', 'BROOKLYN'), ('240275064', 'BRONX'), ('440599381', 'QUEENS'), ('421773389', 'QUEENS'), ('440599425', 'QUEENS'), ('140919200', 'MANHATTAN'), ('540176815', 'STATEN ISLAND'), ('540176842', 'STATEN ISLAND'), ('240274957', 'BRONX'), ('340735510', 'BROOKLYN'), ('440600066', 'QUEENS'), ('540176897', 'STATEN ISLAND'), ('140912412', 'MANHATTAN'), ('140913536', 'MANHATTAN'), ('340736369', 'BROOKLYN'), ('140914036', 'MANHATTAN'), ('321592148', 'BROOKLYN'), ('440603777', 'QUEENS'), ('540176959', 'STATEN ISLAND'), ('140914018', 'MANHATTAN'), ('210181649', 'BRONX'), ('140917612', 'MANHATTAN'), ('140916034', 'MANHATTAN'), ('210181658', 'BRONX'), ('440603857', 'QUEENS'), ('140915311', 'MANHATTAN'), ('440603884', 'QUEENS'), ('340740318', 'BROOKLYN'), ('140915160', 'MANHATTAN'), ('520454534', 'STATEN ISLAND'), ('340739785', 'BROOKLYN'), ('440602876', 'QUEENS'), ('340739696', 'BROOKLYN'), ('440603900', 'QUEENS'), ('140917685', 'MANHATTAN'), ('140917916', 'MANHATTAN'), ('140918997', 'MANHATTAN'), ('140918979', 'MANHATTAN'), ('140918988', 'MANHATTAN'), ('440603483', 'QUEENS'), ('421952104', 'QUEENS'), ('140918737', 'MANHATTAN'), ('340740069', 'BROOKLYN'), ('240276786', 'BRONX'), ('240276839', 'BRONX'), ('140919558', 'MANHATTAN'), ('140919629', 'MANHATTAN'), ('340740452', 'BROOKLYN'), ('240276802', 'BRONX'), ('440603928', 'QUEENS'), ('440603946', 'QUEENS'), ('321592282', 'BROOKLYN'), ('102772983', 'MANHATTAN'), ('104106049', 'MANHATTAN'), ('104484283', 'MANHATTAN'), ('110068051', 'MANHATTAN'), ('110068051', 'MANHATTAN'), ('110068051', 'MANHATTAN'), ('440604026', 'QUEENS'), ('140919638', 'MANHATTAN'), ('103399733', 'MANHATTAN'), ('301979205', 'BROOKLYN'), ('301677460', 'BROOKLYN'), ('301195061', 'BROOKLYN'), ('340759502', 'BROOKLYN'), ('301775611', 'BROOKLYN'), ('440604115', 'QUEENS'), ('440604437', 'QUEENS'), ('540177663', 'STATEN ISLAND'), ('440604071', 'QUEENS'), ('140919969', 'MANHATTAN'), ('321592291', 'BROOKLYN'), ('140920573', 'MANHATTAN'), ('340741488', 'BROOKLYN'), ('240277204', 'BRONX'), ('140920564', 'MANHATTAN'), ('140920528', 'MANHATTAN'), ('140920546', 'MANHATTAN'), ('140920500', 'MANHATTAN'), ('540177878', 'STATEN ISLAND'), ('140920617', 'MANHATTAN'), ('140920582', 'MANHATTAN'), ('140920635', 'MANHATTAN'), ('440605061', 'QUEENS'), ('240277231', 'BRONX'), ('240277222', 'BRONX'), ('240277213', 'BRONX'), ('440605052', 'QUEENS'), ('440605070', 'QUEENS'), ('340741503', 'BROOKLYN'), ('240277240', 'BRONX'), ('440605098', 'QUEENS'), ('140920644', 'MANHATTAN'), ('440605089', 'QUEENS'), ('140920662', 'MANHATTAN'), ('140920653', 'MANHATTAN'), ('340741512', 'BROOKLYN'), ('340741549', 'BROOKLYN'), ('340741521', 'BROOKLYN'), ('440605105', 'QUEENS'), ('140920680', 'MANHATTAN'), ('140920699', 'MANHATTAN'), ('240277268', 'BRONX'), ('340741530', 'BROOKLYN'), ('140920733', 'MANHATTAN'), ('340741558', 'BROOKLYN'), ('340741576', 'BROOKLYN'), ('340741585', 'BROOKLYN'), ('440605123', 'QUEENS'), ('140920742', 'MANHATTAN'), ('340741567', 'BROOKLYN'), ('540177887', 'STATEN ISLAND'), ('340741594', 'BROOKLYN'), ('520398720', 'STATEN ISLAND'), ('340741647', 'BROOKLYN'), ('440605132', 'QUEENS'), ('340741638', 'BROOKLYN'), ('440605141', 'QUEENS'), ('340741601', 'BROOKLYN'), ('440605178', 'QUEENS'), ('240277286', 'BRONX'), ('140920831', 'MANHATTAN'), ('440605150', 'QUEENS'), ('340741629', 'BROOKLYN'), ('440605169', 'QUEENS'), ('540177896', 'STATEN ISLAND'), ('140920788', 'MANHATTAN'), ('140920822', 'MANHATTAN'), ('140920804', 'MANHATTAN'), ('340741656', 'BROOKLYN'), ('140920859', 'MANHATTAN'), ('340759511', 'BROOKLYN'), ('140920840', 'MANHATTAN'), ('340741674', 'BROOKLYN'), ('240277295', 'BRONX'), ('240283705', 'BRONX'), ('220612022', 'BRONX'), ('440621515', 'QUEENS'), ('440605187', 'QUEENS'), ('340741683', 'BROOKLYN'), ('140920886', 'MANHATTAN'), ('140920877', 'MANHATTAN'), ('440605212', 'QUEENS'), ('140920868', 'MANHATTAN'), ('140920895', 'MANHATTAN'), ('340741718', 'BROOKLYN'), ('340741727', 'BROOKLYN'), ('220733856', 'BRONX'), ('440605230', 'QUEENS'), ('240277320', 'BRONX'), ('240277311', 'BRONX'), ('121208406', 'MANHATTAN'), ('420667923', 'QUEENS'), ('340741709', 'BROOKLYN'), ('440605267', 'QUEENS'), ('540177912', 'STATEN ISLAND'), ('440605258', 'QUEENS'), ('210181685', 'BRONX'), ('140920948', 'MANHATTAN'), ('322087068', 'BROOKLYN'), ('340741754', 'BROOKLYN'), ('340741763', 'BROOKLYN'), ('140920957', 'MANHATTAN'), ('240277339', 'BRONX'), ('440605285', 'QUEENS'), ('440605276', 'QUEENS'), ('322087086', 'BROOKLYN'), ('322087077', 'BROOKLYN'), ('340741772', 'BROOKLYN'), ('440605294', 'QUEENS'), ('540177930', 'STATEN ISLAND'), ('140920984', 'MANHATTAN'), ('240277348', 'BRONX'), ('140921019', 'MANHATTAN'), ('321592317', 'BROOKLYN'), ('140920993', 'MANHATTAN'), ('340741807', 'BROOKLYN'), ('440605329', 'QUEENS'), ('440605338', 'QUEENS'), ('340741852', 'BROOKLYN'), ('340741843', 'BROOKLYN'), ('340741834', 'BROOKLYN'), ('340741861', 'BROOKLYN'), ('340741816', 'BROOKLYN'), ('340741870', 'BROOKLYN'), ('140921046', 'MANHATTAN'), ('322087120', 'BROOKLYN'), ('340741923', 'BROOKLYN'), ('440605356', 'QUEENS'), ('340741905', 'BROOKLYN'), ('440605347', 'QUEENS'), ('340741932', 'BROOKLYN'), ('340741914', 'BROOKLYN'), ('440605374', 'QUEENS'), ('340741950', 'BROOKLYN'), ('402481113', 'QUEENS'), ('500783404', 'STATEN ISLAND'), ('110191569', 'MANHATTAN'), ('420022166', 'QUEENS'), ('340741969', 'BROOKLYN'), ('410219428', 'QUEENS'), ('402180091', 'QUEENS'), ('440605383', 'QUEENS'), ('420022157', 'QUEENS'), ('120304973', 'MANHATTAN'), ('320177679', 'BROOKLYN'), ('420337709', 'QUEENS'), ('420337709', 'QUEENS'), ('220128840', 'BRONX'), ('320751575', 'BROOKLYN'), ('520116785', 'STATEN ISLAND'), ('121549226', 'MANHATTAN'), ('121539166', 'MANHATTAN'), ('121331246', 'MANHATTAN'), ('420507464', 'QUEENS'), ('121331246', 'MANHATTAN'), ('220288043', 'BRONX'), ('121334877', 'MANHATTAN'), ('520161574', 'STATEN ISLAND'), ('320905838', 'BROOKLYN'), ('121823688', 'MANHATTAN'), ('121850700', 'MANHATTAN'), ('103645619', 'MANHATTAN'), ('122077705', 'MANHATTAN'), ('121710336', 'MANHATTAN'), ('122168242', 'MANHATTAN'), ('122171568', 'MANHATTAN'), ('421053834', 'QUEENS'), ('122233519', 'MANHATTAN'), ('320623143', 'BROOKLYN'), ('421174730', 'QUEENS'), ('320625613', 'BROOKLYN'), ('122432206', 'MANHATTAN'), ('421156983', 'QUEENS'), ('140141718', 'MANHATTAN'), ('122448404', 'MANHATTAN'), ('122448404', 'MANHATTAN'), ('421177960', 'QUEENS'), ('421203245', 'QUEENS'), ('103648466', 'MANHATTAN'), ('122568845', 'MANHATTAN'), ('321169454', 'BROOKLYN'), ('321286336', 'BROOKLYN'), ('340276347', 'BROOKLYN'), ('321169454', 'BROOKLYN'), ('122633846', 'MANHATTAN'), ('321288815', 'BROOKLYN'), ('122639145', 'MANHATTAN'), ('122639145', 'MANHATTAN'), ('140457404', 'MANHATTAN'), ('421253681', 'QUEENS'), ('321357429', 'BROOKLYN'), ('321381410', 'BROOKLYN'), ('321389154', 'BROOKLYN'), ('421318247', 'QUEENS'), ('140521344', 'MANHATTAN'), ('321430698', 'BROOKLYN'), ('321450979', 'BROOKLYN'), ('321422509', 'BROOKLYN'), ('321450979', 'BROOKLYN'), ('321450979', 'BROOKLYN'), ('122958193', 'MANHATTAN'), ('421428823', 'QUEENS'), ('421409247', 'QUEENS'), ('122990237', 'MANHATTAN'), ('122990237', 'MANHATTAN'), ('123020275', 'MANHATTAN'), ('123005327', 'MANHATTAN'), ('122949159', 'MANHATTAN'), ('321542666', 'BROOKLYN'), ('321542666', 'BROOKLYN'), ('321542666', 'BROOKLYN'), ('140621502', 'MANHATTAN'), ('321532999', 'BROOKLYN'), ('302573917', 'BROOKLYN'), ('421472169', 'QUEENS'), ('321576031', 'BROOKLYN'), ('421107956', 'QUEENS'), ('321532999', 'BROOKLYN'), ('321587485', 'BROOKLYN'), ('121274049', 'MANHATTAN'), ('321501326', 'BROOKLYN'), ('321186694', 'BROOKLYN'), ('321193766', 'BROOKLYN'), ('123327998', 'MANHATTAN'), ('340523320', 'BROOKLYN'), ('123307778', 'MANHATTAN'), ('321186694', 'BROOKLYN'), ('123346003', 'MANHATTAN'), ('121275574', 'MANHATTAN'), ('421527645', 'QUEENS'), ('421527645', 'QUEENS'), ('123307769', 'MANHATTAN'), ('421529091', 'QUEENS'), ('220610113', 'BRONX'), ('340536101', 'BROOKLYN'), ('321655375', 'BROOKLYN'), ('421105066', 'QUEENS'), ('421421964', 'QUEENS'), ('321646910', 'BROOKLYN'), ('421362199', 'QUEENS'), ('123187791', 'MANHATTAN'), ('123337665', 'MANHATTAN'), ('340553029', 'BROOKLYN'), ('440450165', 'QUEENS'), ('440450174', 'QUEENS'), ('140717758', 'MANHATTAN'), ('321681872', 'BROOKLYN'), ('121000291', 'MANHATTAN'), ('520311902', 'STATEN ISLAND'), ('102500875', 'MANHATTAN'), ('123164985', 'MANHATTAN'), ('123164985', 'MANHATTAN'), ('123164985', 'MANHATTAN'), ('123192767', 'MANHATTAN'), ('220627748', 'BRONX'), ('421594260', 'QUEENS'), ('340585003', 'BROOKLYN'), ('321796981', 'BROOKLYN'), ('520329617', 'STATEN ISLAND'), ('240216510', 'BRONX'), ('140748243', 'MANHATTAN'), ('102534161', 'MANHATTAN'), ('123389895', 'MANHATTAN'), ('321728573', 'BROOKLYN'), ('340597982', 'BROOKLYN'), ('420663561', 'QUEENS'), ('123388654', 'MANHATTAN'), ('520334451', 'STATEN ISLAND'), ('421629919', 'QUEENS'), ('302582890', 'BROOKLYN'), ('123437183', 'MANHATTAN'), ('321713632', 'BROOKLYN'), ('123358990', 'MANHATTAN'), ('140767695', 'MANHATTAN'), ('123234990', 'MANHATTAN'), ('123564918', 'MANHATTAN'), ('220650506', 'BRONX'), ('320912857', 'BROOKLYN'), ('123361904', 'MANHATTAN'), ('140771083', 'MANHATTAN'), ('123212488', 'MANHATTAN'), ('123420422', 'MANHATTAN'), ('321776823', 'BROOKLYN'), ('321791432', 'BROOKLYN'), ('240227722', 'BRONX'), ('321776832', 'BROOKLYN'), ('123375917', 'MANHATTAN'), ('421651457', 'QUEENS'), ('340620466', 'BROOKLYN'), ('321813515', 'BROOKLYN'), ('421664443', 'QUEENS'), ('123381544', 'MANHATTAN'), ('321827573', 'BROOKLYN'), ('321827573', 'BROOKLYN'), ('421662953', 'QUEENS'), ('123533284', 'MANHATTAN'), ('421644224', 'QUEENS'), ('103650531', 'MANHATTAN'), ('220659213', 'BRONX'), ('321693119', 'BROOKLYN'), ('321836082', 'BROOKLYN'), ('321836046', 'BROOKLYN'), ('321836046', 'BROOKLYN'), ('421644787', 'QUEENS'), ('121188678', 'MANHATTAN'), ('321836082', 'BROOKLYN'), ('321836082', 'BROOKLYN'), ('421677876', 'QUEENS'), ('140806885', 'MANHATTAN'), ('123319701', 'MANHATTAN'), ('123507080', 'MANHATTAN'), ('321834137', 'BROOKLYN'), ('220671958', 'BRONX'), ('123479093', 'MANHATTAN'), ('140814983', 'MANHATTAN'), ('220655501', 'BRONX'), ('520362018', 'STATEN ISLAND'), ('102620022', 'MANHATTAN'), ('140816026', 'MANHATTAN'), ('140816641', 'MANHATTAN'), ('421697907', 'QUEENS'), ('123404869', 'MANHATTAN'), ('321077240', 'BROOKLYN'), ('421697907', 'QUEENS'), ('322025651', 'BROOKLYN'), ('322024448', 'BROOKLYN'), ('421100506', 'QUEENS'), ('321904524', 'BROOKLYN'), ('321828821', 'BROOKLYN'), ('321074895', 'BROOKLYN'), ('123554983', 'MANHATTAN'), ('421717841', 'QUEENS'), ('123250739', 'MANHATTAN'), ('421720828', 'QUEENS'), ('421720828', 'QUEENS'), ('123656230', 'MANHATTAN'), ('123656230', 'MANHATTAN'), ('123656230', 'MANHATTAN'), ('123534247', 'MANHATTAN'), ('520273953', 'STATEN ISLAND'), ('123534247', 'MANHATTAN'), ('321914292', 'BROOKLYN'), ('201199005', 'BRONX'), ('322058107', 'BROOKLYN'), ('123524837', 'MANHATTAN'), ('123404315', 'MANHATTAN'), ('123673989', 'MANHATTAN'), ('123673989', 'MANHATTAN'), ('123673989', 'MANHATTAN'), ('123663384', 'MANHATTAN'), ('321910802', 'BROOKLYN'), ('321910802', 'BROOKLYN'), ('321910802', 'BROOKLYN'), ('322066955', 'BROOKLYN'), ('123828457', 'MANHATTAN'), ('321934993', 'BROOKLYN'), ('123717629', 'MANHATTAN'), ('140841301', 'MANHATTAN'), ('123754525', 'MANHATTAN'), ('123862132', 'MANHATTAN'), ('421727019', 'QUEENS'), ('340670900', 'BROOKLYN'), ('123826173', 'MANHATTAN'), ('421884483', 'QUEENS'), ('421740566', 'QUEENS'), ('220538728', 'BRONX'), ('140842060', 'MANHATTAN'), ('421597374', 'QUEENS'), ('123807416', 'MANHATTAN'), ('321947159', 'BROOKLYN'), ('220690946', 'BRONX'), ('340674862', 'BROOKLYN'), ('321991671', 'BROOKLYN'), ('421933509', 'QUEENS'), ('321845072', 'BROOKLYN'), ('123494423', 'MANHATTAN'), ('102681340', 'MANHATTAN'), ('321949521', 'BROOKLYN'), ('123760938', 'MANHATTAN'), ('321962104', 'BROOKLYN'), ('123349233', 'MANHATTAN'), ('123781853', 'MANHATTAN'), ('321962104', 'BROOKLYN'), ('340680374', 'BROOKLYN'), ('123896882', 'MANHATTAN'), ('520382363', 'STATEN ISLAND'), ('520382354', 'STATEN ISLAND'), ('520382372', 'STATEN ISLAND'), ('123895286', 'MANHATTAN'), ('123895277', 'MANHATTAN'), ('140856223', 'MANHATTAN'), ('321593860', 'BROOKLYN'), ('123894660', 'MANHATTAN'), ('123894660', 'MANHATTAN'), ('121205524', 'MANHATTAN'), ('421644787', 'QUEENS'), ('123775003', 'MANHATTAN'), ('123775003', 'MANHATTAN'), ('321944232', 'BROOKLYN'), ('123688385', 'MANHATTAN'), ('321593860', 'BROOKLYN'), ('123777323', 'MANHATTAN'), ('321594716', 'BROOKLYN'), ('220706369', 'BRONX'), ('421644787', 'QUEENS'), ('321974271', 'BROOKLYN'), ('321980022', 'BROOKLYN'), ('123890496', 'MANHATTAN'), ('421669634', 'QUEENS'), ('321985456', 'BROOKLYN'), ('421797620', 'QUEENS'), ('321594930', 'BROOKLYN'), ('421730041', 'QUEENS'), ('420666087', 'QUEENS'), ('421861346', 'QUEENS'), ('440563891', 'QUEENS'), ('340696358', 'BROOKLYN'), ('321963336', 'BROOKLYN'), ('123885714', 'MANHATTAN'), ('140871643', 'MANHATTAN'), ('340695493', 'BROOKLYN'), ('220655501', 'BRONX'), ('123887534', 'MANHATTAN'), ('322001169', 'BROOKLYN'), ('421918410', 'QUEENS'), ('220717197', 'BRONX'), ('322001196', 'BROOKLYN'), ('210180329', 'BRONX'), ('322000954', 'BROOKLYN'), ('123694840', 'MANHATTAN'), ('321996710', 'BROOKLYN'), ('321976395', 'BROOKLYN'), ('420666489', 'QUEENS'), ('420666498', 'QUEENS'), ('322013691', 'BROOKLYN'), ('140879155', 'MANHATTAN'), ('421909019', 'QUEENS'), ('421917153', 'QUEENS'), ('421941974', 'QUEENS'), ('220721182', 'BRONX'), ('321996710', 'BROOKLYN'), ('421906389', 'QUEENS'), ('510113967', 'STATEN ISLAND'), ('421779579', 'QUEENS'), ('123864210', 'MANHATTAN'), ('520377495', 'STATEN ISLAND'), ('322020914', 'BROOKLYN'), ('322021290', 'BROOKLYN'), ('321802894', 'BROOKLYN'), ('140882481', 'MANHATTAN'), ('220721191', 'BRONX'), ('440580685', 'QUEENS'), ('220724223', 'BRONX'), ('322021290', 'BROOKLYN'), ('123795731', 'MANHATTAN'), ('321596849', 'BROOKLYN'), ('322002998', 'BROOKLYN'), ('322022896', 'BROOKLYN'), ('321595243', 'BROOKLYN'), ('322021842', 'BROOKLYN'), ('421941475', 'QUEENS'), ('123700334', 'MANHATTAN'), ('421938531', 'QUEENS'), ('520396606', 'STATEN ISLAND'), ('123848006', 'MANHATTAN'), ('220723545', 'BRONX'), ('140884087', 'MANHATTAN'), ('540173113', 'STATEN ISLAND'), ('421801143', 'QUEENS'), ('520393958', 'STATEN ISLAND'), ('140885184', 'MANHATTAN'), ('220622985', 'BRONX'), ('421799290', 'QUEENS'), ('520392815', 'STATEN ISLAND'), ('520397614', 'STATEN ISLAND'), ('421754113', 'QUEENS'), ('421753908', 'QUEENS'), ('220651872', 'BRONX'), ('321588572', 'BROOKLYN'), ('321964308', 'BROOKLYN'), ('520396278', 'STATEN ISLAND'), ('340716336', 'BROOKLYN'), ('322032670', 'BROOKLYN'), ('340715916', 'BROOKLYN'), ('340717709', 'BROOKLYN'), ('322040055', 'BROOKLYN'), ('421755933', 'QUEENS'), ('421893669', 'QUEENS'), ('140888118', 'MANHATTAN'), ('520397730', 'STATEN ISLAND'), ('321594930', 'BROOKLYN'), ('421713408', 'QUEENS'), ('123848373', 'MANHATTAN'), ('322069916', 'BROOKLYN'), ('520450333', 'STATEN ISLAND'), ('520397981', 'STATEN ISLAND'), ('421943767', 'QUEENS'), ('123848685', 'MANHATTAN'), ('322041866', 'BROOKLYN'), ('421757263', 'QUEENS'), ('421943678', 'QUEENS'), ('123842128', 'MANHATTAN'), ('421733057', 'QUEENS'), ('322072519', 'BROOKLYN'), ('421945970', 'QUEENS'), ('322028710', 'BROOKLYN'), ('322042981', 'BROOKLYN'), ('210180980', 'BRONX'), ('421945426', 'QUEENS'), ('421946158', 'QUEENS'), ('240270586', 'BRONX'), ('520392012', 'STATEN ISLAND'), ('322044952', 'BROOKLYN'), ('322043757', 'BROOKLYN'), ('322039003', 'BROOKLYN'), ('123743431', 'MANHATTAN'), ('240271040', 'BRONX'), ('340722739', 'BROOKLYN'), ('322044319', 'BROOKLYN'), ('322045023', 'BROOKLYN'), ('340722837', 'BROOKLYN'), ('123250141', 'MANHATTAN'), ('322046308', 'BROOKLYN'), ('321589465', 'BROOKLYN'), ('140893433', 'MANHATTAN'), ('140895814', 'MANHATTAN'), ('440591833', 'QUEENS'), ('123878465', 'MANHATTAN'), ('322034650', 'BROOKLYN'), ('220727462', 'BRONX'), ('140895128', 'MANHATTAN'), ('421753711', 'QUEENS'), ('322047325', 'BROOKLYN'), ('440592333', 'QUEENS'), ('123878875', 'MANHATTAN'), ('140896724', 'MANHATTAN'), ('140896742', 'MANHATTAN'), ('421962068', 'QUEENS'), ('210181186', 'BRONX'), ('421943044', 'QUEENS'), ('123725077', 'MANHATTAN'), ('140897457', 'MANHATTAN'), ('421962157', 'QUEENS'), ('340727057', 'BROOKLYN'), ('322033410', 'BROOKLYN'), ('421893437', 'QUEENS'), ('140899650', 'MANHATTAN'), ('340728056', 'BROOKLYN'), ('123910946', 'MANHATTAN'), ('322072519', 'BROOKLYN'), ('322072519', 'BROOKLYN'), ('340727850', 'BROOKLYN'), ('322085122', 'BROOKLYN'), ('322084917', 'BROOKLYN'), ('140902691', 'MANHATTAN'), ('240273262', 'BRONX'), ('140903583', 'MANHATTAN'), ('322084882', 'BROOKLYN'), ('123909869', 'MANHATTAN'), ('140903565', 'MANHATTAN'), ('123912490', 'MANHATTAN'), ('321590934', 'BROOKLYN'), ('340728635', 'BROOKLYN'), ('421896513', 'QUEENS'), ('540175692', 'STATEN ISLAND'), ('220731411', 'BRONX'), ('340729652', 'BROOKLYN'), ('421766057', 'QUEENS'), ('322037899', 'BROOKLYN'), ('322046950', 'BROOKLYN'), ('340732407', 'BROOKLYN'), ('440595544', 'QUEENS'), ('540175763', 'STATEN ISLAND'), ('140905073', 'MANHATTAN'), ('240273814', 'BRONX'), ('340730677', 'BROOKLYN'), ('420667665', 'QUEENS'), ('322084882', 'BROOKLYN'), ('421945630', 'QUEENS'), ('140905224', 'MANHATTAN'), ('123909039', 'MANHATTAN'), ('340731060', 'BROOKLYN'), ('240274074', 'BRONX'), ('123922666', 'MANHATTAN'), ('340730739', 'BROOKLYN'), ('520392717', 'STATEN ISLAND'), ('140906269', 'MANHATTAN'), ('140909042', 'MANHATTAN'), ('340732130', 'BROOKLYN'), ('140909783', 'MANHATTAN'), ('340732700', 'BROOKLYN'), ('440597917', 'QUEENS'), ('140908178', 'MANHATTAN'), ('540176290', 'STATEN ISLAND'), ('123911847', 'MANHATTAN'), ('340733059', 'BROOKLYN'), ('321592031', 'BROOKLYN'), ('340734209', 'BROOKLYN'), ('340733424', 'BROOKLYN'), ('140919102', 'MANHATTAN'), ('440598435', 'QUEENS'), ('440599265', 'QUEENS'), ('140919175', 'MANHATTAN'), ('340735495', 'BROOKLYN'), ('140911761', 'MANHATTAN'), ('140919166', 'MANHATTAN'), ('340735716', 'BROOKLYN'), ('440599354', 'QUEENS'), ('140911486', 'MANHATTAN'), ('340740256', 'BROOKLYN'), ('340740247', 'BROOKLYN'), ('140914722', 'MANHATTAN'), ('340740238', 'BROOKLYN'), ('440603786', 'QUEENS'), ('322087022', 'BROOKLYN'), ('540176824', 'STATEN ISLAND'), ('340739669', 'BROOKLYN'), ('240276474', 'BRONX'), ('340738161', 'BROOKLYN'), ('340740425', 'BROOKLYN'), ('240276330', 'BRONX'), ('340740390', 'BROOKLYN'), ('140919004', 'MANHATTAN'), ('140919380', 'MANHATTAN'), ('140919399', 'MANHATTAN'), ('140919512', 'MANHATTAN'), ('340740274', 'BROOKLYN'), ('340740489', 'BROOKLYN'), ('510115714', 'STATEN ISLAND'), ('240276919', 'BRONX'), ('340740808', 'BROOKLYN'), ('340740826', 'BROOKLYN'), ('440604179', 'QUEENS'), ('340740791', 'BROOKLYN'), ('440603973', 'QUEENS'), ('440604035', 'QUEENS'), ('140919665', 'MANHATTAN'), ('140919898', 'MANHATTAN'), ('540177798', 'STATEN ISLAND'), ('240276937', 'BRONX'), ('421765389', 'QUEENS'), ('240277053', 'BRONX'), ('340740899', 'BROOKLYN'), ('340741040', 'BROOKLYN'), ('440604516', 'QUEENS'), ('140920225', 'MANHATTAN'), ('340741111', 'BROOKLYN'), ('340741184', 'BROOKLYN'), ('540177841', 'STATEN ISLAND'), ('220733829', 'BRONX'), ('440604730', 'QUEENS'), ('440604758', 'QUEENS'), ('240277124', 'BRONX'), ('440604776', 'QUEENS'), ('340741273', 'BROOKLYN'), ('340741264', 'BROOKLYN'), ('540177850', 'STATEN ISLAND'), ('340741326', 'BROOKLYN'), ('340741335', 'BROOKLYN'), ('140920341', 'MANHATTAN'), ('140920314', 'MANHATTAN'), ('440604909', 'QUEENS'), ('440604954', 'QUEENS'), ('102836585', 'MANHATTAN'), ('103927592', 'MANHATTAN'), ('104647447', 'MANHATTAN'), ('104646411', 'MANHATTAN'), ('340741415', 'BROOKLYN'), ('140920412', 'MANHATTAN'), ('140920403', 'MANHATTAN'), ('104719912', 'MANHATTAN'), ('200782812', 'BRONX'), ('301028091', 'BROOKLYN'), ('340759539', 'BROOKLYN'), ('140944566', 'MANHATTAN'), ('240283723', 'BRONX'), ('140944520', 'MANHATTAN'), ('140944539', 'MANHATTAN'), ('240283714', 'BRONX'), ('440605418', 'QUEENS'), ('340741996', 'BROOKLYN'), ('440605392', 'QUEENS'), ('140919941', 'MANHATTAN'), ('440605409', 'QUEENS'), ('340741978', 'BROOKLYN'), ('540177958', 'STATEN ISLAND'), ('140921091', 'MANHATTAN'), ('140921108', 'MANHATTAN'), ('440605445', 'QUEENS'), ('340742003', 'BROOKLYN'), ('440605463', 'QUEENS'), ('540177967', 'STATEN ISLAND'), ('440605454', 'QUEENS'), ('340742012', 'BROOKLYN'), ('140921135', 'MANHATTAN'), ('440605481', 'QUEENS'), ('140921144', 'MANHATTAN'), ('340742021', 'BROOKLYN'), ('240277393', 'BRONX'), ('140921180', 'MANHATTAN'), ('140921171', 'MANHATTAN'), ('140921153', 'MANHATTAN'), ('340742076', 'BROOKLYN'), ('540177976', 'STATEN ISLAND'), ('540177985', 'STATEN ISLAND'), ('140921215', 'MANHATTAN'), ('440605515', 'QUEENS'), ('340742094', 'BROOKLYN'), ('140921206', 'MANHATTAN'), ('340742085', 'BROOKLYN'), ('321051115', 'BROOKLYN'), ('340742101', 'BROOKLYN'), ('440605506', 'QUEENS'), ('123040306', 'MANHATTAN'), ('421535057', 'QUEENS'), ('123839347', 'MANHATTAN'), ('140899829', 'MANHATTAN'), ('340727182', 'BROOKLYN'), ('140899883', 'MANHATTAN'), ('440593225', 'QUEENS'), ('140899936', 'MANHATTAN'), ('322083990', 'BROOKLYN'), ('140900041', 'MANHATTAN'), ('440593261', 'QUEENS'), ('440593350', 'QUEENS'), ('440593369', 'QUEENS'), ('340735459', 'BROOKLYN'), ('140912895', 'MANHATTAN'), ('440602670', 'QUEENS'), ('121208264', 'MANHATTAN'), ('340741781', 'BROOKLYN'), ('140921000', 'MANHATTAN'), ('440604794', 'QUEENS'), ('140920519', 'MANHATTAN'), ('340741317', 'BROOKLYN'), ('240277259', 'BRONX'), ('420667932', 'QUEENS'), ('340740611', 'BROOKLYN'), ('340742156', 'BROOKLYN'), ('340742138', 'BROOKLYN'), ('440605542', 'QUEENS'), ('140921055', 'MANHATTAN'), ('340742129', 'BROOKLYN'), ('540177994', 'STATEN ISLAND'), ('440593412', 'QUEENS'), ('440593449', 'QUEENS'), ('440593467', 'QUEENS'), ('440593546', 'QUEENS'), ('340727315', 'BROOKLYN'), ('440593421', 'QUEENS'), ('140921242', 'MANHATTAN'), ('140900238', 'MANHATTAN'), ('140900309', 'MANHATTAN'), ('340759575', 'BROOKLYN'), ('440621542', 'QUEENS'), ('440621533', 'QUEENS'), ('140905028', 'MANHATTAN'), ('340759557', 'BROOKLYN'), ('540182345', 'STATEN ISLAND'), ('240277419', 'BRONX'), ('140921288', 'MANHATTAN'), ('440605588', 'QUEENS'), ('340742183', 'BROOKLYN'), ('340742192', 'BROOKLYN'), ('440605579', 'QUEENS'), ('140921279', 'MANHATTAN'), ('140921260', 'MANHATTAN'), ('140921251', 'MANHATTAN'), ('420967289', 'QUEENS'), ('421243149', 'QUEENS'), ('440283596', 'QUEENS'), ('420655785', 'QUEENS'), ('420655785', 'QUEENS'), ('420655785', 'QUEENS'), ('340742209', 'BROOKLYN'), ('420655785', 'QUEENS'), ('421260218', 'QUEENS'), ('440305260', 'QUEENS'), ('440366916', 'QUEENS'), ('440367185', 'QUEENS'), ('440417693', 'QUEENS'), ('440593644', 'QUEENS'), ('440283603', 'QUEENS'), ('140520853', 'MANHATTAN'), ('140900648', 'MANHATTAN'), ('340727495', 'BROOKLYN'), ('340742049', 'BROOKLYN'), ('440602607', 'QUEENS'), ('340742110', 'BROOKLYN'), ('440605043', 'QUEENS'), ('140921117', 'MANHATTAN'), ('140913108', 'MANHATTAN'), ('240272931', 'BRONX'), ('240277400', 'BRONX'), ('340742174', 'BROOKLYN'), ('140944593', 'MANHATTAN'), ('140953984', 'MANHATTAN'), ('340759584', 'BROOKLYN'), ('140921297', 'MANHATTAN'), ('340742218', 'BROOKLYN'), ('440605604', 'QUEENS'), ('340740684', 'BROOKLYN'), ('240277428', 'BRONX'), ('140919727', 'MANHATTAN'), ('340740666', 'BROOKLYN'), ('140919807', 'MANHATTAN'), ('440605613', 'QUEENS'), ('440605631', 'QUEENS'), ('440605622', 'QUEENS'), ('140921304', 'MANHATTAN'), ('340742227', 'BROOKLYN'), ('440605668', 'QUEENS'), ('140921322', 'MANHATTAN'), ('340742290', 'BROOKLYN'), ('240277437', 'BRONX'), ('340742236', 'BROOKLYN'), ('140921340', 'MANHATTAN'), ('140921313', 'MANHATTAN'), ('440605640', 'QUEENS'), ('140921386', 'MANHATTAN'), ('140921402', 'MANHATTAN'), ('440605677', 'QUEENS'), ('340742325', 'BROOKLYN'), ('140921377', 'MANHATTAN'), ('340742316', 'BROOKLYN'), ('140921368', 'MANHATTAN'), ('140921395', 'MANHATTAN'), ('240277455', 'BRONX'), ('440605686', 'QUEENS'), ('440605720', 'QUEENS'), ('440605711', 'QUEENS'), ('140921448', 'MANHATTAN'), ('340742389', 'BROOKLYN'), ('220688174', 'BRONX'), ('340742370', 'BROOKLYN'), ('340742361', 'BROOKLYN'), ('340742343', 'BROOKLYN'), ('440605748', 'QUEENS'), ('140921484', 'MANHATTAN'), ('140921457', 'MANHATTAN'), ('340742441', 'BROOKLYN'), ('340742398', 'BROOKLYN'), ('340742414', 'BROOKLYN'), ('440605766', 'QUEENS'), ('220616741', 'BRONX'), ('340742405', 'BROOKLYN'), ('340742478', 'BROOKLYN'), ('440605757', 'QUEENS'), ('140921527', 'MANHATTAN'), ('140921554', 'MANHATTAN'), ('140921536', 'MANHATTAN'), ('340742450', 'BROOKLYN'), ('340742469', 'BROOKLYN'), ('220733892', 'BRONX'), ('340742496', 'BROOKLYN'), ('220733874', 'BRONX'), ('421902178', 'QUEENS'), ('421902178', 'QUEENS'), ('340742487', 'BROOKLYN'), ('440605784', 'QUEENS'), ('140921572', 'MANHATTAN'), ('340742502', 'BROOKLYN'), ('220733883', 'BRONX'), ('440605819', 'QUEENS'), ('440605800', 'QUEENS'), ('340742539', 'BROOKLYN'), ('140921581', 'MANHATTAN'), ('440605793', 'QUEENS'), ('321590621', 'BROOKLYN'), ('540178047', 'STATEN ISLAND'), ('340742575', 'BROOKLYN'), ('340742584', 'BROOKLYN'), ('240277464', 'BRONX'), ('340742557', 'BROOKLYN'), ('140921607', 'MANHATTAN'), ('340742566', 'BROOKLYN'), ('321596545', 'BROOKLYN'), ('340742600', 'BROOKLYN'), ('440605846', 'QUEENS'), ('440605837', 'QUEENS'), ('140921625', 'MANHATTAN'), ('140921634', 'MANHATTAN'), ('340759600', 'BROOKLYN'), ('140921652', 'MANHATTAN'), ('240277516', 'BRONX'), ('440605864', 'QUEENS'), ('240277507', 'BRONX'), ('240277491', 'BRONX'), ('240277482', 'BRONX'), ('140921643', 'MANHATTAN'), ('140921661', 'MANHATTAN'), ('240277534', 'BRONX'), ('440605882', 'QUEENS'), ('340742664', 'BROOKLYN'), ('140921698', 'MANHATTAN'), ('440605873', 'QUEENS'), ('421774084', 'QUEENS'), ('421773566', 'QUEENS'), ('322087148', 'BROOKLYN'), ('140921714', 'MANHATTAN'), ('421754462', 'QUEENS'), ('140921723', 'MANHATTAN'), ('440605908', 'QUEENS'), ('140921778', 'MANHATTAN'), ('104213441', 'MANHATTAN'), ('104213441', 'MANHATTAN'), ('140921769', 'MANHATTAN'), ('340742691', 'BROOKLYN'), ('321592335', 'BROOKLYN'), ('140921787', 'MANHATTAN'), ('440605926', 'QUEENS'), ('440605935', 'QUEENS'), ('140921803', 'MANHATTAN'), ('140921796', 'MANHATTAN'), ('440605953', 'QUEENS'), ('440605962', 'QUEENS'), ('340742717', 'BROOKLYN'), ('321592353', 'BROOKLYN'), ('140921812', 'MANHATTAN'), ('240277561', 'BRONX'), ('140921821', 'MANHATTAN'), ('340742753', 'BROOKLYN'), ('240277552', 'BRONX'), ('321620983', 'BROOKLYN'), ('322087139', 'BROOKLYN'), ('140921830', 'MANHATTAN'), ('340742771', 'BROOKLYN'), ('321999030', 'BROOKLYN'), ('322047254', 'BROOKLYN'), ('440606015', 'QUEENS'), ('440606006', 'QUEENS'), ('340742762', 'BROOKLYN'), ('440606024', 'QUEENS'), ('440606033', 'QUEENS'), ('440606042', 'QUEENS'), ('140921867', 'MANHATTAN'), ('340742815', 'BROOKLYN'), ('440606097', 'QUEENS'), ('302291712', 'BROOKLYN'), ('440606088', 'QUEENS'), ('302205352', 'BROOKLYN'), ('240277589', 'BRONX'), ('340742833', 'BROOKLYN'), ('440606079', 'QUEENS'), ('340742824', 'BROOKLYN'), ('401295843', 'QUEENS'), ('402249660', 'QUEENS'), ('410046533', 'QUEENS'), ('420004177', 'QUEENS'), ('420031879', 'QUEENS'), ('420067750', 'QUEENS'), ('320353443', 'BROOKLYN'), ('420487217', 'QUEENS'), ('120741082', 'MANHATTAN'), ('410081405', 'QUEENS'), ('120971225', 'MANHATTAN'), ('121021376', 'MANHATTAN'), ('402889530', 'QUEENS'), ('121331246', 'MANHATTAN'), ('121635249', 'MANHATTAN'), ('420893554', 'QUEENS'), ('121936646', 'MANHATTAN'), ('320504003', 'BROOKLYN'), ('121017559', 'MANHATTAN'), ('320914258', 'BROOKLYN'), ('421012479', 'QUEENS'), ('122136330', 'MANHATTAN'), ('320913534', 'BROOKLYN'), ('440190035', 'QUEENS'), ('421065787', 'QUEENS'), ('122136330', 'MANHATTAN'), ('220177751', 'BRONX'), ('320596583', 'BROOKLYN'), ('140326127', 'MANHATTAN'), ('140326136', 'MANHATTAN'), ('122366297', 'MANHATTAN'), ('421065787', 'QUEENS'), ('421065787', 'QUEENS'), ('140359449', 'MANHATTAN'), ('122366297', 'MANHATTAN'), ('421171975', 'QUEENS'), ('122470637', 'MANHATTAN'), ('421152246', 'QUEENS'), ('201194796', 'BRONX'), ('122532250', 'MANHATTAN'), ('321237407', 'BROOKLYN'), ('320958031', 'BROOKLYN'), ('140416208', 'MANHATTAN'), ('321368300', 'BROOKLYN'), ('220523066', 'BRONX'), ('421000017', 'QUEENS'), ('421098083', 'QUEENS'), ('321183456', 'BROOKLYN'), ('340389797', 'BROOKLYN'), ('500872479', 'STATEN ISLAND'), ('440333854', 'QUEENS'), ('121191003', 'MANHATTAN'), ('121191003', 'MANHATTAN'), ('421334915', 'QUEENS'), ('140539451', 'MANHATTAN'), ('121191003', 'MANHATTAN'), ('240155568', 'BRONX'), ('321195498', 'BROOKLYN'), ('321195498', 'BROOKLYN'), ('321195498', 'BROOKLYN'), ('122916345', 'MANHATTAN'), ('122168377', 'MANHATTAN'), ('140587764', 'MANHATTAN'), ('321421225', 'BROOKLYN'), ('121191352', 'MANHATTAN'), ('122989141', 'MANHATTAN'), ('321493424', 'BROOKLYN'), ('321372750', 'BROOKLYN'), ('121191003', 'MANHATTAN'), ('240173600', 'BRONX'), ('321538840', 'BROOKLYN'), ('321537958', 'BROOKLYN'), ('220576918', 'BRONX'), ('321560538', 'BROOKLYN'), ('122168377', 'MANHATTAN'), ('321368300', 'BROOKLYN'), ('302574060', 'BROOKLYN'), ('321578556', 'BROOKLYN'), ('421106181', 'QUEENS'), ('220592062', 'BRONX'), ('421419334', 'QUEENS'), ('321193445', 'BROOKLYN'), ('121239196', 'MANHATTAN'), ('121239196', 'MANHATTAN'), ('421531177', 'QUEENS'), ('121240148', 'MANHATTAN'), ('121293377', 'MANHATTAN'), ('123107262', 'MANHATTAN'), ('321368300', 'BROOKLYN'), ('220614217', 'BRONX'), ('321368300', 'BROOKLYN'), ('421544680', 'QUEENS'), ('123161434', 'MANHATTAN'), ('123161434', 'MANHATTAN'), ('123179194', 'MANHATTAN'), ('321191642', 'BROOKLYN'), ('123290900', 'MANHATTAN'), ('220616313', 'BRONX'), ('140711567', 'MANHATTAN'), ('123289565', 'MANHATTAN'), ('123289574', 'MANHATTAN'), ('123256555', 'MANHATTAN'), ('321688820', 'BROOKLYN'), ('123202284', 'MANHATTAN'), ('123162889', 'MANHATTAN'), ('340569361', 'BROOKLYN'), ('220623617', 'BRONX'), ('123129373', 'MANHATTAN'), ('104213021', 'MANHATTAN'), ('123149707', 'MANHATTAN'), ('321726281', 'BROOKLYN'), ('420663302', 'QUEENS'), ('321726281', 'BROOKLYN'), ('321690210', 'BROOKLYN'), ('123207127', 'MANHATTAN'), ('321660216', 'BROOKLYN'), ('520281702', 'STATEN ISLAND'), ('421531177', 'QUEENS'), ('302576932', 'BROOKLYN'), ('520323846', 'STATEN ISLAND'), ('123204415', 'MANHATTAN'), ('123425098', 'MANHATTAN'), ('321704759', 'BROOKLYN'), ('220642623', 'BRONX'), ('321742557', 'BROOKLYN'), ('321742557', 'BROOKLYN'), ('140757740', 'MANHATTAN'), ('340590890', 'BROOKLYN'), ('321782059', 'BROOKLYN'), ('220625027', 'BRONX'), ('123601520', 'MANHATTAN'), ('421628894', 'QUEENS'), ('123386941', 'MANHATTAN'), ('123431018', 'MANHATTAN'), ('140767276', 'MANHATTAN'), ('421608077', 'QUEENS'), ('321741442', 'BROOKLYN'), ('123143632', 'MANHATTAN'), ('123420896', 'MANHATTAN'), ('340610690', 'BROOKLYN'), ('123364000', 'MANHATTAN'), ('123576629', 'MANHATTAN'), ('421602279', 'QUEENS'), ('123420896', 'MANHATTAN'), ('321763150', 'BROOKLYN'), ('321781979', 'BROOKLYN'), ('140782801', 'MANHATTAN'), ('123381009', 'MANHATTAN'), ('123462859', 'MANHATTAN'), ('421656568', 'QUEENS'), ('220661923', 'BRONX'), ('123439680', 'MANHATTAN'), ('220659302', 'BRONX'), ('421662640', 'QUEENS'), ('540153144', 'STATEN ISLAND'), ('102600053', 'MANHATTAN'), ('123130147', 'MANHATTAN'), ('421676939', 'QUEENS'), ('340637029', 'BROOKLYN'), ('220625465', 'BRONX'), ('500871005', 'STATEN ISLAND'), ('321849087', 'BROOKLYN'), ('321772569', 'BROOKLYN'), ('520337092', 'STATEN ISLAND'), ('123518942', 'MANHATTAN'), ('500875181', 'STATEN ISLAND'), ('321833575', 'BROOKLYN'), ('123385899', 'MANHATTAN'), ('123404262', 'MANHATTAN'), ('123406867', 'MANHATTAN'), ('123385899', 'MANHATTAN'), ('123535282', 'MANHATTAN'), ('421693144', 'QUEENS'), ('322059133', 'BROOKLYN'), ('322059133', 'BROOKLYN'), ('302585129', 'BROOKLYN'), ('220678452', 'BRONX'), ('123385899', 'MANHATTAN'), ('123482472', 'MANHATTAN'), ('123482472', 'MANHATTAN'), ('321383766', 'BROOKLYN'), ('123512270', 'MANHATTAN'), ('240245114', 'BRONX'), ('123597900', 'MANHATTAN'), ('123265082', 'MANHATTAN'), ('123265082', 'MANHATTAN'), ('421422106', 'QUEENS'), ('123508276', 'MANHATTAN'), ('123508276', 'MANHATTAN'), ('340653545', 'BROOKLYN'), ('123252489', 'MANHATTAN'), ('440533004', 'QUEENS'), ('123669949', 'MANHATTAN'), ('220689477', 'BRONX'), ('321924263', 'BROOKLYN'), ('140831447', 'MANHATTAN'), ('421932396', 'QUEENS'), ('240249352', 'BRONX'), ('220689663', 'BRONX'), ('123682835', 'MANHATTAN'), ('321932094', 'BROOKLYN'), ('321930764', 'BROOKLYN'), ('123252915', 'MANHATTAN'), ('421891233', 'QUEENS'), ('421951301', 'QUEENS'), ('220693426', 'BRONX'), ('220678835', 'BRONX'), ('321928438', 'BROOKLYN'), ('321912560', 'BROOKLYN'), ('321933967', 'BROOKLYN'), ('220693426', 'BRONX'), ('220696806', 'BRONX'), ('321743191', 'BROOKLYN'), ('340670919', 'BROOKLYN'), ('123871934', 'MANHATTAN'), ('123871444', 'MANHATTAN'), ('123871444', 'MANHATTAN'), ('321955363', 'BROOKLYN'), ('321955372', 'BROOKLYN'), ('500875788', 'STATEN ISLAND'), ('500875779', 'STATEN ISLAND'), ('440547678', 'QUEENS'), ('421861881', 'QUEENS'), ('123494664', 'MANHATTAN'), ('123872504', 'MANHATTAN'), ('123862383', 'MANHATTAN'), ('123892412', 'MANHATTAN'), ('123779189', 'MANHATTAN'), ('340677896', 'BROOKLYN'), ('421887532', 'QUEENS'), ('123896542', 'MANHATTAN'), ('321990887', 'BROOKLYN'), ('123717898', 'MANHATTAN'), ('123717898', 'MANHATTAN'), ('220704806', 'BRONX'), ('500876019', 'STATEN ISLAND'), ('201199933', 'BRONX'), ('140853280', 'MANHATTAN'), ('240256405', 'BRONX'), ('123779170', 'MANHATTAN'), ('201202545', 'BRONX'), ('123751699', 'MANHATTAN'), ('421728777', 'QUEENS'), ('102689663', 'MANHATTAN'), ('123835779', 'MANHATTAN'), ('321971755', 'BROOKLYN'), ('210179812', 'BRONX'), ('321969278', 'BROOKLYN'), ('321594191', 'BROOKLYN'), ('340683184', 'BROOKLYN'), ('421733547', 'QUEENS'), ('123689160', 'MANHATTAN'), ('123689160', 'MANHATTAN'), ('123881371', 'MANHATTAN'), ('220710489', 'BRONX'), ('123799345', 'MANHATTAN'), ('520386207', 'STATEN ISLAND'), ('340685495', 'BROOKLYN'), ('321935484', 'BROOKLYN'), ('123777305', 'MANHATTAN'), ('123881807', 'MANHATTAN'), ('140860799', 'MANHATTAN'), ('123879874', 'MANHATTAN'), ('421731763', 'QUEENS'), ('123691246', 'MANHATTAN'), ('123691255', 'MANHATTAN'), ('220634419', 'BRONX'), ('220707607', 'BRONX'), ('421951221', 'QUEENS'), ('123819118', 'MANHATTAN'), ('123712660', 'MANHATTAN'), ('123397617', 'MANHATTAN'), ('321921934', 'BROOKLYN'), ('123685404', 'MANHATTAN'), ('220696058', 'BRONX'), ('321594887', 'BROOKLYN'), ('421747550', 'QUEENS'), ('123716586', 'MANHATTAN'), ('123814934', 'MANHATTAN'), ('123816102', 'MANHATTAN'), ('140868069', 'MANHATTAN'), ('321597946', 'BROOKLYN'), ('421898003', 'QUEENS'), ('321987793', 'BROOKLYN'), ('321987882', 'BROOKLYN'), ('321996177', 'BROOKLYN'), ('220707849', 'BRONX'), ('123753385', 'MANHATTAN'), ('321959555', 'BROOKLYN'), ('123885643', 'MANHATTAN'), ('220691320', 'BRONX'), ('123880167', 'MANHATTAN'), ('421619831', 'QUEENS'), ('123696928', 'MANHATTAN'), ('322002408', 'BROOKLYN'), ('220716811', 'BRONX'), ('520393967', 'STATEN ISLAND'), ('123697115', 'MANHATTAN'), ('210180392', 'BRONX'), ('123743280', 'MANHATTAN'), ('421907057', 'QUEENS'), ('123884537', 'MANHATTAN'), ('123741754', 'MANHATTAN'), ('123790843', 'MANHATTAN'), ('140876513', 'MANHATTAN'), ('340707319', 'BROOKLYN'), ('440575726', 'QUEENS'), ('140878708', 'MANHATTAN'), ('240266396', 'BRONX'), ('321596117', 'BROOKLYN'), ('421942973', 'QUEENS'), ('123866012', 'MANHATTAN'), ('322003354', 'BROOKLYN'), ('421780148', 'QUEENS'), ('322016741', 'BROOKLYN'), ('220723091', 'BRONX'), ('123794894', 'MANHATTAN'), ('140882953', 'MANHATTAN'), ('520396660', 'STATEN ISLAND'), ('123817691', 'MANHATTAN'), ('421781799', 'QUEENS'), ('140883168', 'MANHATTAN'), ('340713491', 'BROOKLYN'), ('220723643', 'BRONX'), ('123816424', 'MANHATTAN'), ('321596821', 'BROOKLYN'), ('421802302', 'QUEENS'), ('520392557', 'STATEN ISLAND'), ('520397534', 'STATEN ISLAND'), ('123743627', 'MANHATTAN'), ('440582647', 'QUEENS'), ('140885022', 'MANHATTAN'), ('123702476', 'MANHATTAN'), ('421801642', 'QUEENS'), ('220724036', 'BRONX'), ('322029229', 'BROOKLYN'), ('321588297', 'BROOKLYN'), ('421753105', 'QUEENS'), ('322041394', 'BROOKLYN'), ('123858904', 'MANHATTAN'), ('121207158', 'MANHATTAN'), ('322041615', 'BROOKLYN'), ('321596858', 'BROOKLYN'), ('322041660', 'BROOKLYN'), ('240268474', 'BRONX'), ('121207158', 'MANHATTAN'), ('121207158', 'MANHATTAN'), ('123841691', 'MANHATTAN'), ('123866012', 'MANHATTAN'), ('321588386', 'BROOKLYN'), ('123703466', 'MANHATTAN'), ('421757254', 'QUEENS'), ('322031975', 'BROOKLYN'), ('240269008', 'BRONX'), ('322070469', 'BROOKLYN'), ('440586803', 'QUEENS'), ('123794340', 'MANHATTAN'), ('322004601', 'BROOKLYN'), ('520450958', 'STATEN ISLAND'), ('321457712', 'BROOKLYN'), ('321610226', 'BROOKLYN'), ('123846721', 'MANHATTAN'), ('321610217', 'BROOKLYN'), ('421945532', 'QUEENS'), ('520450967', 'STATEN ISLAND'), ('440590488', 'QUEENS'), ('520382559', 'STATEN ISLAND'), ('510115670', 'STATEN ISLAND'), ('322044685', 'BROOKLYN'), ('123875707', 'MANHATTAN'), ('123688358', 'MANHATTAN'), ('123573908', 'MANHATTAN'), ('440589007', 'QUEENS'), ('421940485', 'QUEENS'), ('322083071', 'BROOKLYN'), ('321589964', 'BROOKLYN'), ('210181159', 'BRONX'), ('340724559', 'BROOKLYN'), ('421960765', 'QUEENS'), ('210180285', 'BRONX'), ('520452144', 'STATEN ISLAND'), ('322004870', 'BROOKLYN'), ('421947683', 'QUEENS'), ('140901807', 'MANHATTAN'), ('123910820', 'MANHATTAN'), ('121207185', 'MANHATTAN'), ('121207425', 'MANHATTAN'), ('140900265', 'MANHATTAN'), ('140900988', 'MANHATTAN'), ('421764022', 'QUEENS'), ('140897581', 'MANHATTAN'), ('340725861', 'BROOKLYN'), ('340727734', 'BROOKLYN'), ('240272904', 'BRONX'), ('510115670', 'STATEN ISLAND'), ('421946942', 'QUEENS'), ('123911936', 'MANHATTAN'), ('440593813', 'QUEENS'), ('140901175', 'MANHATTAN'), ('140901193', 'MANHATTAN'), ('140901228', 'MANHATTAN'), ('421764200', 'QUEENS'), ('220723732', 'BRONX'), ('520395901', 'STATEN ISLAND'), ('140903306', 'MANHATTAN'), ('540175497', 'STATEN ISLAND'), ('140902469', 'MANHATTAN'), ('220510034', 'BRONX'), ('440594769', 'QUEENS'), ('322070209', 'BROOKLYN'), ('322070209', 'BROOKLYN'), ('322037158', 'BROOKLYN'), ('140903690', 'MANHATTAN'), ('421946942', 'QUEENS'), ('440594929', 'QUEENS'), ('421765691', 'QUEENS'), ('440595553', 'QUEENS'), ('322037327', 'BROOKLYN'), ('540176254', 'STATEN ISLAND'), ('140904387', 'MANHATTAN'), ('440595474', 'QUEENS'), ('340730089', 'BROOKLYN'), ('220644328', 'BRONX'), ('421766789', 'QUEENS'), ('123922906', 'MANHATTAN'), ('421763844', 'QUEENS'), ('440596936', 'QUEENS'), ('140909211', 'MANHATTAN'), ('123922737', 'MANHATTAN'), ('140906189', 'MANHATTAN'), ('140910138', 'MANHATTAN'), ('540176450', 'STATEN ISLAND'), ('440598337', 'QUEENS'), ('140909239', 'MANHATTAN'), ('240274813', 'BRONX'), ('140910664', 'MANHATTAN'), ('140909738', 'MANHATTAN'), ('140910325', 'MANHATTAN'), ('440599283', 'QUEENS'), ('540176833', 'STATEN ISLAND'), ('140911627', 'MANHATTAN'), ('540176940', 'STATEN ISLAND'), ('140910959', 'MANHATTAN'), ('540176539', 'STATEN ISLAND'), ('140913634', 'MANHATTAN'), ('140915142', 'MANHATTAN'), ('340736653', 'BROOKLYN'), ('140914795', 'MANHATTAN'), ('440602233', 'QUEENS'), ('340740292', 'BROOKLYN'), ('340737171', 'BROOKLYN'), ('340735422', 'BROOKLYN'), ('220733794', 'BRONX'), ('340740586', 'BROOKLYN'), ('340739909', 'BROOKLYN'), ('340740504', 'BROOKLYN'), ('140918381', 'MANHATTAN'), ('140918372', 'MANHATTAN'), ('520399284', 'STATEN ISLAND'), ('140919488', 'MANHATTAN'), ('140919718', 'MANHATTAN'), ('340740773', 'BROOKLYN'), ('440604491', 'QUEENS'), ('240277062', 'BRONX'), ('440604393', 'QUEENS'), ('140919816', 'MANHATTAN'), ('440604400', 'QUEENS'), ('440604339', 'QUEENS'), ('440604810', 'QUEENS'), ('340741120', 'BROOKLYN'), ('520451706', 'STATEN ISLAND'), ('440604865', 'QUEENS'), ('440604623', 'QUEENS'), ('440604687', 'QUEENS'), ('140920449', 'MANHATTAN'), ('140920537', 'MANHATTAN'), ('340741497', 'BROOKLYN'), ('140920715', 'MANHATTAN'), ('140920485', 'MANHATTAN'), ('140920671', 'MANHATTAN'), ('140920626', 'MANHATTAN'), ('140920608', 'MANHATTAN'), ('240277302', 'BRONX'), ('440605203', 'QUEENS'), ('440605221', 'QUEENS'), ('440605114', 'QUEENS'), ('340741665', 'BROOKLYN'), ('140920797', 'MANHATTAN'), ('540177921', 'STATEN ISLAND'), ('322050837', 'BROOKLYN'), ('440605310', 'QUEENS'), ('340741736', 'BROOKLYN'), ('340741745', 'BROOKLYN'), ('140920966', 'MANHATTAN'), ('140920920', 'MANHATTAN'), ('340741941', 'BROOKLYN'), ('140921162', 'MANHATTAN'), ('140921082', 'MANHATTAN'), ('340741790', 'BROOKLYN'), ('440605427', 'QUEENS'), ('540178001', 'STATEN ISLAND'), ('103281459', 'MANHATTAN'), ('103708187', 'MANHATTAN'), ('103931024', 'MANHATTAN'), ('104370011', 'MANHATTAN'), ('201062786', 'BRONX'), ('201099989', 'BRONX'), ('301171461', 'BROOKLYN'), ('440605533', 'QUEENS'), ('301924595', 'BROOKLYN'), ('421764308', 'QUEENS'), ('301217948', 'BROOKLYN'), ('340742147', 'BROOKLYN'), ('340759619', 'BROOKLYN'), ('340759637', 'BROOKLYN'), ('140944600', 'MANHATTAN'), ('340759628', 'BROOKLYN'), ('140944619', 'MANHATTAN'), ('140919870', 'MANHATTAN'), ('321591862', 'BROOKLYN'), ('321591862', 'BROOKLYN'), ('421764335', 'QUEENS'), ('340740853', 'BROOKLYN'), ('140919754', 'MANHATTAN'), ('240276884', 'BRONX'), ('440604419', 'QUEENS'), ('440606104', 'QUEENS'), ('440606113', 'QUEENS'), ('340742888', 'BROOKLYN'), ('140920001', 'MANHATTAN'), ('340742860', 'BROOKLYN'), ('340742879', 'BROOKLYN'), ('540178074', 'STATEN ISLAND'), ('140921894', 'MANHATTAN'), ('140921901', 'MANHATTAN'), ('340742904', 'BROOKLYN'), ('340742897', 'BROOKLYN'), ('440606122', 'QUEENS'), ('340742931', 'BROOKLYN'), ('104213959', 'MANHATTAN'), ('104213959', 'MANHATTAN'), ('104213959', 'MANHATTAN'), ('104213959', 'MANHATTAN'), ('140921947', 'MANHATTAN'), ('140921910', 'MANHATTAN'), ('340742940', 'BROOKLYN'), ('440606159', 'QUEENS'), ('340742968', 'BROOKLYN'), ('440606168', 'QUEENS'), ('340742959', 'BROOKLYN'), ('140921956', 'MANHATTAN'), ('440606177', 'QUEENS'), ('121208424', 'MANHATTAN'), ('421133008', 'QUEENS'), ('440606186', 'QUEENS'), ('540178083', 'STATEN ISLAND'), ('140921974', 'MANHATTAN'), ('340742986', 'BROOKLYN'), ('140921983', 'MANHATTAN'), ('540178092', 'STATEN ISLAND'), ('440606195', 'QUEENS'), ('440606202', 'QUEENS'), ('240277614', 'BRONX'), ('340743039', 'BROOKLYN'), ('340743048', 'BROOKLYN'), ('140921992', 'MANHATTAN'), ('440606220', 'QUEENS'), ('123920784', 'MANHATTAN'), ('140922027', 'MANHATTAN'), ('140922018', 'MANHATTAN'), ('140922036', 'MANHATTAN'), ('440606239', 'QUEENS'), ('440606248', 'QUEENS'), ('340743057', 'BROOKLYN'), ('140922045', 'MANHATTAN'), ('340743075', 'BROOKLYN'), ('140922072', 'MANHATTAN'), ('140922054', 'MANHATTAN'), ('340743100', 'BROOKLYN'), ('340743128', 'BROOKLYN'), ('421449132', 'QUEENS'), ('340743137', 'BROOKLYN'), ('440606257', 'QUEENS'), ('340743093', 'BROOKLYN'), ('240277623', 'BRONX'), ('140922107', 'MANHATTAN'), ('220726481', 'BRONX'), ('140922090', 'MANHATTAN'), ('520346046', 'STATEN ISLAND'), ('140922143', 'MANHATTAN'), ('440606266', 'QUEENS'), ('140922152', 'MANHATTAN'), ('220728096', 'BRONX'), ('240277650', 'BRONX'), ('220732946', 'BRONX'), ('540178127', 'STATEN ISLAND'), ('520454687', 'STATEN ISLAND'), ('321592371', 'BROOKLYN'), ('340743182', 'BROOKLYN'), ('123920702', 'MANHATTAN'), ('340743191', 'BROOKLYN'), ('421133017', 'QUEENS'), ('140922189', 'MANHATTAN'), ('140922170', 'MANHATTAN'), ('322087166', 'BROOKLYN'), ('440606319', 'QUEENS'), ('440606328', 'QUEENS'), ('440606300', 'QUEENS'), ('322087200', 'BROOKLYN'), ('440606284', 'QUEENS'), ('340743226', 'BROOKLYN'), ('340743244', 'BROOKLYN'), ('340743235', 'BROOKLYN'), ('140922232', 'MANHATTAN'), ('340743253', 'BROOKLYN'), ('322087193', 'BROOKLYN'), ('240277669', 'BRONX'), ('440606346', 'QUEENS'), ('440606337', 'QUEENS'), ('140922241', 'MANHATTAN'), ('140922214', 'MANHATTAN'), ('340743262', 'BROOKLYN'), ('421902187', 'QUEENS'), ('421902187', 'QUEENS'), ('421902187', 'QUEENS'), ('240277678', 'BRONX'), ('440606373', 'QUEENS'), ('340743271', 'BROOKLYN'), ('340743280', 'BROOKLYN'), ('440606364', 'QUEENS'), ('140922269', 'MANHATTAN'), ('440606382', 'QUEENS'), ('440606391', 'QUEENS'), ('240277687', 'BRONX'), ('540178136', 'STATEN ISLAND'), ('140922278', 'MANHATTAN'), ('340743333', 'BROOKLYN'), ('123725781', 'MANHATTAN'), ('440606417', 'QUEENS'), ('440606426', 'QUEENS'), ('340743324', 'BROOKLYN'), ('123573908', 'MANHATTAN'), ('140922303', 'MANHATTAN'), ('440606444', 'QUEENS'), ('440606453', 'QUEENS'), ('140922296', 'MANHATTAN'), ('140922287', 'MANHATTAN'), ('340743342', 'BROOKLYN'), ('340743388', 'BROOKLYN'), ('140922312', 'MANHATTAN'), ('140922321', 'MANHATTAN'), ('140922330', 'MANHATTAN'), ('440606480', 'QUEENS'), ('340743404', 'BROOKLYN'), ('340743440', 'BROOKLYN'), ('402201283', 'QUEENS'), ('402469510', 'QUEENS'), ('402585038', 'QUEENS'), ('310100761', 'BROOKLYN'), ('210041239', 'BRONX'), ('110130643', 'MANHATTAN'), ('440606505', 'QUEENS'), ('402460608', 'QUEENS'), ('410175910', 'QUEENS'), ('120004244', 'MANHATTAN'), ('320110330', 'BROOKLYN'), ('420255084', 'QUEENS'), ('120864920', 'MANHATTAN'), ('120864920', 'MANHATTAN'), ('121143743', 'MANHATTAN'), ('320426035', 'BROOKLYN'), ('320242634', 'BROOKLYN'), ('121458323', 'MANHATTAN'), ('420803223', 'QUEENS'), ('140050290', 'MANHATTAN'), ('320516839', 'BROOKLYN'), ('121581886', 'MANHATTAN'), ('121581886', 'MANHATTAN'), ('220324986', 'BRONX'), ('320714223', 'BROOKLYN'), ('320577595', 'BROOKLYN'), ('420908129', 'QUEENS'), ('320593808', 'BROOKLYN'), ('121989027', 'MANHATTAN'), ('140233968', 'MANHATTAN'), ('302571456', 'BROOKLYN'), ('420976787', 'QUEENS'), ('320577595', 'BROOKLYN'), ('402895284', 'QUEENS'), ('520205448', 'STATEN ISLAND'), ('320577595', 'BROOKLYN'), ('320577595', 'BROOKLYN'), ('320577595', 'BROOKLYN'), ('220423138', 'BRONX'), ('321063549', 'BROOKLYN'), ('220423138', 'BRONX'), ('121192609', 'MANHATTAN'), ('122345293', 'MANHATTAN'), ('140335947', 'MANHATTAN'), ('421151988', 'QUEENS'), ('140351161', 'MANHATTAN'), ('321131191', 'BROOKLYN'), ('321129186', 'BROOKLYN'), ('140358333', 'MANHATTAN'), ('122396308', 'MANHATTAN'), ('421205314', 'QUEENS'), ('122556144', 'MANHATTAN'), ('122604431', 'MANHATTAN'), ('201195660', 'BRONX'), ('520265249', 'STATEN ISLAND'), ('520265258', 'STATEN ISLAND'), ('122450551', 'MANHATTAN'), ('440255670', 'QUEENS'), ('421259257', 'QUEENS'), ('122716409', 'MANHATTAN'), ('440318354', 'QUEENS'), ('321400612', 'BROOKLYN'), ('421256394', 'QUEENS'), ('122832159', 'MANHATTAN'), ('121190567', 'MANHATTAN'), ('121190567', 'MANHATTAN'), ('421341300', 'QUEENS'), ('421341300', 'QUEENS'), ('340394736', 'BROOKLYN'), ('321398947', 'BROOKLYN'), ('440337725', 'QUEENS'), ('540111813', 'STATEN ISLAND'), ('421385496', 'QUEENS'), ('520281800', 'STATEN ISLAND'), ('520281793', 'STATEN ISLAND'), ('340438770', 'BROOKLYN'), ('220152475', 'BRONX'), ('340438761', 'BROOKLYN'), ('421396304', 'QUEENS'), ('421400585', 'QUEENS'), ('340446501', 'BROOKLYN'), ('421401833', 'QUEENS'), ('340452762', 'BROOKLYN'), ('122993485', 'MANHATTAN'), ('220561381', 'BRONX'), ('340465829', 'BROOKLYN'), ('321363877', 'BROOKLYN'), ('321186195', 'BROOKLYN'), ('321523703', 'BROOKLYN'), ('321523703', 'BROOKLYN'), ('123076982', 'MANHATTAN'), ('421472551', 'QUEENS'), ('321184543', 'BROOKLYN'), ('321584139', 'BROOKLYN'), ('321405332', 'BROOKLYN'), ('340519433', 'BROOKLYN'), ('122735273', 'MANHATTAN'), ('421526511', 'QUEENS'), ('321554331', 'BROOKLYN'), ('421462107', 'QUEENS'), ('421482023', 'QUEENS'), ('220604497', 'BRONX'), ('321617087', 'BROOKLYN'), ('340520387', 'BROOKLYN'), ('321626889', 'BROOKLYN'), ('340528227', 'BROOKLYN'), ('140679497', 'MANHATTAN'), ('421540407', 'QUEENS'), ('123117750', 'MANHATTAN'), ('123122833', 'MANHATTAN'), ('220613101', 'BRONX'), ('421543075', 'QUEENS'), ('123141126', 'MANHATTAN'), ('420663482', 'QUEENS'), ('123338450', 'MANHATTAN'), ('123046186', 'MANHATTAN'), ('210177609', 'BRONX'), ('240200377', 'BRONX'), ('321672980', 'BROOKLYN'), ('220607573', 'BRONX'), ('321677707', 'BROOKLYN'), ('123291017', 'MANHATTAN'), ('321681952', 'BROOKLYN'), ('321681952', 'BROOKLYN'), ('240205728', 'BRONX'), ('321663552', 'BROOKLYN'), ('540139036', 'STATEN ISLAND'), ('321687082', 'BROOKLYN'), ('220625688', 'BRONX'), ('421570473', 'QUEENS'), ('220603149', 'BRONX'), ('220604497', 'BRONX'), ('421588071', 'QUEENS'), ('520268068', 'STATEN ISLAND'), ('201201822', 'BRONX'), ('123149716', 'MANHATTAN'), ('321694911', 'BROOKLYN'), ('302576460', 'BROOKLYN'), ('420663437', 'QUEENS'), ('420663437', 'QUEENS'), ('220639389', 'BRONX'), ('321736412', 'BROOKLYN'), ('123411708', 'MANHATTAN'), ('340597866', 'BROOKLYN'), ('321702733', 'BROOKLYN'), ('321734183', 'BROOKLYN'), ('321779517', 'BROOKLYN'), ('321736706', 'BROOKLYN'), ('321697213', 'BROOKLYN'), ('123456624', 'MANHATTAN'), ('123500014', 'MANHATTAN'), ('123396609', 'MANHATTAN'), ('140768122', 'MANHATTAN'), ('123421092', 'MANHATTAN'), ('123421092', 'MANHATTAN'), ('340607775', 'BROOKLYN'), ('421624825', 'QUEENS'), ('220644541', 'BRONX'), ('321759101', 'BROOKLYN'), ('140775695', 'MANHATTAN'), ('321775478', 'BROOKLYN'), ('140777844', 'MANHATTAN'), ('321770810', 'BROOKLYN'), ('321729894', 'BROOKLYN'), ('440491843', 'QUEENS'), ('220657803', 'BRONX'), ('140789966', 'MANHATTAN'), ('140789993', 'MANHATTAN'), ('421099180', 'QUEENS'), ('440502190', 'QUEENS'), ('321826850', 'BROOKLYN'), ('340618870', 'BROOKLYN'), ('421668644', 'QUEENS'), ('122885743', 'MANHATTAN'), ('321827332', 'BROOKLYN'), ('321770810', 'BROOKLYN'), ('123562778', 'MANHATTAN'), ('123544842', 'MANHATTAN'), ('123544842', 'MANHATTAN'), ('210179000', 'BRONX'), ('520355400', 'STATEN ISLAND'), ('440510886', 'QUEENS'), ('440511689', 'QUEENS'), ('520359399', 'STATEN ISLAND'), ('520359399', 'STATEN ISLAND'), ('123480205', 'MANHATTAN'), ('123480651', 'MANHATTAN'), ('520337118', 'STATEN ISLAND'), ('321806266', 'BROOKLYN'), ('123489233', 'MANHATTAN'), ('321070416', 'BROOKLYN'), ('123488948', 'MANHATTAN'), ('321736706', 'BROOKLYN'), ('321822881', 'BROOKLYN'), ('421682423', 'QUEENS'), ('123450103', 'MANHATTAN'), ('421680933', 'QUEENS'), ('123534764', 'MANHATTAN'), ('123408892', 'MANHATTAN'), ('421925652', 'QUEENS'), ('340649711', 'BROOKLYN'), ('340683228', 'BROOKLYN'), ('340649301', 'BROOKLYN'), ('321077516', 'BROOKLYN'), ('321823791', 'BROOKLYN'), ('322023412', 'BROOKLYN'), ('421697792', 'QUEENS'), ('321073379', 'BROOKLYN'), ('321073379', 'BROOKLYN'), ('321073379', 'BROOKLYN'), ('322066152', 'BROOKLYN'), ('321913738', 'BROOKLYN'), ('340655516', 'BROOKLYN'), ('321849470', 'BROOKLYN'), ('123601003', 'MANHATTAN'), ('321916414', 'BROOKLYN'), ('321916414', 'BROOKLYN'), ('421931618', 'QUEENS'), ('421931707', 'QUEENS'), ('440534174', 'QUEENS'), ('321921505', 'BROOKLYN'), ('220686069', 'BRONX'), ('123253228', 'MANHATTAN'), ('440535645', 'QUEENS'), ('421723647', 'QUEENS'), ('321910330', 'BROOKLYN'), ('220692267', 'BRONX'), ('321387405', 'BROOKLYN'), ('321386852', 'BROOKLYN'), ('520374960', 'STATEN ISLAND'), ('321911758', 'BROOKLYN'), ('322065750', 'BROOKLYN'), ('123507632', 'MANHATTAN'), ('123507632', 'MANHATTAN'), ('123507632', 'MANHATTAN'), ('340667095', 'BROOKLYN'), ('440540318', 'QUEENS'), ('123870276', 'MANHATTAN'), ('123835074', 'MANHATTAN'), ('421694848', 'QUEENS'), ('321387389', 'BROOKLYN'), ('123838669', 'MANHATTAN'), ('321939088', 'BROOKLYN'), ('123861598', 'MANHATTAN'), ('321910394', 'BROOKLYN'), ('520378181', 'STATEN ISLAND'), ('520379082', 'STATEN ISLAND'), ('421764291', 'QUEENS'), ('421738800', 'QUEENS'), ('220700711', 'BRONX'), ('321945801', 'BROOKLYN'), ('321945801', 'BROOKLYN'), ('321945810', 'BROOKLYN'), ('220700418', 'BRONX'), ('321386852', 'BROOKLYN'), ('321387405', 'BROOKLYN'), ('340677556', 'BROOKLYN'), ('421862844', 'QUEENS'), ('321951740', 'BROOKLYN'), ('440547936', 'QUEENS'), ('123729527', 'MANHATTAN'), ('123761811', 'MANHATTAN'), ('123761811', 'MANHATTAN'), ('123806925', 'MANHATTAN'), ('103651932', 'MANHATTAN'), ('220705146', 'BRONX'), ('321916904', 'BROOKLYN'), ('340680070', 'BROOKLYN'), ('123766077', 'MANHATTAN'), ('421102185', 'QUEENS'), ('123766674', 'MANHATTAN'), ('140853547', 'MANHATTAN'), ('240256263', 'BRONX'), ('321966681', 'BROOKLYN'), ('123895115', 'MANHATTAN'), ('321967608', 'BROOKLYN'), ('321935670', 'BROOKLYN'), ('321848578', 'BROOKLYN'), ('321593931', 'BROOKLYN'), ('123820268', 'MANHATTAN'), ('220708713', 'BRONX'), ('220708713', 'BRONX'), ('220708713', 'BRONX'), ('520383059', 'STATEN ISLAND'), ('321593931', 'BROOKLYN'), ('421732389', 'QUEENS'), ('220709589', 'BRONX'), ('421920309', 'QUEENS'), ('123689605', 'MANHATTAN'), ('540166602', 'STATEN ISLAND'), ('123769136', 'MANHATTAN'), ('520338117', 'STATEN ISLAND'), ('421952293', 'QUEENS'), ('321594823', 'BROOKLYN'), ('421732370', 'QUEENS'), ('321975957', 'BROOKLYN'), ('321910893', 'BROOKLYN'), ('440562598', 'QUEENS'), ('240260837', 'BRONX'), ('340695260', 'BROOKLYN'), ('340695581', 'BROOKLYN'), ('321984876', 'BROOKLYN'), ('421922370', 'QUEENS'), ('140864483', 'MANHATTAN'), ('123709576', 'MANHATTAN'), ('340699275', 'BROOKLYN'), ('123886633', 'MANHATTAN'), ('440569332', 'QUEENS'), ('520391530', 'STATEN ISLAND'), ('240262522', 'BRONX'), ('340699961', 'BROOKLYN'), ('210180196', 'BRONX'), ('240263326', 'BRONX'), ('140873062', 'MANHATTAN'), ('123744840', 'MANHATTAN'), ('123788124', 'MANHATTAN'), ('440573078', 'QUEENS'), ('240264593', 'BRONX'), ('340705437', 'BROOKLYN'), ('520389981', 'STATEN ISLAND'), ('421906593', 'QUEENS'), ('220672706', 'BRONX'), ('421906094', 'QUEENS'), ('220715297', 'BRONX'), ('421732762', 'QUEENS'), ('322007617', 'BROOKLYN'), ('440575361', 'QUEENS'), ('322004558', 'BROOKLYN'), ('140878539', 'MANHATTAN'), ('121206523', 'MANHATTAN'), ('340708452', 'BROOKLYN'), ('123847329', 'MANHATTAN'), ('520395705', 'STATEN ISLAND'), ('123789515', 'MANHATTAN'), ('421939237', 'QUEENS'), ('421940528', 'QUEENS'), ('540172132', 'STATEN ISLAND'), ('123787278', 'MANHATTAN'), ('220722145', 'BRONX'), ('123725200', 'MANHATTAN'), ('123765283', 'MANHATTAN'), ('321802901', 'BROOKLYN'), ('123205441', 'MANHATTAN'), ('322022654', 'BROOKLYN'), ('322021995', 'BROOKLYN'), ('321986348', 'BROOKLYN'), ('220723377', 'BRONX'), ('321760386', 'BROOKLYN'), ('322017866', 'BROOKLYN'), ('340714837', 'BROOKLYN'), ('220724269', 'BRONX'), ('321596965', 'BROOKLYN'), ('123848809', 'MANHATTAN'), ('440583414', 'QUEENS'), ('123789052', 'MANHATTAN'), ('123050214', 'MANHATTAN'), ('123820909', 'MANHATTAN'), ('123703821', 'MANHATTAN'), ('123700138', 'MANHATTAN'), ('123728323', 'MANHATTAN'), ('340716185', 'BROOKLYN'), ('140886405', 'MANHATTAN'), ('340716666', 'BROOKLYN'), ('421800475', 'QUEENS'), ('123858227', 'MANHATTAN'), ('321588493', 'BROOKLYN'), ('322039227', 'BROOKLYN'), ('340716942', 'BROOKLYN'), ('123795170', 'MANHATTAN'), ('421800581', 'QUEENS'), ('540174167', 'STATEN ISLAND'), ('322032812', 'BROOKLYN'), ('340721703', 'BROOKLYN'), ('123788124', 'MANHATTAN'), ('220641358', 'BRONX'), ('123855587', 'MANHATTAN'), ('140888065', 'MANHATTAN'), ('123842538', 'MANHATTAN'), ('420667095', 'QUEENS'), ('340720624', 'BROOKLYN'), ('123693565', 'MANHATTAN'), ('123572810', 'MANHATTAN'), ('321588992', 'BROOKLYN'), ('123829722', 'MANHATTAN'), ('321594823', 'BROOKLYN'), ('123832095', 'MANHATTAN'), ('421943552', 'QUEENS'), ('421886169', 'QUEENS'), ('123830186', 'MANHATTAN'), ('123830444', 'MANHATTAN'), ('123732988', 'MANHATTAN'), ('322043597', 'BROOKLYN'), ('520392673', 'STATEN ISLAND'), ('520389589', 'STATEN ISLAND'), ('322045130', 'BROOKLYN'), ('123831390', 'MANHATTAN'), ('140891747', 'MANHATTAN'), ('123791664', 'MANHATTAN'), ('440590353', 'QUEENS'), ('421800876', 'QUEENS'), ('322033599', 'BROOKLYN'), ('322032992', 'BROOKLYN'), ('520397847', 'STATEN ISLAND'), ('340723881', 'BROOKLYN'), ('240271870', 'BRONX'), ('520451467', 'STATEN ISLAND'), ('123725086', 'MANHATTAN'), ('123854016', 'MANHATTAN'), ('123875716', 'MANHATTAN'), ('321589768', 'BROOKLYN'), ('322034231', 'BROOKLYN'), ('322033955', 'BROOKLYN'), ('140898955', 'MANHATTAN'), ('140899099', 'MANHATTAN'), ('140898018', 'MANHATTAN'), ('340725460', 'BROOKLYN'), ('421764102', 'QUEENS'), ('321590809', 'BROOKLYN'), ('123854016', 'MANHATTAN'), ('421763327', 'QUEENS'), ('421960471', 'QUEENS'), ('340727618', 'BROOKLYN'), ('440593895', 'QUEENS'), ('440593902', 'QUEENS'), ('440593911', 'QUEENS'), ('440593920', 'QUEENS'), ('440593948', 'QUEENS'), ('322084640', 'BROOKLYN'), ('220683507', 'BRONX'), ('321590872', 'BROOKLYN'), ('220732786', 'BRONX'), ('322085649', 'BROOKLYN'), ('220732866', 'BRONX'), ('322086167', 'BROOKLYN'), ('240273342', 'BRONX'), ('322086354', 'BROOKLYN'), ('123922023', 'MANHATTAN'), ('123912999', 'MANHATTAN'), ('240273663', 'BRONX'), ('220732964', 'BRONX'), ('421765913', 'QUEENS'), ('421766011', 'QUEENS'), ('421765753', 'QUEENS'), ('421764282', 'QUEENS'), ('322086826', 'BROOKLYN'), ('140905527', 'MANHATTAN'), ('140905581', 'MANHATTAN'), ('123542201', 'MANHATTAN'), ('421773058', 'QUEENS'), ('140907525', 'MANHATTAN'), ('421732762', 'QUEENS'), ('321591005', 'BROOKLYN'), ('440595456', 'QUEENS'), ('421732762', 'QUEENS'), ('421767966', 'QUEENS'), ('440597962', 'QUEENS'), ('123922416', 'MANHATTAN'), ('440597025', 'QUEENS'), ('140909792', 'MANHATTAN'), ('421767083', 'QUEENS'), ('440597034', 'QUEENS'), ('321590854', 'BROOKLYN'), ('340731729', 'BROOKLYN'), ('540176432', 'STATEN ISLAND'), ('240274886', 'BRONX'), ('140910628', 'MANHATTAN'), ('440599513', 'QUEENS'), ('140911878', 'MANHATTAN'), ('240275108', 'BRONX'), ('140911681', 'MANHATTAN'), ('540176904', 'STATEN ISLAND'), ('140913457', 'MANHATTAN'), ('140914009', 'MANHATTAN'), ('340736680', 'BROOKLYN'), ('140912859', 'MANHATTAN'), ('140912467', 'MANHATTAN'), ('340740764', 'BROOKLYN'), ('340737563', 'BROOKLYN'), ('440604099', 'QUEENS'), ('140915026', 'MANHATTAN'), ('140915963', 'MANHATTAN'), ('340740817', 'BROOKLYN'), ('121208317', 'MANHATTAN'), ('240277080', 'BRONX'), ('140920760', 'MANHATTAN'), ('140920591', 'MANHATTAN'), ('140920555', 'MANHATTAN'), ('140920902', 'MANHATTAN'), ('421774011', 'QUEENS'), ('140920252', 'MANHATTAN'), ('140920706', 'MANHATTAN'), ('340741825', 'BROOKLYN'), ('322087095', 'BROOKLYN'), ('140920939', 'MANHATTAN'), ('140920975', 'MANHATTAN'), ('140921064', 'MANHATTAN'), ('440605436', 'QUEENS'), ('440605490', 'QUEENS'), ('440605472', 'QUEENS'), ('140921126', 'MANHATTAN'), ('340742030', 'BROOKLYN'), ('440605597', 'QUEENS'), ('240277357', 'BRONX'), ('140921331', 'MANHATTAN'), ('340742307', 'BROOKLYN'), ('340742272', 'BROOKLYN'), ('240277446', 'BRONX'), ('140921420', 'MANHATTAN'), ('440605659', 'QUEENS'), ('140921359', 'MANHATTAN'), ('340742423', 'BROOKLYN'), ('340742432', 'BROOKLYN'), ('140921545', 'MANHATTAN'), ('140921518', 'MANHATTAN'), ('540178029', 'STATEN ISLAND'), ('540178038', 'STATEN ISLAND'), ('140921475', 'MANHATTAN'), ('540178010', 'STATEN ISLAND'), ('340742593', 'BROOKLYN'), ('340742637', 'BROOKLYN'), ('340742548', 'BROOKLYN'), ('340742520', 'BROOKLYN'), ('240277473', 'BRONX'), ('140921616', 'MANHATTAN'), ('340742511', 'BROOKLYN'), ('340742655', 'BROOKLYN'), ('240277543', 'BRONX'), ('140921741', 'MANHATTAN'), ('140921670', 'MANHATTAN'), ('340742646', 'BROOKLYN'), ('140921750', 'MANHATTAN'), ('340742682', 'BROOKLYN'), ('340742708', 'BROOKLYN'), ('321592344', 'BROOKLYN'), ('440605971', 'QUEENS'), ('140921858', 'MANHATTAN'), ('340742799', 'BROOKLYN'), ('340742806', 'BROOKLYN'), ('440606051', 'QUEENS'), ('140921849', 'MANHATTAN'), ('340742780', 'BROOKLYN'), ('340742726', 'BROOKLYN'), ('340742735', 'BROOKLYN'), ('421764273', 'QUEENS'), ('540178065', 'STATEN ISLAND'), ('540182354', 'STATEN ISLAND'), ('440606060', 'QUEENS'), ('102796431', 'MANHATTAN'), ('103971659', 'MANHATTAN'), ('301105756', 'BROOKLYN'), ('104767619', 'MANHATTAN'), ('302015726', 'BROOKLYN'), ('200875062', 'BRONX'), ('240273066', 'BRONX'), ('440604133', 'QUEENS'), ('340740933', 'BROOKLYN'), ('540177761', 'STATEN ISLAND'), ('540177770', 'STATEN ISLAND'), ('340740960', 'BROOKLYN'), ('540177734', 'STATEN ISLAND'), ('240277730', 'BRONX'), ('140919772', 'MANHATTAN'), ('540178154', 'STATEN ISLAND'), ('540178163', 'STATEN ISLAND'), ('540178172', 'STATEN ISLAND'), ('140922367', 'MANHATTAN'), ('440606523', 'QUEENS'), ('340743468', 'BROOKLYN'), ('440606514', 'QUEENS'), ('210180338', 'BRONX'), ('121208317', 'MANHATTAN'), ('340743495', 'BROOKLYN'), ('140922385', 'MANHATTAN'), ('140922376', 'MANHATTAN'), ('210180347', 'BRONX'), ('540178216', 'STATEN ISLAND'), ('140922410', 'MANHATTAN'), ('340743510', 'BROOKLYN'), ('240277749', 'BRONX'), ('440606541', 'QUEENS'), ('340743501', 'BROOKLYN'), ('540178225', 'STATEN ISLAND'), ('220733918', 'BRONX'), ('540178234', 'STATEN ISLAND'), ('340743547', 'BROOKLYN'), ('340743529', 'BROOKLYN'), ('140922447', 'MANHATTAN'), ('440606569', 'QUEENS'), ('140922438', 'MANHATTAN'), ('140922429', 'MANHATTAN'), ('340743556', 'BROOKLYN'), ('240277767', 'BRONX'), ('140922465', 'MANHATTAN'), ('140922483', 'MANHATTAN'), ('140922517', 'MANHATTAN'), ('140922508', 'MANHATTAN'), ('340743565', 'BROOKLYN'), ('140922526', 'MANHATTAN'), ('140922474', 'MANHATTAN'), ('440606578', 'QUEENS'), ('140922535', 'MANHATTAN'), ('140922544', 'MANHATTAN'), ('140922562', 'MANHATTAN'), ('240277785', 'BRONX'), ('140922553', 'MANHATTAN'), ('240277794', 'BRONX'), ('540178261', 'STATEN ISLAND'), ('340743592', 'BROOKLYN'), ('440606587', 'QUEENS'), ('140922580', 'MANHATTAN'), ('140922599', 'MANHATTAN'), ('340743609', 'BROOKLYN'), ('340743583', 'BROOKLYN'), ('140922606', 'MANHATTAN'), ('240277829', 'BRONX'), ('440606596', 'QUEENS'), ('140922633', 'MANHATTAN'), ('340743627', 'BROOKLYN'), ('140922624', 'MANHATTAN'), ('322036863', 'BROOKLYN'), ('240277838', 'BRONX'), ('440606603', 'QUEENS'), ('140922660', 'MANHATTAN'), ('340743636', 'BROOKLYN'), ('440606612', 'QUEENS'), ('140922651', 'MANHATTAN'), ('140922688', 'MANHATTAN'), ('340743645', 'BROOKLYN'), ('140922697', 'MANHATTAN'), ('140922713', 'MANHATTAN'), ('340743654', 'BROOKLYN'), ('340743663', 'BROOKLYN'), ('440606649', 'QUEENS'), ('440606630', 'QUEENS'), ('340743672', 'BROOKLYN'), ('322087228', 'BROOKLYN'), ('140922759', 'MANHATTAN'), ('440606667', 'QUEENS'), ('140922777', 'MANHATTAN'), ('322087237', 'BROOKLYN'), ('340743681', 'BROOKLYN'), ('140922768', 'MANHATTAN'), ('322036701', 'BROOKLYN'), ('123922345', 'MANHATTAN'), ('123922345', 'MANHATTAN'), ('440606701', 'QUEENS'), ('421902196', 'QUEENS'), ('421902196', 'QUEENS'), ('123833511', 'MANHATTAN'), ('240277847', 'BRONX'), ('140922802', 'MANHATTAN'), ('322053326', 'BROOKLYN'), ('322053326', 'BROOKLYN'), ('540178298', 'STATEN ISLAND'), ('340743725', 'BROOKLYN'), ('540178305', 'STATEN ISLAND'), ('340743716', 'BROOKLYN'), ('440606694', 'QUEENS'), ('140922839', 'MANHATTAN'), ('140922820', 'MANHATTAN'), ('340743734', 'BROOKLYN'), ('440606710', 'QUEENS'), ('340743752', 'BROOKLYN'), ('340743743', 'BROOKLYN'), ('140922857', 'MANHATTAN'), ('340743761', 'BROOKLYN'), ('140922866', 'MANHATTAN'), ('440606738', 'QUEENS'), ('140922893', 'MANHATTAN'), ('240277865', 'BRONX'), ('140922900', 'MANHATTAN'), ('140922919', 'MANHATTAN'), ('210181364', 'BRONX'), ('540178332', 'STATEN ISLAND'), ('340743770', 'BROOKLYN'), ('140922946', 'MANHATTAN'), ('440606747', 'QUEENS'), ('340743823', 'BROOKLYN'), ('340743789', 'BROOKLYN'), ('540178350', 'STATEN ISLAND'), ('340743805', 'BROOKLYN'), ('240277874', 'BRONX'), ('340743814', 'BROOKLYN'), ('140922955', 'MANHATTAN'), ('140922973', 'MANHATTAN'), ('440606756', 'QUEENS'), ('140922982', 'MANHATTAN'), ('321592380', 'BROOKLYN'), ('321592399', 'BROOKLYN'), ('140922964', 'MANHATTAN'), ('440606783', 'QUEENS'), ('440606774', 'QUEENS'), ('140923026', 'MANHATTAN'), ('340743869', 'BROOKLYN'), ('140923008', 'MANHATTAN'), ('340743878', 'BROOKLYN'), ('340743850', 'BROOKLYN'), ('402297064', 'QUEENS'), ('402297082', 'QUEENS'), ('110098073', 'MANHATTAN'), ('110097412', 'MANHATTAN'), ('110217015', 'MANHATTAN'), ('145147132', 'MANHATTAN'), ('145147169', 'MANHATTAN'), ('120196073', 'MANHATTAN'), ('220068664', 'BRONX'), ('120428858', 'MANHATTAN'), ('320350972', 'BROOKLYN'), ('420510762', 'QUEENS'), ('320763580', 'BROOKLYN'), ('240277883', 'BRONX'), ('121755582', 'MANHATTAN'), ('320886591', 'BROOKLYN'), ('121566554', 'MANHATTAN'), ('121332664', 'MANHATTAN'), ('240044634', 'BRONX'), ('320593336', 'BROOKLYN'), ('320593336', 'BROOKLYN'), ('121186233', 'MANHATTAN'), ('121329053', 'MANHATTAN'), ('320840060', 'BROOKLYN'), ('121186233', 'MANHATTAN'), ('122093340', 'MANHATTAN'), ('122093340', 'MANHATTAN'), ('122093340', 'MANHATTAN'), ('420976448', 'QUEENS'), ('320919324', 'BROOKLYN'), ('420859814', 'QUEENS'), ('121187214', 'MANHATTAN'), ('122136054', 'MANHATTAN'), ('122136054', 'MANHATTAN'), ('122136376', 'MANHATTAN'), ('121187161', 'MANHATTAN'), ('121187189', 'MANHATTAN'), ('103647216', 'MANHATTAN'), ('122256334', 'MANHATTAN'), ('122256334', 'MANHATTAN'), ('321082788', 'BROOKLYN'), ('320623303', 'BROOKLYN'), ('321097415', 'BROOKLYN'), ('122136054', 'MANHATTAN'), ('421022066', 'QUEENS'), ('122172549', 'MANHATTAN'), ('320623287', 'BROOKLYN'), ('421082857', 'QUEENS'), ('122356191', 'MANHATTAN'), ('122386471', 'MANHATTAN'), ('122386471', 'MANHATTAN'), ('122387942', 'MANHATTAN'), ('321117901', 'BROOKLYN'), ('220447078', 'BRONX'), ('122413307', 'MANHATTAN'), ('520247037', 'STATEN ISLAND'), ('122490232', 'MANHATTAN'), ('140407129', 'MANHATTAN'), ('122528229', 'MANHATTAN'), ('421201238', 'QUEENS'), ('321271529', 'BROOKLYN'), ('122136054', 'MANHATTAN'), ('321275847', 'BROOKLYN'), ('122521814', 'MANHATTAN'), ('421252370', 'QUEENS'), ('421252370', 'QUEENS'), ('421252370', 'QUEENS'), ('122666597', 'MANHATTAN'), ('321316839', 'BROOKLYN'), ('321316223', 'BROOKLYN'), ('421232534', 'QUEENS'), ('240127732', 'BRONX'), ('321288735', 'BROOKLYN'), ('140468438', 'MANHATTAN'), ('140468456', 'MANHATTAN'), ('140468465', 'MANHATTAN'), ('140468474', 'MANHATTAN'), ('121190576', 'MANHATTAN'), ('421229548', 'QUEENS'), ('122758113', 'MANHATTAN'), ('421229548', 'QUEENS'), ('421300791', 'QUEENS'), ('140494301', 'MANHATTAN'), ('321377595', 'BROOKLYN'), ('122806892', 'MANHATTAN'), ('140499958', 'MANHATTAN'), ('140520274', 'MANHATTAN'), ('122814115', 'MANHATTAN'), ('220547558', 'BRONX'), ('122779127', 'MANHATTAN'), ('321442131', 'BROOKLYN'), ('122919672', 'MANHATTAN'), ('340444898', 'BROOKLYN'), ('122924318', 'MANHATTAN'), ('321183349', 'BROOKLYN'), ('122923417', 'MANHATTAN'), ('421405072', 'QUEENS'), ('321195853', 'BROOKLYN'), ('421431187', 'QUEENS'), ('220551016', 'BRONX'), ('123000858', 'MANHATTAN'), ('321547313', 'BROOKLYN'), ('321552128', 'BROOKLYN'), ('240180004', 'BRONX'), ('240180013', 'BRONX'), ('240180022', 'BRONX'), ('240180031', 'BRONX'), ('520282417', 'STATEN ISLAND'), ('121187731', 'MANHATTAN'), ('240180040', 'BRONX'), ('240180059', 'BRONX'), ('240180068', 'BRONX'), ('240180086', 'BRONX'), ('240180095', 'BRONX'), ('123092955', 'MANHATTAN'), ('123092955', 'MANHATTAN'), ('123092955', 'MANHATTAN'), ('321576914', 'BROOKLYN'), ('121291244', 'MANHATTAN'), ('321193524', 'BROOKLYN'), ('123101543', 'MANHATTAN'), ('123101543', 'MANHATTAN'), ('123101543', 'MANHATTAN'), ('340513395', 'BROOKLYN'), ('321606776', 'BROOKLYN'), ('123037132', 'MANHATTAN'), ('122330931', 'MANHATTAN'), ('421522329', 'QUEENS'), ('220603933', 'BRONX'), ('421475166', 'QUEENS'), ('340521493', 'BROOKLYN'), ('123329843', 'MANHATTAN'), ('123099814', 'MANHATTAN'), ('123353897', 'MANHATTAN'), ('520310146', 'STATEN ISLAND'), ('520310146', 'STATEN ISLAND'), ('321618308', 'BROOKLYN'), ('321622730', 'BROOKLYN'), ('123108225', 'MANHATTAN'), ('321640042', 'BROOKLYN'), ('123121022', 'MANHATTAN'), ('520275292', 'STATEN ISLAND'), ('520275292', 'STATEN ISLAND'), ('421545830', 'QUEENS'), ('520135700', 'STATEN ISLAND'), ('321655080', 'BROOKLYN'), ('520303252', 'STATEN ISLAND'), ('220616288', 'BRONX'), ('340549204', 'BROOKLYN'), ('520314589', 'STATEN ISLAND'), ('123339093', 'MANHATTAN'), ('123239584', 'MANHATTAN'), ('421578117', 'QUEENS'), ('321664150', 'BROOKLYN'), ('123257153', 'MANHATTAN'), ('340565748', 'BROOKLYN'), ('123174064', 'MANHATTAN'), ('440458568', 'QUEENS'), ('321715248', 'BROOKLYN'), ('123152417', 'MANHATTAN'), ('220625198', 'BRONX'), ('123210952', 'MANHATTAN'), ('321713393', 'BROOKLYN'), ('421615309', 'QUEENS'), ('123216858', 'MANHATTAN'), ('123216849', 'MANHATTAN'), ('123413779', 'MANHATTAN'), ('123364322', 'MANHATTAN'), ('520321161', 'STATEN ISLAND'), ('421638071', 'QUEENS'), ('340595546', 'BROOKLYN'), ('321694467', 'BROOKLYN'), ('123568709', 'MANHATTAN'), ('420663838', 'QUEENS'), ('520321214', 'STATEN ISLAND'), ('220652666', 'BRONX'), ('123583363', 'MANHATTAN'), ('421650733', 'QUEENS'), ('140782437', 'MANHATTAN'), ('123375926', 'MANHATTAN'), ('123523598', 'MANHATTAN'), ('210178270', 'BRONX'), ('440489259', 'QUEENS'), ('123461949', 'MANHATTAN'), ('321713393', 'BROOKLYN'), ('123523972', 'MANHATTAN'), ('520353091', 'STATEN ISLAND'), ('321821766', 'BROOKLYN'), ('123377602', 'MANHATTAN'), ('123530465', 'MANHATTAN'), ('321383702', 'BROOKLYN'), ('123561831', 'MANHATTAN'), ('421675048', 'QUEENS'), ('210178270', 'BRONX'), ('210178270', 'BRONX'), ('340631962', 'BROOKLYN'), ('321831862', 'BROOKLYN'), ('321835494', 'BROOKLYN'), ('123124920', 'MANHATTAN'), ('520321214', 'STATEN ISLAND'), ('123548349', 'MANHATTAN'), ('500875065', 'STATEN ISLAND'), ('321844180', 'BROOKLYN'), ('321851698', 'BROOKLYN'), ('123505117', 'MANHATTAN'), ('421690343', 'QUEENS'), ('321384426', 'BROOKLYN'), ('421641049', 'QUEENS'), ('123480045', 'MANHATTAN'), ('140820182', 'MANHATTAN'), ('500875323', 'STATEN ISLAND'), ('123558792', 'MANHATTAN'), ('123558792', 'MANHATTAN'), ('140820707', 'MANHATTAN'), ('220679736', 'BRONX'), ('140821136', 'MANHATTAN'), ('321385201', 'BROOKLYN'), ('123596162', 'MANHATTAN'), ('340651592', 'BROOKLYN'), ('123536076', 'MANHATTAN'), ('340652966', 'BROOKLYN'), ('520359709', 'STATEN ISLAND'), ('123659013', 'MANHATTAN'), ('123659013', 'MANHATTAN'), ('240246373', 'BRONX'), ('321916673', 'BROOKLYN'), ('520370278', 'STATEN ISLAND'), ('520370278', 'STATEN ISLAND'), ('421929872', 'QUEENS'), ('240247327', 'BRONX'), ('123669672', 'MANHATTAN'), ('421722880', 'QUEENS'), ('421686054', 'QUEENS'), ('421932680', 'QUEENS'), ('321927233', 'BROOKLYN'), ('321788614', 'BROOKLYN'), ('220690358', 'BRONX'), ('123660680', 'MANHATTAN'), ('520352573', 'STATEN ISLAND'), ('321911570', 'BROOKLYN'), ('421889530', 'QUEENS'), ('123825334', 'MANHATTAN'), ('123664944', 'MANHATTAN'), ('321909869', 'BROOKLYN'), ('123850500', 'MANHATTAN'), ('421672087', 'QUEENS'), ('321931040', 'BROOKLYN'), ('220654414', 'BRONX'), ('321934886', 'BROOKLYN'), ('123704884', 'MANHATTAN'), ('123730043', 'MANHATTAN'), ('123732461', 'MANHATTAN'), ('123732461', 'MANHATTAN'), ('123732452', 'MANHATTAN'), ('321935233', 'BROOKLYN'), ('123836144', 'MANHATTAN'), ('440541683', 'QUEENS'), ('140841178', 'MANHATTAN'), ('123666639', 'MANHATTAN'), ('321387352', 'BROOKLYN'), ('321935723', 'BROOKLYN'), ('321386950', 'BROOKLYN'), ('421716094', 'QUEENS'), ('321921863', 'BROOKLYN'), ('123736127', 'MANHATTAN'), ('123717282', 'MANHATTAN'), ('520379448', 'STATEN ISLAND'), ('210179402', 'BRONX'), ('123655231', 'MANHATTAN'), ('123891360', 'MANHATTAN'), ('123891360', 'MANHATTAN'), ('123891985', 'MANHATTAN'), ('421725878', 'QUEENS'), ('123863024', 'MANHATTAN'), ('123891510', 'MANHATTAN'), ('220689324', 'BRONX'), ('220689333', 'BRONX'), ('520380150', 'STATEN ISLAND'), ('123872032', 'MANHATTAN'), ('540164267', 'STATEN ISLAND'), ('123759361', 'MANHATTAN'), ('340675353', 'BROOKLYN'), ('123899175', 'MANHATTAN'), ('340676664', 'BROOKLYN'), ('123597287', 'MANHATTAN'), ('421935507', 'QUEENS'), ('500875751', 'STATEN ISLAND'), ('340677011', 'BROOKLYN'), ('340677020', 'BROOKLYN'), ('440547491', 'QUEENS'), ('140848395', 'MANHATTAN'), ('321385201', 'BROOKLYN'), ('500875975', 'STATEN ISLAND'), ('140851077', 'MANHATTAN'), ('321945428', 'BROOKLYN'), ('121205436', 'MANHATTAN'), ('240254639', 'BRONX'), ('103651816', 'MANHATTAN'), ('340683059', 'BROOKLYN'), ('123813739', 'MANHATTAN'), ('123813739', 'MANHATTAN'), ('123813739', 'MANHATTAN'), ('121205524', 'MANHATTAN'), ('121205524', 'MANHATTAN'), ('121205524', 'MANHATTAN'), ('121205524', 'MANHATTAN'), ('321195853', 'BROOKLYN'), ('321195853', 'BROOKLYN'), ('520376851', 'STATEN ISLAND'), ('321977802', 'BROOKLYN'), ('421728330', 'QUEENS'), ('140860968', 'MANHATTAN'), ('520388474', 'STATEN ISLAND'), ('121205445', 'MANHATTAN'), ('421743411', 'QUEENS'), ('123767851', 'MANHATTAN'), ('123737108', 'MANHATTAN'), ('123712045', 'MANHATTAN'), ('123767325', 'MANHATTAN'), ('340695796', 'BROOKLYN'), ('421796603', 'QUEENS'), ('520391139', 'STATEN ISLAND'), ('520357131', 'STATEN ISLAND'), ('123802297', 'MANHATTAN'), ('321597214', 'BROOKLYN'), ('321597214', 'BROOKLYN'), ('520391120', 'STATEN ISLAND'), ('140868719', 'MANHATTAN'), ('123816282', 'MANHATTAN'), ('123744270', 'MANHATTAN'), ('321993009', 'BROOKLYN'), ('340697678', 'BROOKLYN'), ('123748114', 'MANHATTAN'), ('321595001', 'BROOKLYN'), ('123712072', 'MANHATTAN'), ('321985848', 'BROOKLYN'), ('340699266', 'BROOKLYN'), ('220717552', 'BRONX'), ('123788614', 'MANHATTAN'), ('123694467', 'MANHATTAN'), ('321995105', 'BROOKLYN'), ('520392799', 'STATEN ISLAND'), ('220717892', 'BRONX'), ('123688394', 'MANHATTAN'), ('321983911', 'BROOKLYN'), ('123791977', 'MANHATTAN'), ('123859128', 'MANHATTAN'), ('123739311', 'MANHATTAN'), ('321595573', 'BROOKLYN'), ('321981637', 'BROOKLYN'), ('123742218', 'MANHATTAN'), ('321647009', 'BROOKLYN'), ('421938167', 'QUEENS'), ('220721128', 'BRONX'), ('421940840', 'QUEENS'), ('123800887', 'MANHATTAN'), ('322021352', 'BROOKLYN'), ('123846133', 'MANHATTAN'), ('340709184', 'BROOKLYN'), ('240266984', 'BRONX'), ('123864130', 'MANHATTAN'), ('420666835', 'QUEENS'), ('123699729', 'MANHATTAN'), ('322031555', 'BROOKLYN'), ('322030360', 'BROOKLYN'), ('540172800', 'STATEN ISLAND'), ('123794037', 'MANHATTAN'), ('321588126', 'BROOKLYN'), ('421801928', 'QUEENS'), ('240267901', 'BRONX'), ('123699480', 'MANHATTAN'), ('421799281', 'QUEENS'), ('123701841', 'MANHATTAN'), ('220725687', 'BRONX'), ('220724884', 'BRONX'), ('321588395', 'BROOKLYN'), ('220690688', 'BRONX'), ('123701084', 'MANHATTAN'), ('322039156', 'BROOKLYN'), ('123855042', 'MANHATTAN'), ('421798638', 'QUEENS'), ('140886361', 'MANHATTAN'), ('421754140', 'QUEENS'), ('440584823', 'QUEENS'), ('123816095', 'MANHATTAN'), ('321742316', 'BROOKLYN'), ('520390032', 'STATEN ISLAND'), ('123843234', 'MANHATTAN'), ('123843396', 'MANHATTAN'), ('123843840', 'MANHATTAN'), ('322069453', 'BROOKLYN'), ('340718129', 'BROOKLYN'), ('420666915', 'QUEENS'), ('140888350', 'MANHATTAN'), ('321971951', 'BROOKLYN'), ('123569012', 'MANHATTAN'), ('340719011', 'BROOKLYN'), ('123839748', 'MANHATTAN'), ('421757539', 'QUEENS'), ('340719253', 'BROOKLYN'), ('322070842', 'BROOKLYN'), ('421909625', 'QUEENS'), ('421910882', 'QUEENS'), ('240269801', 'BRONX'), ('520388330', 'STATEN ISLAND'), ('123572650', 'MANHATTAN'), ('421958420', 'QUEENS'), ('340721302', 'BROOKLYN'), ('322070655', 'BROOKLYN'), ('421946069', 'QUEENS'), ('123789800', 'MANHATTAN'), ('340719958', 'BROOKLYN'), ('510115554', 'STATEN ISLAND'), ('322040359', 'BROOKLYN'), ('322040073', 'BROOKLYN'), ('322030404', 'BROOKLYN'), ('321379968', 'BROOKLYN'), ('140892755', 'MANHATTAN'), ('421959580', 'QUEENS'), ('123811474', 'MANHATTAN'), ('322033606', 'BROOKLYN'), ('220727097', 'BRONX'), ('322033866', 'BROOKLYN'), ('240271745', 'BRONX'), ('121207639', 'MANHATTAN'), ('121208102', 'MANHATTAN'), ('322033875', 'BROOKLYN'), ('123829900', 'MANHATTAN'), ('140898125', 'MANHATTAN'), ('140898401', 'MANHATTAN'), ('140897019', 'MANHATTAN'), ('421899529', 'QUEENS'), ('321590097', 'BROOKLYN'), ('322071351', 'BROOKLYN'), ('140901031', 'MANHATTAN'), ('123831318', 'MANHATTAN'), ('340727379', 'BROOKLYN'), ('140901291', 'MANHATTAN'), ('322084409', 'BROOKLYN'), ('121207719', 'MANHATTAN'), ('340727324', 'BROOKLYN'), ('220721039', 'BRONX'), ('220732633', 'BRONX'), ('340727903', 'BROOKLYN'), ('322047575', 'BROOKLYN'), ('520453875', 'STATEN ISLAND'), ('140903244', 'MANHATTAN'), ('321635343', 'BROOKLYN'), ('440594590', 'QUEENS'), ('220732321', 'BRONX'), ('322037167', 'BROOKLYN'), ('140908695', 'MANHATTAN'), ('440595170', 'QUEENS'), ('123922862', 'MANHATTAN'), ('440595802', 'QUEENS'), ('421960462', 'QUEENS'), ('340730720', 'BROOKLYN'), ('140908034', 'MANHATTAN'), ('220633223', 'BRONX'), ('520398383', 'STATEN ISLAND'), ('421767699', 'QUEENS'), ('140907650', 'MANHATTAN'), ('322071654', 'BROOKLYN'), ('340733601', 'BROOKLYN'), ('140909499', 'MANHATTAN'), ('440601421', 'QUEENS'), ('540177690', 'STATEN ISLAND'), ('440604213', 'QUEENS'), ('440600592', 'QUEENS'), ('440600468', 'QUEENS'), ('440600707', 'QUEENS'), ('340735477', 'BROOKLYN'), ('340740835', 'BROOKLYN'), ('340739240', 'BROOKLYN'), ('440604240', 'QUEENS'), ('440604268', 'QUEENS'), ('440604277', 'QUEENS'), ('440604302', 'QUEENS'), ('220733865', 'BRONX'), ('140920243', 'MANHATTAN'), ('240277035', 'BRONX'), ('440604892', 'QUEENS'), ('140920369', 'MANHATTAN'), ('340740942', 'BROOKLYN'), ('140921073', 'MANHATTAN'), ('240277384', 'BRONX'), ('340742281', 'BROOKLYN'), ('340742352', 'BROOKLYN'), ('340742165', 'BROOKLYN'), ('140921028', 'MANHATTAN'), ('140920911', 'MANHATTAN'), ('440605365', 'QUEENS'), ('440605944', 'QUEENS'), ('140921689', 'MANHATTAN'), ('440605739', 'QUEENS'), ('440605775', 'QUEENS'), ('240277570', 'BRONX'), ('340742851', 'BROOKLYN'), ('340742619', 'BROOKLYN'), ('440605855', 'QUEENS'), ('140921929', 'MANHATTAN'), ('140921938', 'MANHATTAN'), ('340742842', 'BROOKLYN'), ('240277598', 'BRONX'), ('340742977', 'BROOKLYN'), ('340743011', 'BROOKLYN'), ('340743066', 'BROOKLYN'), ('340743020', 'BROOKLYN'), ('140922063', 'MANHATTAN'), ('210181729', 'BRONX'), ('240277641', 'BRONX'), ('140922125', 'MANHATTAN'), ('140922116', 'MANHATTAN'), ('340743119', 'BROOKLYN'), ('240277632', 'BRONX'), ('440606275', 'QUEENS'), ('140922205', 'MANHATTAN'), ('140922223', 'MANHATTAN'), ('140922081', 'MANHATTAN'), ('140922250', 'MANHATTAN'), ('340743164', 'BROOKLYN'), ('140922161', 'MANHATTAN'), ('340743306', 'BROOKLYN'), ('240277721', 'BRONX'), ('440606435', 'QUEENS'), ('240277712', 'BRONX'), ('340743315', 'BROOKLYN'), ('540178145', 'STATEN ISLAND'), ('440606462', 'QUEENS'), ('340743413', 'BROOKLYN'), ('103288684', 'MANHATTAN'), ('103747046', 'MANHATTAN'), ('201051958', 'BRONX'), ('340743422', 'BROOKLYN'), ('340743431', 'BROOKLYN'), ('103288684', 'MANHATTAN'), ('440606499', 'QUEENS'), ('104373492', 'MANHATTAN'), ('201058381', 'BRONX'), ('301322307', 'BROOKLYN'), ('301481625', 'BROOKLYN'), ('340759646', 'BROOKLYN'), ('421764264', 'QUEENS'), ('421776180', 'QUEENS'), ('340759655', 'BROOKLYN'), ('140944628', 'MANHATTAN'), ('140919736', 'MANHATTAN'), ('140923080', 'MANHATTAN'), ('440606809', 'QUEENS'), ('540178387', 'STATEN ISLAND'), ('340743896', 'BROOKLYN'), ('140923044', 'MANHATTAN'), ('140923071', 'MANHATTAN'), ('140923053', 'MANHATTAN'), ('140923099', 'MANHATTAN'), ('340743930', 'BROOKLYN'), ('240277909', 'BRONX'), ('340743903', 'BROOKLYN'), ('340743921', 'BROOKLYN'), ('540178396', 'STATEN ISLAND'), ('210181364', 'BRONX'), ('140923133', 'MANHATTAN'), ('340743967', 'BROOKLYN'), ('340743976', 'BROOKLYN'), ('140923124', 'MANHATTAN'), ('340743949', 'BROOKLYN'), ('240277918', 'BRONX'), ('240277927', 'BRONX'), ('220733909', 'BRONX'), ('220721253', 'BRONX'), ('220721262', 'BRONX'), ('220721271', 'BRONX'), ('140923179', 'MANHATTAN'), ('240277936', 'BRONX'), ('140923160', 'MANHATTAN'), ('140923197', 'MANHATTAN'), ('220733927', 'BRONX'), ('540178412', 'STATEN ISLAND'), ('440606845', 'QUEENS'), ('440606854', 'QUEENS'), ('240277954', 'BRONX'), ('140923188', 'MANHATTAN'), ('440606863', 'QUEENS'), ('140923213', 'MANHATTAN'), ('440606872', 'QUEENS'), ('340743994', 'BROOKLYN'), ('140923231', 'MANHATTAN'), ('440606881', 'QUEENS'), ('340744010', 'BROOKLYN'), ('440606925', 'QUEENS'), ('140923277', 'MANHATTAN'), ('140923286', 'MANHATTAN'), ('440606907', 'QUEENS'), ('440606916', 'QUEENS'), ('140923268', 'MANHATTAN'), ('240277972', 'BRONX'), ('140923311', 'MANHATTAN'), ('440606943', 'QUEENS'), ('340759673', 'BROOKLYN'), ('440606934', 'QUEENS'), ('140923295', 'MANHATTAN'), ('140923302', 'MANHATTAN'), ('340744029', 'BROOKLYN'), ('440606998', 'QUEENS'), ('440607014', 'QUEENS'), ('440606970', 'QUEENS'), ('140923320', 'MANHATTAN'), ('440606989', 'QUEENS'), ('140923339', 'MANHATTAN'), ('210181747', 'BRONX'), ('340744047', 'BROOKLYN'), ('123922318', 'MANHATTAN'), ('440607023', 'QUEENS'), ('540178485', 'STATEN ISLAND'), ('140923348', 'MANHATTAN'), ('140923366', 'MANHATTAN'), ('140923375', 'MANHATTAN'), ('440607032', 'QUEENS'), ('340744056', 'BROOKLYN'), ('123922327', 'MANHATTAN'), ('123922336', 'MANHATTAN'), ('340744083', 'BROOKLYN'), ('340744092', 'BROOKLYN'), ('340744065', 'BROOKLYN'), ('140923393', 'MANHATTAN'), ('340744109', 'BROOKLYN'), ('140923400', 'MANHATTAN'), ('520451788', 'STATEN ISLAND'), ('140923437', 'MANHATTAN'), ('140923455', 'MANHATTAN'), ('440607078', 'QUEENS'), ('140923428', 'MANHATTAN'), ('340744118', 'BROOKLYN'), ('540178494', 'STATEN ISLAND'), ('340744127', 'BROOKLYN'), ('240277990', 'BRONX'), ('340744145', 'BROOKLYN'), ('140923473', 'MANHATTAN'), ('440607096', 'QUEENS'), ('140923464', 'MANHATTAN'), ('140923491', 'MANHATTAN'), ('240278016', 'BRONX'), ('140923446', 'MANHATTAN'), ('140923516', 'MANHATTAN'), ('140923534', 'MANHATTAN'), ('140923525', 'MANHATTAN'), ('140923507', 'MANHATTAN'), ('240278007', 'BRONX'), ('140923552', 'MANHATTAN'), ('201204302', 'BRONX'), ('140923570', 'MANHATTAN'), ('440607130', 'QUEENS'), ('121208433', 'MANHATTAN'), ('440607149', 'QUEENS'), ('140944655', 'MANHATTAN'), ('140944664', 'MANHATTAN'), ('210181747', 'BRONX'), ('140923605', 'MANHATTAN'), ('140923614', 'MANHATTAN'), ('340744207', 'BROOKLYN'), ('240278025', 'BRONX'), ('440607158', 'QUEENS'), ('440607121', 'QUEENS'), ('140923598', 'MANHATTAN'), ('240278034', 'BRONX'), ('440607185', 'QUEENS'), ('540178537', 'STATEN ISLAND'), ('340744225', 'BROOKLYN'), ('340744243', 'BROOKLYN'), ('421884492', 'QUEENS'), ('421715610', 'QUEENS'), ('440607238', 'QUEENS'), ('440607247', 'QUEENS'), ('140923650', 'MANHATTAN'), ('140923641', 'MANHATTAN'), ('440607201', 'QUEENS'), ('440607194', 'QUEENS'), ('302079248', 'BROOKLYN'), ('240278052', 'BRONX'), ('140923687', 'MANHATTAN'), ('302066528', 'BROOKLYN'), ('140923669', 'MANHATTAN'), ('302098290', 'BROOKLYN'), ('302290465', 'BROOKLYN'), ('302290465', 'BROOKLYN'), ('401895080', 'QUEENS'), ('402064109', 'QUEENS'), ('500401825', 'STATEN ISLAND'), ('302290465', 'BROOKLYN'), ('310220953', 'BROOKLYN'), ('110426619', 'MANHATTAN'), ('310005437', 'BROOKLYN'), ('420027697', 'QUEENS'), ('520020281', 'STATEN ISLAND'), ('320145393', 'BROOKLYN'), ('220065783', 'BRONX'), ('320169884', 'BROOKLYN'), ('320190958', 'BROOKLYN'), ('320169884', 'BROOKLYN'), ('120571434', 'MANHATTAN'), ('320276358', 'BROOKLYN'), ('320312130', 'BROOKLYN'), ('420363494', 'QUEENS'), ('420363494', 'QUEENS'), ('520082204', 'STATEN ISLAND'), ('420330378', 'QUEENS'), ('121183236', 'MANHATTAN'), ('121183236', 'MANHATTAN'), ('121183236', 'MANHATTAN'), ('121183236', 'MANHATTAN'), ('121183236', 'MANHATTAN'), ('121183129', 'MANHATTAN'), ('420533747', 'QUEENS'), ('320506207', 'BROOKLYN'), ('520111129', 'STATEN ISLAND'), ('420632809', 'QUEENS'), ('220237456', 'BRONX'), ('420788035', 'QUEENS'), ('520145860', 'STATEN ISLAND'), ('103644647', 'MANHATTAN'), ('320882808', 'BROOKLYN'), ('121839555', 'MANHATTAN'), ('220358832', 'BRONX'), ('320883709', 'BROOKLYN'), ('340143151', 'BROOKLYN'), ('122079749', 'MANHATTAN'), ('320978000', 'BROOKLYN'), ('122104695', 'MANHATTAN'), ('321037098', 'BROOKLYN'), ('320860252', 'BROOKLYN'), ('122231619', 'MANHATTAN'), ('520217863', 'STATEN ISLAND'), ('122336052', 'MANHATTAN'), ('140322158', 'MANHATTAN'), ('122336597', 'MANHATTAN'), ('402897594', 'QUEENS'), ('321084429', 'BROOKLYN'), ('140322906', 'MANHATTAN'), ('122182903', 'MANHATTAN'), ('140381931', 'MANHATTAN'), ('321180253', 'BROOKLYN'), ('520239803', 'STATEN ISLAND'), ('321176491', 'BROOKLYN'), ('340313501', 'BROOKLYN'), ('340313510', 'BROOKLYN'), ('140421844', 'MANHATTAN'), ('220471219', 'BRONX'), ('320909709', 'BROOKLYN'), ('340325776', 'BROOKLYN'), ('302578299', 'BROOKLYN'), ('220490742', 'BRONX'), ('421245637', 'QUEENS'), ('122639270', 'MANHATTAN'), ('122639270', 'MANHATTAN'), ('122639270', 'MANHATTAN'), ('122639270', 'MANHATTAN'), ('340328345', 'BROOKLYN'), ('440283006', 'QUEENS'), ('122668648', 'MANHATTAN'), ('321196157', 'BROOKLYN'), ('122682338', 'MANHATTAN'), ('122745100', 'MANHATTAN'), ('321295736', 'BROOKLYN'), ('122760654', 'MANHATTAN'), ('122788297', 'MANHATTAN'), ('122770180', 'MANHATTAN'), ('103649385', 'MANHATTAN'), ('421337397', 'QUEENS'), ('421201522', 'QUEENS'), ('321411575', 'BROOKLYN'), ('440321466', 'QUEENS'), ('140526394', 'MANHATTAN'), ('140526465', 'MANHATTAN'), ('140524323', 'MANHATTAN'), ('140526562', 'MANHATTAN'), ('321431134', 'BROOKLYN'), ('122842317', 'MANHATTAN'), ('122843272', 'MANHATTAN'), ('140540127', 'MANHATTAN'), ('421363535', 'QUEENS'), ('321195274', 'BROOKLYN'), ('122857612', 'MANHATTAN'), ('140526660', 'MANHATTAN'), ('220561327', 'BRONX'), ('220561327', 'BRONX'), ('302573034', 'BROOKLYN'), ('122870456', 'MANHATTAN'), ('220577677', 'BRONX'), ('122996534', 'MANHATTAN'), ('122999773', 'MANHATTAN'), ('122924513', 'MANHATTAN'), ('421374275', 'QUEENS'), ('421159123', 'QUEENS'), ('123045702', 'MANHATTAN'), ('321327131', 'BROOKLYN'), ('321499936', 'BROOKLYN'), ('321496886', 'BROOKLYN'), ('123049833', 'MANHATTAN'), ('121187802', 'MANHATTAN'), ('321551110', 'BROOKLYN'), ('321551110', 'BROOKLYN'), ('440407365', 'QUEENS'), ('220601061', 'BRONX'), ('321193819', 'BROOKLYN'), ('421437127', 'QUEENS'), ('520277520', 'STATEN ISLAND'), ('121291271', 'MANHATTAN'), ('140662496', 'MANHATTAN'), ('123311255', 'MANHATTAN'), ('321608630', 'BROOKLYN'), ('123098254', 'MANHATTAN'), ('321615365', 'BROOKLYN'), ('122098951', 'MANHATTAN'), ('421528724', 'QUEENS'), ('121232825', 'MANHATTAN'), ('321583568', 'BROOKLYN'), ('321188157', 'BROOKLYN'), ('123107832', 'MANHATTAN'), ('321188237', 'BROOKLYN'), ('321188246', 'BROOKLYN'), ('321188264', 'BROOKLYN'), ('321188424', 'BROOKLYN'), ('321635637', 'BROOKLYN'), ('123110882', 'MANHATTAN'), ('220551025', 'BRONX'), ('421536911', 'QUEENS'), ('321660966', 'BROOKLYN'), ('123180128', 'MANHATTAN'), ('123161381', 'MANHATTAN'), ('123161381', 'MANHATTAN'), ('123339734', 'MANHATTAN'), ('123290571', 'MANHATTAN'), ('321673088', 'BROOKLYN'), ('123241134', 'MANHATTAN'), ('123200311', 'MANHATTAN'), ('520318200', 'STATEN ISLAND'), ('421571828', 'QUEENS'), ('123277854', 'MANHATTAN'), ('321679947', 'BROOKLYN'), ('321673088', 'BROOKLYN'), ('321673088', 'BROOKLYN'), ('123176035', 'MANHATTAN'), ('123174518', 'MANHATTAN'), ('123174518', 'MANHATTAN'), ('421594457', 'QUEENS'), ('321191919', 'BROOKLYN'), ('321673088', 'BROOKLYN'), ('321702136', 'BROOKLYN'), ('421569341', 'QUEENS'), ('321673088', 'BROOKLYN'), ('320910190', 'BROOKLYN'), ('123175704', 'MANHATTAN'), ('123175704', 'MANHATTAN'), ('220610916', 'BRONX'), ('123153559', 'MANHATTAN'), ('123174769', 'MANHATTAN'), ('140751069', 'MANHATTAN'), ('140751078', 'MANHATTAN'), ('321732014', 'BROOKLYN'), ('123355797', 'MANHATTAN'), ('123390197', 'MANHATTAN'), ('302582426', 'BROOKLYN'), ('123458310', 'MANHATTAN'), ('123457286', 'MANHATTAN'), ('123425668', 'MANHATTAN'), ('421627591', 'QUEENS'), ('302582827', 'BROOKLYN'), ('321725344', 'BROOKLYN'), ('421104851', 'QUEENS'), ('123456214', 'MANHATTAN'), ('421632987', 'QUEENS'), ('421632978', 'QUEENS'), ('421632996', 'QUEENS'), ('123566596', 'MANHATTAN'), ('123388707', 'MANHATTAN'), ('123566587', 'MANHATTAN'), ('123454323', 'MANHATTAN'), ('123420495', 'MANHATTAN'), ('123564847', 'MANHATTAN'), ('123420100', 'MANHATTAN'), ('123564874', 'MANHATTAN'), ('340610823', 'BROOKLYN'), ('123582523', 'MANHATTAN'), ('421651331', 'QUEENS'), ('123580847', 'MANHATTAN'), ('540150726', 'STATEN ISLAND'), ('140771993', 'MANHATTAN'), ('220657340', 'BRONX'), ('340617292', 'BROOKLYN'), ('140787762', 'MANHATTAN'), ('123474454', 'MANHATTAN'), ('321768306', 'BROOKLYN'), ('123530278', 'MANHATTAN'), ('321774512', 'BROOKLYN'), ('421665763', 'QUEENS'), ('421668662', 'QUEENS'), ('321825995', 'BROOKLYN'), ('421465024', 'QUEENS'), ('123542425', 'MANHATTAN'), ('123516506', 'MANHATTAN'), ('123547322', 'MANHATTAN'), ('123547322', 'MANHATTAN'), ('123547322', 'MANHATTAN'), ('123215458', 'MANHATTAN'), ('123468443', 'MANHATTAN'), ('123237210', 'MANHATTAN'), ('123468087', 'MANHATTAN'), ('123497260', 'MANHATTAN'), ('321852232', 'BROOKLYN'), ('321848444', 'BROOKLYN'), ('321077534', 'BROOKLYN'), ('421692029', 'QUEENS'), ('520361910', 'STATEN ISLAND'), ('421696285', 'QUEENS'), ('321074902', 'BROOKLYN'), ('321073770', 'BROOKLYN'), ('123536245', 'MANHATTAN'), ('421678713', 'QUEENS'), ('421923618', 'QUEENS'), ('123160337', 'MANHATTAN'), ('220676392', 'BRONX'), ('123590756', 'MANHATTAN'), ('123160337', 'MANHATTAN'), ('220681126', 'BRONX'), ('421714434', 'QUEENS'), ('321905319', 'BROOKLYN'), ('321905319', 'BROOKLYN'), ('123408231', 'MANHATTAN'), ('321903552', 'BROOKLYN'), ('520368815', 'STATEN ISLAND'), ('123417196', 'MANHATTAN'), ('123510762', 'MANHATTAN'), ('140828326', 'MANHATTAN'), ('321918305', 'BROOKLYN'), ('123668744', 'MANHATTAN'), ('340656882', 'BROOKLYN'), ('220686096', 'BRONX'), ('421672755', 'QUEENS'), ('123672212', 'MANHATTAN'), ('123672212', 'MANHATTAN'), ('201199041', 'BRONX'), ('302585762', 'BROOKLYN'), ('123417196', 'MANHATTAN'), ('123527889', 'MANHATTAN'), ('123590881', 'MANHATTAN'), ('340662900', 'BROOKLYN'), ('321929017', 'BROOKLYN'), ('123756774', 'MANHATTAN'), ('123717246', 'MANHATTAN'), ('123677208', 'MANHATTAN'), ('520375834', 'STATEN ISLAND'), ('123850528', 'MANHATTAN'), ('321928349', 'BROOKLYN'), ('321386950', 'BROOKLYN'), ('420665355', 'QUEENS'), ('321845170', 'BROOKLYN'), ('321752206', 'BROOKLYN'), ('421687446', 'QUEENS'), ('220696913', 'BRONX'), ('123716844', 'MANHATTAN'), ('123861865', 'MANHATTAN'), ('123716844', 'MANHATTAN'), ('123861534', 'MANHATTAN'), ('123835216', 'MANHATTAN'), ('123835216', 'MANHATTAN'), ('123252452', 'MANHATTAN'), ('440542496', 'QUEENS'), ('520377681', 'STATEN ISLAND'), ('440542646', 'QUEENS'), ('123834510', 'MANHATTAN'), ('123834501', 'MANHATTAN'), ('421741841', 'QUEENS'), ('220684604', 'BRONX'), ('123834495', 'MANHATTAN'), ('123807899', 'MANHATTAN'), ('340674951', 'BROOKLYN'), ('321072726', 'BROOKLYN'), ('123763472', 'MANHATTAN'), ('421933723', 'QUEENS'), ('321944768', 'BROOKLYN'), ('201199513', 'BRONX'), ('140849143', 'MANHATTAN'), ('520382933', 'STATEN ISLAND'), ('421935990', 'QUEENS'), ('421934884', 'QUEENS'), ('123863079', 'MANHATTAN'), ('321947168', 'BROOKLYN'), ('321950732', 'BROOKLYN'), ('302586752', 'BROOKLYN'), ('140850791', 'MANHATTAN'), ('123895703', 'MANHATTAN'), ('123896329', 'MANHATTAN'), ('321961490', 'BROOKLYN'), ('123687402', 'MANHATTAN'), ('321371190', 'BROOKLYN'), ('220695861', 'BRONX'), ('321775977', 'BROOKLYN'), ('321775977', 'BROOKLYN'), ('123898336', 'MANHATTAN'), ('123813196', 'MANHATTAN'), ('321960320', 'BROOKLYN'), ('321968340', 'BROOKLYN'), ('240256290', 'BRONX'), ('103651996', 'MANHATTAN'), ('201202661', 'BRONX'), ('123708693', 'MANHATTAN'), ('123708693', 'MANHATTAN'), ('123774497', 'MANHATTAN'), ('220700980', 'BRONX'), ('421919142', 'QUEENS'), ('123809637', 'MANHATTAN'), ('421926134', 'QUEENS'), ('520387439', 'STATEN ISLAND'), ('123799185', 'MANHATTAN'), ('340687242', 'BROOKLYN'), ('321068269', 'BROOKLYN'), ('440557728', 'QUEENS'), ('123799960', 'MANHATTAN'), ('123693921', 'MANHATTAN'), ('123800333', 'MANHATTAN'), ('123800342', 'MANHATTAN'), ('220710336', 'BRONX'), ('210179876', 'BRONX'), ('340693379', 'BROOKLYN'), ('421745035', 'QUEENS'), ('421746873', 'QUEENS'), ('340695322', 'BROOKLYN'), ('321984304', 'BROOKLYN'), ('240261961', 'BRONX'), ('520367950', 'STATEN ISLAND'), ('322012433', 'BROOKLYN'), ('321597651', 'BROOKLYN'), ('123746107', 'MANHATTAN'), ('123746090', 'MANHATTAN'), ('322016689', 'BROOKLYN'), ('340698310', 'BROOKLYN'), ('123784707', 'MANHATTAN'), ('321597651', 'BROOKLYN'), ('220715634', 'BRONX'), ('421910640', 'QUEENS'), ('123787045', 'MANHATTAN'), ('440570543', 'QUEENS'), ('140874980', 'MANHATTAN'), ('240264245', 'BRONX'), ('321723355', 'BROOKLYN'), ('321999897', 'BROOKLYN'), ('421903168', 'QUEENS'), ('322002845', 'BROOKLYN'), ('421909386', 'QUEENS'), ('220719042', 'BRONX'), ('340704615', 'BROOKLYN'), ('421907342', 'QUEENS'), ('322003498', 'BROOKLYN'), ('440576663', 'QUEENS'), ('421743420', 'QUEENS'), ('321962300', 'BROOKLYN'), ('220718980', 'BRONX'), ('322014565', 'BROOKLYN'), ('322015573', 'BROOKLYN'), ('540172034', 'STATEN ISLAND'), ('240266216', 'BRONX'), ('123790647', 'MANHATTAN'), ('220685872', 'BRONX'), ('220720405', 'BRONX'), ('220722074', 'BRONX'), ('123725399', 'MANHATTAN'), ('220701783', 'BRONX'), ('421782128', 'QUEENS'), ('322014681', 'BROOKLYN'), ('420666773', 'QUEENS'), ('540172739', 'STATEN ISLAND'), ('123726664', 'MANHATTAN'), ('421939674', 'QUEENS'), ('421780246', 'QUEENS'), ('321998790', 'BROOKLYN'), ('321405029', 'BROOKLYN'), ('421801465', 'QUEENS'), ('140883952', 'MANHATTAN'), ('321903393', 'BROOKLYN'), ('220724492', 'BRONX'), ('340714793', 'BROOKLYN'), ('322031145', 'BROOKLYN'), ('220580226', 'BRONX'), ('322022556', 'BROOKLYN'), ('220723867', 'BRONX'), ('123702387', 'MANHATTAN'), ('421799744', 'QUEENS'), ('440583334', 'QUEENS'), ('322016607', 'BROOKLYN'), ('123511020', 'MANHATTAN'), ('322029336', 'BROOKLYN'), ('140886174', 'MANHATTAN'), ('123342846', 'MANHATTAN'), ('340716504', 'BROOKLYN'), ('322061362', 'BROOKLYN'), ('240268848', 'BRONX'), ('122881097', 'MANHATTAN'), ('520399578', 'STATEN ISLAND'), ('123840022', 'MANHATTAN'), ('220726285', 'BRONX'), ('240269534', 'BRONX'), ('220726445', 'BRONX'), ('322069042', 'BROOKLYN'), ('322070003', 'BROOKLYN'), ('123818333', 'MANHATTAN'), ('322070600', 'BROOKLYN'), ('421943133', 'QUEENS'), ('220727364', 'BRONX'), ('321076081', 'BROOKLYN'), ('140889536', 'MANHATTAN'), ('322070129', 'BROOKLYN'), ('123844581', 'MANHATTAN'), ('220727408', 'BRONX'), ('123829410', 'MANHATTAN'), ('520378555', 'STATEN ISLAND'), ('340720928', 'BROOKLYN'), ('322043490', 'BROOKLYN'), ('123829875', 'MANHATTAN'), ('123829875', 'MANHATTAN'), ('421943776', 'QUEENS'), ('123573828', 'MANHATTAN'), ('421659707', 'QUEENS'), ('322072788', 'BROOKLYN'), ('520452117', 'STATEN ISLAND'), ('440589926', 'QUEENS'), ('322045835', 'BROOKLYN'), ('421960097', 'QUEENS'), ('540174826', 'STATEN ISLAND'), ('123831522', 'MANHATTAN'), ('220728390', 'BRONX'), ('421941563', 'QUEENS'), ('123830934', 'MANHATTAN'), ('421960088', 'QUEENS'), ('123875912', 'MANHATTAN'), ('440590996', 'QUEENS'), ('123866628', 'MANHATTAN'), ('322030510', 'BROOKLYN'), ('440590344', 'QUEENS'), ('421961693', 'QUEENS'), ('340724372', 'BROOKLYN'), ('123832576', 'MANHATTAN'), ('123832576', 'MANHATTAN'), ('123910633', 'MANHATTAN'), ('140898189', 'MANHATTAN'), ('140896225', 'MANHATTAN'), ('123829072', 'MANHATTAN'), ('123702948', 'MANHATTAN'), ('140898857', 'MANHATTAN'), ('123896604', 'MANHATTAN'), ('123832674', 'MANHATTAN'), ('201204302', 'BRONX'), ('240272842', 'BRONX'), ('123913809', 'MANHATTAN'), ('322004120', 'BROOKLYN'), ('322085177', 'BROOKLYN'), ('421763390', 'QUEENS'), ('140901111', 'MANHATTAN'), ('322084775', 'BROOKLYN'), ('322084775', 'BROOKLYN'), ('440594750', 'QUEENS'), ('140901255', 'MANHATTAN'), ('340727761', 'BROOKLYN'), ('210181364', 'BRONX'), ('240273529', 'BRONX'), ('140908604', 'MANHATTAN'), ('520453009', 'STATEN ISLAND'), ('322037577', 'BROOKLYN'), ('322070218', 'BROOKLYN'), ('322041544', 'BROOKLYN'), ('322031145', 'BROOKLYN'), ('421861845', 'QUEENS'), ('340732390', 'BROOKLYN'), ('140904760', 'MANHATTAN'), ('440596464', 'QUEENS'), ('140905493', 'MANHATTAN'), ('220722733', 'BRONX'), ('140919059', 'MANHATTAN'), ('240274083', 'BRONX'), ('520450413', 'STATEN ISLAND'), ('340732755', 'BROOKLYN'), ('322086960', 'BROOKLYN'), ('340730524', 'BROOKLYN'), ('421767902', 'QUEENS'), ('140907856', 'MANHATTAN'), ('140910548', 'MANHATTAN'), ('440597855', 'QUEENS'), ('240274984', 'BRONX'), ('440598033', 'QUEENS'), ('140912840', 'MANHATTAN'), ('140913153', 'MANHATTAN'), ('340737313', 'BROOKLYN'), ('140911770', 'MANHATTAN'), ('140914090', 'MANHATTAN'), ('140913171', 'MANHATTAN'), ('240275493', 'BRONX'), ('140912369', 'MANHATTAN'), ('540177510', 'STATEN ISLAND'), ('340739945', 'BROOKLYN'), ('440603535', 'QUEENS'), ('140915981', 'MANHATTAN'), ('140919781', 'MANHATTAN'), ('140915972', 'MANHATTAN'), ('340741987', 'BROOKLYN'), ('140921411', 'MANHATTAN'), ('140920234', 'MANHATTAN'), ('140920813', 'MANHATTAN'), ('340741692', 'BROOKLYN'), ('440605695', 'QUEENS'), ('140920118', 'MANHATTAN'), ('340741451', 'BROOKLYN'), ('340742334', 'BROOKLYN'), ('440606131', 'QUEENS'), ('240277605', 'BRONX'), ('440606211', 'QUEENS'), ('140921563', 'MANHATTAN'), ('440605702', 'QUEENS'), ('440606140', 'QUEENS'), ('140922009', 'MANHATTAN'), ('340743173', 'BROOKLYN'), ('140922134', 'MANHATTAN'), ('340743217', 'BROOKLYN'), ('540178109', 'STATEN ISLAND'), ('340743208', 'BROOKLYN'), ('340743084', 'BROOKLYN'), ('240277696', 'BRONX'), ('240277703', 'BRONX'), ('340743477', 'BROOKLYN'), ('123920739', 'MANHATTAN'), ('340743459', 'BROOKLYN'), ('140922394', 'MANHATTAN'), ('140922358', 'MANHATTAN'), ('440606471', 'QUEENS'), ('440606532', 'QUEENS'), ('123920720', 'MANHATTAN'), ('140922456', 'MANHATTAN'), ('140922679', 'MANHATTAN'), ('440606685', 'QUEENS'), ('340743707', 'BROOKLYN'), ('140922848', 'MANHATTAN'), ('140922811', 'MANHATTAN'), ('540178289', 'STATEN ISLAND'), ('440606658', 'QUEENS'), ('440606676', 'QUEENS'), ('140922786', 'MANHATTAN'), ('340743798', 'BROOKLYN'), ('140922937', 'MANHATTAN'), ('540178341', 'STATEN ISLAND'), ('140922875', 'MANHATTAN'), ('340743887', 'BROOKLYN'), ('540178378', 'STATEN ISLAND'), ('103817014', 'MANHATTAN'), ('104794082', 'MANHATTAN'), ('200612202', 'BRONX'), ('301392035', 'BROOKLYN'), ('302011285', 'BROOKLYN'), ('301355272', 'BROOKLYN'), ('103346988', 'MANHATTAN'), ('140923017', 'MANHATTAN'), ('140923730', 'MANHATTAN'), ('140923703', 'MANHATTAN'), ('440607274', 'QUEENS'), ('140923721', 'MANHATTAN'), ('440607265', 'QUEENS'), ('140919763', 'MANHATTAN'), ('240278070', 'BRONX'), ('340744314', 'BROOKLYN'), ('340744323', 'BROOKLYN'), ('140923758', 'MANHATTAN'), ('140923712', 'MANHATTAN'), ('420667914', 'QUEENS'), ('321592200', 'BROOKLYN'), ('540178555', 'STATEN ISLAND'), ('140923801', 'MANHATTAN'), ('140923767', 'MANHATTAN'), ('240278098', 'BRONX'), ('340744350', 'BROOKLYN'), ('440607283', 'QUEENS'), ('140923776', 'MANHATTAN'), ('140923785', 'MANHATTAN'), ('140923810', 'MANHATTAN'), ('340744369', 'BROOKLYN'), ('201204883', 'BRONX'), ('201204883', 'BRONX'), ('140923847', 'MANHATTAN'), ('340744378', 'BROOKLYN')]

Const

Const is an Evaluation function that creates a column with the provided constant value. For e.g:

from openclean.function.eval.base import Const

complaint_phone = Const('311').eval(ds)

print(complaint_phone)
['311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311', '311']

And

And is an important logical Evaluation function that validates whether the outputs of the input functions are all true and creates a list of predicates.

from openclean.function.eval.logic import And

pred = And(Eval('Borough', str.lower) == str.lower('BROOKLYN'), Col('Street Name') == 'BROADWAY').eval(ds)

print(ds[pred])
          Job #   Borough Street Name           GIS_NTA_NAME
1121  340738303  BROOKLYN    BROADWAY             Ocean Hill
1925  340739099  BROOKLYN    BROADWAY             Ocean Hill
2348  321941182  BROOKLYN    BROADWAY             Ocean Hill
2422  322038497  BROOKLYN    BROADWAY     Stuyvesant Heights
2467  322043775  BROOKLYN    BROADWAY     Stuyvesant Heights
2468  322043775  BROOKLYN    BROADWAY     Stuyvesant Heights
2615  322036337  BROOKLYN    BROADWAY           Williamsburg
2783  340739400  BROOKLYN    BROADWAY             Ocean Hill
2973  321612830  BROOKLYN    BROADWAY         Bushwick South
3197  321595387  BROOKLYN    BROADWAY     Stuyvesant Heights
3208  321595387  BROOKLYN    BROADWAY     Stuyvesant Heights
3481  340737297  BROOKLYN    BROADWAY  North Side-South Side
3496  340738045  BROOKLYN    BROADWAY         Bushwick South
3648  320838224  BROOKLYN    BROADWAY  North Side-South Side
4048  321596554  BROOKLYN    BROADWAY  North Side-South Side
4301  340737279  BROOKLYN    BROADWAY  North Side-South Side
4591  321478511  BROOKLYN    BROADWAY         Bushwick South
5349  322021272  BROOKLYN    BROADWAY     Stuyvesant Heights
5351  321596607  BROOKLYN    BROADWAY         Bushwick South
5372  321596607  BROOKLYN    BROADWAY         Bushwick South
6173  321962836  BROOKLYN    BROADWAY         Bushwick South
6275  321589125  BROOKLYN    BROADWAY     Stuyvesant Heights
6356  321589125  BROOKLYN    BROADWAY     Stuyvesant Heights
6576  320905838  BROOKLYN    BROADWAY  North Side-South Side
7325  340742691  BROOKLYN    BROADWAY     Stuyvesant Heights
9337  340744092  BROOKLYN    BROADWAY  North Side-South Side
9510  321499936  BROOKLYN    BROADWAY           Williamsburg

Or

Or validates that at least one of the outputs of the input functions is true and creates a list of predicates.

from openclean.function.eval.logic import Or

pred = Or(Eval('Borough', str.lower) == str.lower('BROOKLYN'), Col('Street Name') == 'BROADWAY').eval(ds)

print(ds[pred])
          Job #    Borough        Street Name  \
1     340737929   BROOKLYN           16TH AVE   
3     340737901   BROOKLYN         3RD STREET   
8     322050748   BROOKLYN    WILLIAMS AVENUE   
10    140915990  MANHATTAN           BROADWAY   
11    140915992     QUEENS           BROADWAY   
...         ...        ...                ...   
9981  340744323   BROOKLYN           STARR ST   
9985  321592200   BROOKLYN  WILLOUGHBY STREET   
9990  340744350   BROOKLYN   CONSELYEA STREET   
9995  340744369   BROOKLYN    FOUNTAIN AVENUE   
9999  340744378   BROOKLYN       AMBOY STREET   

                                          GIS_NTA_NAME  
1                                     Bensonhurst West  
3             Carroll Gardens-Columbia Street-Red Hook  
8                                             Canarsie  
10              SoHo-TriBeCa-Civic Center-Little Italy  
11              SoHo-TriBeCa-Civic Center-Little Italy  
...                                                ...  
9981                                    Bushwick North  
9985  DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill  
9990                                 East Williamsburg  
9995                                     East New York  
9999                                       Brownsville  

[3206 rows x 4 columns]

Data Profiling

openclean comes with pre-configured tools to profile datasets that help to report some actionable metrics. It also provides a fairly easy to implement interface for users to create/attach their own data profilers. A user can select the default profiler to get basic statistics (min/max, entropy, distinct values, datatypes etc) or plug in their own profilers for advanced computations.

We use a sample of NYC open data with completed job codes at various locations in New York City to demonstrate some examples.

import os
path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'job_locations.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Using the openclean profiler

from openclean.profiling.dataset import dataset_profile

profiles = dataset_profile(ds)
print(profiles)
[{'column': 'Job #', 'stats': {'totalValueCount': 10000, 'emptyValueCount': 0, 'datatypes': defaultdict(<class 'collections.Counter'>, {'total': Counter({'int': 10000}), 'distinct': Counter({'int': 9329})}), 'minmaxValues': {'int': {'minimum': 102020858, 'maximum': 540182354}}, 'distinctValueCount': 9329, 'entropy': 13.136358755966901, 'topValues': [('121191138', 7), ('301779396', 6), ('320621993', 6), ('121190549', 6), ('121328660', 5), ('121204428', 5), ('121204963', 5), ('121191325', 5), ('121205481', 5), ('320594120', 5)]}}, {'column': 'Borough', 'stats': {'totalValueCount': 10000, 'emptyValueCount': 0, 'datatypes': defaultdict(<class 'collections.Counter'>, {'total': Counter({'str': 10000}), 'distinct': Counter({'str': 5})}), 'minmaxValues': {'str': {'minimum': 'BRONX', 'maximum': 'STATEN ISLAND'}}, 'distinctValueCount': 5, 'entropy': 2.066625059397576, 'topValues': [('MANHATTAN', 3443), ('BROOKLYN', 3002), ('QUEENS', 2093), ('BRONX', 933), ('STATEN ISLAND', 529)]}}, {'column': 'Street Name', 'stats': {'totalValueCount': 10000, 'emptyValueCount': 0, 'datatypes': defaultdict(<class 'collections.Counter'>, {'total': Counter({'str': 9985, 'date': 15}), 'distinct': Counter({'str': 3678, 'date': 13})}), 'minmaxValues': {'str': {'minimum': '1 AVE', 'maximum': 'ZEREGA AVENUE'}, 'date': {'minimum': datetime.datetime(103, 6, 16, 0, 0), 'maximum': datetime.datetime(2065, 6, 16, 0, 0)}}, 'distinctValueCount': 3691, 'entropy': 10.99080989068581, 'topValues': [('BROADWAY', 231), ('PARK AVENUE', 112), ('FIFTH AVENUE', 73), ('MADISON AVENUE', 66), ('LEXINGTON AVENUE', 65), ('5TH AVENUE', 62), ('AVENUE OF THE AMERICAS', 49), ('WEST END AVENUE', 41), ('3RD AVENUE', 35), ('THIRD AVENUE', 35)]}}, {'column': 'GIS_NTA_NAME', 'stats': {'totalValueCount': 10000, 'emptyValueCount': 29, 'datatypes': defaultdict(<class 'collections.Counter'>, {'total': Counter({'str': 9971}), 'distinct': Counter({'str': 192})}), 'minmaxValues': {'str': {'minimum': 'Allerton-Pelham Gardens', 'maximum': 'park-cemetery-etc-Queens'}}, 'distinctValueCount': 192, 'entropy': 7.040697875315458, 'topValues': [('Midtown-Midtown South', 471), ('Hudson Yards-Chelsea-Flatiron-Union Square', 307), ('Upper East Side-Carnegie Hill', 241), ('Upper West Side', 230), ('Turtle Bay-East Midtown', 229), ('SoHo-TriBeCa-Civic Center-Little Italy', 214), ('West Village', 202), ('Bedford', 180), ('Lincoln Square', 178), ('Battery Park City-Lower Manhattan', 163)]}}]

These profiled results can be accessed directly:

# see all stats
print(profiles.stats())
              total  empty  distinct  uniqueness    entropy
Job #         10000      0      9329    0.932900  13.136359
Borough       10000      0         5    0.000500   2.066625
Street Name   10000      0      3691    0.369100  10.990810
GIS_NTA_NAME  10000     29       192    0.019256   7.040698

or can be queried:

# query the minimum and maximum in the Borough column
print(profiles.minmax('Borough'))
       min            max
str  BRONX  STATEN ISLAND

To see different data types in the column:

# look at all the datatypes in the dataset
print(profiles.types())
              date   int   str
Job #            0  9329     0
Borough          0     0     5
Street Name     13     0  3678
GIS_NTA_NAME     0     0   192

We also realize from this that one good exercise to ensure data quality could be to look at the Street Name column’s values that have been classified as dates.

Visualizing profiled results

The openclean-notebook allows profiled results to be visually seen in the notebook. The following screen grab demonstrates this using the Auctus profiler with the openclean-notebook spreadsheet UI:

_images/auctus_profiler.gif

Data Transformation

openclean provides it’s own set of operations to transform datasets whilst keeping row indices intact.

We use a sample of NYC open data with completed job codes at various locations in New York City to demonstrate some examples.

import os
path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'job_locations.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Selecting

One can select columns from a dataset using the select operation:

from openclean.operator.transform.select import select

selected = select(ds, columns=['Job #', 'GIS_NTA_NAME'], names=['job_id','neighborhood'])

selected.head()
job_id neighborhood
0 140915936 Upper East Side-Carnegie Hill
1 340737929 Bensonhurst West
2 440601733 Kew Gardens
3 340737901 Carroll Gardens-Columbia Street-Red Hook
4 240275910 University Heights-Morris Heights

Inserting

To insert a new column into a dataset, use the inscol operation. We use a Const eval function to define values for the new ‘City’ column.

from openclean.operator.transform.insert import inscol
from openclean.function.eval.base import Const

new_col = inscol(ds, names=['City'], pos=4, values=Const('New York'))

new_col.head()
Job # Borough Street Name GIS_NTA_NAME City
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill New York
1 340737929 BROOKLYN 16TH AVE Bensonhurst West New York
2 440601733 QUEENS AUSTIN STREET Kew Gardens New York
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook New York
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights New York

To insert a new row, use the insrow operation. Let’s add a dummy row at the start with all zeros.

from openclean.operator.transform.insert import insrow

new_row = insrow(ds, pos=0, values=[0,0,0,0])

new_row.head()
Job # Borough Street Name GIS_NTA_NAME
-1 0 0 0 0
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook

Updating

Updating a preexisting column is straightforward. The update operator takes the column name and a func argument which can be a callable or an Eval function. The following snippet updates the ‘Borough’ column to Title case. The func can be a dictionary, a scalar or a function.

from openclean.operator.transform.update import update

title_case = update(ds, columns='Borough', func=str.title)

title_case.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 Manhattan EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 Brooklyn 16TH AVE Bensonhurst West
2 440601733 Queens AUSTIN STREET Kew Gardens
3 340737901 Brooklyn 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 Bronx CEDAR AVENUE University Heights-Morris Heights

Filtering

openclean filters records from a dataset using the filter operation, which requires a predicate. The predicate is a list or dataframe of Booleans. Here, we use the Col eval function to create the predicate that translates to; show all rows that have the value ‘BROOKLYN’ in the ‘Borough’ column.

from openclean.operator.transform.filter import filter
from openclean.function.eval.base import Col

filtered = filter(ds, predicate=Col('Borough')=='BROOKLYN')

filtered.head()
Job # Borough Street Name GIS_NTA_NAME
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
8 322050748 BROOKLYN WILLIAMS AVENUE Canarsie
12 340737938 BROOKLYN SHORE ROAD Bay Ridge
21 310123381 BROOKLYN JEFFERSON AVENUE Bedford

Moving

Changing the column order is efficiently straight forward too. Let’s move Job # to a different position.

from openclean.operator.transform.move import movecols

moved_col = movecols(ds, 'Job #', 2)

moved_col.head()
Borough Street Name Job # GIS_NTA_NAME
0 MANHATTAN EAST 93RD STREET 140915936 Upper East Side-Carnegie Hill
1 BROOKLYN 16TH AVE 340737929 Bensonhurst West
2 QUEENS AUSTIN STREET 440601733 Kew Gardens
3 BROOKLYN 3RD STREET 340737901 Carroll Gardens-Columbia Street-Red Hook
4 BRONX CEDAR AVENUE 240275910 University Heights-Morris Heights

To move the an existing row to a different position, use the moverows operation. Here is an example:

from openclean.operator.transform.move import move_rows

moved_row = move_rows(ds, 0, 2)

moved_row.head()
Job # Borough Street Name GIS_NTA_NAME
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Sorting

To sort values in a column, openclean provides a sort operation. Let’s try to sort the dataset in descending Job #s.

from openclean.operator.transform.sort import order_by

sorted = order_by(ds, columns='Job #', reversed=True)

sorted.head()
Job # Borough Street Name GIS_NTA_NAME
8563 540182354 STATEN ISLAND CLOVE ROAD West New Brighton-New Brighton-St. George
7176 540182345 STATEN ISLAND ARDEN AVENUE Arden Heights
9986 540178555 STATEN ISLAND LINWOOD AVENUE Old Town-Dongan Hills-South Beach
9381 540178537 STATEN ISLAND HASBROUCK ROAD Todt Hill-Emerson Hill-Heartland Village-Light...
9348 540178494 STATEN ISLAND VICTORY BOULEVARD New Springville-Bloomfield-Travis

Data Wrangling and Cleaning

openclean comes with the following operators to help users find anomalies, make fixes and wrangle their datasets.

Note

This list is growing and will be updated periodically.

We use a sample of NYC open data with completed job codes at various locations in New York City to demonstrate some examples.

import os
path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'job_locations.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Functional Dependency Violations

openclean makes it easy to identify any functional dependency violations in datasets.

from openclean.operator.map.violations import fd_violations
from openclean.operator.collector.count import distinct

fd1_violations = fd_violations(ds, ['Street Name', 'GIS_NTA_NAME'], ['Borough'])

print('# of violations for FD(Street Name, GIS_NTA_NAME -> Borough) is {}\n'.format(len(fd1_violations)))
for key, gr in fd1_violations.items():
    print(gr[['Street Name', 'GIS_NTA_NAME', 'Borough']])
# of violations for FD(Street Name, GIS_NTA_NAME -> Borough) is 1

     Street Name                            GIS_NTA_NAME    Borough
10      BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
11      BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy     QUEENS
61      BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
691     BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1205    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1398    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1546    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1616    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1728    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
1781    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
2366    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
2590    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
2958    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
3535    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
3556    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
3725    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
4225    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
4441    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
5333    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
5555    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
5583    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
6561    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
7428    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
7939    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
8027    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
9426    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN
9811    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy  MANHATTAN

We identify one violation in the above example. Clearly, it is row 11 as someone with domain knowledge should be able to point out that FD(BROADWAY SoHo-TriBeCa-Civic Center-Little Italy) -> QUEENS is incorrect. Let’s fix this using one of the repair strategies available to us:

from openclean.operator.collector.repair import Shortest, Vote, conflict_repair

# Define the conflict resolution strategy. We use majority vote for both RHS attributes.
strategy = {'Borough': Vote()}

# resolve the conflicts
resolved = conflict_repair(conflicts=fd1_violations, strategy=strategy, in_order=False)

This should replace the violation value with the maximum frequency value of the group and resolve the conflict.

violation_group = resolved[(resolved['Street Name']=='BROADWAY') & (resolved['GIS_NTA_NAME']=='SoHo-TriBeCa-Civic Center-Little Italy')]

fd2_violations = fd_violations(resolved, ['Street Name', 'GIS_NTA_NAME'], ['Borough'])

print('# of violations for FD(Street Name, GIS_NTA_NAME -> Borough) is {}\n'.format(len(fd2_violations)))
print(violation_group)
# of violations for FD(Street Name, GIS_NTA_NAME -> Borough) is 0

          Job #    Borough Street Name                            GIS_NTA_NAME
10    140915990  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
11    140915992  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
61    121848590  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
691   123919901  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1205  123512430  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1398  140838360  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1546  123843485  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1616  123569352  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1728  140911798  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
1781  140914704  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
2366  123788311  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
2590  123830514  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
2958  123070292  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
3535  140917774  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
3556  140944478  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
3725  122967021  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
4225  123569389  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
4441  140918648  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
5333  123787081  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
5555  140918620  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
5583  104115011  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
6561  120304973  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
7428  122989141  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
7939  140922072  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
8027  120004244  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
9426  121183129  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy
9811  122881097  MANHATTAN    BROADWAY  SoHo-TriBeCa-Civic Center-Little Italy

A complete list of repair strategies can be accessed in the API Reference

Missing Values

Depending on the use case, missing values can be handled by the filter transformation (removing them) or by the update transformation (new values). They are both explained in Data Transformation. We demonstrate both again here.

misspelled_data = dataset(os.path.join(path_to_file, 'misspellings.csv'))
misspelled_data['Borough'].value_counts()
MANHATTAN        3442
BROOKLYN         2999
QUEENS           2090
BRONX             932
STATEN ISLAND     529
                    2
MENHATTAN           1
BROOKLIN            1
QEENS               1
BOOKLYN             1
QUEINS              1
BRONKS              1
Name: Borough, dtype: int64

We see there are empty values in this column. First let’s update them using a lambda function that uses the is_empty value function.

from openclean.operator.transform.update import update
from openclean.function.value.null import is_empty

updated_misspelled = update(misspelled_data, 'Borough', lambda x: 'Unknown' if is_empty(x) else x)

updated_misspelled['Borough'].value_counts()
MANHATTAN        3442
BROOKLYN         2999
QUEENS           2090
BRONX             932
STATEN ISLAND     529
Unknown             2
MENHATTAN           1
BROOKLIN            1
QEENS               1
BOOKLYN             1
QUEINS              1
BRONKS              1
Name: Borough, dtype: int64

We’ve replaced missing values with Unknown. But, because there is no way to be sure of the correct value without using other columns and data augmentation techniques from the Data Enrichment section to get the correct Borough, we shall filter out the nulls in this example using the IsNotEmpty eval function.

from openclean.operator.transform.filter import filter
from openclean.function.eval.null import IsNotEmpty

misspelled_data = filter(misspelled_data, predicate=IsNotEmpty('Borough'))

misspelled_data['Borough'].value_counts()
MANHATTAN        3442
BROOKLYN         2999
QUEENS           2090
BRONX             932
STATEN ISLAND     529
MENHATTAN           1
BROOKLIN            1
QEENS               1
BOOKLYN             1
QUEINS              1
BRONKS              1
Name: Borough, dtype: int64

The whole range of eval functions and value functions can be accessed in the Eval package of the API Reference and Value package of the API Reference respectively as explained in Data Model.

Misspellings and Data Entry Bugs

openclean can help identify misspellings and data entry bugs using it’s powerful string matcher class. It helps detect anomalous values using:

  • Phonetic Matching

    Phonetic algorithms transform the input strings to normalized phonetic encodings before comparing them. openclean has the following phonetic string algorithms:

    • NYSIIS

    • Soundex

    • Metaphone

  • Fuzzy Matching

    Implementation of fuzzy string matching using n-gram overlaps and levenshtein or cosine distance.

StringMatcher objects ingest a vocabulary, and a matching algorithm that is used to identify dataset values that are misspelled. These can optionally be stored into an openclean mapping to be reused later with other datasets as translation tables.

from openclean.function.matching.base import DefaultStringMatcher
from openclean.function.matching.fuzzy import FuzzySimilarity
from openclean.data.mapping import Mapping

VOCABULARY = ['BROOKLYN' ,'MANHATTAN','STATEN ISLAND','BRONX', 'QUEENS']

matcher = DefaultStringMatcher(
    vocabulary=VOCABULARY,
    similarity=FuzzySimilarity()
)

map = Mapping()
for query in set(misspelled_data['Borough']):
    map.add(query, matcher.find_matches(query))

print(map)
Mapping(<class 'list'>, {'QEENS': [StringMatch(term='QUEENS', score=0.8333333333333334)], 'STATEN ISLAND': [StringMatch(term='STATEN ISLAND', score=1)], 'BROOKLYN': [StringMatch(term='BROOKLYN', score=1)], 'MENHATTAN': [StringMatch(term='MANHATTAN', score=0.8888888888888888)], 'BRONX': [StringMatch(term='BRONX', score=1)], 'MANHATTAN': [StringMatch(term='MANHATTAN', score=1)], 'QUEENS': [StringMatch(term='QUEENS', score=1)], 'BRONKS': [StringMatch(term='BRONX', score=0.6666666666666667)], 'BROOKLIN': [StringMatch(term='BROOKLYN', score=0.875)], 'QUEINS': [StringMatch(term='QUEENS', score=0.8333333333333334)], 'BOOKLYN': [StringMatch(term='BROOKLYN', score=0.875)]})

The map shows all misspellings matched at least one value from the vocabulary so the map can be used to fix the Borough column. The user will have to manually intervene and update the map if for a query value there were zero or more than one matches from the vocabulary.

Fixing is easy, we can use the update operation with the Lookup eval function (to provide default values if key not found in the map).

from openclean.function.eval.domain import Lookup
from openclean.operator.transform.update import update
from openclean.function.eval.base import Col


fixed = update(misspelled_data, 'Borough', Lookup(columns=['Borough'], mapping=map.to_lookup(), default=Col('Borough')))

print(fixed['Borough'].unique())
['MANHATTAN' 'BROOKLYN' 'QUEENS' 'BRONX' 'STATEN ISLAND']
  • KNN Clustering

    openclean lets users use KNN clustering to identify values in a dataset that are potential variations of one another, and suggests a replacement for each. For e.g. those with missing or extra punctuation. A well-put example demonstrating this can be found here.

Data Standardization

Many a times, users will be faced with situations where the dataset contains variations of spellings (with extra / missing punctuations) for example, a Business or a street name. openclean provides multiple ways to enforce consistency across datasets:

  • Token Signature Outliers

    When values in the dataset are expected to have a signature token present, this functionality helps identify anomalies. For e.g. an address column often requires values to contain street suffixes. The Token Signature class will ensure any values that don’t have one are highlighted. Here is a notebook demonstrating this.

  • KNN Clustering

    As mentioned in the previous section, KNN Clustering can be used to identify sets of similar values. openclean takes it up a notch by recommending a suggested value for each identified cluster.

These two tools become even more powerful when synergized with each other as demonstrated in this notebook where we use first replace different token signature representations with a standard one and then use KNN Clustering to fix the possible value variations in a street name column.

Statistical Outliers

openclean provides many statistical anomaly detection operators that are implemented by the scikit-learn machine learning library. To name them, we have:

Here we use a simple ensemble approach that applies all these operators to the dataset’s GIS_NTA_NAME column.

from collections import Counter

ensemble = Counter()

from openclean.embedding.feature.default import UniqueSetEmbedding
from openclean.profiling.anomalies.sklearn import (
    dbscan,
    isolation_forest,
    local_outlier_factor,
    one_class_svm,
    robust_covariance
)

for f in [dbscan, isolation_forest, local_outlier_factor, one_class_svm, robust_covariance]:
    ensemble.update(f(ds, 'GIS_NTA_NAME', features=UniqueSetEmbedding()))

We then count for each value, the number of operators that classified the value as an outlier.

# Output values that have been classified as outliers by at least three out of the
# five operators.

prev = 0
for value, count in ensemble.most_common():
    if count < 3:
        break
    if count < prev:
        print()
    if count != prev:
        print('{}\t{}'.format(count, value))
    else:
        print('\t{}'.format(value))
    prev = count
5	

4	St. Albans
	Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill
	Co-op City
	Mariner's Harbor-Arlington-Port Ivory-Graniteville
	Breezy Point-Belle Harbor-Rockaway Park-Broad Channel

3	DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill
	Grasmere-Arrochar-Ft. Wadsworth
	park-cemetery-etc-Queens
	park-cemetery-etc-Brooklyn
	Annadale-Huguenot-Prince's Bay-Eltingville
	park-cemetery-etc-Manhattan
	Sheepshead Bay-Gerritsen Beach-Manhattan Beach

Statistically classified as anomalies, these neighborhoods can be those with fewer job requests or misspellings. Something a user with domain knowledge can verify.

Custom functions

A user can create their own data cleaning operators, apply them and reuse them as per their requirements. With openclean-notebook, these eval functions or callables can further be registered on a UI and applied to datasets visually. The following screen grab shows how custom functions together with openclean-notebook enhance a user’s data munging experience:

_images/custom_func.gif

Data Enrichment

Master data using Socrata

Master data can be downloaded into openclean to enrich datasets and support the data cleaning process. In this quick example, we download the ITU ICT Development Index (IDI) from Socrata to demonstrate this.

from openclean.data.source.socrata import Socrata

idi = Socrata().dataset('3bxy-wfk9').load()

print(idi.head())
   year country_id    country_name sub_index value_type  value
0  2015        KOR    Korea (Rep.)       NaN       rank    1.0
1  2015        DNK         Denmark       NaN       rank    2.0
2  2015        ISL         Iceland       NaN       rank    3.0
3  2015        GBR  United Kingdom       NaN       rank    4.0
4  2015        SWE          Sweden       NaN       rank    5.0

Master data using Reference Data Repository

openclean integrates the refdata package to provides easy access to several different reference datasets that are available online for download. Reference datasets are for example a great source for lookup tables and mappings that are used in data cleaning for outlier detection and data standardization.

There are a couple of examples in the Master data guide which show how refdata package can be used to get master data for cleaning operations.

For more information, visit the official repo

Data Provenance

openclean provides users the ability to maintain provenance of the operations performed on a dataset. Just like a version control system, it has methods to load, commit, and checkout versions of the dataset. Here we talk about the methods available to achieve this.

We use a sample of NYC open data with completed job codes at various locations in New York City to demonstrate some examples.

import os
path_to_file = os.path.join(os.getcwd(), 'source', 'data')
from openclean.data.load import dataset

ds = dataset(os.path.join(path_to_file, 'job_locations.csv'))

ds.head()
Job # Borough Street Name GIS_NTA_NAME
0 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
1 340737929 BROOKLYN 16TH AVE Bensonhurst West
2 440601733 QUEENS AUSTIN STREET Kew Gardens
3 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Initialize

To be able to maintain provenance in openclean, a persistent instance of the openclean engine needs to be created. All versions of the data files are maintained inside the base directory.

from openclean.engine.base import DB

db = DB(basedir='./archive', create=True)

Create

The user can then register their dataset with the initialized openclean engine.

df = db.create(source=ds, name='jobs', primary_key='Job #')

The create method returns a pandas dataframe object which we shall apply some transformations on.

Commit

Let’s create a new version of the dataset by performing lowercasing the Borough column.

from openclean.operator.transform.update import update

df = db.checkout('jobs') # get the dataset

lower_cased = update(df, columns='Borough', func=str.lower)

lower_cased
Job # Borough Street Name GIS_NTA_NAME
2735 140915936 manhattan EAST 93RD STREET Upper East Side-Carnegie Hill
6822 340737929 brooklyn 16TH AVE Bensonhurst West
8988 440601733 queens AUSTIN STREET Kew Gardens
6820 340737901 brooklyn 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4188 240275910 bronx CEDAR AVENUE University Heights-Morris Heights
... ... ... ... ...
7359 340744369 brooklyn FOUNTAIN AVENUE East New York
3503 201204883 bronx LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3504 201204883 bronx LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3422 140923847 manhattan MADISON AVENUE Midtown-Midtown South
7360 340744378 brooklyn AMBOY STREET Brownsville

10000 rows × 4 columns

The new dataset version can then be committed in the engine using the commit method.

db.commit(name='jobs', source=lower_cased)
Job # Borough Street Name GIS_NTA_NAME
2735 140915936 manhattan EAST 93RD STREET Upper East Side-Carnegie Hill
6822 340737929 brooklyn 16TH AVE Bensonhurst West
8988 440601733 queens AUSTIN STREET Kew Gardens
6820 340737901 brooklyn 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4188 240275910 bronx CEDAR AVENUE University Heights-Morris Heights
... ... ... ... ...
7359 340744369 brooklyn FOUNTAIN AVENUE East New York
3503 201204883 bronx LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3504 201204883 bronx LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3422 140923847 manhattan MADISON AVENUE Midtown-Midtown South
7360 340744378 brooklyn AMBOY STREET Brownsville

10000 rows × 4 columns

To see the different versions of each dataset, we can simply request a log from the engine:

logs = db.dataset('jobs').log()
logs
[LogEntry(descriptor={'optype': 'load', 'columns': None}, action=None, version=0),
 LogEntry(descriptor={'optype': 'commit', 'columns': None}, action=<openclean.engine.action.CommitOp object at 0x7fd3fbd31990>, version=1)]

Checkout

Users can checkout a previous version of a dataset to see what it looked like.

db.dataset('jobs').checkout(logs[0].version)
Job # Borough Street Name GIS_NTA_NAME
2735 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
6822 340737929 BROOKLYN 16TH AVE Bensonhurst West
8988 440601733 QUEENS AUSTIN STREET Kew Gardens
6820 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4188 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights
... ... ... ... ...
7359 340744369 BROOKLYN FOUNTAIN AVENUE East New York
3503 201204883 BRONX LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3504 201204883 BRONX LAFAYETTE AVENUE Soundview-Castle Hill-Clason Point-Harding Park
3422 140923847 MANHATTAN MADISON AVENUE Midtown-Midtown South
7360 340744378 BROOKLYN AMBOY STREET Brownsville

10000 rows × 4 columns

Rollback

If the user is not happy with the changes, they can be rolled back to get the previous version of the dataset:

df = db.rollback('jobs', version=logs[0].version)

df.head()
Job # Borough Street Name GIS_NTA_NAME
2735 140915936 MANHATTAN EAST 93RD STREET Upper East Side-Carnegie Hill
6822 340737929 BROOKLYN 16TH AVE Bensonhurst West
8988 440601733 QUEENS AUSTIN STREET Kew Gardens
6820 340737901 BROOKLYN 3RD STREET Carroll Gardens-Columbia Street-Red Hook
4188 240275910 BRONX CEDAR AVENUE University Heights-Morris Heights

Register

Additionally, the functionality is complemented by a GUI provided by openclean-notebook that allows users to register custom functions and apply it across datasets and versions seemlessly. A visual example of what this looks like is present in the Custom functions section.

Other Examples

A full example notebook performing operations and maintaining provenance on a real dataset is available here.

Step by Step Guides

We provide a number of Jupyter notebooks examples to walk through various openclean functionalities. All notebooks and datasets are available in the Github repository.

Downloading master data from Reference Data Repository

openclean integrates the refdata package to provides easy access to several different reference datasets that are available online for download. Reference datasets are for example a great source for lookup tables and mappings that are used in data cleaning for outlier detection and data standardization.

[1]:
# Setup the environment for this demo. All files will be
# stored in a subfolder data.

import os

from openclean.config import ENV_DATA_DIR
from refdata.config import ENV_BASEDIR

os.environ[ENV_DATA_DIR] = './data/archives'
os.environ[ENV_BASEDIR] = './data/refdata'
[2]:
# Import the amasterdata and reference data modules.

import openclean.data.archive.base as masterdata
import openclean.data.refdata as refdata
[3]:
# Print a listing for all dataset in the default
# reference data repository.

for dataset in refdata.repository():
    print('{} ({})'.format(dataset.name, dataset.identifier))
Company Suffixes (company_suffixes)
Cities in the U.S. (encyclopaedia_britannica:us_cities)
NYC Finance - State Codes (nyc.gov:dof:state_codes)
REST Countries (restcountries.eu)
C1 Street Suffix Abbreviations (usps:street_abbrev)
C2 Secondary Unit Designators (usps:secondary_unit_designators)
States and territories of the U.S. (wikipedia:us_states)

restcountries.eu

Dataset of countries in the world that is available from the restcountries.eu project.

[4]:
# Download the countries dataset.

refdata.download('restcountries.eu')
[5]:
# Print the first rows in the countries dataset.

countries = refdata.load('restcountries.eu').df()

print(countries.head())
             name alpha2Code alpha3Code    capital   region        subregion
0     Afghanistan         AF        AFG      Kabul     Asia    Southern Asia
1   Åland Islands         AX        ALA  Mariehamn   Europe  Northern Europe
2         Albania         AL        ALB     Tirana   Europe  Southern Europe
3         Algeria         DZ        DZA    Algiers   Africa  Northern Africa
4  American Samoa         AS        ASM  Pago Pago  Oceania        Polynesia
[6]:
# Print entry for 'Venezuela'

countries.loc[countries['name'] == 'Venezuela (Bolivarian Republic of)']
[6]:
name alpha2Code alpha3Code capital region subregion
243 Venezuela (Bolivarian Republic of) VE VEN Caracas Americas South America
Modified Mastedata Copies

The user has the option to modify the downloaded data and store the updated dataset version in the local masterdata repository.

[7]:
# Create a local masterdata archive for the countries dataset.

archive = masterdata.create('restcountries', source=countries, primary_key=['alpha3Code'], replace=True)
[8]:
# Rename 'Venezuela (Bolivarian Republic of)' to 'Venezuela'.

from openclean.operator.transform.update import update

countries = update(countries, 'name', {'Venezuela (Bolivarian Republic of)': 'Venezuela'})
countries.loc[countries['name'] == 'Venezuela']
[8]:
name alpha2Code alpha3Code capital region subregion
243 Venezuela VE VEN Caracas Americas South America
[9]:
countries.head()
[9]:
name alpha2Code alpha3Code capital region subregion
0 Afghanistan AF AFG Kabul Asia Southern Asia
1 Åland Islands AX ALA Mariehamn Europe Northern Europe
2 Albania AL ALB Tirana Europe Southern Europe
3 Algeria DZ DZA Algiers Africa Northern Africa
4 American Samoa AS ASM Pago Pago Oceania Polynesia
[10]:
# Store the modified dataset as a new snapshot in the masterdata
# archive.

archive = masterdata.get('restcountries')
archive.commit(countries)
[10]:
<Snapshot (version=1 description='' at=2021-04-27 13:54:01.371209-04:00)>
[11]:
countries = masterdata.get('restcountries').checkout()
countries.loc[countries['name'] == 'Venezuela']
[11]:
name alpha2Code alpha3Code capital region subregion
239 Venezuela VE VEN Caracas Americas South America
[12]:
snapshots = masterdata.get('restcountries').snapshots()
for s in snapshots:
    print(s)
<Snapshot (version=0 description='' at=2021-04-27 13:53:59.129191-04:00)>
<Snapshot (version=1 description='' at=2021-04-27 13:54:01.371209-04:00)>
[13]:
prov = masterdata.get('restcountries').diff(0, 1)
prov.describe()
Schema Changes
==============
Inserted Columns : 0
Deleted Columns  : 0
Moved Columns    : 0
Renamed Columns  : 0

Data Changes
============
Inserted Rows    : 0
Deleted Rows     : 0
Moved Rows       : 0
Updated Rows     : 1
Updated Values   : 1
[14]:
row = prov.rows().update()[0]
old_val, new_val = row.cells[0].values()

print("Country name updated from '{}' to '{}'".format(old_val, new_val))
Country name updated from 'Venezuela (Bolivarian Republic of)' to 'Venezuela'

Encyclopaedia Britannica

Datasets that are extracted from Web pages of the Encyclopaedia Britannica.

[15]:
# Get dataset with US city names. Used the auto_download
# option that will fetch the dataset if it has not been
# downloaded yet.

us_cities = refdata.load(key='encyclopaedia_britannica:us_cities', auto_download=True).df()
us_cities.head()
[15]:
city state
0 Demopolis Alabama
1 Sylacauga Alabama
2 Troy Alabama
3 Dothan Alabama
4 Prichard Alabama

Cleanup

[16]:
# Remove the created data folder.

import shutil

shutil.rmtree('./data')

Downloading DOB Job Application Filings from Socrata

[1]:
# Download the full 'DOB Job Application Filings' dataset.

import gzip

from openclean.data.source.socrata import Socrata


outfile = './ic3t-wcy2.tsv.gz'

with gzip.open(outfile, 'wb') as f:
    Socrata().dataset('ic3t-wcy2').write(f)
[2]:
# Verify that the download was successful. Print dataset columns and number of rows.
# This example makes use of the streaming option to avoid loading the full data frame
# into memory.

from openclean.pipeline import stream

df = stream(outfile)


print('Schema\n------')
for col in df.columns:
    print("  '{}'".format(col))

print('\n{} rows.'.format(df.count()))
Schema
------
  'Job #'
  'Doc #'
  'Borough'
  'House #'
  'Street Name'
  'Block'
  'Lot'
  'Bin #'
  'Job Type'
  'Job Status'
  'Job Status Descrp'
  'Latest Action Date'
  'Building Type'
  'Community - Board'
  'Cluster'
  'Landmarked'
  'Adult Estab'
  'Loft Board'
  'City Owned'
  'Little e'
  'PC Filed'
  'eFiling Filed'
  'Plumbing'
  'Mechanical'
  'Boiler'
  'Fuel Burning'
  'Fuel Storage'
  'Standpipe'
  'Sprinkler'
  'Fire Alarm'
  'Equipment'
  'Fire Suppression'
  'Curb Cut'
  'Other'
  'Other Description'
  'Applicant's First Name'
  'Applicant's Last Name'
  'Applicant Professional Title'
  'Applicant License #'
  'Professional Cert'
  'Pre- Filing Date'
  'Paid'
  'Fully Paid'
  'Assigned'
  'Approved'
  'Fully Permitted'
  'Initial Cost'
  'Total Est. Fee'
  'Fee Status'
  'Existing Zoning Sqft'
  'Proposed Zoning Sqft'
  'Horizontal Enlrgmt'
  'Vertical Enlrgmt'
  'Enlargement SQ Footage'
  'Street Frontage'
  'ExistingNo. of Stories'
  'Proposed No. of Stories'
  'Existing Height'
  'Proposed Height'
  'Existing Dwelling Units'
  'Proposed Dwelling Units'
  'Existing Occupancy'
  'Proposed Occupancy'
  'Site Fill'
  'Zoning Dist1'
  'Zoning Dist2'
  'Zoning Dist3'
  'Special District 1'
  'Special District 2'
  'Owner Type'
  'Non-Profit'
  'Owner's First Name'
  'Owner's Last Name'
  'Owner's Business Name'
  'Owner's House Number'
  'Owner'sHouse Street Name'
  'City '
  'State'
  'Zip'
  'Owner'sPhone #'
  'Job Description'
  'DOBRunDate'
  'JOB_S1_NO'
  'TOTAL_CONSTRUCTION_FLOOR_AREA'
  'WITHDRAWAL_FLAG'
  'SIGNOFF_DATE'
  'SPECIAL_ACTION_STATUS'
  'SPECIAL_ACTION_DATE'
  'BUILDING_CLASS'
  'JOB_NO_GOOD_COUNT'
  'GIS_LATITUDE'
  'GIS_LONGITUDE'
  'GIS_COUNCIL_DISTRICT'
  'GIS_CENSUS_TRACT'
  'GIS_NTA_NAME'
  'GIS_BIN'

1762407 rows.

Misspellings in Country Names

This notebook contains an example that uses the list of country names provided by the restcountries project to identify potential misspelled names in the ‘ITU ICT Development Index (IDI)’.

Download Country Names Masterdata

[1]:
# Create a new local archive for the countries dataset. All archive data will be stored in
# a sub-folder 'data'.

datadir = './data'
[2]:
# Download the current listing of country names in the world.

from openclean.data.refdata import RefStore

import openclean.data.archive.base as masterdata

refstore = RefStore(basedir=datadir)
refstore.download('restcountries.eu')
countries = refstore.load('restcountries.eu').df()

print(countries.head())

archive = masterdata.create('restcountries', source=countries, primary_key=['alpha3Code'], replace=True)
             name alpha2Code alpha3Code    capital   region        subregion
0     Afghanistan         AF        AFG      Kabul     Asia    Southern Asia
1   Åland Islands         AX        ALA  Mariehamn   Europe  Northern Europe
2         Albania         AL        ALB     Tirana   Europe  Southern Europe
3         Algeria         DZ        DZA    Algiers   Africa  Northern Africa
4  American Samoa         AS        ASM  Pago Pago  Oceania        Polynesia

Identify Country Name Outliers in ITU ICT Development Index (IDI)

[3]:
# Download the latest version of the 'ITU ICT Development Index (IDI)' from Socrata.

import os

from openclean.data.source.socrata import Socrata

idi = Socrata().dataset('3bxy-wfk9').load()
idi.head()
[3]:
year country_id country_name sub_index value_type value
0 2015 KOR Korea (Rep.) NaN rank 1.0
1 2015 DNK Denmark NaN rank 2.0
2 2015 ISL Iceland NaN rank 3.0
3 2015 GBR United Kingdom NaN rank 4.0
4 2015 SWE Sweden NaN rank 5.0
[4]:
# Use the restcountries country names as the ground truth domain to identify names in the
# IDI that do not occur in the grounth truth.

from openclean.profiling.anomalies.domain import domain_outliers

unknown_countries = domain_outliers(idi, 'country_name', countries['name'])

unknown_countries
[4]:
['Korea (Rep.)',
 'United Kingdom',
 'Hong Kong, China',
 'United States',
 'Macao, China',
 'TFYR Macedonia',
 'Antigua & Barbuda',
 'St. Kitts and Nevis',
 'Moldova',
 'St. Vincent and the Grenadines',
 'Trinidad & Tobago',
 'Venezuela',
 'St. Lucia',
 'Iran (I.R.)',
 'Cape Verde',
 'Dominican Rep.',
 'Bolivia',
 'Syria',
 "C™te d'Ivoire",
 'Lao P.D.R.',
 'Congo (Rep.)',
 'Tanzania',
 'Congo (Dem. Rep.)']

Repair Contry Name Outliers in ITU ICT Development Index (IDI)

[5]:
# Use the restcountries country codes as the ground truth domain to identify country identifier in the
# IDI that do not occur in the grounth truth.

unknown_codes = domain_outliers(idi, 'country_id', countries['alpha3Code'])

unknown_codes
[5]:
[]
[6]:
# User the country codes in the IDI datasets to create a mapping from the identified outliers in IDI to the
# country name in the ground truth dataset.

import pandas as pd

from openclean.data.util import repair_mapping

# Create a dictionary that maps the 'unknown' country names from the IDI dataset to the respective
# ground truth name based on the contry code.

df = pd.merge(idi, countries, left_on='country_id', right_on='alpha3Code')
lookup = repair_mapping(df, key='country_name', value='name')

print('Replace {} with {}\n------------------')
for key, value in lookup.items():
    print("'{}' -> '{}'".format(key, value))
Replace {} with {}
------------------
'Korea (Rep.)' -> 'Korea (Republic of)'
'United Kingdom' -> 'United Kingdom of Great Britain and Northern Ireland'
'Hong Kong, China' -> 'Hong Kong'
'United States' -> 'United States of America'
'Macao, China' -> 'Macao'
'TFYR Macedonia' -> 'Macedonia (the former Yugoslav Republic of)'
'Antigua & Barbuda' -> 'Antigua and Barbuda'
'St. Kitts and Nevis' -> 'Saint Kitts and Nevis'
'Moldova' -> 'Moldova (Republic of)'
'St. Vincent and the Grenadines' -> 'Saint Vincent and the Grenadines'
'Trinidad & Tobago' -> 'Trinidad and Tobago'
'Venezuela' -> 'Venezuela (Bolivarian Republic of)'
'St. Lucia' -> 'Saint Lucia'
'Iran (I.R.)' -> 'Iran (Islamic Republic of)'
'Cape Verde' -> 'Cabo Verde'
'Dominican Rep.' -> 'Dominican Republic'
'Bolivia' -> 'Bolivia (Plurinational State of)'
'Syria' -> 'Syrian Arab Republic'
'C™te d'Ivoire' -> 'Côte d'Ivoire'
'Lao P.D.R.' -> 'Lao People's Democratic Republic'
'Congo (Rep.)' -> 'Congo'
'Tanzania' -> 'Tanzania, United Republic of'
'Congo (Dem. Rep.)' -> 'Congo (Democratic Republic of the)'
[7]:
# Use the mapping to replace unknown country names in IDI with their respective
# ground truth value.

from openclean.function.eval.domain import Lookup
from openclean.operator.transform.update import update

idi_repaired = update(idi, 'country_name', Lookup('country_name', lookup))
[8]:
idi_repaired.head()
[8]:
year country_id country_name sub_index value_type value
0 2015 KOR Korea (Republic of) NaN rank 1.0
1 2015 DNK Denmark NaN rank 2.0
2 2015 ISL Iceland NaN rank 3.0
3 2015 GBR United Kingdom of Great Britain and Northern I... NaN rank 4.0
4 2015 SWE Sweden NaN rank 5.0

Statistical Outliers in City names

This notebook demonstrates the use of anomaly detection operators that are implemented by the scikit-learn machine learning library. There are five different anomaly detection operators that are included in openclean. Here we use a simple ensemble approach that applies all five operators to a sample of the DOB Job Application Filing dataset and counts for each value the number of operators that classified the value as an outlier.

[1]:
# Use the 'DOB Job Application Filings - Download' notebook to download the
# 'DOB Job Application Filings' dataset for this example.

datafile = './ic3t-wcy2.tsv.gz'

# As an alternative, you can also use the smaller dataset sample that is
# included in the repository.
#
# datafile = './data/ic3t-wcy2.tsv.gz'
[2]:
# Use a random sample of 10,000 records for this example.

from openclean.pipeline import stream

df = stream(datafile).select('City ').update('City ', str.upper).sample(10000, random_state=42).to_df()
[3]:
# Print (a subset of) the distinct city names in the sample.

df['City '].value_counts()
[3]:
NEW YORK           3680
BROOKLYN           1594
QUEENS              538
BRONX               470
NY                  462
                   ...
BROOKLLYN             1
CAMBRIA HEIGHTS       1
STUART                1
BRONXVILLE            1
BROOKLYM              1
Name: City , Length: 513, dtype: int64
[4]:
# Use a counter to maintain count of how many anomaly detection operators
# classified each value as an outlier.

from collections import Counter

ensemble = Counter()
[5]:
# Apply fife different anomaly detection operators to the values in the city column.
# Here we use a default value embedding that ignores the frequency of each value (since
# in this NYC Open Dataset city names like NEW YORK and any of the five boroughs are
# more frequent that other names).

from openclean.embedding.feature.default import UniqueSetEmbedding
from openclean.profiling.anomalies.sklearn import (
    dbscan,
    isolation_forest,
    local_outlier_factor,
    one_class_svm,
    robust_covariance
)

for f in [dbscan, isolation_forest, local_outlier_factor, one_class_svm, robust_covariance]:
    ensemble.update(f(df, 'City ', features=UniqueSetEmbedding()))

[6]:
# Output values that have been classified as outliers by at least three out of the
# five operators.

prev = 0
for value, count in ensemble.most_common():
    if count < 3:
        break
    if count < prev:
        print()
    if count != prev:
        print('{}\t{}'.format(count, value))
    else:
        print('\t{}'.format(value))
    prev = count
4       L.I.C.
        SI,NY
        N Y
        N.Y.
        NEW  YORK
        S.I.,NY
        L.I.CITY
        _BK
        S.I.
        SUITE 2107 NY
        L.I.C
        MIAMI
        LIC.
        BKLYN.
        B'KLYN
        QUEEN S

3       LONG ISLN. CITY
        NEW  YOURK
        S.OZONE PARK
        RICHMOND-HILL
        NEW YORK\
        S. RICHMOND HIL
        HOLLIS HILLS
        NEW CANAAN
        LONG ISL.CITY
        NEW YORK,
        ROCKVILLE_CENTR
        MINEOLA,
        N.MIAMI BEACH
        QUEENS _VILLAGE
        FLUS. MEADOWS
        SO. PLAINFIELD
        MC LEAN
        S. OZONE PARK
        LONG ISL. CITY
        S. PLAINFIELD
        FLUSHING MEADOW
        JACKSON HTS.
        ST. PETERSBURG
        BROOKLYN,
        NEW YORK  CITY
        NEW YORK, NY
        PHILADELPHIA
        MT.VERNON
        SO. OZONE PARK
        MT. KISCO

Misspellings of Brooklyn

This is an example notebook that uses the SOUNDEX function to identify potential misspellings of the city name BROOKLYN in the NYC DOB Job Application Filings dataset.

[1]:
# Use the 'DOB Job Application Filings - Download' notebook to download the
# 'DOB Job Application Filings' dataset for this example.

datafile = './ic3t-wcy2.tsv.gz'

# As an alternative, you can also use the smaller dataset sample that is
# included in the repository.
#
# datafile = './data/ic3t-wcy2.tsv.gz'
[2]:
# This example makes use of the streaming option that avoids loading the full
# data frame into memory.

from openclean.pipeline import stream

df = stream(datafile)
[3]:
# Find entries where the Soundex of the City is the same as the soundex for 'BROOKLYN'
# but where the city name is not 'BROOKLYN', i.e., potential misspellings.

from openclean.function.eval.base import Col, Eval
from openclean.function.eval.logic import And
from openclean.function.value.phonetic import Soundex, soundex

brooklyn = df\
    .select('City ')\
    .update('City ', str.upper)\
    .filter(And(Eval('City ', Soundex()) == soundex('BROOKLYN'), Col('City ') != 'BROOKLYN'))\
    .distinct()
[4]:
# Print (potential) misspellings in decreasing order of their
# frequency.

print('RANK\tCOUNT\tNAME')
for i, entry in enumerate(brooklyn.most_common()):
    key, count = entry
    print('{}.\t{}\t{}'.format(i + 1, count, key))
RANK    COUNT   NAME
1.      1059    BRKLYN
2.      749     BROOKYLN
3.      437     BROOKLY
4.      288     BROOKLYN,
5.      231     BROKLYN
6.      162     BRROKLYN
7.      162     BROOKLN
8.      107     BROOKLYLN
9.      84      BROOOKLYN
10.     70      BROOKLNY
11.     56      BROOKLYM
12.     54      BRO0KLYN
13.     49      BROOKKLYN
14.     45      BROOKLYNB
15.     45      BROOKLLYN
16.     35      BROOKLYN NY
17.     35      BROKKLYN
18.     33      BRROOKLYN
19.     29      BROOKLKYN
20.     28      BROOKLYNN
21.     27      BROOKLTN
22.     24      BROOKLYN`
23.     22      BROOKLUN
24.     22      BROOKLYNQ
25.     21      BROOKLINE
26.     20      BROOKLNYN
27.     19      BROOKLYN, NY
28.     13      BROOKLYB
29.     13      BROOKL
30.     12      BROOKLY N
31.     11      BROOKLYKN
32.     11      BERKELEY
33.     11      BROOKJLYN
34.     10      BROOKLYNS
35.     10      BR00KLYN
36.     10      BROOKYLYN
37.     10      BERKLEY
38.     8       BROOKL;YN
39.     8       BROOKLYNM
40.     7       BROOKLYN.
41.     7       BROOKLYTN
42.     7       BROOKLYHN
43.     7       BROOKLIN
44.     7       BROOKLVILLE
45.     6       BROOJLYN
46.     6       BROOKLYN HEIGHT
47.     6       BROOKLYNNY
48.     6       BROOKLOYN
49.     5       BROOKLRN
50.     5       BRIOOKLYN
51.     5       BRIIKLYN
52.     5       BROOKLEN
53.     4       BROOKLYN1
54.     4       BROOKLYN `
55.     4       BORRKLYN
56.     4       BROOKILYN
57.     4       BBROOKLYN
58.     3       BROOKLYBN
59.     3       BROKLY
60.     3       BROOKLYN=
61.     3       BR0OKLYN
62.     3       BROOKL6YN
63.     3       BVROOKLYN
64.     3       BROOKLYN,NY
65.     3       BROOKLYN-
66.     3       BROOKOLYN
67.     3       BROOOKKLYN
68.     3       B ROOKLYN
69.     3       BROOKLYN, NYC
70.     3       BROOKLY6N
71.     3       BROOKLYN, N.Y.
72.     2       BROOKLU
73.     2       BROOKLYNE
74.     2       BROOKLYN 11207
75.     2       BROOKLYNENS
76.     2       BROOKLYIN
77.     2       BROOIKLYN
78.     2       BROOKLTYN
79.     2       BROOKLYH
80.     2       BROOKL YN
81.     2       BROOKLYN11201
82.     2       BROOYKLN
83.     2       BROOK.LYN
84.     2       BROOKLYN01
85.     2       BREOOKLYN
86.     2       BROOKLYNT
87.     2       BRO9KLYN
88.     2       BROOKLKN
89.     2       BROOKLYNH
90.     2       BROOKLYN0
91.     2       BERKLEY HTS.
92.     2       BERKELEY HEIGHT
93.     2       BEROOKLYN
94.     2       BRIACLIFF MANOR
95.     1       BROOKLYN NYC
96.     1       BROOKL.YN
97.     1       BROOKLYN HGTS
98.     1       BROOKLYN11234
99.     1       BROOKLYN``
100.    1       BROOKLYN``````
101.    1       BRKLLYN
102.    1       BFROOKLYN
103.    1       BROOKLAY
104.    1       BROOKLYN{
105.    1       BROO9KLYN
106.    1       BROOKLYN AVE
107.    1       BROOKLYJN
108.    1       BROOJKLYN
109.    1       BROOKLKY
110.    1       BROOKLIYN
111.    1       BRIOKLYN
112.    1       BROOKLYNMASPETH
113.    1       BROOKLYNL
114.    1       BROOKLYNTCHEN
115.    1       BROOKLUM
116.    1       BROOKLYNNAVYYD
117.    1       BROOKYL
118.    1       BROOKLYU
119.    1       BBBROOKLYN
120.    1       BROOAKLYN
121.    1       BROOKLING
122.    1       BROOKLYN NAVY Y
123.    1       BROOKLYN Q
124.    1       B2ROOKLYN
125.    1       BROOKLYON
126.    1       BROOKLYNBROOKLY
127.    1       BROKLYLN
128.    1       BROOKLYN/OZONE
129.    1       BROOKLYNO
130.    1       BROOKLYNB\
131.    1       BROOKLYEN
132.    1       BROOKLYN11238
133.    1       BRROKLY
134.    1       BROOKLYN HTS
135.    1       BROOKLEY
136.    1       BRKLN
137.    1       BROOKLYNHEIGHTS
138.    1       BROOKLYN N.Y. 1
139.    1       BROOKLYN162
140.    1       BRAOOKLYN
141.    1       BROOKLYN+
142.    1       B4ROOKLYN
143.    1       BROOKLNM
144.    1       BROKLY N
145.    1       BROOKLYN P
146.    1       BROOKLYNJ
147.    1       BORSALOM
148.    1       BRKOOLYN
149.    1       BROOKLYNC
150.    1       BROOOKLN
151.    1       BRUUKLYN
152.    1       BRKKLYN
153.    1       BERKELEY HTS.
154.    1       BROOKLYNY
155.    1       BRKLY
156.    1       BERKELEY HTS
157.    1       BROOKLYN11219
158.    1       BRRRKLYN
159.    1       BROOKLYN NY 112
160.    1       BROOK\LYN
161.    1       BROOKLYYN
162.    1       BOORKLY
163.    1       BROOKLYK
164.    1       BERKLEY HEIGHTS
165.    1       BROCKLYN
166.    1       BR4OOKLYN
167.    1       BROOKLYN  `
168.    1       BROOKLYMN
169.    1       BROOKLYNEW YORK
170.    1       BROOK;LYN
171.    1       BROOKLN NY

Profiling - DOHMH New York City Restaurant Inspection Results

Data Profiling

In this step we start be getting an overview of the properties for the Restaurant Inspection dataset. We then focus on a few quality issues related to the data that we want to extract to plot the score distributions.

[1]:
# For this demo we make use of openclean's streaming option for large datasets (to avoid
# having to load the full dataset into memory).

import os

from openclean.pipeline import stream

ds = stream(os.path.join('data', '43nn-pn8j.tsv.gz'))
Basic Dataset Properties and Statistics
[2]:
# Get the list of column names in the dataset.

ds.columns
[2]:
['CAMIS',
 'DBA',
 'BORO',
 'BUILDING',
 'STREET',
 'ZIPCODE',
 'PHONE',
 'CUISINE DESCRIPTION',
 'INSPECTION DATE',
 'ACTION',
 'VIOLATION CODE',
 'VIOLATION DESCRIPTION',
 'CRITICAL FLAG',
 'SCORE',
 'GRADE',
 'GRADE DATE',
 'RECORD DATE',
 'INSPECTION TYPE',
 'Latitude',
 'Longitude',
 'Community Board',
 'Council District',
 'Census Tract',
 'BIN',
 'BBL',
 'NTA']
[3]:
# Take a look ath the first 10 rows in the dataset.

ds.head()
[3]:
CAMIS DBA BORO BUILDING STREET ZIPCODE PHONE CUISINE DESCRIPTION INSPECTION DATE ACTION ... RECORD DATE INSPECTION TYPE Latitude Longitude Community Board Council District Census Tract BIN BBL NTA
0 50001317 D'LILI BAKERY Manhattan 526 W 207TH ST 10034 2123040356 Bakery 05/04/2018 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Initial Inspection 40.865269576991 -73.919671779695 112 10 029300 1064780 1022220025 MN01
1 41716448 HARLEM SHAKE Manhattan 100 WEST 124 STREET 10027 2122228300 American 07/30/2019 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Re-inspection 40.807286117139 -73.946454954277 110 09 022200 1057790 1019080035 MN11
2 50044535 HAWKERS Manhattan 225 E 14TH ST 10003 2129821688 Asian 06/14/2017 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Initial Inspection 40.732989026505 -73.986454624452 106 02 004800 1019505 1008960012 MN21
3 50041601 118 KITCHEN Manhattan 1 E 118TH ST 10035 2127226888 Tex-Mex 05/09/2019 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Initial Inspection 40.801870167292 -73.945260143617 111 09 018400 1053946 1017450001 MN34
4 50045596 NEW CHINA Bronx 5690 MOSHOLU AVE 10471 7188841111 Chinese 09/07/2016 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Re-inspection 40.905434879643 -73.900843816155 208 11 033700 2084805 2058481761 BX22
5 41156678 SUNSWICK Queens 3502 35 STREET 11106 7187520620 American 05/02/2017 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Re-inspection 40.756372985356 -73.925517485863 401 26 005700 4009585 4006380025 QN70
6 41434036 CANCUN MEXICAN RESTAURANT Manhattan 937 8 AVENUE 10019 2123077307 Mexican 04/14/2016 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Re-inspection 40.765676019444 -73.983642958358 104 03 013900 1025437 1010460032 MN15
7 50058219 HAN JOO BBQ CYCJ Queens 4106 149TH PL 11355 7183596888 Korean 03/21/2017 Violations were cited in the following area(s). ... 09/28/2019 Pre-permit (Operational) / Initial Inspection 40.762113093414 -73.814688971988 407 20 116700 4447126 4050540032 QN51
8 41018004 ANGELICA PIZZERIA Brooklyn 30 NEVINS STREET 11217 7188522728 Pizza/Italian 04/18/2019 Violations were cited in the following area(s). ... 09/28/2019 Cycle Inspection / Initial Inspection 40.687850595312 -73.981473402889 302 33 003700 3000515 3001660037 BK38
9 50064285 E.A.K. RAMEN Manhattan 469 6TH AVE 10011 6468632027 Japanese 06/07/2017 Establishment Closed by DOHMH. Violations wer... ... 09/28/2019 Pre-permit (Operational) / Initial Inspection 40.73558361361 -73.998141677927 102 03 007100 1010580 1006070045 MN23

10 rows × 26 columns

[4]:
# Count the number of rows in the dataset.

ds.count()
[4]:
392131
[5]:
# Get basic profile information for all columns in the dataset.

profiles = ds.profile()
profiles
[5]:
[{'column': 'CAMIS',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 392131})}),
   'minmaxValues': {'int': {'minimum': 30075445, 'maximum': 50099136}}}},
 {'column': 'DBA',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 588,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 391478, 'int': 55, 'date': 10})}),
   'minmaxValues': {'str': {'minimum': '#1 Chinese Restaurant',
     'maximum': 'zx accounting service llc'},
    'int': {'minimum': 33, 'maximum': 1976},
    'date': {'minimum': datetime.datetime(1983, 1, 2, 0, 0),
     'maximum': datetime.datetime(1983, 1, 2, 0, 0)}}}},
 {'column': 'BORO',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 392015, 'int': 116})}),
   'minmaxValues': {'str': {'minimum': 'Bronx', 'maximum': 'Staten Island'},
    'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'BUILDING',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 231,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 381625, 'str': 10095, 'date': 180})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 65626564},
    'str': {'minimum': '.1-A', 'maximum': 'W105'},
    'date': {'minimum': datetime.datetime(120, 1, 2, 0, 0),
     'maximum': datetime.datetime(3906, 1, 2, 0, 0)}}}},
 {'column': 'STREET',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 392131})}),
   'minmaxValues': {'str': {'minimum': '& GRAND CENTRAL',
     'maximum': 'west 34th st'}}}},
 {'column': 'ZIPCODE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5557,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 386558, 'str': 16})}),
   'minmaxValues': {'int': {'minimum': 10000, 'maximum': 12345},
    'str': {'minimum': 'N/A', 'maximum': 'N/A'}}}},
 {'column': 'PHONE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 11,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 391725, 'str': 395})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 90172017170},
    'str': {'minimum': '212690369_', 'maximum': '__________'}}}},
 {'column': 'CUISINE DESCRIPTION',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 392131})}),
   'minmaxValues': {'str': {'minimum': 'Afghan',
     'maximum': 'Vietnamese/Cambodian/Malaysia'}}}},
 {'column': 'INSPECTION DATE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'date': 392131})}),
   'minmaxValues': {'date': {'minimum': datetime.datetime(1900, 1, 1, 0, 0),
     'maximum': datetime.datetime(2019, 9, 27, 0, 0)}}}},
 {'column': 'ACTION',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 1337,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 390794})}),
   'minmaxValues': {'str': {'minimum': 'Establishment Closed by DOHMH.  Violations were cited in the following area(s) and those requiring immediate action were addressed.',
     'maximum': 'Violations were cited in the following area(s).'}}}},
 {'column': 'VIOLATION CODE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5696,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 386272, 'float': 163})}),
   'minmaxValues': {'str': {'minimum': '02A', 'maximum': '22G'},
    'float': {'minimum': 1500.0, 'maximum': 15000.0}}}},
 {'column': 'VIOLATION DESCRIPTION',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 8918,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 383213})}),
   'minmaxValues': {'str': {'minimum': '""No Smoking” and/or \'Smoking Permitted” sign not conspicuously posted. Health warning not present on \'Smoking Permitted”',
     'maximum': '“Choking first aid” poster not posted. “Alcohol and pregnancy” warning sign not posted. Resuscitation equipment: exhaled air resuscitation masks (adult & pediatric), latex gloves, sign not posted. Inspection report sign not posted.'}}}},
 {'column': 'CRITICAL FLAG',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 8918,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 383213})}),
   'minmaxValues': {'str': {'minimum': 'N', 'maximum': 'Y'}}}},
 {'column': 'SCORE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 17046,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 375085})}),
   'minmaxValues': {'int': {'minimum': -1, 'maximum': 164}}}},
 {'column': 'GRADE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 193610,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 198521})}),
   'minmaxValues': {'str': {'minimum': 'A', 'maximum': 'Z'}}}},
 {'column': 'GRADE DATE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 195416,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'date': 196715})}),
   'minmaxValues': {'date': {'minimum': datetime.datetime(2013, 6, 7, 0, 0),
     'maximum': datetime.datetime(2019, 9, 26, 0, 0)}}}},
 {'column': 'RECORD DATE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'date': 392131})}),
   'minmaxValues': {'date': {'minimum': datetime.datetime(2019, 9, 28, 0, 0),
     'maximum': datetime.datetime(2019, 9, 28, 0, 0)}}}},
 {'column': 'INSPECTION TYPE',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 1337,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 390794})}),
   'minmaxValues': {'str': {'minimum': 'Administrative Miscellaneous / Compliance Inspection',
     'maximum': 'Trans Fat / Second Compliance Inspection'}}}},
 {'column': 'Latitude',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 430,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'float': 386144, 'int': 5557})}),
   'minmaxValues': {'float': {'minimum': 40.508068517904,
     'maximum': 40.912822326386},
    'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'Longitude',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 430,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'float': 386144, 'int': 5557})}),
   'minmaxValues': {'float': {'minimum': -74.248434473464,
     'maximum': -73.700928057808},
    'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'Community Board',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5987,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 386144})}),
   'minmaxValues': {'int': {'minimum': 101, 'maximum': 595}}}},
 {'column': 'Council District',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5987,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 386144})}),
   'minmaxValues': {'int': {'minimum': 1, 'maximum': 51}}}},
 {'column': 'Census Tract',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5987,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 386144})}),
   'minmaxValues': {'int': {'minimum': 100, 'maximum': 162100}}}},
 {'column': 'BIN',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 7670,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 384461})}),
   'minmaxValues': {'int': {'minimum': 1000000, 'maximum': 5799501}}}},
 {'column': 'BBL',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 430,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 391701})}),
   'minmaxValues': {'int': {'minimum': 1, 'maximum': 5270000501}}}},
 {'column': 'NTA',
  'stats': {'totalValueCount': 392131,
   'emptyValueCount': 5987,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 386144})}),
   'minmaxValues': {'str': {'minimum': 'BK09', 'maximum': 'SI54'}}}}]
[6]:
# Print number of empty cells for each column

profiles.stats()['empty']
[6]:
CAMIS                         0
DBA                         588
BORO                          0
BUILDING                    231
STREET                        0
ZIPCODE                    5557
PHONE                        11
CUISINE DESCRIPTION           0
INSPECTION DATE               0
ACTION                     1337
VIOLATION CODE             5696
VIOLATION DESCRIPTION      8918
CRITICAL FLAG              8918
SCORE                     17046
GRADE                    193610
GRADE DATE               195416
RECORD DATE                   0
INSPECTION TYPE            1337
Latitude                    430
Longitude                   430
Community Board            5987
Council District           5987
Census Tract               5987
BIN                        7670
BBL                         430
NTA                        5987
Name: empty, dtype: int64
[7]:
# How many records are there for date '09/28/2019'
from openclean.function.eval.base import Col

ds.filter(Col('RECORD DATE') == '09/28/2019').count()
[7]:
392131
[8]:
# Print column type information (as data frame)

profiles.types()
[8]:
date float int str
CAMIS 0 0 392131 0
DBA 10 0 55 391478
BORO 0 0 116 392015
BUILDING 180 0 381625 10095
STREET 0 0 0 392131
ZIPCODE 0 0 386558 16
PHONE 0 0 391725 395
CUISINE DESCRIPTION 0 0 0 392131
INSPECTION DATE 392131 0 0 0
ACTION 0 0 0 390794
VIOLATION CODE 0 163 0 386272
VIOLATION DESCRIPTION 0 0 0 383213
CRITICAL FLAG 0 0 0 383213
SCORE 0 0 375085 0
GRADE 0 0 0 198521
GRADE DATE 196715 0 0 0
RECORD DATE 392131 0 0 0
INSPECTION TYPE 0 0 0 390794
Latitude 0 386144 5557 0
Longitude 0 386144 5557 0
Community Board 0 0 386144 0
Council District 0 0 386144 0
Census Tract 0 0 386144 0
BIN 0 0 384461 0
BBL 0 0 391701 0
NTA 0 0 0 386144
Datatype Outliers (?)

Note that type detection is difficult and can be ambigious for some values. Let us take a closer look at some columns that appear to have values of different types.

[9]:
# Get a quick look at the columns that contain values of
# different (raw) data types.

profiles.multitype_columns().types()
[9]:
date float int str
DBA 10 0 55 391478
BORO 0 0 116 392015
BUILDING 180 0 381625 10095
ZIPCODE 0 0 386558 16
PHONE 0 0 391725 395
VIOLATION CODE 0 163 0 386272
Latitude 0 386144 5557 0
Longitude 0 386144 5557 0
[10]:
# Get minimum and maximum values for each datatype in columns 'DBA'

profiles.minmax('DBA')
[10]:
min max
str #1 Chinese Restaurant zx accounting service llc
int 33 1976
date 1983-01-02 00:00:00 1983-01-02 00:00:00
[11]:
# Which values are identified as 'date' in column 'BUILDING'

from openclean.function.eval.datatype import IsDatetime

ds.select('BUILDING').filter(IsDatetime('BUILDING')).distinct()
[11]:
Counter({'271 1/2': 7,
         '94 1/2': 23,
         '168 1/2': 5,
         '3906 1/2': 12,
         '34   1/2': 37,
         '120 1/2': 10,
         '227-02/08': 35,
         '134 1/2': 7,
         '1045 1/2': 19,
         '22 1-2': 6,
         '42 1/2': 3,
         '67 1/2': 6,
         '501 1/2': 6,
         '48 1/2': 3,
         '27 1/2': 1})
[12]:
# Filter distinct values in column 'VIOLATION CODE' that were recognized
# as being of type float.

from openclean.function.eval.base import Col
from openclean.function.eval.datatype import IsFloat

ds.filter(IsFloat('VIOLATION CODE')).distinct('VIOLATION CODE')
[12]:
Counter({'15E2': 134, '15E3': 29})
[13]:
# List the distinct values (and their total counts) for
# column 'BORO'

ds.distinct('BORO')
[13]:
Counter({'Manhattan': 153958,
         'Bronx': 35761,
         'Queens': 89963,
         'Brooklyn': 99317,
         'Staten Island': 13016,
         '0': 116})
Boroughs that are ‘0’

Take a look at the rows that have 0 as ‘BORO’. Is it possible to infer the borough from other columns soch as BBL (block-borough-lot) or NTA (Neighborhood Tabulation Area).

[14]:
# Profile only those rows that have a 'BORO' value '0'. Here we use the default
# column profiler that generates sets of distinct values for each column.

from openclean.function.eval.base import Col
from openclean.profiling.column import DefaultColumnProfiler

boro_0 = ds.filter(Col('BORO') == '0').profile(default_profiler=DefaultColumnProfiler)
boro_0.stats()
[14]:
total empty distinct uniqueness entropy
CAMIS 116 0 21 0.181034 2.758740
DBA 116 9 12 0.112150 2.297430
BORO 116 0 1 0.008621 0.000000
BUILDING 116 0 6 0.051724 2.207016
STREET 116 0 6 0.051724 2.207016
ZIPCODE 116 0 4 0.034483 1.319701
PHONE 116 0 21 0.181034 2.758740
CUISINE DESCRIPTION 116 0 4 0.034483 1.596319
INSPECTION DATE 116 0 32 0.275862 4.709064
ACTION 116 16 1 0.010000 0.000000
VIOLATION CODE 116 16 30 0.300000 4.367569
VIOLATION DESCRIPTION 116 16 30 0.300000 4.367569
CRITICAL FLAG 116 16 2 0.020000 0.976500
SCORE 116 20 18 0.187500 3.881308
GRADE 116 68 3 0.062500 1.199460
GRADE DATE 116 68 17 0.354167 3.917481
RECORD DATE 116 0 1 0.008621 0.000000
INSPECTION TYPE 116 16 7 0.070000 1.986198
Latitude 116 116 0 NaN NaN
Longitude 116 116 0 NaN NaN
Community Board 116 116 0 NaN NaN
Council District 116 116 0 NaN NaN
Census Tract 116 116 0 NaN NaN
BIN 116 116 0 NaN NaN
BBL 116 116 0 NaN NaN
NTA 116 116 0 NaN NaN
[15]:
# There are only four different zip codes. The different values and their
# frequency are included in the profiler results.

boro_0.column('ZIPCODE')['topValues']
[15]:
[('11249', 81), ('N/A', 16), ('10168', 14), ('10285', 5)]
[16]:
# What are the boroughs that are associated with zip codes
# '10168', '10285' in our dataset.

from openclean.function.eval.domain import IsIn

ds.filter(IsIn('ZIPCODE', {'10168', '10285'})).select('BORO').distinct()
[16]:
Counter({'Manhattan': 8, '0': 19})
[17]:
# What are the boroughs that are associated with zip code
# '11249' in our dataset.

ds.filter(Col('ZIPCODE') == '11249').select('BORO').distinct()
[17]:
Counter({'Brooklyn': 2358, '0': 81})
[18]:
# NOTE (for cleaning step):
#
# It seems save to replace '0' in column 'BORO' for those rows that have
# zip codes in ['11249', '10168', '10285'] using the mapping below.Also
# delete those records that have 'ZIPCODE' 'N/A'

boro_0_mapping = {'11249': 'Brooklyn', '10168': 'Manhattan', '10285': 'Manhattan'}
New Establishments

From the dataset description: “… Records are also included for each restaurant that has applied for a permit but has not yet been inspected and for inspections resulting in no violations. Establishments with inspection date of 1/1/1900 are new establishments that have not yet received an inspection. Restaurants that received no violations are represented by a single row and coded as having no violations using the ACTION field.

We expect that records with an ‘INSPECTION DATE’ 1900/1/1 have no value for ‘ACTION’, ‘INSPECTION TYPE’, ‘SCORE’, and ‘GRADE’.

[19]:
from datetime import datetime
from openclean.function.eval.datatype import Datetime
from openclean.profiling.column import DefaultColumnProfiler

# Date that identifies new establishments that have not
# been inspected.
new_establ_date = datetime(1900, 1, 1)

# Count total, empty, and distinct values for the columns that we
# expect to be empty for new establishments.
ds.filter(Datetime('INSPECTION DATE') == new_establ_date)\
    .select(['ACTION', 'INSPECTION TYPE', 'SCORE', 'GRADE'])\
    .profile(default_profiler=DefaultColumnProfiler)\
    .stats()
[19]:
total empty distinct uniqueness entropy
ACTION 1337 1337 0 None None
INSPECTION TYPE 1337 1337 0 None None
SCORE 1337 1337 0 None None
GRADE 1337 1337 0 None None
[20]:
# NOTE (for cleaning step):
#
# Delete records with date 1900/1/1.
Missing Scores

We are interested in the overall scores that were assigned to individual establishments as a result of the inspection. For new establishments we have seen that the score can be missing in some cases. Are there other records that do not have a ‘SCORE’?

[21]:
from openclean.function.eval.logic import And
from openclean.function.eval.datatype import Datetime
from openclean.function.eval.null import IsEmpty

df = ds.filter(And(Datetime('INSPECTION DATE') != new_establ_date, IsEmpty('SCORE'))).to_df()
[22]:
df.shape
[22]:
(15709, 26)
[23]:
df['INSPECTION TYPE'].value_counts()
[23]:
Administrative Miscellaneous / Initial Inspection              7018
Smoke-Free Air Act / Initial Inspection                        2320
Administrative Miscellaneous / Re-inspection                   2063
Trans Fat / Initial Inspection                                 1648
Calorie Posting / Initial Inspection                           1123
Smoke-Free Air Act / Re-inspection                              586
Trans Fat / Re-inspection                                       394
Calorie Posting / Re-inspection                                 233
Administrative Miscellaneous / Compliance Inspection            118
Administrative Miscellaneous / Reopening Inspection             102
Trans Fat / Compliance Inspection                                42
Administrative Miscellaneous / Second Compliance Inspection      19
Smoke-Free Air Act / Compliance Inspection                       17
Calorie Posting / Compliance Inspection                          16
Trans Fat / Second Compliance Inspection                          7
Smoke-Free Air Act / Limited Inspection                           2
Trans Fat / Limited Inspection                                    1
Name: INSPECTION TYPE, dtype: int64
[24]:
# QUESTION:
#
# IS there an easy way to get the difference between distinct value counts for those records that
# have a score and tose that don't. That is, are there INSPECTION TYPE's that never result in score
# and others that always have a score?

# NOTE (for cleaning step):
#
# Delete records with empty score.
Cuisine Types

We want to compare inspection results by cuisine type. Get a quick look at the different values in that column.

[25]:
ds.distinct('CUISINE DESCRIPTION')
[25]:
Counter({'Bakery': 12305,
         'American': 82709,
         'Asian': 6237,
         'Tex-Mex': 1786,
         'Chinese': 41431,
         'Mexican': 15811,
         'Korean': 5431,
         'Pizza/Italian': 8354,
         'Japanese': 13956,
         'Donuts': 5199,
         'Sandwiches': 4108,
         'Pizza': 17536,
         'Caribbean': 14080,
         'French': 4499,
         'Delicatessen': 6257,
         'Seafood': 3092,
         'Café/Coffee/Tea': 18833,
         'Spanish': 12231,
         'Salads': 956,
         'Juice, Smoothies, Fruit Salads': 4573,
         'Afghan': 190,
         'Chinese/Japanese': 884,
         'Filipino': 666,
         'Thai': 5334,
         'Irish': 3336,
         'Latin (Cuban, Dominican, Puerto Rican, South & Central American)': 17117,
         'Eastern European': 1369,
         'Turkish': 1179,
         'Italian': 15798,
         'Bottled beverages, including water, sodas, juices, etc.': 1202,
         'Hamburgers': 4385,
         'African': 1729,
         'Chicken': 7337,
         'Other': 2535,
         'Barbecue': 764,
         'Jewish/Kosher': 5550,
         'Greek': 2162,
         'English': 207,
         'Bangladeshi': 1193,
         'Sandwiches/Salads/Mixed Buffet': 2740,
         'Middle Eastern': 2927,
         'Pakistani': 651,
         'Bagels/Pretzels': 2630,
         'Soul Food': 1138,
         'Steak': 1277,
         'German': 428,
         'Peruvian': 1849,
         'Indian': 6841,
         'Brazilian': 488,
         'Tapas': 516,
         'Hawaiian': 496,
         'Russian': 1086,
         'Vietnamese/Cambodian/Malaysia': 1895,
         'Mediterranean': 4219,
         'Ice Cream, Gelato, Yogurt, Ices': 3044,
         'Vegetarian': 1874,
         'Continental': 629,
         'Soups & Sandwiches': 552,
         'Hotdogs/Pretzels': 269,
         'Egyptian': 188,
         'Chinese/Cuban': 420,
         'Creole': 526,
         'Moroccan': 149,
         'Polish': 542,
         'Ethiopian': 231,
         'Portuguese': 133,
         'Australian': 378,
         'Fruits/Vegetables': 90,
         'Armenian': 305,
         'Czech': 41,
         'Hotdogs': 185,
         'Scandinavian': 88,
         'Soups': 56,
         'Nuts/Confectionary': 34,
         'Creole/Cajun': 133,
         'Southwestern': 80,
         'Iranian': 60,
         'Pancakes/Waffles': 221,
         'Not Listed/Not Applicable': 98,
         'Chilean': 23,
         'Cajun': 82,
         'Californian': 90,
         'Indonesian': 101,
         'Basque': 7})

Wrangling - DOHMH New York City Restaurant Inspection Results

Data Cleaning

Our goal is to reproduce a previous study from 2014 that looks at the distribution of restaurant inspection grades in New York City. For our study, we use data that was downloaded in Sept. 2019.

We performed some basic data profiling steps to get an understanding of the data and to identify a some initial data cleaning task.

[1]:
# Open the downloaded dataset to extract the relevant columns and records.

import os

from openclean.pipeline import stream

ds = stream(os.path.join('data', '43nn-pn8j.tsv.gz'))

Extract Relevant Records

Get the data records for the data strudy. Perform initial cleaning guided by the profing step.

[2]:
# We will only consider the following columns from the full dataset.

columns=[
    'CAMIS',
    'DBA',
    'BORO',
    'BUILDING',
    'STREET',
    'ZIPCODE',
    'CUISINE DESCRIPTION',
    'INSPECTION DATE',
    'VIOLATION CODE',
    'CRITICAL FLAG',
    'SCORE',
    'GRADE',
    'INSPECTION TYPE'
]
ds = ds.select(columns)
[3]:
# During data profiling we decided to
#
# - replace the 'BORO' for records that have value '0' and a 'ZIPCODE' in ['11249', '10168', '10285'].
# - remove records ...
#   + for new establishments ('INSPECTION DATE' == 1900/1/1)
#   + with empty 'SCORE's
#   + 'BORO' == 'N/A'

from datetime import datetime
from openclean.function.eval.base import Col
from openclean.function.eval.datatype import Datetime
from openclean.function.eval.logic import And
from openclean.function.eval.null import IsNotEmpty
from openclean.function.eval.domain import Lookup

# Date that identifies new establishments that have not
# been inspected.
new_establ_date = datetime(1900, 1, 1)

boro_0_mapping = {'11249': 'Brooklyn', '10168': 'Manhattan', '10285': 'Manhattan'}

# Filter and update the data in the stream. Then perform atype casting and
# generate the pandas data frame with the selected records that we will be
# using for the remainder of our study.

df = ds\
    .filter(And(Col('BORO') != 'N/A', Datetime('INSPECTION DATE') != new_establ_date, IsNotEmpty('SCORE')))\
    .update('BORO', Lookup('ZIPCODE', boro_0_mapping, default=Col('BORO')))\
    .typecast()\
    .to_df()

[4]:
# What is the size of the resulting dataset?

df.shape
[4]:
(375085, 13)
[5]:
# Remove any exact duplicates from the dataset.

df = df.drop_duplicates()
df.shape
[5]:
(375078, 13)
[6]:
# Profile the dataset.

from openclean.profiling.dataset import dataset_profile

profile = dataset_profile(df)
[7]:
profile.stats()
[7]:
total empty distinct uniqueness entropy
CAMIS 375078 0 25530 0.068066 14.296316
DBA 375078 0 20468 0.054570 13.627345
BORO 375078 0 5 0.000013 1.998406
BUILDING 375078 224 7166 0.019117 11.707591
STREET 375078 0 3191 0.008508 9.835756
ZIPCODE 375078 5316 224 0.000606 7.029375
CUISINE DESCRIPTION 375078 0 84 0.000224 4.726841
INSPECTION DATE 375078 0 1301 0.003469 9.821872
VIOLATION CODE 375078 1590 73 0.000195 4.396638
CRITICAL FLAG 375078 2793 2 0.000005 0.983115
SCORE 375078 0 136 0.000363 5.340192
GRADE 375078 176567 7 0.000035 1.119769
INSPECTION TYPE 375078 0 17 0.000045 1.618490
[8]:
profile.types()
[8]:
date int str
CAMIS 0 25530 0
DBA 1 4 20463
BORO 0 0 5
BUILDING 14 6606 546
STREET 0 0 3191
ZIPCODE 0 224 0
CUISINE DESCRIPTION 0 0 84
INSPECTION DATE 1301 0 0
VIOLATION CODE 0 0 73
CRITICAL FLAG 0 0 2
SCORE 0 136 0
GRADE 0 0 7
INSPECTION TYPE 0 0 17
FD Violations

We want to make sure that certain constraints hold on the data before we start generating the charts.

From the dataset description: “… When an inspection results in more than one violation, values for associated fields are repeated for each additional violation record.

There might be multiple records in the dataset for each business (‘CAMIS’) and inspection date. We want to ensure that the score that a business gets for an inspection is the same accross all records for that individual inspection, i.e., CAMIS, INSPECTION DATE -> SCORE.

The unique business identifier should also uniquely identify all the inspection idenpendent (statis) attributes in the dataset, i.e., CAMIS -> DBA, BORO, BUILDING, STREET, ZIPCODE, CUISINE DESCRIPTION.

One would also assume that the inspection score determines the inspection grade, i.e., SCORE -> GRADE.

[9]:
# FD1: CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE

from openclean.operator.map.violations import fd_violations
fd1_violations = fd_violations(df, ['CAMIS', 'INSPECTION DATE'], ['INSPECTION TYPE', 'SCORE'])

print('# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is {}'.format(len(fd1_violations)))
# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is 10
[10]:
# Have a look at the different sets of violations.

for key, gr in fd1_violations.items():
    print(gr[['CAMIS', 'INSPECTION DATE', 'INSPECTION TYPE', 'VIOLATION CODE', 'SCORE']])
    print()
          CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
4569   41702610  2017-07-17 00:00:00  Cycle Inspection / Initial Inspection
78197  41702610  2017-07-17 00:00:00  Cycle Inspection / Initial Inspection

      VIOLATION CODE SCORE
4569                    29
78197                    0

           CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
14420   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
31755   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
49122   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
56000   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
69598   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
112737  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
148895  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
167080  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
274101  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection

       VIOLATION CODE SCORE
14420             04N    20
31755             08C    20
49122             04M    15
56000             08A    20
69598             04N    15
112737            08A    15
148895            08C    15
167080            04M    20
274101            06C    20

           CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
29316   41720266  2018-03-14 00:00:00  Cycle Inspection / Initial Inspection
298918  41720266  2018-03-14 00:00:00  Cycle Inspection / Initial Inspection

       VIOLATION CODE SCORE
29316             02B     0
298918            02B     9

           CAMIS      INSPECTION DATE                   INSPECTION TYPE  \
34745   41199571  2016-08-30 00:00:00         Trans Fat / Re-inspection
117447  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection
252713  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection
338929  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection

       VIOLATION CODE SCORE
34745             16B    13
117447            10F    13
252713            06C    13
338929            06F    13

          CAMIS      INSPECTION DATE  \
58708  40894333  2017-02-10 00:00:00
73534  40894333  2017-02-10 00:00:00

                                    INSPECTION TYPE VIOLATION CODE SCORE
58708  Administrative Miscellaneous / Re-inspection            20F     5
73534              Cycle Inspection / Re-inspection            06D     5

           CAMIS      INSPECTION DATE  \
66064   50065982  2018-03-23 00:00:00
210211  50065982  2018-03-23 00:00:00
353272  50065982  2018-03-23 00:00:00

                                          INSPECTION TYPE VIOLATION CODE SCORE
66064   Pre-permit (Non-operational) / Initial Inspection            08A    12
210211  Pre-permit (Non-operational) / Initial Inspection                    0
353272  Pre-permit (Non-operational) / Initial Inspection            04L    12

           CAMIS      INSPECTION DATE  \
73769   50048062  2018-10-30 00:00:00
330432  50048062  2018-10-30 00:00:00

                                INSPECTION TYPE VIOLATION CODE SCORE
73769   Cycle Inspection / Reopening Inspection            05H    28
330432  Cycle Inspection / Reopening Inspection                    0

           CAMIS      INSPECTION DATE  \
147186  50032911  2019-06-22 00:00:00
218146  50032911  2019-06-22 00:00:00
338555  50032911  2019-06-22 00:00:00
347659  50032911  2019-06-22 00:00:00

                                     INSPECTION TYPE VIOLATION CODE SCORE
147186  Inter-Agency Task Force / Initial Inspection            04L    12
218146  Inter-Agency Task Force / Initial Inspection            10B    12
338555         Cycle Inspection / Initial Inspection            02G     7
347659  Inter-Agency Task Force / Initial Inspection            08A    12

           CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
150184  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection
187310  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection
231219  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection
262845  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection
306394  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection
316178  41485450  2018-04-12 00:00:00  Cycle Inspection / Initial Inspection

       VIOLATION CODE SCORE
150184            06B    16
187310            08A     0
231219            04L     0
262845            06B     0
306394            08A    16
316178            04L    16

           CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
248195  50004682  2017-04-11 00:00:00  Cycle Inspection / Initial Inspection
383438  50004682  2017-04-11 00:00:00  Cycle Inspection / Initial Inspection

       VIOLATION CODE SCORE
248195                   38
383438                    0

Violation Repair Strategy

First, we are goin to take a closer look at records where the score is zero. Are there other records with score zero and if how many? Should we remove all records with a score of zero? Are there other records that we may want to get rid of (e.g., score - 1).

For the two groups that have violations without zero we use majority voting to update the data.

[11]:
# How many records are there where the 'SCORE' is zero?

df['SCORE'].value_counts().loc[0]
[11]:
1626
[12]:
# What are the VIOLATION CODES for score zero?

df.loc[df['SCORE'] == 0]['VIOLATION CODE'].value_counts()
[12]:
       1579
08A       6
10F       5
04L       5
02B       4
06C       4
22F       3
02G       3
06D       3
22G       2
10B       2
06B       2
04M       1
04N       1
09B       1
04K       1
05A       1
04F       1
10D       1
04H       1
Name: VIOLATION CODE, dtype: int64
[13]:
# There are also scores of -1

df.loc[df['SCORE'] == -1]['VIOLATION CODE'].value_counts()
[13]:
08A    11
02G    10
06D     8
04L     8
06C     7
02B     7
10F     7
06E     6
05D     4
04H     4
04M     3
04A     3
10B     3
06A     2
06F     2
10H     2
10I     2
04N     2
09B     2
07A     1
03A     1
04K     1
04C     1
09C     1
08C     1
06B     1
Name: VIOLATION CODE, dtype: int64
[14]:
# Delete records with score lower or equal zero or empty violation code.

from openclean.function.eval.logic import Or
from openclean.function.eval.null import IsEmpty
from openclean.operator.transform.filter import delete

df = delete(df, Or(IsEmpty('VIOLATION CODE'), Col('SCORE') <= 0))

# What is the pandas equivalent ??? These are the rows we want to delete:
# df[df['VIOLATION CODE'].isnull() | df['SCORE'] <= 0]
[15]:
df.shape
[15]:
(373341, 13)
[16]:
# Revisit FD1: CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE

from openclean.operator.map.violations import fd_violations
fd1_violations = fd_violations(df, ['CAMIS', 'INSPECTION DATE'], ['INSPECTION TYPE', 'SCORE'])

print('# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is {}'.format(len(fd1_violations)))

for key, gr in fd1_violations.items():
    print(gr[['CAMIS', 'INSPECTION DATE', 'INSPECTION TYPE', 'VIOLATION CODE', 'SCORE']])
    print()
# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is 4
           CAMIS      INSPECTION DATE                        INSPECTION TYPE  \
14420   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
31755   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
49122   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
56000   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
69598   40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
112737  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
148895  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
167080  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection
274101  40911114  2017-11-04 00:00:00  Cycle Inspection / Initial Inspection

       VIOLATION CODE SCORE
14420             04N    20
31755             08C    20
49122             04M    15
56000             08A    20
69598             04N    15
112737            08A    15
148895            08C    15
167080            04M    20
274101            06C    20

           CAMIS      INSPECTION DATE                   INSPECTION TYPE  \
34745   41199571  2016-08-30 00:00:00         Trans Fat / Re-inspection
117447  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection
252713  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection
338929  41199571  2016-08-30 00:00:00  Cycle Inspection / Re-inspection

       VIOLATION CODE SCORE
34745             16B    13
117447            10F    13
252713            06C    13
338929            06F    13

          CAMIS      INSPECTION DATE  \
58708  40894333  2017-02-10 00:00:00
73534  40894333  2017-02-10 00:00:00

                                    INSPECTION TYPE VIOLATION CODE SCORE
58708  Administrative Miscellaneous / Re-inspection            20F     5
73534              Cycle Inspection / Re-inspection            06D     5

           CAMIS      INSPECTION DATE  \
147186  50032911  2019-06-22 00:00:00
218146  50032911  2019-06-22 00:00:00
338555  50032911  2019-06-22 00:00:00
347659  50032911  2019-06-22 00:00:00

                                     INSPECTION TYPE VIOLATION CODE SCORE
147186  Inter-Agency Task Force / Initial Inspection            04L    12
218146  Inter-Agency Task Force / Initial Inspection            10B    12
338555         Cycle Inspection / Initial Inspection            02G     7
347659  Inter-Agency Task Force / Initial Inspection            08A    12

[17]:
# Repair violations of FD. Use majority voting for 'INSPECTION TYPE' and 'SCORE'
# for groups of rows wth violations.

from openclean.operator.collector.repair import Shortest, Vote, conflict_repair

# Define the conflict resolution strategy. We use majority vote for both RHS attributes.
# In one case (CAMIS=40894333) values for 'INSPECTION TYPE' in the conflict group are
# equally frequent (i.e., there is a tie in the vote). We break that tie by selecting
# the shorter of the two values.
strategy = {'INSPECTION TYPE': Vote(tiebreaker=Shortest()), 'SCORE': Vote()}

df = conflict_repair(conflicts=fd1_violations, strategy=strategy, in_order=False)
[18]:
# Make sure that there are no further violations of FD1.

fd1_violations = fd_violations(df, ['CAMIS', 'INSPECTION DATE'], ['INSPECTION TYPE', 'SCORE'])
assert len(fd1_violations) == 0

print('# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is {}'.format(len(fd1_violations)))
# of violations for FD(CAMIS, INSPECTION DATE -> INSPECTION TYPE, SCORE) is 0
[19]:
# FD2: AMIS -> DBA, BORO, BUILDING, STREET, ZIPCODE, CUISINE DESCRIPTION

from openclean.operator.map.violations import fd_violations

fd2_violations = fd_violations(df, 'CAMIS', ['DBA', 'BORO', 'BUILDING', 'STREET', 'ZIPCODE', 'CUISINE DESCRIPTION'])

print('# of violations for FD(CAMIS -> DBA, BORO, BUILDING, STREET, ZIPCODE, CUISINE DESCRIPTION) is {}'.format(len(fd2_violations)))
# of violations for FD(CAMIS -> DBA, BORO, BUILDING, STREET, ZIPCODE, CUISINE DESCRIPTION) is 0
[20]:
# FD 3: SCORE -> GRADE

from openclean.operator.map.violations import fd_violations
fd3_violations = fd_violations(df, 'SCORE', 'GRADE')

print('# of violations for FD(SCORE -> GRADE) is {}'.format(len(fd3_violations)))
# of violations for FD(SCORE -> GRADE) is 95

Grades appear to be empty for restaurants that did not receive a grade ‘A’ in the first inspection (see example records below). FD 3 is therefore not expected to hold.

Prepare Data for Plotting

Create a datset with ‘CAMIS’, ‘BORO’, ‘CUISINE’, ‘DATE’, ‘TYPE’, ‘SCORE’ with one row per (business, inspection date).

[21]:
from openclean.operator.transform.select import select

columns = ['CAMIS', 'BORO', 'CUISINE DESCRIPTION', 'INSPECTION DATE', 'INSPECTION TYPE', 'SCORE']
establishments = select(df, columns=columns).drop_duplicates()
[22]:
from openclean.operator.map.violations import key_violations

# Ensure that ['CAMIS', 'INSPECTION DATE'] is a key candidate now.
groups = key_violations(establishments, ['CAMIS', 'INSPECTION DATE'])
assert len(groups) == 0

print('# of violations for KEY(CAMIS, INSPECTION DATE) is {}'.format(len(groups)))

# Total number of businesses.
print('Total number of inspections is {}'.format(len(establishments)))
# of violations for KEY(CAMIS, INSPECTION DATE) is 0
Total number of inspections is 128455
[23]:
establishments.head()
[23]:
CAMIS BORO CUISINE DESCRIPTION INSPECTION DATE INSPECTION TYPE SCORE
0 50001317 Manhattan Bakery 2018-05-04 00:00:00 Cycle Inspection / Initial Inspection 19
1 41716448 Manhattan American 2019-07-30 00:00:00 Cycle Inspection / Re-inspection 27
2 50044535 Manhattan Asian 2017-06-14 00:00:00 Cycle Inspection / Initial Inspection 24
3 50041601 Manhattan Tex-Mex 2019-05-09 00:00:00 Cycle Inspection / Initial Inspection 11
4 50045596 Bronx Chinese 2016-09-07 00:00:00 Cycle Inspection / Re-inspection 12
[24]:
# Show inspection data for a single business.

for camis in [40911114, 50001317, 50044535]:
    inspections = establishments[establishments['CAMIS'] == camis]
    print('\nCAMIS={}\n'.format(camis))
    print(inspections[['INSPECTION DATE', 'SCORE', 'INSPECTION TYPE']].sort_values('INSPECTION DATE'))

CAMIS=40911114

            INSPECTION DATE SCORE                        INSPECTION TYPE
14420   2017-11-04 00:00:00    20  Cycle Inspection / Initial Inspection
9923    2018-03-23 00:00:00     5       Cycle Inspection / Re-inspection
147506  2019-05-16 00:00:00     7  Cycle Inspection / Initial Inspection

CAMIS=50001317

            INSPECTION DATE SCORE                        INSPECTION TYPE
39400   2016-03-10 00:00:00    13  Cycle Inspection / Initial Inspection
38971   2017-05-04 00:00:00    12  Cycle Inspection / Initial Inspection
0       2018-05-04 00:00:00    19  Cycle Inspection / Initial Inspection
113508  2018-07-05 00:00:00    12       Cycle Inspection / Re-inspection
45619   2018-12-03 00:00:00    12  Cycle Inspection / Initial Inspection

CAMIS=50044535

            INSPECTION DATE SCORE  \
234918  2015-12-16 00:00:00    16
4327    2016-01-12 00:00:00    13
89129   2016-09-21 00:00:00    14
65087   2016-11-03 00:00:00    10
2       2017-06-14 00:00:00    24
173318  2017-08-15 00:00:00    12
21837   2018-02-28 00:00:00    17
78332   2018-04-24 00:00:00    12
54655   2018-09-19 00:00:00    11

                                      INSPECTION TYPE
234918  Pre-permit (Operational) / Initial Inspection
4327         Pre-permit (Operational) / Re-inspection
89129           Cycle Inspection / Initial Inspection
65087                Cycle Inspection / Re-inspection
2               Cycle Inspection / Initial Inspection
173318               Cycle Inspection / Re-inspection
21837           Cycle Inspection / Initial Inspection
78332                Cycle Inspection / Re-inspection
54655           Cycle Inspection / Initial Inspection
[25]:
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme()
sns.set_context("talk", font_scale=1.)

# sns.set_style('ticks')
fig, ax = plt.subplots()
# the size of A4 paper
fig.set_size_inches(11.7, 8.27)


sns.histplot(establishments[establishments['SCORE'] < 40], x="SCORE", ax=ax)
[25]:
<AxesSubplot:xlabel='SCORE', ylabel='Count'>
_images/source_examples_restaurant_cleaning_30_1.png
[ ]:


Drawing

openclean is a Python library for data profiling and data cleaning. It is motivated by the fact that data preparation is still a major bottleneck for many data science projects. Data preparation requires profiling to gain an understanding of data quality issues, and data manipulation to transform the data into a form that is fit for the intended purpose.

While a large number of different tools and techniques have previously been developed for profiling and cleaning data, one main issue that we see with these tools is the lack of access to them in a single (unified) framework. Existing tools may be implemented in different programming languages and require significant effort to install and interface with. In other cases, promising data cleaning methods have been published in the scientific literature but there is no suitable codebase available for them. We believe that the lack of seamless access to existing work is a major contributor to why data preparation is so time consuming.

The goal of openclean goal is to bring together data cleaning tools in a single environment that is easy and intuitive to use for a data scientist. openclean allows users to compose and execute cleaning pipelines that are built using a variety of different tools. We aim for openclean to be flexible and extensible to allow easy integration of new functionality. To this end, we define a set of primitives and API’s for the different types of operators (actors) in openclean pipelines.

Features

openclean has many features that make the data wrangling experience straightforward. It shines particularly in these areas:

Data Profiling

openclean comes with a profiler to provide users actionable metrics about their data’s quality. It allows users to detect possible problems early on by providing various statistical measures of the data from min-max frequencies, to uniqueness and entropy calculations. The interface is easy to implement and can be extended by python savvy users to cater their needs.

Data Cleaning & Wrangling

openclean’s operators have been created specifically to handle data janitorial tasks. They help identify and present statistical anomalies, fix functional dependency violations, locate and update spelling mistakes, and handle missing values gracefully. As openclean is growing fast, so is this list of operators!

Data Enrichment

openclean seamlessly integrates with Socrata and Reference Data Repository to provide it’s users master datasets which can be incorporated in the data cleaning process.

Data Provenance

openclean comes with a mini-version control engine that allows users to maintain versions of their datasets and at any point commit, checkout or rollback changes. Not only this, users can register custom functions inside the openclean engine and apply them effortlessly across different datasets/notebooks.

Drawing is available on PyPI ( https://pypi.org/project/openclean-core/ )


Standardizing Ethiopian dates and Woreda names

This notebook demonstrates openclean’s abilities on solving some major hurdles encountered in the Ethiopian Vaccine deliveries dataset showing monthly vaccine deliveries to various Zones and Woredas in Ethiopia between 2017-2019 (note: the dataset values have been randomized).

Setting up

[1]:
import pprint
import os, re

pp = pprint.PrettyPrinter(indent=2)

The DB engine allows users to profile and view their data through a user interface. They can also create recipes of operations on samples and apply them lazily over a full set once they’re convinced with the changes.

The engine also provides users the ability to maintain provenance of the operations performed on a dataset. Just like a version control system, it has methods to load, commit, and checkout versions of the dataset. To learn more about maintaining provenance in openclean, check out the documentation. Finally, not only can they create versions of their datasets, they can also register custom functions with the engine and use them across notebooks.

[2]:
# load openclean jupyter widget

from openclean_notebook import DB

db = DB(basedir='.openclean', create=True)

Loading data

We use the stream operator to show how large datasets can be streamed through openclean transformations without ever needing to fully load them into memory. We also perform a couple horizontal and vertical slicing operations that are evaluated lazily. The final dataset we will use in this notebook has 10k rows and 10 columns and contains information on 3 administrative levels inside Ethiopia: Region, Zone and Woreda. For succinctness, we only use data from the ‘Oromia’ Region.

[3]:
# Load data

from openclean.pipeline import stream
from openclean.profiling.datatype.convert import DefaultConverter
from openclean.function.eval.base import Eq, Col

vacc = stream(os.path.join('data', 'ethiopia-vacc-randomized.csv'))\
    .typecast(DefaultConverter()) \
    .select(['EthiopianMonth', 'EthMonNum', 'EthYear',
             'RegionName', 'ZoneName', 'WoredaName',
             'DeliveredPrivateClinics', 'DeliveredPublicClinics',
             'DeliveredOther', 'DeliveredTotal'])\
    .where(Eq(Col('RegionName'), 'Oromia'))\
    .to_df()
[4]:
vacc.sample(5, random_state=42)
[4]:
EthiopianMonth EthMonNum EthYear RegionName ZoneName WoredaName DeliveredPrivateClinics DeliveredPublicClinics DeliveredOther DeliveredTotal
6252 Yekatit 6th 2009 Oromia South West Shewa Wonchi 22 7 9 38
4684 Hedar 3rd 2011 Oromia Bale Sinana 36 69 45 150
1731 Teqemt 2nd 2010 Oromia Bale Raitu 94 90 0 184
4742 Tir 5th 2011 Oromia West Wellega Homa 74 45 13 132
4521 Hamle 11th 2009 Oromia West Shewa Guder Hosp 74 74 46 194

Profiling

openclean comes with pre-configured tools that profile datasets and report actionable metrics on data quality as well as with an API to let users create / plug their own. By default, we use the auctus profiler. The power of the user interface coupled with the profiler can be seen here.

[5]:
# load the dataset to the widget

db.load_dataset(source=vacc, name='vacc')
[5]:
<openclean.engine.dataset.FullDataset at 0x7fe299597e20>
[6]:
# fix string dates
@db.register.eval('get_numerical_value')
def get_numerical_value(value):
    """Ingest a given string and return only the numerical characters

        e.g.: 12th -> 12
    """
    return re.findall("\d+", value)[0]

[7]:
# The detail and column views show various profiled metrics

db.edit('vacc', n=100)
[8]:
vacc = db.checkout(name='vacc')

Transformations

This section performs standardization transformations on the dataset. A few updates that the dataset needs are: - Recreating Gregorian dates from Ethiopian dates - Fixing spelling mistakes in Woreda Names

Date Conversion

An ethiopian calendar year spreads over parts of two Gregorian years as it starts in September. Hence we need both the month and year to tranform it to it’s gregorian counterpart. We should be able to assign a month and year to each record. We cant calculate the exact gregorian day for each record because we don’t have ethiopian day information. So we’ll assume the 1st of each month while providing the user freedom to modify it based on domain knowledge.

Note: Ethiopian calendars have 13 months (https://allaboutethio.com/tcalendar.html) which can create uneven time deltas between records because all months are 30 days long and the 13th is 5 or 6(leap) days. Luckily this dataset disregards the 13th month.

YYYY-MM-DD (Eth) -> YYYY-MM-DD (Greg)

2009-01-01 (Eth) —> 2016-09-16 (Greg)

2009-13-05 (Eth) —> 2017-09-15 (Greg)

[9]:
# the dataset has ethiopic dates in 3 columns

vacc.sample(5, random_state=42)[['EthYear','EthMonNum','EthiopianMonth']]
[9]:
EthYear EthMonNum EthiopianMonth
6252 2009 6 Yekatit
4684 2011 3 Hedar
1731 2010 2 Teqemt
4742 2011 5 Tir
4521 2009 11 Hamle

We use an external library (ethiopian-date) to parse these dates into Gregorian by constructing an openclean operator. The operator expects 2 columns and a function to perform on those columns and can be passed to any similar dataset for the same conversion.

[10]:
from ethiopian_date import EthiopianDateConverter
from openclean.function.eval.base import Eval
from openclean.operator.transform.insert import inscol


# the operator should have two input values and return a date
convert_date = lambda x, y : EthiopianDateConverter.to_gregorian(int(x), int(y), 1)


# create a new operator that expects two columns name 'EthYear' and 'EthMonth' and it runs
# the convert_date callable on those columns
date_parser = Eval(columns=['EthYear','EthMonNum'],
     func = convert_date,
     is_unary = False)


# insert a new column in the vacc dataset called 'Converted_Date' at position 0 using the date_parser operator
vacc = inscol(vacc, 'Converted_Date', 0, date_parser)
[11]:
# the Converted_date column has the converted dates

vacc.sample(10, random_state=42)
[11]:
Converted_Date EthiopianMonth EthMonNum EthYear RegionName ZoneName WoredaName DeliveredPrivateClinics DeliveredPublicClinics DeliveredOther DeliveredTotal
6252 2017-02-08 Yekatit 6 2009 Oromia South West Shewa Wonchi 22 7 9 38
4684 2018-11-10 Hedar 3 2011 Oromia Bale Sinana 36 69 45 150
1731 2017-10-11 Teqemt 2 2010 Oromia Bale Raitu 94 90 0 184
4742 2019-01-09 Tir 5 2011 Oromia West Wellega Homa 74 45 13 132
4521 2017-07-08 Hamle 11 2009 Oromia West Shewa Guder Hosp 74 74 46 194
6340 2018-04-09 Miyazia 8 2010 Oromia Bale Seweyna 7 83 2 92
576 2018-01-09 Tir 5 2010 Oromia West Hararge Guba Qoricha 77 95 15 187
5202 2018-07-08 Hamle 11 2010 Oromia Lege Dadi Lege Tafo Town Lege Dadi Lege Tafo Town 59 11 84 154
6363 2019-01-09 Tir 5 2011 Oromia Qeleme Wellega Dale Sedi 43 86 20 149
439 2019-05-09 Ginbot 9 2011 Oromia Arsi Tena 86 42 53 181

Standardizing Spellings

Because this dataset was collected over a period of time and the Zone and Woreda names are in a different language, they susceptible to spelling mistakes when transliterated into english. We check this in this section.

We use official lists of regional names provided by the Ethiopian Government as master data to cross reference the vacc data Woredas.

[12]:
from openclean.data.load import dataset
from openclean.operator.transform.apply import apply
from openclean.operator.transform.select import select

# load the master data. As per the meta data:
# - admin0 - Country
# - admin1 - State/Region
# - admin2 - Zone
# - admin3 - Woreda
admin_boundaries = dataset(os.path.join('data','admin-boundaries.csv'),\
                           typecast=DefaultConverter())


# the openclean select method can be used to select specific columns and change their names
admin_boundaries = select(admin_boundaries,
                          ['admin0Name_en', 'admin1Name_en', 'admin2Name_en', 'admin3Name_en'],
                          ['Country', 'Region', 'Zone', 'Woreda'])


# the apply method applies a function over one or more columns
admin_boundaries = apply(admin_boundaries, ['Country','Region','Zone','Woreda'] , str.title)


admin_boundaries.head(10)
[12]:
Country Region Zone Woreda
0 Ethiopia Oromia West Guji Olanciti Town
1 Ethiopia Oromia Horo Gudru Wellega Gudeya Bila
2 Ethiopia Somali Shabelle Aba-Korow
3 Ethiopia Afar Kilbati /Zone2 Abaala
4 Ethiopia Afar Kilbati /Zone2 Abaala Town
5 Ethiopia Oromia Horo Gudru Wellega Ababo
6 Ethiopia Harari Harari Abadir
7 Ethiopia Oromia Horo Gudru Wellega Abay Chomen
8 Ethiopia Oromia West Guji Abaya
9 Ethiopia Oromia Horo Gudru Wellega Abe Dongoro

First, let’s check how many values in our dataset are not present in the official list.

[13]:
errors = set(vacc['WoredaName']) - set(admin_boundaries['Woreda'])
print('there are {} errors'.format(len(errors)))
there are 216 errors

Next, we use the openclean StringMatcher to find potential matches to these errors and all other values in our dataset. The string matcher uses Fuzzy Similarity and uses admin_boundaries as master vocabulary. We create a mapping of all matches per query.

[14]:
from openclean.function.matching.fuzzy import FuzzySimilarity
from openclean.function.matching.base import DefaultStringMatcher
from openclean.data.mapping import Mapping

matcher = DefaultStringMatcher(
            vocabulary = admin_boundaries['Woreda'],
            similarity = FuzzySimilarity(),
            best_matches_only=True,
            no_match_threshold=0.4,
            cache_results = True)

woreda_map = Mapping()
for query in set(vacc['WoredaName']):
    woreda_map.add(query, matcher.find_matches(query))
pp.pprint(woreda_map)
Mapping(<class 'list'>,
        { 'Abay Chomen': [StringMatch(term='Abay Chomen', score=1)],
          'Abaya': [StringMatch(term='Abaya', score=1)],
          'Abe Dengoro': [ StringMatch(term='Abe Dongoro', score=0.9090909090909091)],
          'Abichugna': [StringMatch(term="Abichugna Gne'A", score=0.6)],
          'Abuna Gindeberet': [ StringMatch(term='Abuna Ginde Beret', score=0.9411764705882353)],
          'Adaba': [StringMatch(term='Adaba', score=1)],
          'Adama': [StringMatch(term='Adama', score=1)],
          'Adama Town': [StringMatch(term='Adama Town', score=1)],
          'Adami Tulu Jido Kombolcha': [ StringMatch(term='Adama Tulu Jido Kombolcha', score=0.96)],
          'Adea': [ StringMatch(term='Adet', score=0.75),
                    StringMatch(term='Adwa', score=0.75)],
          'Adea Berga': [StringMatch(term='Adda Berga', score=0.9)],
          'Adola Hospital': [StringMatch(term='Adola Town', score=0.5)],
          'Adola Reda': [StringMatch(term='Adola Town', score=0.6)],
          'Adola Town': [StringMatch(term='Adola Town', score=1)],
          'Aga Wayyu': [StringMatch(term='Aga Wayu', score=0.8888888888888888)],
          'Agarfa': [StringMatch(term='Agarfa', score=1)],
          'Agaro': [StringMatch(term='Amaro', score=0.8)],
          'Agaro Hospital': [StringMatch(term='Agaro Town', score=0.5)],
          'Akaki': [StringMatch(term='Akaki', score=1)],
          'Ale': [StringMatch(term='Ale', score=1)],
          'Aleiltu': [StringMatch(term='Aleltu', score=0.8571428571428572)],
          'Algesachi': [StringMatch(term='Alge Sachi', score=0.9)],
          'Ambo': [StringMatch(term='Afambo', score=0.6666666666666667)],
          'Ambo Hospital': [ StringMatch(term='Ambo Zuria', score=0.5384615384615384)],
          'Ambo Town': [StringMatch(term='Ambo Town', score=1)],
          'Ambo University  Hosp': [],
          'Ameya': [StringMatch(term='Ameya', score=1)],
          'Ameya Hospital': [],
          'Amigna': [StringMatch(term='Amigna', score=1)],
          'Amuru': [StringMatch(term='Amuru', score=1)],
          'Anchar': [StringMatch(term='Anchar', score=1)],
          'Anfilo': [StringMatch(term='Anfilo', score=1)],
          'Anna Sora': [StringMatch(term='Ana Sora', score=0.8888888888888888)],
          'Arena Buluq': [ StringMatch(term='Harena Buluk', score=0.8333333333333334)],
          'Arero': [StringMatch(term='Arero', score=1)],
          'Arsi Negele Rural': [ StringMatch(term='Arsi Negele Town', score=0.7058823529411764)],
          'Arsi Negele Town': [StringMatch(term='Arsi Negele Town', score=1)],
          'Aseko': [StringMatch(term='Aseko', score=1)],
          'Assela Town': [ StringMatch(term='Asela Town', score=0.9090909090909091)],
          'Aweday Town': [StringMatch(term='Aweday Town', score=1)],
          'Ayira': [StringMatch(term='Ayira', score=1)],
          'Ayira Hospital': [],
          'B/Tolyi': [StringMatch(term='Tole', score=0.4285714285714286)],
          'Babile': [StringMatch(term='Berahile', score=0.625)],
          'Babile Woreda': [ StringMatch(term='Babile (Or)', score=0.6923076923076923)],
          'Babo Gembel': [ StringMatch(term='Chabe Gambeltu', score=0.5714285714285714)],
          'Bako Hospital': [ StringMatch(term='Maokomo Special', score=0.4666666666666667)],
          'Bako Tibe': [StringMatch(term='Bako Tibe', score=1)],
          'Bale Gesgara': [ StringMatch(term='Bele Gesgar', score=0.8333333333333334)],
          'Bantu  Hospital': [],
          'Batu': [StringMatch(term='Bati', score=0.75)],
          'Becho': [ StringMatch(term='Bero', score=0.6),
                     StringMatch(term='Decha', score=0.6),
                     StringMatch(term='Gechi', score=0.6),
                     StringMatch(term='Mecha', score=0.6)],
          'Bedele Hospital': [ StringMatch(term='Bedele Town', score=0.5333333333333333),
                               StringMatch(term='Badele Zuria', score=0.5333333333333333)],
          'Bedele Town': [StringMatch(term='Bedele Town', score=1)],
          'Bedele Zuriya': [ StringMatch(term='Badele Zuria', score=0.8461538461538461)],
          'Bedeno': [StringMatch(term='Bedeno', score=1)],
          'Bedesa Town': [ StringMatch(term='Bedele Town', score=0.8181818181818181)],
          'Begi': [StringMatch(term='Begi', score=1)],
          'Begi Hospital': [],
          'Bekoji Town': [StringMatch(term='Bekoji Town', score=1)],
          'Berbere': [StringMatch(term='Berbere', score=1)],
          'Berreh': [StringMatch(term='Bereh', score=0.8333333333333334)],
          'Biebirsa Kojowa': [ StringMatch(term='Birbirsa Kojowa', score=0.9333333333333333)],
          'Bilonopa': [StringMatch(term='Bilo Nopha', score=0.8)],
          'Bishan Guracha Town': [ StringMatch(term='Bishan Guracha', score=0.736842105263158)],
          'Bishoftu Town': [StringMatch(term='Bishoftu Town', score=1)],
          'Bisidimo Hospital': [ StringMatch(term='Bilo Nopha', score=0.4117647058823529)],
          'Boji Cheqorsa': [ StringMatch(term='Boji Chekorsa', score=0.9230769230769231)],
          'Boji Dermeji': [ StringMatch(term='Boji Dirmeji', score=0.9166666666666666)],
          'Boke': [StringMatch(term='Boke', score=1)],
          'Boneya Bushe': [ StringMatch(term='Boneya Boshe', score=0.9166666666666666)],
          'Bora': [ StringMatch(term='Bore', score=0.75),
                    StringMatch(term='Bura', score=0.75)],
          'Bore': [StringMatch(term='Bore', score=1)],
          'Bore Hospital': [ StringMatch(term='Borecha', score=0.46153846153846156),
                             StringMatch(term='Bule Hora', score=0.46153846153846156)],
          'Boricha': [StringMatch(term='Boricha', score=1)],
          'Boset': [StringMatch(term='Boset', score=1)],
          'Bule Hora': [StringMatch(term='Bule Hora', score=1)],
          'Bule Hora Hospital': [ StringMatch(term='Bule Hora Town', score=0.6111111111111112)],
          'Bule Hora Toun': [ StringMatch(term='Bule Hora Town', score=0.9285714285714286)],
          'Burayu Town': [ StringMatch(term='Bure Town', score=0.7272727272727273),
                           StringMatch(term='Durame Town', score=0.7272727272727273)],
          'Bure': [ StringMatch(term='Bura', score=0.75),
                    StringMatch(term='Bule', score=0.75),
                    StringMatch(term='Bore', score=0.75)],
          'Burka Dimtu': [ StringMatch(term='Burqua Dhintu', score=0.6923076923076923)],
          'Chelenko Hospital': [],
          'Chelia': [StringMatch(term='Cheliya', score=0.8571428571428572)],
          'Chewaqa': [StringMatch(term='Chwaka', score=0.7142857142857143)],
          'Chinakesen': [StringMatch(term='Chinaksen', score=0.9)],
          'Chiro Hospital': [ StringMatch(term='Chiro Zuria', score=0.5714285714285714)],
          'Chiro Town': [StringMatch(term='Chiro Town', score=1)],
          'Chiro Zuriya': [ StringMatch(term='Chiro Zuria', score=0.9166666666666666)],
          'Chole': [StringMatch(term='Chole', score=1)],
          'Chomen Guduru': [ StringMatch(term='Choman Guduru', score=0.9230769230769231)],
          'Chora': [StringMatch(term='Chifra', score=0.6666666666666667)],
          'Chora Boter': [ StringMatch(term='Chora (Buno Bedele)', score=0.4736842105263158)],
          'Codi': [StringMatch(term='Cobi', score=0.75)],
          'Dale Sedi': [ StringMatch(term='Dale Sadi', score=0.8888888888888888)],
          'Dale Wabera': [StringMatch(term='Dale Wabera', score=1)],
          'Dambi Dollo': [StringMatch(term='Denbi Dollo Town', score=0.5625)],
          'Dambi Dolo Hospital': [ StringMatch(term='Denbi Dollo Town', score=0.4736842105263158)],
          'Dano': [StringMatch(term='Dano', score=1)],
          'Dapho Hana': [StringMatch(term='Dabo Hana', score=0.8)],
          'Darimu': [StringMatch(term='Darimu', score=1)],
          'Daro Lebu': [StringMatch(term='Daro Lebu', score=1)],
          'Dawe Qachen': [StringMatch(term='Dawe Ketchen', score=0.75)],
          'Dawe Serar': [ StringMatch(term='Dale Wabera', score=0.5454545454545454)],
          'Dawo': [StringMatch(term='Dawo', score=1)],
          'Debre Libanos': [StringMatch(term='Debre Libanos', score=1)],
          'Deder': [StringMatch(term='Deder', score=1)],
          'Deder Hospital': [StringMatch(term='Deder Town', score=0.5)],
          'Deder Town': [StringMatch(term='Deder Town', score=1)],
          'Dedesa': [StringMatch(term='Dedesa', score=1)],
          'Dedo': [StringMatch(term='Dedo', score=1)],
          'Degem': [StringMatch(term='Degem', score=1)],
          'Deksis': [StringMatch(term='Diksis', score=0.8333333333333334)],
          'Delo Mena': [ StringMatch(term='Doyogena', score=0.5555555555555556),
                         StringMatch(term='Melo Gada', score=0.5555555555555556)],
          'Dendi': [StringMatch(term='Dendi', score=1)],
          'Dera': [ StringMatch(term='Gera', score=0.75),
                    StringMatch(term='Wera', score=0.75),
                    StringMatch(term='Dega', score=0.75),
                    StringMatch(term='Dara', score=0.75)],
          'Dera Hospital': [StringMatch(term='Derashe Special', score=0.6)],
          'Dhas': [StringMatch(term='Dhas', score=1)],
          'Dhidesa Hospital': [],
          'Didu': [StringMatch(term='Didu', score=1)],
          'Diga': [StringMatch(term='Diga', score=1)],
          'Digeluna Tijo': [ StringMatch(term='Degeluna Tijo', score=0.9230769230769231)],
          'Dilo': [StringMatch(term='Dilo', score=1)],
          'Dima': [ StringMatch(term='Diga', score=0.75),
                    StringMatch(term='Disa', score=0.75),
                    StringMatch(term='Dita', score=0.75),
                    StringMatch(term='Dama', score=0.75)],
          'Dinsho': [StringMatch(term='Dinsho', score=1)],
          'Dire': [StringMatch(term='Dire', score=1)],
          'Doba': [StringMatch(term='Doba', score=1)],
          'Dodola  Hospital': [StringMatch(term='Dodola Town', score=0.5)],
          'Dodola Rural': [ StringMatch(term='Dodola Town', score=0.5833333333333333)],
          'Dodola Town': [StringMatch(term='Dodola Town', score=1)],
          'Dodota': [StringMatch(term='Dodota', score=1)],
          'Doreni': [StringMatch(term='Dorani', score=0.8333333333333334)],
          'Dubluk': [StringMatch(term='Dubluk', score=1)],
          'Dugda': [StringMatch(term='Dugda', score=1)],
          'Dugda Dawa': [StringMatch(term='Dugda Dawa', score=1)],
          'Dukem Town': [ StringMatch(term='Durame Town', score=0.7272727272727273)],
          'Ebantu': [StringMatch(term='Ibantu', score=0.8333333333333334)],
          'Ejerie': [StringMatch(term='Saesie', score=0.5)],
          'Ejersa Lafo': [StringMatch(term='Ejersa Lafo', score=1)],
          'El Way': [StringMatch(term='Elwaya', score=0.6666666666666667)],
          'Elifata': [StringMatch(term='Ifata', score=0.7142857142857143)],
          'Enkelo Wabe': [ StringMatch(term='Inkolo Wabe', score=0.8181818181818181)],
          'Fedis': [StringMatch(term='Fedis', score=1)],
          'Fentale': [StringMatch(term='Fentale', score=1)],
          'Fiche Hospital': [StringMatch(term='Fiche Town', score=0.5)],
          'Fichetown': [StringMatch(term='Fiche Town', score=0.9)],
          'Gambo Hospital': [StringMatch(term='Ambo Zuria', score=0.5)],
          'Garemuleta Hospital': [],
          'Gasera': [StringMatch(term='Gasera', score=1)],
          'Gawo Qebe': [ StringMatch(term='Gawo Kebe', score=0.8888888888888888)],
          'Gechi': [StringMatch(term='Gechi', score=1)],
          'Gedeb Asasa': [StringMatch(term='Gedeb Asasa', score=1)],
          'Gedo Hospital': [],
          'Gelan Town': [ StringMatch(term='Gedeb Town', score=0.7),
                          StringMatch(term='Asela Town', score=0.7),
                          StringMatch(term='Dejen Town', score=0.7),
                          StringMatch(term='Dila Town', score=0.7),
                          StringMatch(term='Goba Town', score=0.7)],
          'Gelana': [StringMatch(term='Delanta', score=0.7142857142857143)],
          'Gelemso Hospital': [],
          'Gemechis': [StringMatch(term='Gemechis', score=1)],
          'Genji': [ StringMatch(term='Gena', score=0.6),
                     StringMatch(term='Gaji', score=0.6),
                     StringMatch(term='Gechi', score=0.6)],
          'Gera': [StringMatch(term='Gera', score=1)],
          'Gida Ayana': [StringMatch(term='Gida Ayana', score=1)],
          'Gidami': [StringMatch(term='Gidami', score=1)],
          'Gidami Hosp': [StringMatch(term='Gidami', score=0.5454545454545454)],
          'Gimbi': [StringMatch(term='Gimbi', score=1)],
          'Gimbi Adventist Hospital': [],
          'Gimbi Public  Hospital': [],
          'Gimbi Rural': [ StringMatch(term='Gimbi Town', score=0.5454545454545454),
                           StringMatch(term='Gimbichu', score=0.5454545454545454)],
          'Gimbichu': [StringMatch(term='Gimbichu', score=1)],
          'Ginde Beret': [StringMatch(term='Ginde Beret', score=1)],
          'Gindeberet Hospital': [ StringMatch(term='Ginde Beret', score=0.4736842105263158)],
          'Ginir': [StringMatch(term='Ginir', score=1)],
          'Ginir Town': [StringMatch(term='Ginir Town', score=1)],
          'Girar Jarso': [ StringMatch(term='Gerar Jarso', score=0.9090909090909091)],
          'Girawa': [StringMatch(term='Girawa', score=1)],
          'Girja': [StringMatch(term='Girawa', score=0.6666666666666667)],
          'Goba': [ StringMatch(term='Doba', score=0.75),
                    StringMatch(term='Goma', score=0.75),
                    StringMatch(term='Guba', score=0.75)],
          'Goba Town': [StringMatch(term='Goba Town', score=1)],
          'Gobu Seyo': [StringMatch(term='Gobu Seyo', score=1)],
          'Gojo Hospital': [ StringMatch(term='Golo Oda', score=0.46153846153846156)],
          'Gole Oda': [StringMatch(term='Golo Oda', score=0.875)],
          'Gololcha': [StringMatch(term='Golocha', score=0.875)],
          'Gomma': [StringMatch(term='Goma', score=0.8)],
          'Gomole': [StringMatch(term='Gomole', score=1)],
          'Goro': [ StringMatch(term='Horo', score=0.75),
                    StringMatch(term='Soro', score=0.75)],
          'Goro Dola': [ StringMatch(term='Gora Dola', score=0.8888888888888888)],
          'Goro Gutu': [StringMatch(term='Goro Gutu', score=1)],
          'Goro Muti': [StringMatch(term='Goro Muti', score=1)],
          'Guba Qoricha': [ StringMatch(term='Goba Koricha', score=0.8333333333333334)],
          'Guchi': [StringMatch(term='Guchi', score=1)],
          'Guder Hosp': [ StringMatch(term='Gonder Town', score=0.5454545454545454),
                          StringMatch(term='Lude Hitosa', score=0.5454545454545454)],
          'Gudeyabila': [ StringMatch(term='Gudeya Bila', score=0.9090909090909091)],
          'Gudru': [StringMatch(term='Guduru', score=0.8333333333333334)],
          'Guliso': [StringMatch(term='Guliso', score=1)],
          'Guma': [StringMatch(term='Gumay', score=0.8)],
          'Gumi Eldallo': [StringMatch(term='Gumi Idalo', score=0.75)],
          'Guna': [StringMatch(term='Guna', score=1)],
          'Gura Dhamole': [ StringMatch(term='Gura Damole', score=0.9166666666666666)],
          'Gursum': [ StringMatch(term='Gursum (Or)', score=0.5454545454545454),
                      StringMatch(term='Gursum (Sm)', score=0.5454545454545454)],
          'Guto Gida': [StringMatch(term='Guto Gida', score=1)],
          'Hababo Guduru': [ StringMatch(term='Choman Guduru', score=0.6153846153846154)],
          'Habro': [StringMatch(term='Habro', score=1)],
          'Halu': [ StringMatch(term='Kalu', score=0.75),
                    StringMatch(term='Haru', score=0.75)],
          'Hambela Wamena': [StringMatch(term='Hambela Wamena', score=1)],
          'Hanbala': [ StringMatch(term='Hawela', score=0.5714285714285714),
                       StringMatch(term='Abaala', score=0.5714285714285714),
                       StringMatch(term='Hanruka', score=0.5714285714285714),
                       StringMatch(term='Dangila', score=0.5714285714285714)],
          'Haro Limu': [StringMatch(term='Haro Limu', score=1)],
          'Haromaya Hospital': [ StringMatch(term='Haromaya Town', score=0.5882352941176471)],
          'Haromaya Rural': [ StringMatch(term='Haromaya Town', score=0.6428571428571428)],
          'Haromaya Town': [StringMatch(term='Haromaya Town', score=1)],
          'Haru': [StringMatch(term='Haru', score=1)],
          'Hawa Gelan': [StringMatch(term='Hawa Galan', score=0.9)],
          'Hawa Gelan Hosp': [StringMatch(term='Hawa Galan', score=0.6)],
          'Hawi Gudina': [ StringMatch(term='Hawi Gudina\n', score=0.9166666666666666)],
          'Hebal Arsi': [StringMatch(term='Heban Arsi', score=0.9)],
          'Hidabu Abote': [StringMatch(term='Hidabu Abote', score=1)],
          'Hitosa': [StringMatch(term='Hitosa', score=1)],
          'Holeta': [StringMatch(term='Holeta Town', score=0.5454545454545454)],
          'Holeta Town': [StringMatch(term='Holeta Town', score=1)],
          'Homa': [StringMatch(term='Homa', score=1)],
          'Horo': [StringMatch(term='Horo', score=1)],
          'Horro Buluk': [ StringMatch(term='Horo Buluk', score=0.9090909090909091)],
          'Hurumu': [StringMatch(term='Hurumu', score=1)],
          'Ilu': [StringMatch(term='Ilu', score=1)],
          'Ilu Galan': [StringMatch(term='Illu Galan', score=0.9)],
          'Inchini Hospital': [],
          'Jarso': [StringMatch(term='Ararso', score=0.6666666666666667)],
          'Jarte Jardga': [ StringMatch(term='Jarte Jardega', score=0.9230769230769231)],
          'Jeju': [StringMatch(term='Jeju', score=1)],
          'Jeldu': [StringMatch(term='Jeldu', score=1)],
          'Jibat': [StringMatch(term='Jibat', score=1)],
          'Jido': [StringMatch(term='Jida', score=0.75)],
          'Jima Geneti': [ StringMatch(term='Jimma Genete', score=0.8333333333333334)],
          'Jima Rare': [StringMatch(term='Jimma Rare', score=0.9)],
          'Jimma Arjo': [StringMatch(term='Jimma Arjo', score=1)],
          'Jimma Horo': [StringMatch(term='Jimma Horo', score=1)],
          'Jimma Spe Town': [ StringMatch(term='Jimma Town', score=0.7142857142857143)],
          'Kake Hosp': [ StringMatch(term='Kawo Koisha', score=0.4545454545454546),
                         StringMatch(term='Lude Hitosa', score=0.4545454545454546)],
          'Kercha': [StringMatch(term='Kercha', score=1)],
          'Kercha Hospital': [ StringMatch(term='Tercha Zuriya', score=0.5333333333333333)],
          'Kersa': [StringMatch(term='Kercha', score=0.6666666666666667)],
          'Kersa Eh': [ StringMatch(term='Mersa Town', score=0.5),
                        StringMatch(term='Bereh', score=0.5)],
          'Kersana Malima': [StringMatch(term='Kersana Malima', score=1)],
          'Kimbibit': [StringMatch(term='Kimbibit', score=1)],
          'Kiremu': [StringMatch(term='Kiremu', score=1)],
          'Kofele': [StringMatch(term='Kofele', score=1)],
          'Kokosa': [StringMatch(term='Kokosa', score=1)],
          'Kokosa  Hospital': [],
          'Kombolicha': [StringMatch(term='Kombolcha', score=0.9)],
          'Kore': [StringMatch(term='Kore', score=1)],
          'Kumbi': [StringMatch(term='Kumbi', score=1)],
          'Kundala': [ StringMatch(term='Kunneba', score=0.5714285714285714),
                       StringMatch(term='Undulu', score=0.5714285714285714)],
          'Kurfa Chele': [StringMatch(term='Kurfa Chele', score=1)],
          'Kuyu': [StringMatch(term='Kuyu', score=1)],
          'Kuyu Hospital': [],
          'Lalo Asabi': [StringMatch(term='Lalo Asabi', score=1)],
          'Laloqile': [StringMatch(term='Lalo Kile', score=0.7777777777777778)],
          'Lata Sibu': [ StringMatch(term='Leta Sibu', score=0.8888888888888888)],
          'Lege Dadi Lege Tafo Town': [ StringMatch(term='Lege Tafo-Lege Dadi Town', score=0.7083333333333333)],
          'Legehida': [StringMatch(term='Legehida', score=1)],
          'Leqa Dulecha': [ StringMatch(term='Leka Dulecha', score=0.9166666666666666)],
          'Liban Jawi': [StringMatch(term='Liban Jawi', score=1)],
          'Liben': [StringMatch(term='Liben', score=1)],
          'Limu': [ StringMatch(term='Darimu', score=0.5),
                    StringMatch(term='Kiremu', score=0.5)],
          'Limu Hospital': [ StringMatch(term='Limu Kosa', score=0.6153846153846154)],
          'Limu Kosa': [StringMatch(term='Limu Kosa', score=1)],
          'Limu Seka': [StringMatch(term='Limu Seka', score=1)],
          'Limuna Bilbilo': [ StringMatch(term='Limu Bilbilo', score=0.8571428571428572)],
          'Loke Hada Hospital': [],
          'Lomme': [StringMatch(term='Loma', score=0.6)],
          'Ludehetosa': [ StringMatch(term='Lude Hitosa', score=0.8181818181818181)],
          'Mana': [StringMatch(term='Zana', score=0.75)],
          'Mancho': [StringMatch(term='Mancho', score=1)],
          'Matahara': [StringMatch(term='May Kadra', score=0.5555555555555556)],
          'Meda Welabu': [StringMatch(term='Meda Welabu', score=1)],
          'Meiso': [StringMatch(term='Miesso', score=0.6666666666666667)],
          'Meko': [StringMatch(term='Meko', score=1)],
          'Melka Belo': [StringMatch(term='Melka Balo', score=0.9)],
          'Mendi Hospital': [StringMatch(term='Mendi Town', score=0.5)],
          'Mendi Town': [StringMatch(term='Mendi Town', score=1)],
          'Mene Sibu': [ StringMatch(term='Mana Sibu', score=0.7777777777777778)],
          'Merti': [StringMatch(term='Merti', score=1)],
          'Mesela': [StringMatch(term='Mesela', score=1)],
          'Meta': [StringMatch(term='Meta', score=1)],
          'Meta Waliqite': [ StringMatch(term='Meta Walkite', score=0.8461538461538461)],
          'Metarobi': [StringMatch(term='Meta Robi', score=0.8888888888888888)],
          'Metu Rural': [StringMatch(term='Metu Zuria', score=0.7)],
          'Metu Town': [StringMatch(term='Metu Town', score=1)],
          'Meyo': [ StringMatch(term='Meko', score=0.75),
                    StringMatch(term='Miyo', score=0.75)],
          'Meyu Muleke': [StringMatch(term='Meyu Muleke', score=1)],
          'Midakegni': [ StringMatch(term='Mida Kegn', score=0.7777777777777778)],
          'Midega Tole': [StringMatch(term='Midhaga Tola', score=0.75)],
          'Mkelka Soda': [ StringMatch(term='Melka Soda', score=0.9090909090909091)],
          'Modjo Town': [StringMatch(term='Mojo Town', score=0.9)],
          'Mojo': [StringMatch(term='Nejo', score=0.5)],
          'Moyale': [ StringMatch(term='Megale', score=0.6666666666666667),
                      StringMatch(term='Yocale', score=0.6666666666666667)],
          'Moyale Hospital': [ StringMatch(term='Moyale (Or)', score=0.5333333333333333),
                               StringMatch(term='Moyale (Sm)', score=0.5333333333333333)],
          'Muke Turi Hospital': [],
          'Mullo': [ StringMatch(term='Mulo', score=0.8),
                     StringMatch(term='Tullo', score=0.8)],
          'Munesa': [StringMatch(term='Munessa', score=0.8571428571428572)],
          'Negele Hospital': [ StringMatch(term='Negele Town', score=0.5333333333333333)],
          'Negele Town': [StringMatch(term='Negele Town', score=1)],
          'Nejo Hospital': [ StringMatch(term='Nejo Town', score=0.46153846153846156)],
          'Nejo Rural': [StringMatch(term='Nejo Town', score=0.5)],
          'Nejo Town': [StringMatch(term='Nejo Town', score=1)],
          'Nekemte Town': [StringMatch(term='Nekemte Town', score=1)],
          'Nensebo': [StringMatch(term='Nenesebo', score=0.875)],
          'Nole Kaba': [StringMatch(term='Nole Kaba', score=1)],
          'Nono': [StringMatch(term='Nono', score=1)],
          'Nono Benja': [StringMatch(term='Nono Benja', score=1)],
          'Nono Sele': [StringMatch(term='Nono Benja', score=0.6)],
          'Nunu Qumba': [StringMatch(term='Nunu Kumba', score=0.9)],
          'O/Beyam': [StringMatch(term='Omo Beyam', score=0.6666666666666667)],
          'Oda Bultum': [StringMatch(term='Kuni /Oda Bultum', score=0.625)],
          'Odo Shakiso': [StringMatch(term='Odo Shakiso', score=1)],
          'Olanciti Hospital': [ StringMatch(term='Olanciti Town', score=0.5882352941176471)],
          'Omo Nada Hospital': [ StringMatch(term='Omo Nada', score=0.47058823529411764)],
          'Omonada': [StringMatch(term='Omo Nada', score=0.875)],
          'Qiltu Kara': [StringMatch(term='Kiltu Kara', score=0.9)],
          'Raitu': [StringMatch(term='Rayitu', score=0.8333333333333334)],
          'Robe': [StringMatch(term='Robe', score=1)],
          'Robe Town': [StringMatch(term='Robe Town', score=1)],
          'Saba Boru': [StringMatch(term='Saba Boru', score=1)],
          'Sandefa': [StringMatch(term='Sankura', score=0.5714285714285714)],
          'Sasiga': [StringMatch(term='Sasiga', score=1)],
          'Sebeta Awas': [ StringMatch(term='Sebeta Hawas', score=0.9166666666666666)],
          'Sebeta Town': [StringMatch(term='Sebeta Town', score=1)],
          'Sedan Chanka': [StringMatch(term='Sedi Chenka', score=0.75)],
          'Seden Sodo': [StringMatch(term='Seden Sodo', score=1)],
          'Seka Chekorsa': [StringMatch(term='Seka Chekorsa', score=1)],
          'Seka Chhokorsa Hospital': [ StringMatch(term='Seka Chekorsa', score=0.5217391304347826)],
          'Sekoru': [StringMatch(term='Sekoru', score=1)],
          'Seru': [StringMatch(term='Seru', score=1)],
          'Setema': [StringMatch(term='Setema', score=1)],
          'Setema Hospital': [ StringMatch(term='Sebeta Hawas', score=0.4666666666666667)],
          'Seweyna': [StringMatch(term='Seweyna', score=1)],
          'Seyo': [StringMatch(term='Sayo', score=0.75)],
          'Seyo Nole': [ StringMatch(term='Sayo Nole', score=0.8888888888888888)],
          'Shabe': [StringMatch(term='Shala', score=0.6)],
          'Shakiso Town': [StringMatch(term='Shakiso Town', score=1)],
          'Shala': [StringMatch(term='Shala', score=1)],
          'Shambu Hospital': [ StringMatch(term='Shambu Town', score=0.5333333333333333)],
          'Shambu Town': [StringMatch(term='Shambu Town', score=1)],
          'Shashamane Town': [ StringMatch(term='Shashemene Town', score=0.8666666666666667)],
          'Shashemene Rural': [ StringMatch(term='Shashemene Zuria', score=0.8125)],
          'Shenan Kolu': [ StringMatch(term='Shanan Kolu', score=0.9090909090909091)],
          'Shirka': [StringMatch(term='Shirka', score=1)],
          'Sibu Sire': [StringMatch(term='Sibu Sire', score=1)],
          'Sigmo': [StringMatch(term='Sigmo', score=1)],
          'Sinana': [StringMatch(term='Sinana', score=1)],
          'Siraro': [StringMatch(term='Siraro', score=1)],
          'Sire': [StringMatch(term='Sire', score=1)],
          "Sodo Dac'Ha": [ StringMatch(term='Sodo Daci', score=0.7272727272727273)],
          'St.Luke Hospital': [],
          'Sude': [StringMatch(term='Sude', score=1)],
          'Sululta Town': [StringMatch(term='Sululta Town', score=1)],
          'Suro Barguda': [ StringMatch(term='Suro Berguda', score=0.9166666666666666)],
          'Teltele': [StringMatch(term='Teltale', score=0.8571428571428572)],
          'Tena': [StringMatch(term='Tena', score=1)],
          'Tibe Kutaye': [ StringMatch(term='Toke Kutaye', score=0.8181818181818181)],
          'Tikur Enchini': [StringMatch(term='Tikur Enchini', score=1)],
          'Tiro Afeta': [StringMatch(term='Tiro Afeta', score=1)],
          'Tiyo': [StringMatch(term='Tiyo', score=1)],
          'Tole': [StringMatch(term='Tole', score=1)],
          'Tulo': [StringMatch(term='Tullo', score=0.8)],
          'Tulu Bolo Hospital': [],
          'Uraga': [StringMatch(term='Uraga', score=1)],
          'Wachile': [StringMatch(term='Wachile', score=1)],
          'Wadara': [StringMatch(term='Wadera', score=0.8333333333333334)],
          'Walmera': [StringMatch(term='Welmera', score=0.8571428571428572)],
          'Wama Hagelo': [ StringMatch(term='Wama Hagalo', score=0.9090909090909091)],
          'Wayu Tuqa': [ StringMatch(term='Wayu Tuka', score=0.8888888888888888)],
          'Were Jarso': [StringMatch(term='Wara Jarso', score=0.8)],
          'West Harerge\tGumbi Bordede': [ StringMatch(term='Gumbi Bordede', score=0.5)],
          'Woliso Rural': [ StringMatch(term='Woliso Town', score=0.5833333333333333)],
          'Woliso Town': [StringMatch(term='Woliso Town', score=1)],
          'Wonchi': [StringMatch(term='Wenchi', score=0.8333333333333334)],
          'Wondo': [StringMatch(term='Wondo', score=1)],
          'Wuchale': [StringMatch(term='Wuchale', score=1)],
          'Yabelo': [StringMatch(term='Yabelo', score=1)],
          'Yabelo Hospital': [ StringMatch(term='Yabelo Town', score=0.5333333333333333)],
          'Yabelo Rural': [ StringMatch(term='Yabelo Town', score=0.5833333333333333)],
          'Yaya Gulele': [StringMatch(term='Yaya Gulele', score=1)],
          'Yayu': [StringMatch(term='Yayu', score=1)],
          'Yemalogi Wolel': [StringMatch(term='Yama Logi Welel', score=0.8)],
          'Yubdo': [StringMatch(term='Yubdo', score=1)],
          'Zeway Dugda': [ StringMatch(term='Ziway Dugda', score=0.9090909090909091)]})

Looking at query terms that still didn’t match anything in the master data we realize there exists a common pattern. These terms are hospital names. Maybe rerunning the matcher with stopwords such as HOSP and HOSPITAL removed will yield better results

[15]:
woreda_map.unmatched()
[15]:
{'Ambo University  Hosp',
 'Ameya Hospital',
 'Ayira Hospital',
 'Bantu  Hospital',
 'Begi Hospital',
 'Chelenko Hospital',
 'Dhidesa Hospital',
 'Garemuleta Hospital',
 'Gedo Hospital',
 'Gelemso Hospital',
 'Gimbi Adventist Hospital',
 'Gimbi Public  Hospital',
 'Inchini Hospital',
 'Kokosa  Hospital',
 'Kuyu Hospital',
 'Loke Hada Hospital',
 'Muke Turi Hospital',
 'St.Luke Hospital',
 'Tulu Bolo Hospital'}

We replace the stopwords and see if this solves the problem

[16]:
vacc = apply(vacc, 'WoredaName', lambda x: x.replace('Hospital','')\
             .replace('Hosp','').replace('University','').strip())

woreda_map = Mapping()
for query in set(vacc['WoredaName']):
    woreda_map.add(query, matcher.find_matches(query))
woreda_map
[16]:
Mapping(list,
        {'Dodota': [StringMatch(term='Dodota', score=1)],
         'Haromaya Town': [StringMatch(term='Haromaya Town', score=1)],
         'Merti': [StringMatch(term='Merti', score=1)],
         'Shambu Town': [StringMatch(term='Shambu Town', score=1)],
         'Setema': [StringMatch(term='Setema', score=1)],
         'Dapho Hana': [StringMatch(term='Dabo Hana', score=0.8)],
         'Dugda': [StringMatch(term='Dugda', score=1)],
         'Kundala': [StringMatch(term='Kunneba', score=0.5714285714285714),
          StringMatch(term='Undulu', score=0.5714285714285714)],
         'Haromaya': [StringMatch(term='Haro Maya', score=0.8888888888888888)],
         'Deder Town': [StringMatch(term='Deder Town', score=1)],
         'Dale Wabera': [StringMatch(term='Dale Wabera', score=1)],
         'Chelenko': [StringMatch(term='Cheliya', score=0.5),
          StringMatch(term='Chena', score=0.5),
          StringMatch(term='Shenkor', score=0.5),
          StringMatch(term='Chole', score=0.5),
          StringMatch(term='Sheko', score=0.5)],
         "Sodo Dac'Ha": [StringMatch(term='Sodo Daci', score=0.7272727272727273)],
         'Bilonopa': [StringMatch(term='Bilo Nopha', score=0.8)],
         'Muke Turi': [StringMatch(term='Metu Zuria', score=0.5)],
         'Midakegni': [StringMatch(term='Mida Kegn', score=0.7777777777777778)],
         'Bule Hora': [StringMatch(term='Bule Hora', score=1)],
         'Tulu Bolo': [StringMatch(term='Tullo', score=0.5555555555555556),
          StringMatch(term='Tulo (Or)', score=0.5555555555555556)],
         'Mullo': [StringMatch(term='Mulo', score=0.8),
          StringMatch(term='Tullo', score=0.8)],
         'Sebeta Awas': [StringMatch(term='Sebeta Hawas', score=0.9166666666666666)],
         'Elifata': [StringMatch(term='Ifata', score=0.7142857142857143)],
         'Kore': [StringMatch(term='Kore', score=1)],
         'Begi': [StringMatch(term='Begi', score=1)],
         'Shirka': [StringMatch(term='Shirka', score=1)],
         'Bore': [StringMatch(term='Bore', score=1)],
         'Horro Buluk': [StringMatch(term='Horo Buluk', score=0.9090909090909091)],
         'Gojo': [StringMatch(term='Goglo', score=0.6),
          StringMatch(term='Gonje', score=0.6)],
         'Limu Kosa': [StringMatch(term='Limu Kosa', score=1)],
         'Aseko': [StringMatch(term='Aseko', score=1)],
         'Gambo': [StringMatch(term='Garbo', score=0.8),
          StringMatch(term='Gimbo', score=0.8)],
         'Adola': [StringMatch(term='Adola', score=1)],
         'Jimma Horo': [StringMatch(term='Jimma Horo', score=1)],
         'Hebal Arsi': [StringMatch(term='Heban Arsi', score=0.9)],
         'Seru': [StringMatch(term='Seru', score=1)],
         'Gimbi Public': [StringMatch(term='Gimbi Town', score=0.5),
          StringMatch(term='Gimbichu', score=0.5),
          StringMatch(term='Kimbibit', score=0.5)],
         'Gedeb Asasa': [StringMatch(term='Gedeb Asasa', score=1)],
         'Adea Berga': [StringMatch(term='Adda Berga', score=0.9)],
         'Walmera': [StringMatch(term='Welmera', score=0.8571428571428572)],
         'Ambo Town': [StringMatch(term='Ambo Town', score=1)],
         'Ameya': [StringMatch(term='Ameya', score=1)],
         'Jima Geneti': [StringMatch(term='Jimma Genete', score=0.8333333333333334)],
         'Bora': [StringMatch(term='Bore', score=0.75),
          StringMatch(term='Bura', score=0.75)],
         'Chewaqa': [StringMatch(term='Chwaka', score=0.7142857142857143)],
         'Ejerie': [StringMatch(term='Saesie', score=0.5)],
         'Kombolicha': [StringMatch(term='Kombolcha', score=0.9)],
         'Daro Lebu': [StringMatch(term='Daro Lebu', score=1)],
         'Dubluk': [StringMatch(term='Dubluk', score=1)],
         'Amigna': [StringMatch(term='Amigna', score=1)],
         'Berreh': [StringMatch(term='Bereh', score=0.8333333333333334)],
         'Aleiltu': [StringMatch(term='Aleltu', score=0.8571428571428572)],
         'Ejersa Lafo': [StringMatch(term='Ejersa Lafo', score=1)],
         'Algesachi': [StringMatch(term='Alge Sachi', score=0.9)],
         'Ale': [StringMatch(term='Ale', score=1)],
         'Raitu': [StringMatch(term='Rayitu', score=0.8333333333333334)],
         'Codi': [StringMatch(term='Cobi', score=0.75)],
         'Seka Chhokorsa': [StringMatch(term='Seka Chekorsa', score=0.8571428571428572)],
         'Shakiso Town': [StringMatch(term='Shakiso Town', score=1)],
         'Gomma': [StringMatch(term='Goma', score=0.8)],
         'Bedeno': [StringMatch(term='Bedeno', score=1)],
         'Jeju': [StringMatch(term='Jeju', score=1)],
         'Shabe': [StringMatch(term='Shala', score=0.6)],
         'Haromaya Rural': [StringMatch(term='Haromaya Town', score=0.6428571428571428)],
         'Abay Chomen': [StringMatch(term='Abay Chomen', score=1)],
         'Degem': [StringMatch(term='Degem', score=1)],
         'Lomme': [StringMatch(term='Loma', score=0.6)],
         'Limu': [StringMatch(term='Darimu', score=0.5),
          StringMatch(term='Kiremu', score=0.5)],
         'Mesela': [StringMatch(term='Mesela', score=1)],
         'Abuna Gindeberet': [StringMatch(term='Abuna Ginde Beret', score=0.9411764705882353)],
         'Meiso': [StringMatch(term='Miesso', score=0.6666666666666667)],
         'Sedan Chanka': [StringMatch(term='Sedi Chenka', score=0.75)],
         'Tibe Kutaye': [StringMatch(term='Toke Kutaye', score=0.8181818181818181)],
         'Bale Gesgara': [StringMatch(term='Bele Gesgar', score=0.8333333333333334)],
         'Gera': [StringMatch(term='Gera', score=1)],
         'Adami Tulu Jido Kombolcha': [StringMatch(term='Adama Tulu Jido Kombolcha', score=0.96)],
         'Nono': [StringMatch(term='Nono', score=1)],
         'Ludehetosa': [StringMatch(term='Lude Hitosa', score=0.8181818181818181)],
         'Legehida': [StringMatch(term='Legehida', score=1)],
         'Holeta': [StringMatch(term='Holeta Town', score=0.5454545454545454)],
         'Gumi Eldallo': [StringMatch(term='Gumi Idalo', score=0.75)],
         'Yabelo': [StringMatch(term='Yabelo', score=1)],
         'Guliso': [StringMatch(term='Guliso', score=1)],
         'Bako Tibe': [StringMatch(term='Bako Tibe', score=1)],
         'B/Tolyi': [StringMatch(term='Tole', score=0.4285714285714286)],
         'Dinsho': [StringMatch(term='Dinsho', score=1)],
         'Wachile': [StringMatch(term='Wachile', score=1)],
         'Bishan Guracha Town': [StringMatch(term='Bishan Guracha', score=0.736842105263158)],
         'Homa': [StringMatch(term='Homa', score=1)],
         'Bedele Town': [StringMatch(term='Bedele Town', score=1)],
         'Hitosa': [StringMatch(term='Hitosa', score=1)],
         'Sire': [StringMatch(term='Sire', score=1)],
         'Gimbichu': [StringMatch(term='Gimbichu', score=1)],
         'Deksis': [StringMatch(term='Diksis', score=0.8333333333333334)],
         'Sandefa': [StringMatch(term='Sankura', score=0.5714285714285714)],
         'Goro Gutu': [StringMatch(term='Goro Gutu', score=1)],
         'Shashemene Rural': [StringMatch(term='Shashemene Zuria', score=0.8125)],
         'Akaki': [StringMatch(term='Akaki', score=1)],
         'Adama': [StringMatch(term='Adama', score=1)],
         'Chomen Guduru': [StringMatch(term='Choman Guduru', score=0.9230769230769231)],
         'Woliso Rural': [StringMatch(term='Woliso Town', score=0.5833333333333333)],
         'Chole': [StringMatch(term='Chole', score=1)],
         'Jimma Arjo': [StringMatch(term='Jimma Arjo', score=1)],
         'Kiremu': [StringMatch(term='Kiremu', score=1)],
         'Gursum': [StringMatch(term='Gursum (Or)', score=0.5454545454545454),
          StringMatch(term='Gursum (Sm)', score=0.5454545454545454)],
         'Tena': [StringMatch(term='Tena', score=1)],
         'Tiyo': [StringMatch(term='Tiyo', score=1)],
         'Debre Libanos': [StringMatch(term='Debre Libanos', score=1)],
         'Omonada': [StringMatch(term='Omo Nada', score=0.875)],
         'Hanbala': [StringMatch(term='Hawela', score=0.5714285714285714),
          StringMatch(term='Abaala', score=0.5714285714285714),
          StringMatch(term='Hanruka', score=0.5714285714285714),
          StringMatch(term='Dangila', score=0.5714285714285714)],
         'Dano': [StringMatch(term='Dano', score=1)],
         'Meyu Muleke': [StringMatch(term='Meyu Muleke', score=1)],
         'Chiro Town': [StringMatch(term='Chiro Town', score=1)],
         'Jarte Jardga': [StringMatch(term='Jarte Jardega', score=0.9230769230769231)],
         'Olanciti': [StringMatch(term='Olanciti Town', score=0.6153846153846154)],
         'Burayu Town': [StringMatch(term='Bure Town', score=0.7272727272727273),
          StringMatch(term='Durame Town', score=0.7272727272727273)],
         'Were Jarso': [StringMatch(term='Wara Jarso', score=0.8)],
         'Bure': [StringMatch(term='Bura', score=0.75),
          StringMatch(term='Bule', score=0.75),
          StringMatch(term='Bore', score=0.75)],
         'Meta Waliqite': [StringMatch(term='Meta Walkite', score=0.8461538461538461)],
         'Gudru': [StringMatch(term='Guduru', score=0.8333333333333334)],
         'Wuchale': [StringMatch(term='Wuchale', score=1)],
         'Dedesa': [StringMatch(term='Dedesa', score=1)],
         'Delo Mena': [StringMatch(term='Doyogena', score=0.5555555555555556),
          StringMatch(term='Melo Gada', score=0.5555555555555556)],
         'Horo': [StringMatch(term='Horo', score=1)],
         'Kurfa Chele': [StringMatch(term='Kurfa Chele', score=1)],
         'Gololcha': [StringMatch(term='Golocha', score=0.875)],
         'Dawe Qachen': [StringMatch(term='Dawe Ketchen', score=0.75)],
         'Kokosa': [StringMatch(term='Kokosa', score=1)],
         'Abaya': [StringMatch(term='Abaya', score=1)],
         'Nejo Rural': [StringMatch(term='Nejo Town', score=0.5)],
         'Nunu Qumba': [StringMatch(term='Nunu Kumba', score=0.9)],
         'Tulo': [StringMatch(term='Tullo', score=0.8)],
         'Suro Barguda': [StringMatch(term='Suro Berguda', score=0.9166666666666666)],
         'Agaro': [StringMatch(term='Amaro', score=0.8)],
         'Boneya Bushe': [StringMatch(term='Boneya Boshe', score=0.9166666666666666)],
         'Midega Tole': [StringMatch(term='Midhaga Tola', score=0.75)],
         'Robe Town': [StringMatch(term='Robe Town', score=1)],
         'Seyo': [StringMatch(term='Sayo', score=0.75)],
         'Halu': [StringMatch(term='Kalu', score=0.75),
          StringMatch(term='Haru', score=0.75)],
         'St.Luke': [StringMatch(term='Dubluk', score=0.4285714285714286)],
         'Dedo': [StringMatch(term='Dedo', score=1)],
         'Adama Town': [StringMatch(term='Adama Town', score=1)],
         'Nejo': [StringMatch(term='Nejo', score=1)],
         'Hambela Wamena': [StringMatch(term='Hambela Wamena', score=1)],
         'Assela Town': [StringMatch(term='Asela Town', score=0.9090909090909091)],
         'Dambi Dolo': [StringMatch(term='Damboya', score=0.5),
          StringMatch(term='Denbi Dollo Town', score=0.5),
          StringMatch(term='Damot Gale', score=0.5),
          StringMatch(term='Damot Sore', score=0.5),
          StringMatch(term='Gimbi Town', score=0.5)],
         'Goba Town': [StringMatch(term='Goba Town', score=1)],
         'Guto Gida': [StringMatch(term='Guto Gida', score=1)],
         'Guba Qoricha': [StringMatch(term='Goba Koricha', score=0.8333333333333334)],
         'Dima': [StringMatch(term='Diga', score=0.75),
          StringMatch(term='Disa', score=0.75),
          StringMatch(term='Dita', score=0.75),
          StringMatch(term='Dama', score=0.75)],
         'West Harerge\tGumbi Bordede': [StringMatch(term='Gumbi Bordede', score=0.5)],
         'Dawo': [StringMatch(term='Dawo', score=1)],
         'Moyale': [StringMatch(term='Megale', score=0.6666666666666667),
          StringMatch(term='Yocale', score=0.6666666666666667)],
         'Seden Sodo': [StringMatch(term='Seden Sodo', score=1)],
         'Chiro': [StringMatch(term='Chire', score=0.8)],
         'Ilu': [StringMatch(term='Ilu', score=1)],
         'Nono Sele': [StringMatch(term='Nono Benja', score=0.6)],
         'Melka Belo': [StringMatch(term='Melka Balo', score=0.9)],
         'Omo Nada': [StringMatch(term='Omo Nada', score=1)],
         'Mancho': [StringMatch(term='Mancho', score=1)],
         'Laloqile': [StringMatch(term='Lalo Kile', score=0.7777777777777778)],
         'Goro Muti': [StringMatch(term='Goro Muti', score=1)],
         'Aga Wayyu': [StringMatch(term='Aga Wayu', score=0.8888888888888888)],
         'Guma': [StringMatch(term='Gumay', score=0.8)],
         'Kofele': [StringMatch(term='Kofele', score=1)],
         'Modjo Town': [StringMatch(term='Mojo Town', score=0.9)],
         'Yabelo Rural': [StringMatch(term='Yabelo Town', score=0.5833333333333333)],
         'Gemechis': [StringMatch(term='Gemechis', score=1)],
         'Dhas': [StringMatch(term='Dhas', score=1)],
         'Bedesa Town': [StringMatch(term='Bedele Town', score=0.8181818181818181)],
         'Dawe Serar': [StringMatch(term='Dale Wabera', score=0.5454545454545454)],
         'Yaya Gulele': [StringMatch(term='Yaya Gulele', score=1)],
         'Boset': [StringMatch(term='Boset', score=1)],
         'Bako': [StringMatch(term='Babo', score=0.75)],
         'Bishoftu Town': [StringMatch(term='Bishoftu Town', score=1)],
         'Chinakesen': [StringMatch(term='Chinaksen', score=0.9)],
         'Dodola Rural': [StringMatch(term='Dodola Town', score=0.5833333333333333)],
         'Lata Sibu': [StringMatch(term='Leta Sibu', score=0.8888888888888888)],
         'Shenan Kolu': [StringMatch(term='Shanan Kolu', score=0.9090909090909091)],
         'Jeldu': [StringMatch(term='Jeldu', score=1)],
         'Gura Dhamole': [StringMatch(term='Gura Damole', score=0.9166666666666666)],
         'Kercha': [StringMatch(term='Kercha', score=1)],
         'Anfilo': [StringMatch(term='Anfilo', score=1)],
         'Oda Bultum': [StringMatch(term='Kuni /Oda Bultum', score=0.625)],
         'Sekoru': [StringMatch(term='Sekoru', score=1)],
         'Lege Dadi Lege Tafo Town': [StringMatch(term='Lege Tafo-Lege Dadi Town', score=0.7083333333333333)],
         'Gimbi Rural': [StringMatch(term='Gimbi Town', score=0.5454545454545454),
          StringMatch(term='Gimbichu', score=0.5454545454545454)],
         'Guna': [StringMatch(term='Guna', score=1)],
         'Nensebo': [StringMatch(term='Nenesebo', score=0.875)],
         'Sululta Town': [StringMatch(term='Sululta Town', score=1)],
         'Abichugna': [StringMatch(term="Abichugna Gne'A", score=0.6)],
         'Loke Hada': [StringMatch(term='Lege Hida', score=0.6666666666666667)],
         'Mojo': [StringMatch(term='Nejo', score=0.5)],
         'Girja': [StringMatch(term='Girawa', score=0.6666666666666667)],
         'Gelan Town': [StringMatch(term='Gedeb Town', score=0.7),
          StringMatch(term='Asela Town', score=0.7),
          StringMatch(term='Dejen Town', score=0.7),
          StringMatch(term='Dila Town', score=0.7),
          StringMatch(term='Goba Town', score=0.7)],
         'Tole': [StringMatch(term='Tole', score=1)],
         'Robe': [StringMatch(term='Robe', score=1)],
         'Guchi': [StringMatch(term='Guchi', score=1)],
         'Jibat': [StringMatch(term='Jibat', score=1)],
         'Metarobi': [StringMatch(term='Meta Robi', score=0.8888888888888888)],
         'Odo Shakiso': [StringMatch(term='Odo Shakiso', score=1)],
         'O/Beyam': [StringMatch(term='Omo Beyam', score=0.6666666666666667)],
         'Shala': [StringMatch(term='Shala', score=1)],
         'Adaba': [StringMatch(term='Adaba', score=1)],
         'Seweyna': [StringMatch(term='Seweyna', score=1)],
         'Chelia': [StringMatch(term='Cheliya', score=0.8571428571428572)],
         'Gudeyabila': [StringMatch(term='Gudeya Bila', score=0.9090909090909091)],
         'Negele Town': [StringMatch(term='Negele Town', score=1)],
         'Metu Rural': [StringMatch(term='Metu Zuria', score=0.7)],
         'Sinana': [StringMatch(term='Sinana', score=1)],
         'Gida Ayana': [StringMatch(term='Gida Ayana', score=1)],
         'Bedele Zuriya': [StringMatch(term='Badele Zuria', score=0.8461538461538461)],
         'Ambo': [StringMatch(term='Afambo', score=0.6666666666666667)],
         'Gidami': [StringMatch(term='Gidami', score=1)],
         'Arsi Negele Town': [StringMatch(term='Arsi Negele Town', score=1)],
         'Mendi': [StringMatch(term='Dendi', score=0.8)],
         'Arero': [StringMatch(term='Arero', score=1)],
         'Dilo': [StringMatch(term='Dilo', score=1)],
         'Kake': [StringMatch(term='Kache', score=0.6),
          StringMatch(term='Akaki', score=0.6)],
         'Enkelo Wabe': [StringMatch(term='Inkolo Wabe', score=0.8181818181818181)],
         'Adola Town': [StringMatch(term='Adola Town', score=1)],
         'Ayira': [StringMatch(term='Ayira', score=1)],
         'Dale Sedi': [StringMatch(term='Dale Sadi', score=0.8888888888888888)],
         'Chiro Zuriya': [StringMatch(term='Chiro Zuria', score=0.9166666666666666)],
         'Babile': [StringMatch(term='Berahile', score=0.625)],
         'Kersa Eh': [StringMatch(term='Mersa Town', score=0.5),
          StringMatch(term='Bereh', score=0.5)],
         'Gomole': [StringMatch(term='Gomole', score=1)],
         'Sude': [StringMatch(term='Sude', score=1)],
         'Meyo': [StringMatch(term='Meko', score=0.75),
          StringMatch(term='Miyo', score=0.75)],
         'Mendi Town': [StringMatch(term='Mendi Town', score=1)],
         'Meko': [StringMatch(term='Meko', score=1)],
         'Leqa Dulecha': [StringMatch(term='Leka Dulecha', score=0.9166666666666666)],
         'Amuru': [StringMatch(term='Amuru', score=1)],
         'Boke': [StringMatch(term='Boke', score=1)],
         'Nole Kaba': [StringMatch(term='Nole Kaba', score=1)],
         'Yemalogi Wolel': [StringMatch(term='Yama Logi Welel', score=0.8)],
         'Sigmo': [StringMatch(term='Sigmo', score=1)],
         'Guder': [StringMatch(term='Gumer', score=0.8)],
         'Didu': [StringMatch(term='Didu', score=1)],
         'Burka Dimtu': [StringMatch(term='Burqua Dhintu', score=0.6923076923076923)],
         'Wondo': [StringMatch(term='Wondo', score=1)],
         'Bantu': [StringMatch(term='Ibantu', score=0.8333333333333334)],
         'Jido': [StringMatch(term='Jida', score=0.75)],
         'Yayu': [StringMatch(term='Yayu', score=1)],
         'Mkelka Soda': [StringMatch(term='Melka Soda', score=0.9090909090909091)],
         'Ginir': [StringMatch(term='Ginir', score=1)],
         'Adea': [StringMatch(term='Adet', score=0.75),
          StringMatch(term='Adwa', score=0.75)],
         'Babo Gembel': [StringMatch(term='Chabe Gambeltu', score=0.5714285714285714)],
         'Bedele': [StringMatch(term='Bedeno', score=0.6666666666666667),
          StringMatch(term='Bedesa', score=0.6666666666666667)],
         'Kersa': [StringMatch(term='Kercha', score=0.6666666666666667)],
         'Dhidesa': [StringMatch(term='Dedesa', score=0.7142857142857143)],
         'Habro': [StringMatch(term='Habro', score=1)],
         'Ginir Town': [StringMatch(term='Ginir Town', score=1)],
         'Holeta Town': [StringMatch(term='Holeta Town', score=1)],
         'Nekemte Town': [StringMatch(term='Nekemte Town', score=1)],
         'Adola Reda': [StringMatch(term='Adola Town', score=0.6)],
         'Sebeta Town': [StringMatch(term='Sebeta Town', score=1)],
         'Liben': [StringMatch(term='Liben', score=1)],
         'Arsi Negele Rural': [StringMatch(term='Arsi Negele Town', score=0.7058823529411764)],
         'Anchar': [StringMatch(term='Anchar', score=1)],
         'Kersana Malima': [StringMatch(term='Kersana Malima', score=1)],
         'Fentale': [StringMatch(term='Fentale', score=1)],
         'Berbere': [StringMatch(term='Berbere', score=1)],
         'Mene Sibu': [StringMatch(term='Mana Sibu', score=0.7777777777777778)],
         'Siraro': [StringMatch(term='Siraro', score=1)],
         'Genji': [StringMatch(term='Gena', score=0.6),
          StringMatch(term='Gaji', score=0.6),
          StringMatch(term='Gechi', score=0.6)],
         'Inchini': [StringMatch(term='Tikur Enchini', score=0.5384615384615384)],
         'Seyo Nole': [StringMatch(term='Sayo Nole', score=0.8888888888888888)],
         'Gole Oda': [StringMatch(term='Golo Oda', score=0.875)],
         'Qiltu Kara': [StringMatch(term='Kiltu Kara', score=0.9)],
         'Goba': [StringMatch(term='Doba', score=0.75),
          StringMatch(term='Goma', score=0.75),
          StringMatch(term='Guba', score=0.75)],
         'Wonchi': [StringMatch(term='Wenchi', score=0.8333333333333334)],
         'Uraga': [StringMatch(term='Uraga', score=1)],
         'Boricha': [StringMatch(term='Boricha', score=1)],
         'Kimbibit': [StringMatch(term='Kimbibit', score=1)],
         'Gechi': [StringMatch(term='Gechi', score=1)],
         'Gindeberet': [StringMatch(term='Ginde Beret', score=0.9090909090909091)],
         'Woliso Town': [StringMatch(term='Woliso Town', score=1)],
         'Boji Dermeji': [StringMatch(term='Boji Dirmeji', score=0.9166666666666666)],
         'Gobu Seyo': [StringMatch(term='Gobu Seyo', score=1)],
         'Dodola Town': [StringMatch(term='Dodola Town', score=1)],
         'Bekoji Town': [StringMatch(term='Bekoji Town', score=1)],
         'Goro Dola': [StringMatch(term='Gora Dola', score=0.8888888888888888)],
         'Fichetown': [StringMatch(term='Fiche Town', score=0.9)],
         'Sibu Sire': [StringMatch(term='Sibu Sire', score=1)],
         'Becho': [StringMatch(term='Bero', score=0.6),
          StringMatch(term='Decha', score=0.6),
          StringMatch(term='Gechi', score=0.6),
          StringMatch(term='Mecha', score=0.6)],
         'Shashamane Town': [StringMatch(term='Shashemene Town', score=0.8666666666666667)],
         'Dukem Town': [StringMatch(term='Durame Town', score=0.7272727272727273)],
         'Dambi Dollo': [StringMatch(term='Denbi Dollo Town', score=0.5625)],
         'Arena Buluq': [StringMatch(term='Harena Buluk', score=0.8333333333333334)],
         'Anna Sora': [StringMatch(term='Ana Sora', score=0.8888888888888888)],
         'Jimma Spe Town': [StringMatch(term='Jimma Town', score=0.7142857142857143)],
         'Zeway Dugda': [StringMatch(term='Ziway Dugda', score=0.9090909090909091)],
         'Gimbi Adventist': [StringMatch(term='Gimbi Town', score=0.4666666666666667)],
         'Bisidimo': [StringMatch(term='Bilidigilu', score=0.5),
          StringMatch(term='Sigmo', score=0.5)],
         'Kuyu': [StringMatch(term='Kuyu', score=1)],
         'Digeluna Tijo': [StringMatch(term='Degeluna Tijo', score=0.9230769230769231)],
         'Munesa': [StringMatch(term='Munessa', score=0.8571428571428572)],
         'Ebantu': [StringMatch(term='Ibantu', score=0.8333333333333334)],
         'Shambu': [StringMatch(term='Shambu Town', score=0.5454545454545454)],
         'Gelana': [StringMatch(term='Delanta', score=0.7142857142857143)],
         'Goro': [StringMatch(term='Horo', score=0.75),
          StringMatch(term='Soro', score=0.75)],
         'Fiche': [StringMatch(term='Kache', score=0.6)],
         'Boji Cheqorsa': [StringMatch(term='Boji Chekorsa', score=0.9230769230769231)],
         'Batu': [StringMatch(term='Bati', score=0.75)],
         'Tikur Enchini': [StringMatch(term='Tikur Enchini', score=1)],
         'Gimbi': [StringMatch(term='Gimbi', score=1)],
         'Diga': [StringMatch(term='Diga', score=1)],
         'Hababo Guduru': [StringMatch(term='Choman Guduru', score=0.6153846153846154)],
         'Ilu Galan': [StringMatch(term='Illu Galan', score=0.9)],
         'Nono Benja': [StringMatch(term='Nono Benja', score=1)],
         'Dugda Dawa': [StringMatch(term='Dugda Dawa', score=1)],
         'Gasera': [StringMatch(term='Gasera', score=1)],
         'Bule Hora Toun': [StringMatch(term='Bule Hora Town', score=0.9285714285714286)],
         'Dera': [StringMatch(term='Gera', score=0.75),
          StringMatch(term='Wera', score=0.75),
          StringMatch(term='Dega', score=0.75),
          StringMatch(term='Dara', score=0.75)],
         'Kumbi': [StringMatch(term='Kumbi', score=1)],
         'Gelemso': [StringMatch(term='Telemt', score=0.5714285714285714),
          StringMatch(term='Lemmo', score=0.5714285714285714),
          StringMatch(term='Gerese', score=0.5714285714285714),
          StringMatch(term='Guliso', score=0.5714285714285714)],
         'Biebirsa Kojowa': [StringMatch(term='Birbirsa Kojowa', score=0.9333333333333333)],
         'Dodola': [StringMatch(term='Dodola', score=1)],
         'Mana': [StringMatch(term='Zana', score=0.75)],
         'Teltele': [StringMatch(term='Teltale', score=0.8571428571428572)],
         'Hidabu Abote': [StringMatch(term='Hidabu Abote', score=1)],
         'Chora Boter': [StringMatch(term='Chora (Buno Bedele)', score=0.4736842105263158)],
         'Garemuleta': [StringMatch(term='Geraleta', score=0.6)],
         'Doreni': [StringMatch(term='Dorani', score=0.8333333333333334)],
         'Nejo Town': [StringMatch(term='Nejo Town', score=1)],
         'Wadara': [StringMatch(term='Wadera', score=0.8333333333333334)],
         'Yubdo': [StringMatch(term='Yubdo', score=1)],
         'Agarfa': [StringMatch(term='Agarfa', score=1)],
         'Abe Dengoro': [StringMatch(term='Abe Dongoro', score=0.9090909090909091)],
         'Gawo Qebe': [StringMatch(term='Gawo Kebe', score=0.8888888888888888)],
         'Matahara': [StringMatch(term='May Kadra', score=0.5555555555555556)],
         'Fedis': [StringMatch(term='Fedis', score=1)],
         'Lalo Asabi': [StringMatch(term='Lalo Asabi', score=1)],
         'El Way': [StringMatch(term='Elwaya', score=0.6666666666666667)],
         'Dendi': [StringMatch(term='Dendi', score=1)],
         'Haru': [StringMatch(term='Haru', score=1)],
         'Haro Limu': [StringMatch(term='Haro Limu', score=1)],
         'Wayu Tuqa': [StringMatch(term='Wayu Tuka', score=0.8888888888888888)],
         'Chora': [StringMatch(term='Chifra', score=0.6666666666666667)],
         'Babile Woreda': [StringMatch(term='Babile (Or)', score=0.6923076923076923)],
         'Hawa Gelan': [StringMatch(term='Hawa Galan', score=0.9)],
         'Tiro Afeta': [StringMatch(term='Tiro Afeta', score=1)],
         'Jarso': [StringMatch(term='Ararso', score=0.6666666666666667)],
         'Girawa': [StringMatch(term='Girawa', score=1)],
         'Hurumu': [StringMatch(term='Hurumu', score=1)],
         'Dire': [StringMatch(term='Dire', score=1)],
         'Aweday Town': [StringMatch(term='Aweday Town', score=1)],
         'Seka Chekorsa': [StringMatch(term='Seka Chekorsa', score=1)],
         'Sasiga': [StringMatch(term='Sasiga', score=1)],
         'Limuna Bilbilo': [StringMatch(term='Limu Bilbilo', score=0.8571428571428572)],
         'Saba Boru': [StringMatch(term='Saba Boru', score=1)],
         'Jima Rare': [StringMatch(term='Jimma Rare', score=0.9)],
         'Deder': [StringMatch(term='Deder', score=1)],
         'Meda Welabu': [StringMatch(term='Meda Welabu', score=1)],
         'Meta': [StringMatch(term='Meta', score=1)],
         'Darimu': [StringMatch(term='Darimu', score=1)],
         'Metu Town': [StringMatch(term='Metu Town', score=1)],
         'Wama Hagelo': [StringMatch(term='Wama Hagalo', score=0.9090909090909091)],
         'Hawi Gudina': [StringMatch(term='Hawi Gudina\n', score=0.9166666666666666)],
         'Ginde Beret': [StringMatch(term='Ginde Beret', score=1)],
         'Gedo': [StringMatch(term='Dedo', score=0.75)],
         'Limu Seka': [StringMatch(term='Limu Seka', score=1)],
         'Liban Jawi': [StringMatch(term='Liban Jawi', score=1)],
         'Doba': [StringMatch(term='Doba', score=1)],
         'Negele': [StringMatch(term='Egela', score=0.6666666666666667),
          StringMatch(term='Megale', score=0.6666666666666667)],
         'Girar Jarso': [StringMatch(term='Gerar Jarso', score=0.9090909090909091)]})

No value was left unmatched. That is every query had atleast one match!

[17]:
woreda_map.unmatched()
[17]:
set()

To replace values with their closest match, the mapping needs to be converted into a lookup dictionary. But in doing so, openclean throws a bunch of warnings at us. Although the lookup dictionary was created, it doesn’t include all the values that had more than a single match.

[18]:
woreda_map.to_lookup()
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Kundala (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Chelenko (5 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Tulu Bolo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Mullo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gojo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gambo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gimbi Public (3 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Bora (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Limu (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gursum (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Hanbala (4 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Burayu Town (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Bure (3 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Delo Mena (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Halu (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Dambi Dolo (5 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Dima (4 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Moyale (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gimbi Rural (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gelan Town (5 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Kake (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Kersa Eh (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Meyo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Adea (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Bedele (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Genji (3 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Goba (3 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Becho (4 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Bisidimo (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Goro (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Dera (4 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Gelemso (4 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
/home/heiko/projects/openclean/openclean-core/openclean/data/mapping.py:222: UserWarning: Ignoring key: Negele (2 matches). To include ignored keys, update the map to contain only 1 match per key
  warnings.warn('Ignoring key: {} ({} matches). To include ignored keys, '
[18]:
{'Dodota': 'Dodota',
 'Haromaya Town': 'Haromaya Town',
 'Merti': 'Merti',
 'Shambu Town': 'Shambu Town',
 'Setema': 'Setema',
 'Dapho Hana': 'Dabo Hana',
 'Dugda': 'Dugda',
 'Haromaya': 'Haro Maya',
 'Deder Town': 'Deder Town',
 'Dale Wabera': 'Dale Wabera',
 "Sodo Dac'Ha": 'Sodo Daci',
 'Bilonopa': 'Bilo Nopha',
 'Muke Turi': 'Metu Zuria',
 'Midakegni': 'Mida Kegn',
 'Bule Hora': 'Bule Hora',
 'Sebeta Awas': 'Sebeta Hawas',
 'Elifata': 'Ifata',
 'Kore': 'Kore',
 'Begi': 'Begi',
 'Shirka': 'Shirka',
 'Bore': 'Bore',
 'Horro Buluk': 'Horo Buluk',
 'Limu Kosa': 'Limu Kosa',
 'Aseko': 'Aseko',
 'Adola': 'Adola',
 'Jimma Horo': 'Jimma Horo',
 'Hebal Arsi': 'Heban Arsi',
 'Seru': 'Seru',
 'Gedeb Asasa': 'Gedeb Asasa',
 'Adea Berga': 'Adda Berga',
 'Walmera': 'Welmera',
 'Ambo Town': 'Ambo Town',
 'Ameya': 'Ameya',
 'Jima Geneti': 'Jimma Genete',
 'Chewaqa': 'Chwaka',
 'Ejerie': 'Saesie',
 'Kombolicha': 'Kombolcha',
 'Daro Lebu': 'Daro Lebu',
 'Dubluk': 'Dubluk',
 'Amigna': 'Amigna',
 'Berreh': 'Bereh',
 'Aleiltu': 'Aleltu',
 'Ejersa Lafo': 'Ejersa Lafo',
 'Algesachi': 'Alge Sachi',
 'Ale': 'Ale',
 'Raitu': 'Rayitu',
 'Codi': 'Cobi',
 'Seka Chhokorsa': 'Seka Chekorsa',
 'Shakiso Town': 'Shakiso Town',
 'Gomma': 'Goma',
 'Bedeno': 'Bedeno',
 'Jeju': 'Jeju',
 'Shabe': 'Shala',
 'Haromaya Rural': 'Haromaya Town',
 'Abay Chomen': 'Abay Chomen',
 'Degem': 'Degem',
 'Lomme': 'Loma',
 'Mesela': 'Mesela',
 'Abuna Gindeberet': 'Abuna Ginde Beret',
 'Meiso': 'Miesso',
 'Sedan Chanka': 'Sedi Chenka',
 'Tibe Kutaye': 'Toke Kutaye',
 'Bale Gesgara': 'Bele Gesgar',
 'Gera': 'Gera',
 'Adami Tulu Jido Kombolcha': 'Adama Tulu Jido Kombolcha',
 'Nono': 'Nono',
 'Ludehetosa': 'Lude Hitosa',
 'Legehida': 'Legehida',
 'Holeta': 'Holeta Town',
 'Gumi Eldallo': 'Gumi Idalo',
 'Yabelo': 'Yabelo',
 'Guliso': 'Guliso',
 'Bako Tibe': 'Bako Tibe',
 'B/Tolyi': 'Tole',
 'Dinsho': 'Dinsho',
 'Wachile': 'Wachile',
 'Bishan Guracha Town': 'Bishan Guracha',
 'Homa': 'Homa',
 'Bedele Town': 'Bedele Town',
 'Hitosa': 'Hitosa',
 'Sire': 'Sire',
 'Gimbichu': 'Gimbichu',
 'Deksis': 'Diksis',
 'Sandefa': 'Sankura',
 'Goro Gutu': 'Goro Gutu',
 'Shashemene Rural': 'Shashemene Zuria',
 'Akaki': 'Akaki',
 'Adama': 'Adama',
 'Chomen Guduru': 'Choman Guduru',
 'Woliso Rural': 'Woliso Town',
 'Chole': 'Chole',
 'Jimma Arjo': 'Jimma Arjo',
 'Kiremu': 'Kiremu',
 'Tena': 'Tena',
 'Tiyo': 'Tiyo',
 'Debre Libanos': 'Debre Libanos',
 'Omonada': 'Omo Nada',
 'Dano': 'Dano',
 'Meyu Muleke': 'Meyu Muleke',
 'Chiro Town': 'Chiro Town',
 'Jarte Jardga': 'Jarte Jardega',
 'Olanciti': 'Olanciti Town',
 'Were Jarso': 'Wara Jarso',
 'Meta Waliqite': 'Meta Walkite',
 'Gudru': 'Guduru',
 'Wuchale': 'Wuchale',
 'Dedesa': 'Dedesa',
 'Horo': 'Horo',
 'Kurfa Chele': 'Kurfa Chele',
 'Gololcha': 'Golocha',
 'Dawe Qachen': 'Dawe Ketchen',
 'Kokosa': 'Kokosa',
 'Abaya': 'Abaya',
 'Nejo Rural': 'Nejo Town',
 'Nunu Qumba': 'Nunu Kumba',
 'Tulo': 'Tullo',
 'Suro Barguda': 'Suro Berguda',
 'Agaro': 'Amaro',
 'Boneya Bushe': 'Boneya Boshe',
 'Midega Tole': 'Midhaga Tola',
 'Robe Town': 'Robe Town',
 'Seyo': 'Sayo',
 'St.Luke': 'Dubluk',
 'Dedo': 'Dedo',
 'Adama Town': 'Adama Town',
 'Nejo': 'Nejo',
 'Hambela Wamena': 'Hambela Wamena',
 'Assela Town': 'Asela Town',
 'Goba Town': 'Goba Town',
 'Guto Gida': 'Guto Gida',
 'Guba Qoricha': 'Goba Koricha',
 'West Harerge\tGumbi Bordede': 'Gumbi Bordede',
 'Dawo': 'Dawo',
 'Seden Sodo': 'Seden Sodo',
 'Chiro': 'Chire',
 'Ilu': 'Ilu',
 'Nono Sele': 'Nono Benja',
 'Melka Belo': 'Melka Balo',
 'Omo Nada': 'Omo Nada',
 'Mancho': 'Mancho',
 'Laloqile': 'Lalo Kile',
 'Goro Muti': 'Goro Muti',
 'Aga Wayyu': 'Aga Wayu',
 'Guma': 'Gumay',
 'Kofele': 'Kofele',
 'Modjo Town': 'Mojo Town',
 'Yabelo Rural': 'Yabelo Town',
 'Gemechis': 'Gemechis',
 'Dhas': 'Dhas',
 'Bedesa Town': 'Bedele Town',
 'Dawe Serar': 'Dale Wabera',
 'Yaya Gulele': 'Yaya Gulele',
 'Boset': 'Boset',
 'Bako': 'Babo',
 'Bishoftu Town': 'Bishoftu Town',
 'Chinakesen': 'Chinaksen',
 'Dodola Rural': 'Dodola Town',
 'Lata Sibu': 'Leta Sibu',
 'Shenan Kolu': 'Shanan Kolu',
 'Jeldu': 'Jeldu',
 'Gura Dhamole': 'Gura Damole',
 'Kercha': 'Kercha',
 'Anfilo': 'Anfilo',
 'Oda Bultum': 'Kuni /Oda Bultum',
 'Sekoru': 'Sekoru',
 'Lege Dadi Lege Tafo Town': 'Lege Tafo-Lege Dadi Town',
 'Guna': 'Guna',
 'Nensebo': 'Nenesebo',
 'Sululta Town': 'Sululta Town',
 'Abichugna': "Abichugna Gne'A",
 'Loke Hada': 'Lege Hida',
 'Mojo': 'Nejo',
 'Girja': 'Girawa',
 'Tole': 'Tole',
 'Robe': 'Robe',
 'Guchi': 'Guchi',
 'Jibat': 'Jibat',
 'Metarobi': 'Meta Robi',
 'Odo Shakiso': 'Odo Shakiso',
 'O/Beyam': 'Omo Beyam',
 'Shala': 'Shala',
 'Adaba': 'Adaba',
 'Seweyna': 'Seweyna',
 'Chelia': 'Cheliya',
 'Gudeyabila': 'Gudeya Bila',
 'Negele Town': 'Negele Town',
 'Metu Rural': 'Metu Zuria',
 'Sinana': 'Sinana',
 'Gida Ayana': 'Gida Ayana',
 'Bedele Zuriya': 'Badele Zuria',
 'Ambo': 'Afambo',
 'Gidami': 'Gidami',
 'Arsi Negele Town': 'Arsi Negele Town',
 'Mendi': 'Dendi',
 'Arero': 'Arero',
 'Dilo': 'Dilo',
 'Enkelo Wabe': 'Inkolo Wabe',
 'Adola Town': 'Adola Town',
 'Ayira': 'Ayira',
 'Dale Sedi': 'Dale Sadi',
 'Chiro Zuriya': 'Chiro Zuria',
 'Babile': 'Berahile',
 'Gomole': 'Gomole',
 'Sude': 'Sude',
 'Mendi Town': 'Mendi Town',
 'Meko': 'Meko',
 'Leqa Dulecha': 'Leka Dulecha',
 'Amuru': 'Amuru',
 'Boke': 'Boke',
 'Nole Kaba': 'Nole Kaba',
 'Yemalogi Wolel': 'Yama Logi Welel',
 'Sigmo': 'Sigmo',
 'Guder': 'Gumer',
 'Didu': 'Didu',
 'Burka Dimtu': 'Burqua Dhintu',
 'Wondo': 'Wondo',
 'Bantu': 'Ibantu',
 'Jido': 'Jida',
 'Yayu': 'Yayu',
 'Mkelka Soda': 'Melka Soda',
 'Ginir': 'Ginir',
 'Babo Gembel': 'Chabe Gambeltu',
 'Kersa': 'Kercha',
 'Dhidesa': 'Dedesa',
 'Habro': 'Habro',
 'Ginir Town': 'Ginir Town',
 'Holeta Town': 'Holeta Town',
 'Nekemte Town': 'Nekemte Town',
 'Adola Reda': 'Adola Town',
 'Sebeta Town': 'Sebeta Town',
 'Liben': 'Liben',
 'Arsi Negele Rural': 'Arsi Negele Town',
 'Anchar': 'Anchar',
 'Kersana Malima': 'Kersana Malima',
 'Fentale': 'Fentale',
 'Berbere': 'Berbere',
 'Mene Sibu': 'Mana Sibu',
 'Siraro': 'Siraro',
 'Inchini': 'Tikur Enchini',
 'Seyo Nole': 'Sayo Nole',
 'Gole Oda': 'Golo Oda',
 'Qiltu Kara': 'Kiltu Kara',
 'Wonchi': 'Wenchi',
 'Uraga': 'Uraga',
 'Boricha': 'Boricha',
 'Kimbibit': 'Kimbibit',
 'Gechi': 'Gechi',
 'Gindeberet': 'Ginde Beret',
 'Woliso Town': 'Woliso Town',
 'Boji Dermeji': 'Boji Dirmeji',
 'Gobu Seyo': 'Gobu Seyo',
 'Dodola Town': 'Dodola Town',
 'Bekoji Town': 'Bekoji Town',
 'Goro Dola': 'Gora Dola',
 'Fichetown': 'Fiche Town',
 'Sibu Sire': 'Sibu Sire',
 'Shashamane Town': 'Shashemene Town',
 'Dukem Town': 'Durame Town',
 'Dambi Dollo': 'Denbi Dollo Town',
 'Arena Buluq': 'Harena Buluk',
 'Anna Sora': 'Ana Sora',
 'Jimma Spe Town': 'Jimma Town',
 'Zeway Dugda': 'Ziway Dugda',
 'Gimbi Adventist': 'Gimbi Town',
 'Kuyu': 'Kuyu',
 'Digeluna Tijo': 'Degeluna Tijo',
 'Munesa': 'Munessa',
 'Ebantu': 'Ibantu',
 'Shambu': 'Shambu Town',
 'Gelana': 'Delanta',
 'Fiche': 'Kache',
 'Boji Cheqorsa': 'Boji Chekorsa',
 'Batu': 'Bati',
 'Tikur Enchini': 'Tikur Enchini',
 'Gimbi': 'Gimbi',
 'Diga': 'Diga',
 'Hababo Guduru': 'Choman Guduru',
 'Ilu Galan': 'Illu Galan',
 'Nono Benja': 'Nono Benja',
 'Dugda Dawa': 'Dugda Dawa',
 'Gasera': 'Gasera',
 'Bule Hora Toun': 'Bule Hora Town',
 'Kumbi': 'Kumbi',
 'Biebirsa Kojowa': 'Birbirsa Kojowa',
 'Dodola': 'Dodola',
 'Mana': 'Zana',
 'Teltele': 'Teltale',
 'Hidabu Abote': 'Hidabu Abote',
 'Chora Boter': 'Chora (Buno Bedele)',
 'Garemuleta': 'Geraleta',
 'Doreni': 'Dorani',
 'Nejo Town': 'Nejo Town',
 'Wadara': 'Wadera',
 'Yubdo': 'Yubdo',
 'Agarfa': 'Agarfa',
 'Abe Dengoro': 'Abe Dongoro',
 'Gawo Qebe': 'Gawo Kebe',
 'Matahara': 'May Kadra',
 'Fedis': 'Fedis',
 'Lalo Asabi': 'Lalo Asabi',
 'El Way': 'Elwaya',
 'Dendi': 'Dendi',
 'Haru': 'Haru',
 'Haro Limu': 'Haro Limu',
 'Wayu Tuqa': 'Wayu Tuka',
 'Chora': 'Chifra',
 'Babile Woreda': 'Babile (Or)',
 'Hawa Gelan': 'Hawa Galan',
 'Tiro Afeta': 'Tiro Afeta',
 'Jarso': 'Ararso',
 'Girawa': 'Girawa',
 'Hurumu': 'Hurumu',
 'Dire': 'Dire',
 'Aweday Town': 'Aweday Town',
 'Seka Chekorsa': 'Seka Chekorsa',
 'Sasiga': 'Sasiga',
 'Limuna Bilbilo': 'Limu Bilbilo',
 'Saba Boru': 'Saba Boru',
 'Jima Rare': 'Jimma Rare',
 'Deder': 'Deder',
 'Meda Welabu': 'Meda Welabu',
 'Meta': 'Meta',
 'Darimu': 'Darimu',
 'Metu Town': 'Metu Town',
 'Wama Hagelo': 'Wama Hagalo',
 'Hawi Gudina': 'Hawi Gudina\n',
 'Ginde Beret': 'Ginde Beret',
 'Gedo': 'Dedo',
 'Limu Seka': 'Limu Seka',
 'Liban Jawi': 'Liban Jawi',
 'Doba': 'Doba',
 'Girar Jarso': 'Gerar Jarso'}

This is where having a user with domain knowledge in the loop pays off. For values that had multiple matches, the user gets to select an option and update the mapping.

[19]:
multiple_matches = list()
for key, count in woreda_map.match_counts().items():
    if count > 1:
        multiple_matches.append(key)

pp.pprint(woreda_map.filter(multiple_matches))
Mapping(<class 'list'>,
        { 'Adea': [ StringMatch(term='Adet', score=0.75),
                    StringMatch(term='Adwa', score=0.75)],
          'Becho': [ StringMatch(term='Bero', score=0.6),
                     StringMatch(term='Decha', score=0.6),
                     StringMatch(term='Gechi', score=0.6),
                     StringMatch(term='Mecha', score=0.6)],
          'Bedele': [ StringMatch(term='Bedeno', score=0.6666666666666667),
                      StringMatch(term='Bedesa', score=0.6666666666666667)],
          'Bisidimo': [ StringMatch(term='Bilidigilu', score=0.5),
                        StringMatch(term='Sigmo', score=0.5)],
          'Bora': [ StringMatch(term='Bore', score=0.75),
                    StringMatch(term='Bura', score=0.75)],
          'Burayu Town': [ StringMatch(term='Bure Town', score=0.7272727272727273),
                           StringMatch(term='Durame Town', score=0.7272727272727273)],
          'Bure': [ StringMatch(term='Bura', score=0.75),
                    StringMatch(term='Bule', score=0.75),
                    StringMatch(term='Bore', score=0.75)],
          'Chelenko': [ StringMatch(term='Cheliya', score=0.5),
                        StringMatch(term='Chena', score=0.5),
                        StringMatch(term='Shenkor', score=0.5),
                        StringMatch(term='Chole', score=0.5),
                        StringMatch(term='Sheko', score=0.5)],
          'Dambi Dolo': [ StringMatch(term='Damboya', score=0.5),
                          StringMatch(term='Denbi Dollo Town', score=0.5),
                          StringMatch(term='Damot Gale', score=0.5),
                          StringMatch(term='Damot Sore', score=0.5),
                          StringMatch(term='Gimbi Town', score=0.5)],
          'Delo Mena': [ StringMatch(term='Doyogena', score=0.5555555555555556),
                         StringMatch(term='Melo Gada', score=0.5555555555555556)],
          'Dera': [ StringMatch(term='Gera', score=0.75),
                    StringMatch(term='Wera', score=0.75),
                    StringMatch(term='Dega', score=0.75),
                    StringMatch(term='Dara', score=0.75)],
          'Dima': [ StringMatch(term='Diga', score=0.75),
                    StringMatch(term='Disa', score=0.75),
                    StringMatch(term='Dita', score=0.75),
                    StringMatch(term='Dama', score=0.75)],
          'Gambo': [ StringMatch(term='Garbo', score=0.8),
                     StringMatch(term='Gimbo', score=0.8)],
          'Gelan Town': [ StringMatch(term='Gedeb Town', score=0.7),
                          StringMatch(term='Asela Town', score=0.7),
                          StringMatch(term='Dejen Town', score=0.7),
                          StringMatch(term='Dila Town', score=0.7),
                          StringMatch(term='Goba Town', score=0.7)],
          'Gelemso': [ StringMatch(term='Telemt', score=0.5714285714285714),
                       StringMatch(term='Lemmo', score=0.5714285714285714),
                       StringMatch(term='Gerese', score=0.5714285714285714),
                       StringMatch(term='Guliso', score=0.5714285714285714)],
          'Genji': [ StringMatch(term='Gena', score=0.6),
                     StringMatch(term='Gaji', score=0.6),
                     StringMatch(term='Gechi', score=0.6)],
          'Gimbi Public': [ StringMatch(term='Gimbi Town', score=0.5),
                            StringMatch(term='Gimbichu', score=0.5),
                            StringMatch(term='Kimbibit', score=0.5)],
          'Gimbi Rural': [ StringMatch(term='Gimbi Town', score=0.5454545454545454),
                           StringMatch(term='Gimbichu', score=0.5454545454545454)],
          'Goba': [ StringMatch(term='Doba', score=0.75),
                    StringMatch(term='Goma', score=0.75),
                    StringMatch(term='Guba', score=0.75)],
          'Gojo': [ StringMatch(term='Goglo', score=0.6),
                    StringMatch(term='Gonje', score=0.6)],
          'Goro': [ StringMatch(term='Horo', score=0.75),
                    StringMatch(term='Soro', score=0.75)],
          'Gursum': [ StringMatch(term='Gursum (Or)', score=0.5454545454545454),
                      StringMatch(term='Gursum (Sm)', score=0.5454545454545454)],
          'Halu': [ StringMatch(term='Kalu', score=0.75),
                    StringMatch(term='Haru', score=0.75)],
          'Hanbala': [ StringMatch(term='Hawela', score=0.5714285714285714),
                       StringMatch(term='Abaala', score=0.5714285714285714),
                       StringMatch(term='Hanruka', score=0.5714285714285714),
                       StringMatch(term='Dangila', score=0.5714285714285714)],
          'Kake': [ StringMatch(term='Kache', score=0.6),
                    StringMatch(term='Akaki', score=0.6)],
          'Kersa Eh': [ StringMatch(term='Mersa Town', score=0.5),
                        StringMatch(term='Bereh', score=0.5)],
          'Kundala': [ StringMatch(term='Kunneba', score=0.5714285714285714),
                       StringMatch(term='Undulu', score=0.5714285714285714)],
          'Limu': [ StringMatch(term='Darimu', score=0.5),
                    StringMatch(term='Kiremu', score=0.5)],
          'Meyo': [ StringMatch(term='Meko', score=0.75),
                    StringMatch(term='Miyo', score=0.75)],
          'Moyale': [ StringMatch(term='Megale', score=0.6666666666666667),
                      StringMatch(term='Yocale', score=0.6666666666666667)],
          'Mullo': [ StringMatch(term='Mulo', score=0.8),
                     StringMatch(term='Tullo', score=0.8)],
          'Negele': [ StringMatch(term='Egela', score=0.6666666666666667),
                      StringMatch(term='Megale', score=0.6666666666666667)],
          'Tulu Bolo': [ StringMatch(term='Tullo', score=0.5555555555555556),
                         StringMatch(term='Tulo (Or)', score=0.5555555555555556)]})
[20]:
multi_match_fixes = {
    'Chelenko': 'Cheliya',
    'Becho': 'Bero',
    'Burayu Town': 'Bure Town',
    'Negele': 'Egela',
    'Kundala': 'Kunneba',
    'Gursum': 'Gursum (Or)',
    'Meyo': 'Meko',
    'Limu': 'Darimu',
    'Dambi Dolo': 'Damboya',
    'Gelemso': 'Telemt',
    'Moyale': 'Megale',
    'Delo Mena': 'Doyogena',
    'Hanbala': 'Hawela',
    'Dima': 'Diga',
    'Halu': 'Kalu',
    'Kersa Eh': 'Mersa Town',
    'Bedele': 'Bedeno',
    'Dera': 'Gera',
    'Tulu Bolo': 'Tullo',
    'Gimbi Rural': 'Gimbi Town',
    'Gelan Town': 'Gedeb Town',
    'Kake': 'Kache',
    'Goro': 'Horo',
    'Gambo': 'Garbo',
    'Bora': 'Bore',
    'Goba': 'Doba',
    'Adea': 'Adet',
    'Bure': 'Bura',
    'Mullo': 'Mulo',
    'Gojo': 'Goglo',
    'Gimbi Public': 'Gimbi Town',
    'Bisidimo': 'Bilidigilu',
    'Genji': 'Gena'
}

woreda_map.update(multi_match_fixes)
[20]:
Mapping(list,
        {'Dodota': [StringMatch(term='Dodota', score=1)],
         'Haromaya Town': [StringMatch(term='Haromaya Town', score=1)],
         'Merti': [StringMatch(term='Merti', score=1)],
         'Shambu Town': [StringMatch(term='Shambu Town', score=1)],
         'Setema': [StringMatch(term='Setema', score=1)],
         'Dapho Hana': [StringMatch(term='Dabo Hana', score=0.8)],
         'Dugda': [StringMatch(term='Dugda', score=1)],
         'Kundala': [ExactMatch(term='Kunneba', score=1.0)],
         'Haromaya': [StringMatch(term='Haro Maya', score=0.8888888888888888)],
         'Deder Town': [StringMatch(term='Deder Town', score=1)],
         'Dale Wabera': [StringMatch(term='Dale Wabera', score=1)],
         'Chelenko': [ExactMatch(term='Cheliya', score=1.0)],
         "Sodo Dac'Ha": [StringMatch(term='Sodo Daci', score=0.7272727272727273)],
         'Bilonopa': [StringMatch(term='Bilo Nopha', score=0.8)],
         'Muke Turi': [StringMatch(term='Metu Zuria', score=0.5)],
         'Midakegni': [StringMatch(term='Mida Kegn', score=0.7777777777777778)],
         'Bule Hora': [StringMatch(term='Bule Hora', score=1)],
         'Tulu Bolo': [ExactMatch(term='Tullo', score=1.0)],
         'Mullo': [ExactMatch(term='Mulo', score=1.0)],
         'Sebeta Awas': [StringMatch(term='Sebeta Hawas', score=0.9166666666666666)],
         'Elifata': [StringMatch(term='Ifata', score=0.7142857142857143)],
         'Kore': [StringMatch(term='Kore', score=1)],
         'Begi': [StringMatch(term='Begi', score=1)],
         'Shirka': [StringMatch(term='Shirka', score=1)],
         'Bore': [StringMatch(term='Bore', score=1)],
         'Horro Buluk': [StringMatch(term='Horo Buluk', score=0.9090909090909091)],
         'Gojo': [ExactMatch(term='Goglo', score=1.0)],
         'Limu Kosa': [StringMatch(term='Limu Kosa', score=1)],
         'Aseko': [StringMatch(term='Aseko', score=1)],
         'Gambo': [ExactMatch(term='Garbo', score=1.0)],
         'Adola': [StringMatch(term='Adola', score=1)],
         'Jimma Horo': [StringMatch(term='Jimma Horo', score=1)],
         'Hebal Arsi': [StringMatch(term='Heban Arsi', score=0.9)],
         'Seru': [StringMatch(term='Seru', score=1)],
         'Gimbi Public': [ExactMatch(term='Gimbi Town', score=1.0)],
         'Gedeb Asasa': [StringMatch(term='Gedeb Asasa', score=1)],
         'Adea Berga': [StringMatch(term='Adda Berga', score=0.9)],
         'Walmera': [StringMatch(term='Welmera', score=0.8571428571428572)],
         'Ambo Town': [StringMatch(term='Ambo Town', score=1)],
         'Ameya': [StringMatch(term='Ameya', score=1)],
         'Jima Geneti': [StringMatch(term='Jimma Genete', score=0.8333333333333334)],
         'Bora': [ExactMatch(term='Bore', score=1.0)],
         'Chewaqa': [StringMatch(term='Chwaka', score=0.7142857142857143)],
         'Ejerie': [StringMatch(term='Saesie', score=0.5)],
         'Kombolicha': [StringMatch(term='Kombolcha', score=0.9)],
         'Daro Lebu': [StringMatch(term='Daro Lebu', score=1)],
         'Dubluk': [StringMatch(term='Dubluk', score=1)],
         'Amigna': [StringMatch(term='Amigna', score=1)],
         'Berreh': [StringMatch(term='Bereh', score=0.8333333333333334)],
         'Aleiltu': [StringMatch(term='Aleltu', score=0.8571428571428572)],
         'Ejersa Lafo': [StringMatch(term='Ejersa Lafo', score=1)],
         'Algesachi': [StringMatch(term='Alge Sachi', score=0.9)],
         'Ale': [StringMatch(term='Ale', score=1)],
         'Raitu': [StringMatch(term='Rayitu', score=0.8333333333333334)],
         'Codi': [StringMatch(term='Cobi', score=0.75)],
         'Seka Chhokorsa': [StringMatch(term='Seka Chekorsa', score=0.8571428571428572)],
         'Shakiso Town': [StringMatch(term='Shakiso Town', score=1)],
         'Gomma': [StringMatch(term='Goma', score=0.8)],
         'Bedeno': [StringMatch(term='Bedeno', score=1)],
         'Jeju': [StringMatch(term='Jeju', score=1)],
         'Shabe': [StringMatch(term='Shala', score=0.6)],
         'Haromaya Rural': [StringMatch(term='Haromaya Town', score=0.6428571428571428)],
         'Abay Chomen': [StringMatch(term='Abay Chomen', score=1)],
         'Degem': [StringMatch(term='Degem', score=1)],
         'Lomme': [StringMatch(term='Loma', score=0.6)],
         'Limu': [ExactMatch(term='Darimu', score=1.0)],
         'Mesela': [StringMatch(term='Mesela', score=1)],
         'Abuna Gindeberet': [StringMatch(term='Abuna Ginde Beret', score=0.9411764705882353)],
         'Meiso': [StringMatch(term='Miesso', score=0.6666666666666667)],
         'Sedan Chanka': [StringMatch(term='Sedi Chenka', score=0.75)],
         'Tibe Kutaye': [StringMatch(term='Toke Kutaye', score=0.8181818181818181)],
         'Bale Gesgara': [StringMatch(term='Bele Gesgar', score=0.8333333333333334)],
         'Gera': [StringMatch(term='Gera', score=1)],
         'Adami Tulu Jido Kombolcha': [StringMatch(term='Adama Tulu Jido Kombolcha', score=0.96)],
         'Nono': [StringMatch(term='Nono', score=1)],
         'Ludehetosa': [StringMatch(term='Lude Hitosa', score=0.8181818181818181)],
         'Legehida': [StringMatch(term='Legehida', score=1)],
         'Holeta': [StringMatch(term='Holeta Town', score=0.5454545454545454)],
         'Gumi Eldallo': [StringMatch(term='Gumi Idalo', score=0.75)],
         'Yabelo': [StringMatch(term='Yabelo', score=1)],
         'Guliso': [StringMatch(term='Guliso', score=1)],
         'Bako Tibe': [StringMatch(term='Bako Tibe', score=1)],
         'B/Tolyi': [StringMatch(term='Tole', score=0.4285714285714286)],
         'Dinsho': [StringMatch(term='Dinsho', score=1)],
         'Wachile': [StringMatch(term='Wachile', score=1)],
         'Bishan Guracha Town': [StringMatch(term='Bishan Guracha', score=0.736842105263158)],
         'Homa': [StringMatch(term='Homa', score=1)],
         'Bedele Town': [StringMatch(term='Bedele Town', score=1)],
         'Hitosa': [StringMatch(term='Hitosa', score=1)],
         'Sire': [StringMatch(term='Sire', score=1)],
         'Gimbichu': [StringMatch(term='Gimbichu', score=1)],
         'Deksis': [StringMatch(term='Diksis', score=0.8333333333333334)],
         'Sandefa': [StringMatch(term='Sankura', score=0.5714285714285714)],
         'Goro Gutu': [StringMatch(term='Goro Gutu', score=1)],
         'Shashemene Rural': [StringMatch(term='Shashemene Zuria', score=0.8125)],
         'Akaki': [StringMatch(term='Akaki', score=1)],
         'Adama': [StringMatch(term='Adama', score=1)],
         'Chomen Guduru': [StringMatch(term='Choman Guduru', score=0.9230769230769231)],
         'Woliso Rural': [StringMatch(term='Woliso Town', score=0.5833333333333333)],
         'Chole': [StringMatch(term='Chole', score=1)],
         'Jimma Arjo': [StringMatch(term='Jimma Arjo', score=1)],
         'Kiremu': [StringMatch(term='Kiremu', score=1)],
         'Gursum': [ExactMatch(term='Gursum (Or)', score=1.0)],
         'Tena': [StringMatch(term='Tena', score=1)],
         'Tiyo': [StringMatch(term='Tiyo', score=1)],
         'Debre Libanos': [StringMatch(term='Debre Libanos', score=1)],
         'Omonada': [StringMatch(term='Omo Nada', score=0.875)],
         'Hanbala': [ExactMatch(term='Hawela', score=1.0)],
         'Dano': [StringMatch(term='Dano', score=1)],
         'Meyu Muleke': [StringMatch(term='Meyu Muleke', score=1)],
         'Chiro Town': [StringMatch(term='Chiro Town', score=1)],
         'Jarte Jardga': [StringMatch(term='Jarte Jardega', score=0.9230769230769231)],
         'Olanciti': [StringMatch(term='Olanciti Town', score=0.6153846153846154)],
         'Burayu Town': [ExactMatch(term='Bure Town', score=1.0)],
         'Were Jarso': [StringMatch(term='Wara Jarso', score=0.8)],
         'Bure': [ExactMatch(term='Bura', score=1.0)],
         'Meta Waliqite': [StringMatch(term='Meta Walkite', score=0.8461538461538461)],
         'Gudru': [StringMatch(term='Guduru', score=0.8333333333333334)],
         'Wuchale': [StringMatch(term='Wuchale', score=1)],
         'Dedesa': [StringMatch(term='Dedesa', score=1)],
         'Delo Mena': [ExactMatch(term='Doyogena', score=1.0)],
         'Horo': [StringMatch(term='Horo', score=1)],
         'Kurfa Chele': [StringMatch(term='Kurfa Chele', score=1)],
         'Gololcha': [StringMatch(term='Golocha', score=0.875)],
         'Dawe Qachen': [StringMatch(term='Dawe Ketchen', score=0.75)],
         'Kokosa': [StringMatch(term='Kokosa', score=1)],
         'Abaya': [StringMatch(term='Abaya', score=1)],
         'Nejo Rural': [StringMatch(term='Nejo Town', score=0.5)],
         'Nunu Qumba': [StringMatch(term='Nunu Kumba', score=0.9)],
         'Tulo': [StringMatch(term='Tullo', score=0.8)],
         'Suro Barguda': [StringMatch(term='Suro Berguda', score=0.9166666666666666)],
         'Agaro': [StringMatch(term='Amaro', score=0.8)],
         'Boneya Bushe': [StringMatch(term='Boneya Boshe', score=0.9166666666666666)],
         'Midega Tole': [StringMatch(term='Midhaga Tola', score=0.75)],
         'Robe Town': [StringMatch(term='Robe Town', score=1)],
         'Seyo': [StringMatch(term='Sayo', score=0.75)],
         'Halu': [ExactMatch(term='Kalu', score=1.0)],
         'St.Luke': [StringMatch(term='Dubluk', score=0.4285714285714286)],
         'Dedo': [StringMatch(term='Dedo', score=1)],
         'Adama Town': [StringMatch(term='Adama Town', score=1)],
         'Nejo': [StringMatch(term='Nejo', score=1)],
         'Hambela Wamena': [StringMatch(term='Hambela Wamena', score=1)],
         'Assela Town': [StringMatch(term='Asela Town', score=0.9090909090909091)],
         'Dambi Dolo': [ExactMatch(term='Damboya', score=1.0)],
         'Goba Town': [StringMatch(term='Goba Town', score=1)],
         'Guto Gida': [StringMatch(term='Guto Gida', score=1)],
         'Guba Qoricha': [StringMatch(term='Goba Koricha', score=0.8333333333333334)],
         'Dima': [ExactMatch(term='Diga', score=1.0)],
         'West Harerge\tGumbi Bordede': [StringMatch(term='Gumbi Bordede', score=0.5)],
         'Dawo': [StringMatch(term='Dawo', score=1)],
         'Moyale': [ExactMatch(term='Megale', score=1.0)],
         'Seden Sodo': [StringMatch(term='Seden Sodo', score=1)],
         'Chiro': [StringMatch(term='Chire', score=0.8)],
         'Ilu': [StringMatch(term='Ilu', score=1)],
         'Nono Sele': [StringMatch(term='Nono Benja', score=0.6)],
         'Melka Belo': [StringMatch(term='Melka Balo', score=0.9)],
         'Omo Nada': [StringMatch(term='Omo Nada', score=1)],
         'Mancho': [StringMatch(term='Mancho', score=1)],
         'Laloqile': [StringMatch(term='Lalo Kile', score=0.7777777777777778)],
         'Goro Muti': [StringMatch(term='Goro Muti', score=1)],
         'Aga Wayyu': [StringMatch(term='Aga Wayu', score=0.8888888888888888)],
         'Guma': [StringMatch(term='Gumay', score=0.8)],
         'Kofele': [StringMatch(term='Kofele', score=1)],
         'Modjo Town': [StringMatch(term='Mojo Town', score=0.9)],
         'Yabelo Rural': [StringMatch(term='Yabelo Town', score=0.5833333333333333)],
         'Gemechis': [StringMatch(term='Gemechis', score=1)],
         'Dhas': [StringMatch(term='Dhas', score=1)],
         'Bedesa Town': [StringMatch(term='Bedele Town', score=0.8181818181818181)],
         'Dawe Serar': [StringMatch(term='Dale Wabera', score=0.5454545454545454)],
         'Yaya Gulele': [StringMatch(term='Yaya Gulele', score=1)],
         'Boset': [StringMatch(term='Boset', score=1)],
         'Bako': [StringMatch(term='Babo', score=0.75)],
         'Bishoftu Town': [StringMatch(term='Bishoftu Town', score=1)],
         'Chinakesen': [StringMatch(term='Chinaksen', score=0.9)],
         'Dodola Rural': [StringMatch(term='Dodola Town', score=0.5833333333333333)],
         'Lata Sibu': [StringMatch(term='Leta Sibu', score=0.8888888888888888)],
         'Shenan Kolu': [StringMatch(term='Shanan Kolu', score=0.9090909090909091)],
         'Jeldu': [StringMatch(term='Jeldu', score=1)],
         'Gura Dhamole': [StringMatch(term='Gura Damole', score=0.9166666666666666)],
         'Kercha': [StringMatch(term='Kercha', score=1)],
         'Anfilo': [StringMatch(term='Anfilo', score=1)],
         'Oda Bultum': [StringMatch(term='Kuni /Oda Bultum', score=0.625)],
         'Sekoru': [StringMatch(term='Sekoru', score=1)],
         'Lege Dadi Lege Tafo Town': [StringMatch(term='Lege Tafo-Lege Dadi Town', score=0.7083333333333333)],
         'Gimbi Rural': [ExactMatch(term='Gimbi Town', score=1.0)],
         'Guna': [StringMatch(term='Guna', score=1)],
         'Nensebo': [StringMatch(term='Nenesebo', score=0.875)],
         'Sululta Town': [StringMatch(term='Sululta Town', score=1)],
         'Abichugna': [StringMatch(term="Abichugna Gne'A", score=0.6)],
         'Loke Hada': [StringMatch(term='Lege Hida', score=0.6666666666666667)],
         'Mojo': [StringMatch(term='Nejo', score=0.5)],
         'Girja': [StringMatch(term='Girawa', score=0.6666666666666667)],
         'Gelan Town': [ExactMatch(term='Gedeb Town', score=1.0)],
         'Tole': [StringMatch(term='Tole', score=1)],
         'Robe': [StringMatch(term='Robe', score=1)],
         'Guchi': [StringMatch(term='Guchi', score=1)],
         'Jibat': [StringMatch(term='Jibat', score=1)],
         'Metarobi': [StringMatch(term='Meta Robi', score=0.8888888888888888)],
         'Odo Shakiso': [StringMatch(term='Odo Shakiso', score=1)],
         'O/Beyam': [StringMatch(term='Omo Beyam', score=0.6666666666666667)],
         'Shala': [StringMatch(term='Shala', score=1)],
         'Adaba': [StringMatch(term='Adaba', score=1)],
         'Seweyna': [StringMatch(term='Seweyna', score=1)],
         'Chelia': [StringMatch(term='Cheliya', score=0.8571428571428572)],
         'Gudeyabila': [StringMatch(term='Gudeya Bila', score=0.9090909090909091)],
         'Negele Town': [StringMatch(term='Negele Town', score=1)],
         'Metu Rural': [StringMatch(term='Metu Zuria', score=0.7)],
         'Sinana': [StringMatch(term='Sinana', score=1)],
         'Gida Ayana': [StringMatch(term='Gida Ayana', score=1)],
         'Bedele Zuriya': [StringMatch(term='Badele Zuria', score=0.8461538461538461)],
         'Ambo': [StringMatch(term='Afambo', score=0.6666666666666667)],
         'Gidami': [StringMatch(term='Gidami', score=1)],
         'Arsi Negele Town': [StringMatch(term='Arsi Negele Town', score=1)],
         'Mendi': [StringMatch(term='Dendi', score=0.8)],
         'Arero': [StringMatch(term='Arero', score=1)],
         'Dilo': [StringMatch(term='Dilo', score=1)],
         'Kake': [ExactMatch(term='Kache', score=1.0)],
         'Enkelo Wabe': [StringMatch(term='Inkolo Wabe', score=0.8181818181818181)],
         'Adola Town': [StringMatch(term='Adola Town', score=1)],
         'Ayira': [StringMatch(term='Ayira', score=1)],
         'Dale Sedi': [StringMatch(term='Dale Sadi', score=0.8888888888888888)],
         'Chiro Zuriya': [StringMatch(term='Chiro Zuria', score=0.9166666666666666)],
         'Babile': [StringMatch(term='Berahile', score=0.625)],
         'Kersa Eh': [ExactMatch(term='Mersa Town', score=1.0)],
         'Gomole': [StringMatch(term='Gomole', score=1)],
         'Sude': [StringMatch(term='Sude', score=1)],
         'Meyo': [ExactMatch(term='Meko', score=1.0)],
         'Mendi Town': [StringMatch(term='Mendi Town', score=1)],
         'Meko': [StringMatch(term='Meko', score=1)],
         'Leqa Dulecha': [StringMatch(term='Leka Dulecha', score=0.9166666666666666)],
         'Amuru': [StringMatch(term='Amuru', score=1)],
         'Boke': [StringMatch(term='Boke', score=1)],
         'Nole Kaba': [StringMatch(term='Nole Kaba', score=1)],
         'Yemalogi Wolel': [StringMatch(term='Yama Logi Welel', score=0.8)],
         'Sigmo': [StringMatch(term='Sigmo', score=1)],
         'Guder': [StringMatch(term='Gumer', score=0.8)],
         'Didu': [StringMatch(term='Didu', score=1)],
         'Burka Dimtu': [StringMatch(term='Burqua Dhintu', score=0.6923076923076923)],
         'Wondo': [StringMatch(term='Wondo', score=1)],
         'Bantu': [StringMatch(term='Ibantu', score=0.8333333333333334)],
         'Jido': [StringMatch(term='Jida', score=0.75)],
         'Yayu': [StringMatch(term='Yayu', score=1)],
         'Mkelka Soda': [StringMatch(term='Melka Soda', score=0.9090909090909091)],
         'Ginir': [StringMatch(term='Ginir', score=1)],
         'Adea': [ExactMatch(term='Adet', score=1.0)],
         'Babo Gembel': [StringMatch(term='Chabe Gambeltu', score=0.5714285714285714)],
         'Bedele': [ExactMatch(term='Bedeno', score=1.0)],
         'Kersa': [StringMatch(term='Kercha', score=0.6666666666666667)],
         'Dhidesa': [StringMatch(term='Dedesa', score=0.7142857142857143)],
         'Habro': [StringMatch(term='Habro', score=1)],
         'Ginir Town': [StringMatch(term='Ginir Town', score=1)],
         'Holeta Town': [StringMatch(term='Holeta Town', score=1)],
         'Nekemte Town': [StringMatch(term='Nekemte Town', score=1)],
         'Adola Reda': [StringMatch(term='Adola Town', score=0.6)],
         'Sebeta Town': [StringMatch(term='Sebeta Town', score=1)],
         'Liben': [StringMatch(term='Liben', score=1)],
         'Arsi Negele Rural': [StringMatch(term='Arsi Negele Town', score=0.7058823529411764)],
         'Anchar': [StringMatch(term='Anchar', score=1)],
         'Kersana Malima': [StringMatch(term='Kersana Malima', score=1)],
         'Fentale': [StringMatch(term='Fentale', score=1)],
         'Berbere': [StringMatch(term='Berbere', score=1)],
         'Mene Sibu': [StringMatch(term='Mana Sibu', score=0.7777777777777778)],
         'Siraro': [StringMatch(term='Siraro', score=1)],
         'Genji': [ExactMatch(term='Gena', score=1.0)],
         'Inchini': [StringMatch(term='Tikur Enchini', score=0.5384615384615384)],
         'Seyo Nole': [StringMatch(term='Sayo Nole', score=0.8888888888888888)],
         'Gole Oda': [StringMatch(term='Golo Oda', score=0.875)],
         'Qiltu Kara': [StringMatch(term='Kiltu Kara', score=0.9)],
         'Goba': [ExactMatch(term='Doba', score=1.0)],
         'Wonchi': [StringMatch(term='Wenchi', score=0.8333333333333334)],
         'Uraga': [StringMatch(term='Uraga', score=1)],
         'Boricha': [StringMatch(term='Boricha', score=1)],
         'Kimbibit': [StringMatch(term='Kimbibit', score=1)],
         'Gechi': [StringMatch(term='Gechi', score=1)],
         'Gindeberet': [StringMatch(term='Ginde Beret', score=0.9090909090909091)],
         'Woliso Town': [StringMatch(term='Woliso Town', score=1)],
         'Boji Dermeji': [StringMatch(term='Boji Dirmeji', score=0.9166666666666666)],
         'Gobu Seyo': [StringMatch(term='Gobu Seyo', score=1)],
         'Dodola Town': [StringMatch(term='Dodola Town', score=1)],
         'Bekoji Town': [StringMatch(term='Bekoji Town', score=1)],
         'Goro Dola': [StringMatch(term='Gora Dola', score=0.8888888888888888)],
         'Fichetown': [StringMatch(term='Fiche Town', score=0.9)],
         'Sibu Sire': [StringMatch(term='Sibu Sire', score=1)],
         'Becho': [ExactMatch(term='Bero', score=1.0)],
         'Shashamane Town': [StringMatch(term='Shashemene Town', score=0.8666666666666667)],
         'Dukem Town': [StringMatch(term='Durame Town', score=0.7272727272727273)],
         'Dambi Dollo': [StringMatch(term='Denbi Dollo Town', score=0.5625)],
         'Arena Buluq': [StringMatch(term='Harena Buluk', score=0.8333333333333334)],
         'Anna Sora': [StringMatch(term='Ana Sora', score=0.8888888888888888)],
         'Jimma Spe Town': [StringMatch(term='Jimma Town', score=0.7142857142857143)],
         'Zeway Dugda': [StringMatch(term='Ziway Dugda', score=0.9090909090909091)],
         'Gimbi Adventist': [StringMatch(term='Gimbi Town', score=0.4666666666666667)],
         'Bisidimo': [ExactMatch(term='Bilidigilu', score=1.0)],
         'Kuyu': [StringMatch(term='Kuyu', score=1)],
         'Digeluna Tijo': [StringMatch(term='Degeluna Tijo', score=0.9230769230769231)],
         'Munesa': [StringMatch(term='Munessa', score=0.8571428571428572)],
         'Ebantu': [StringMatch(term='Ibantu', score=0.8333333333333334)],
         'Shambu': [StringMatch(term='Shambu Town', score=0.5454545454545454)],
         'Gelana': [StringMatch(term='Delanta', score=0.7142857142857143)],
         'Goro': [ExactMatch(term='Horo', score=1.0)],
         'Fiche': [StringMatch(term='Kache', score=0.6)],
         'Boji Cheqorsa': [StringMatch(term='Boji Chekorsa', score=0.9230769230769231)],
         'Batu': [StringMatch(term='Bati', score=0.75)],
         'Tikur Enchini': [StringMatch(term='Tikur Enchini', score=1)],
         'Gimbi': [StringMatch(term='Gimbi', score=1)],
         'Diga': [StringMatch(term='Diga', score=1)],
         'Hababo Guduru': [StringMatch(term='Choman Guduru', score=0.6153846153846154)],
         'Ilu Galan': [StringMatch(term='Illu Galan', score=0.9)],
         'Nono Benja': [StringMatch(term='Nono Benja', score=1)],
         'Dugda Dawa': [StringMatch(term='Dugda Dawa', score=1)],
         'Gasera': [StringMatch(term='Gasera', score=1)],
         'Bule Hora Toun': [StringMatch(term='Bule Hora Town', score=0.9285714285714286)],
         'Dera': [ExactMatch(term='Gera', score=1.0)],
         'Kumbi': [StringMatch(term='Kumbi', score=1)],
         'Gelemso': [ExactMatch(term='Telemt', score=1.0)],
         'Biebirsa Kojowa': [StringMatch(term='Birbirsa Kojowa', score=0.9333333333333333)],
         'Dodola': [StringMatch(term='Dodola', score=1)],
         'Mana': [StringMatch(term='Zana', score=0.75)],
         'Teltele': [StringMatch(term='Teltale', score=0.8571428571428572)],
         'Hidabu Abote': [StringMatch(term='Hidabu Abote', score=1)],
         'Chora Boter': [StringMatch(term='Chora (Buno Bedele)', score=0.4736842105263158)],
         'Garemuleta': [StringMatch(term='Geraleta', score=0.6)],
         'Doreni': [StringMatch(term='Dorani', score=0.8333333333333334)],
         'Nejo Town': [StringMatch(term='Nejo Town', score=1)],
         'Wadara': [StringMatch(term='Wadera', score=0.8333333333333334)],
         'Yubdo': [StringMatch(term='Yubdo', score=1)],
         'Agarfa': [StringMatch(term='Agarfa', score=1)],
         'Abe Dengoro': [StringMatch(term='Abe Dongoro', score=0.9090909090909091)],
         'Gawo Qebe': [StringMatch(term='Gawo Kebe', score=0.8888888888888888)],
         'Matahara': [StringMatch(term='May Kadra', score=0.5555555555555556)],
         'Fedis': [StringMatch(term='Fedis', score=1)],
         'Lalo Asabi': [StringMatch(term='Lalo Asabi', score=1)],
         'El Way': [StringMatch(term='Elwaya', score=0.6666666666666667)],
         'Dendi': [StringMatch(term='Dendi', score=1)],
         'Haru': [StringMatch(term='Haru', score=1)],
         'Haro Limu': [StringMatch(term='Haro Limu', score=1)],
         'Wayu Tuqa': [StringMatch(term='Wayu Tuka', score=0.8888888888888888)],
         'Chora': [StringMatch(term='Chifra', score=0.6666666666666667)],
         'Babile Woreda': [StringMatch(term='Babile (Or)', score=0.6923076923076923)],
         'Hawa Gelan': [StringMatch(term='Hawa Galan', score=0.9)],
         'Tiro Afeta': [StringMatch(term='Tiro Afeta', score=1)],
         'Jarso': [StringMatch(term='Ararso', score=0.6666666666666667)],
         'Girawa': [StringMatch(term='Girawa', score=1)],
         'Hurumu': [StringMatch(term='Hurumu', score=1)],
         'Dire': [StringMatch(term='Dire', score=1)],
         'Aweday Town': [StringMatch(term='Aweday Town', score=1)],
         'Seka Chekorsa': [StringMatch(term='Seka Chekorsa', score=1)],
         'Sasiga': [StringMatch(term='Sasiga', score=1)],
         'Limuna Bilbilo': [StringMatch(term='Limu Bilbilo', score=0.8571428571428572)],
         'Saba Boru': [StringMatch(term='Saba Boru', score=1)],
         'Jima Rare': [StringMatch(term='Jimma Rare', score=0.9)],
         'Deder': [StringMatch(term='Deder', score=1)],
         'Meda Welabu': [StringMatch(term='Meda Welabu', score=1)],
         'Meta': [StringMatch(term='Meta', score=1)],
         'Darimu': [StringMatch(term='Darimu', score=1)],
         'Metu Town': [StringMatch(term='Metu Town', score=1)],
         'Wama Hagelo': [StringMatch(term='Wama Hagalo', score=0.9090909090909091)],
         'Hawi Gudina': [StringMatch(term='Hawi Gudina\n', score=0.9166666666666666)],
         'Ginde Beret': [StringMatch(term='Ginde Beret', score=1)],
         'Gedo': [StringMatch(term='Dedo', score=0.75)],
         'Limu Seka': [StringMatch(term='Limu Seka', score=1)],
         'Liban Jawi': [StringMatch(term='Liban Jawi', score=1)],
         'Doba': [StringMatch(term='Doba', score=1)],
         'Negele': [ExactMatch(term='Egela', score=1.0)],
         'Girar Jarso': [StringMatch(term='Gerar Jarso', score=0.9090909090909091)]})

No warnings this time!

We can now update the dataset using this mapping and standardize the different variations of Woreda names into official values.

[21]:
from openclean.function.eval.domain import Lookup
from openclean.operator.transform.update import update
from openclean.function.eval.base import Col

# update the vaa dataset's WoredaName column using the Lookup eval function
vacc = update(vacc, 'WoredaName', Lookup(columns=['WoredaName'], mapping=woreda_map.to_lookup(), default=Col('WoredaName')))

We confirm if there are any errors left in the data.

[22]:
# All misspelled WoredaNames should be replaced with the closest values in our master vocabulary

errors = set(vacc['WoredaName']) - set(admin_boundaries['Woreda'])
print('there are {} errors'.format(len(errors)))
print(errors)
there are 0 errors
set()

We apply our findings about common spelling mistakes from the vaccine dataset to a dataset on crop production from the Oromia region.

[23]:
# streaming and slicing a different dataset about farming in the Oromia region

crops = stream(os.path.join('data', 'ethiopia-crop-production-2010-11.csv'))\
    .where(Eq(Col('Region'), 'Oromia'))\
    .typecast(DefaultConverter()) \
    .to_df()

crops.sample(5)
[23]:
Crop Cluster Region DominantZone Woreda Land cultivated (Ha) Production (Qt) Productivity (Qt/ha)
109 Tef Oromia Tef Cluster Oromia South West Shewa Tole 4516.179612 17922.214527 3.968446
126 Mango East Shewa - Arsi Horticulture Cluster Oromia Arsi Zeway Dugda 0.12035 68.665683 570.548708
50 Maize East Wellega - Horo - West Shoa Maize Cluster Oromia Horo Gudru Wellega Jima Rare 1518.233234 38781.068885 25.543552
136 Sesame Oromia Sesame Cluster Oromia East Wellega Diga 408.783916 2875.041375 7.033157
70 Maize Jimma - Buno Bedele Maize Cluster Oromia Jimma Limu Kosa 426.384802 94259.82324 221.067503
[24]:
# let's see how many misspelled values exist in the crops dataframe

errors = set(crops.Woreda)  - set(admin_boundaries['Woreda'])
print('there are {} errors'.format(len(errors)))
there are 39 errors
[25]:
# replacing the similarly misspelled ones with their closest spellings from the official list

crops = update(crops, 'Woreda', Lookup(columns=['Woreda'], mapping=woreda_map.to_lookup(), default=Col('Woreda')))
[26]:
# were we able to fix everything?

errors = set(crops.Woreda)  - set(admin_boundaries['Woreda'])
print('there are {} errors'.format(len(errors)))
there are 0 errors

No more errors! Well prepared mappings capturing the essence of mistakes in data are really powerful and can be stored, shared and reused amongst data practitioners across various different use cases.


We welcome feedback and contributions! Please visit us at the following links for more great examples:

|8fc991b19da14ce7a7b086da6e7c7b2e|

       https://openclean.readthedocs.io/
   </p>

|0a73c9785e694524901a84a1c0568b4c|

       https://github.com/VIDA-NYU/openclean-core
   </p>

|3fc3ed104dd74b04902e11a530b7a5f0|

    https://vida.engineering.nyu.edu/research/data-curation/
</p>

kNN Clustering - DOHMH New York City Restaurant Inspection Results

Find groups of different business names that might be alternative representations of the same venue. This is an example for the kNN clustering supported by openclean.

[1]:
# Open the downloaded dataset to extract the relevant columns and records.

import os

from openclean.pipeline import stream

df = stream(os.path.join('data', '43nn-pn8j.tsv.gz'))

Extract Relevant Records

Get set of distinct business names from DBA column.

[2]:
# Get distinct set of street names. By computing the distinct set of
# street names first we avoid computing keys for each distinct street
# name multiple times.

dba = df.select('DBA').distinct()

print('{} distinct bisiness names (for {} total values)'.format(len(dba), sum(dba.values())))
21046 distinct bisiness names (for 392131 total values)
[3]:
# Cluster business names using kNN clusterer (with the default n-gram setting)
# using the Levenshtein distance as the similarity measure.
# Remove clusters that contain less than ten distinct values (for display
# purposes).

from openclean.cluster.knn import knn_clusters
from openclean.function.similarity.base import SimilarityConstraint
from openclean.function.similarity.text import LevenshteinDistance
from openclean.function.value.threshold import GreaterThan

# Minimum cluster size. Use ten as default (to limit
# the number of clusters that are printed in the next cell).
minsize = 5

clusters = knn_clusters(
    values=dba,
    sim=SimilarityConstraint(func=LevenshteinDistance(), pred=GreaterThan(0.9)),
    minsize=minsize
)

print('{} clusters of size {} or greater'.format(len(clusters), minsize))
17 clusters of size 5 or greater
[4]:
# For each cluster print cluster values, their frequency counts,
# and the suggested common value for the cluster.

def print_cluster(cnumber, cluster):
    print('Cluster {} (of size {})\n'.format(cnumber, len(cluster)))
    for val, count in cluster.items():
        print('{} ({})'.format(val, count))
    print('\nSuggested value: {}\n\n'.format(cluster.suggestion()))

# Sort clusters by decreasing number of distinct values.
clusters.sort(key=lambda c: len(c), reverse=True)

for i, cluster in enumerate(clusters):
    print_cluster(i + 1, cluster)

Cluster 1 (of size 11)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN', BASKINS ROBBINS (19)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN BASKIN ROBINS (8)
DUNKIN' BASKIN ROBBINS (6)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 2 (of size 11)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN', BASKINS ROBBINS (19)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN  / BASKIN ROBBINS (2)
DUNKIN'  BASKIN ROBBINS (7)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 3 (of size 11)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN BASKIN ROBINS (8)
DUNKIN  / BASKIN ROBBINS (2)
DUNKIN  BASKIN ROBBINS (13)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 4 (of size 10)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN', BASKINS ROBBINS (19)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN BASKIN ROBINS (8)
DUNKIN, BASKIN ROBBINS (20)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 5 (of size 9)

DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN', BASKINS ROBBINS (19)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN', BASKIN ROBBINS (1147)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 6 (of size 9)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN BASKIN ROBINS (8)
DUNKIN BASKIN ROBBINS (52)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 7 (of size 9)

DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN'/BASKIN ROBBINS (15)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN BASKIN ROBINS (8)
DUNKIN  / BASKIN ROBBINS (2)
DUNKIN /BASKIN ROBBINS (9)

Suggested value: DUNKIN BASKIN ROBBINS


Cluster 8 (of size 8)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN'/BASKIN ROBBINS (15)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 9 (of size 6)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN  / BASKIN ROBBINS (2)
DUNKIN' & BASKIN ROBBINS (13)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 10 (of size 6)

DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN BASKIN ROBINS (8)

Suggested value: DUNKIN BASKIN ROBBINS


Cluster 11 (of size 6)

CITI FIELD STAND 321 (6)
CITI FIELD STAND 121 (5)
CITI FIELD STAND 425 (6)
CITI FIELD STAND 431 (5)
CITI FIELD STAND 423 (6)
CITI FIELD STAND 421 (7)

Suggested value: CITI FIELD STAND 421


Cluster 12 (of size 6)

CITI FIELD STAND 335 (4)
CITI FIELD STAND 415 (5)
CITI FIELD STAND 425 (6)
CITI FIELD STAND 433 (4)
CITI FIELD STAND 431 (5)
CITI FIELD STAND 435 (4)

Suggested value: CITI FIELD STAND 425


Cluster 13 (of size 5)

CHIPOTLE MEXICAN GRILL #2308 (6)
CHIPOTLE MEXICAN GRILL #2834 (8)
CHIPOTLE MEXICAN GRILL #2918 (3)
CHIPOTLE MEXICAN GRILL #2879 (3)
CHIPOTLE MEXICAN GRILL #2838 (7)

Suggested value: CHIPOTLE MEXICAN GRILL #2834


Cluster 14 (of size 5)

DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN', BASKINS ROBBINS (19)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 15 (of size 5)

DUNKIN'  BASKIN ROBBINS (7)
DUNKIN  BASKIN ROBBINS (13)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN  / BASKIN ROBBINS (2)

Suggested value: DUNKIN  BASKIN ROBBINS


Cluster 16 (of size 5)

SERVICE BAR 6 (10)
SERVICE BAR 8 (5)
SERVICE BAR 5 (6)
SERVICE BAR 3 (5)
SERVICE BAR 7 (3)

Suggested value: SERVICE BAR 6


Cluster 17 (of size 5)

CITI FIELD STAND 421 (7)
CITI FIELD STAND 435 (4)
CITI FIELD STAND 415 (5)
CITI FIELD STAND 423 (6)
CITI FIELD STAND 425 (6)

Suggested value: CITI FIELD STAND 421


[5]:
# Perform normalization of business names first to get an
# initial set of clusters using key collision clustering.
# Then run kNN clustering on the collision keys.

from collections import Counter

from openclean.cluster.knn import knn_collision_clusters

clusters = knn_collision_clusters(
    values=dba,
    sim=SimilarityConstraint(func=LevenshteinDistance(), pred=GreaterThan(0.9)),
    minsize=minsize
)

print('{} clusters of size {} or greater'.format(len(clusters), minsize))
4 clusters of size 5 or greater
[6]:
# Print resulting clusters.

clusters.sort(key=lambda c: len(c), reverse=True)

for i, cluster in enumerate(clusters):
    print_cluster(i + 1, cluster)

Cluster 1 (of size 12)

DUNKIN', BASKINS ROBBINS (19)
DUNKIN BASKIN ROBINS (8)
DUNKIN', BASKIN ROBBINS (1147)
DUNKIN, BASKIN ROBBINS (20)
DUNKIN BASKIN ROBBINS (52)
DUNKIN' BASKIN ROBBINS (6)
DUNKIN'  BASKIN ROBBINS (7)
DUNKIN  BASKIN ROBBINS (13)
Dunkin/ Baskin Robbins (12)
DUNKIN' & BASKIN ROBBINS (13)
DUNKIN /BASKIN ROBBINS (9)
DUNKIN  / BASKIN ROBBINS (2)

Suggested value: DUNKIN', BASKIN ROBBINS


Cluster 2 (of size 7)

KENNEDY FRIED CHICKEN (1294)
Kennedy Fried Chicken (50)
Kennedy fried chicken (10)
KENNEDY  FRIED CHICKEN (8)
U.S KENNEDY FRIED CHICKEN (12)
US KENNEDY FRIED CHICKEN (27)
KENNEDY'S FRIED CHICKEN (16)

Suggested value: KENNEDY FRIED CHICKEN


Cluster 3 (of size 6)

CITI FIELD STAND 121 (5)
CITI FIELD STAND 321 (6)
CITI FIELD STAND 423 (6)
CITI FIELD STAND 425 (6)
CITI FIELD STAND 431 (5)
CITI FIELD STAND 421 (7)

Suggested value: CITI FIELD STAND 421


Cluster 4 (of size 6)

CITI FIELD STAND 335 (4)
CITI FIELD STAND 415 (5)
CITI FIELD STAND 425 (6)
CITI FIELD STAND 431 (5)
CITI FIELD STAND 433 (4)
CITI FIELD STAND 435 (4)

Suggested value: CITI FIELD STAND 425


Functional Dependency Violations

Example showing how to detect functional dependency violations. Uses the NYC Parking Violations Issued - Fiscal Year 2014 dataset to identify violations of the functional dependency Meter Number -> Registration State, Street.

[1]:
# Download the full 'DOB Job Application Fiings' dataset.
# Note that the fill is over 300MB in size.

import gzip
import os

from openclean.data.source.socrata import Socrata

datafile = './jt7v-77mi.tsv.gz'

# Download file only if it does not exist already.
if not os.path.isfile(datafile):
    with gzip.open(datafile, 'wb') as f:
        ds = Socrata().dataset('jt7v-77mi')
        print('Downloading ...\n')
        print(ds.name + '\n')
        print(ds.description)
        ds.write(f)


# As an alternative, you can also use the smaller dataset sample that is
# included in the repository.
#
# datafile = './data/jt7v-77mi.tsv.gz'
[2]:
# Verify that the download was successful. Print dataset columns and number of rows.
# This example makes use of the streaming option to avoid loading the full data frame
# into memory.

from openclean.pipeline import stream

ds = stream(datafile)


print('Schema\n------')
for col in ds.columns:
    print("  '{}'".format(col))

print('\n{} rows.'.format(ds.count()))
Schema
------
  'Summons Number'
  'Plate ID'
  'Registration State'
  'Plate Type'
  'Issue Date'
  'Violation Code'
  'Vehicle Body Type'
  'Vehicle Make'
  'Issuing Agency'
  'Street Code1'
  'Street Code2'
  'Street Code3'
  'Vehicle Expiration Date'
  'Violation Location'
  'Violation Precinct'
  'Issuer Precinct'
  'Issuer Code'
  'Issuer Command'
  'Issuer Squad'
  'Violation Time'
  'Time First Observed'
  'Violation County'
  'Violation In Front Of Or Opposite'
  'Number'
  'Street'
  'Intersecting Street'
  'Date First Observed'
  'Law Section'
  'Sub Division'
  'Violation Legal Code'
  'Days Parking In Effect    '
  'From Hours In Effect'
  'To Hours In Effect'
  'Vehicle Color'
  'Unregistered Vehicle?'
  'Vehicle Year'
  'Meter Number'
  'Feet From Curb'
  'Violation Post Code'
  'Violation Description'
  'No Standing or Stopping Violation'
  'Hydrant Violation'
  'Double Parking Violation'

9100278 rows.
[3]:
# Profile a sample of 1000 rows using the default profiler.

profiles = ds.sample(n=1000, random_state=42).profile()
profiles
[3]:
[{'column': 'Summons Number',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 1286655493, 'maximum': 8004852361}}}},
 {'column': 'Plate ID',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 982, 'int': 18})}),
   'minmaxValues': {'str': {'minimum': '019KWM', 'maximum': 'ZFF73E'},
    'int': {'minimum': 22, 'maximum': 8184138}}}},
 {'column': 'Registration State',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 998, 'int': 2})}),
   'minmaxValues': {'str': {'minimum': 'AZ', 'maximum': 'VT'},
    'int': {'minimum': 99, 'maximum': 99}}}},
 {'column': 'Plate Type',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 994, 'int': 6})}),
   'minmaxValues': {'str': {'minimum': 'APP', 'maximum': 'TRC'},
    'int': {'minimum': 999, 'maximum': 999}}}},
 {'column': 'Issue Date',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'date': 1000})}),
   'minmaxValues': {'date': {'minimum': datetime.datetime(2012, 12, 10, 0, 0),
     'maximum': datetime.datetime(2014, 6, 25, 0, 0)}}}},
 {'column': 'Violation Code',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 5, 'maximum': 99}}}},
 {'column': 'Vehicle Body Type',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 7,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 993})}),
   'minmaxValues': {'str': {'minimum': '2 DR', 'maximum': 'VAN'}}}},
 {'column': 'Vehicle Make',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 9,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 991})}),
   'minmaxValues': {'str': {'minimum': 'ACURA', 'maximum': 'WORKH'}}}},
 {'column': 'Issuing Agency',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 1000})}),
   'minmaxValues': {'str': {'minimum': 'P', 'maximum': 'X'}}}},
 {'column': 'Street Code1',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 95030}}}},
 {'column': 'Street Code2',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 97740}}}},
 {'column': 'Street Code3',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 98260}}}},
 {'column': 'Vehicle Expiration Date',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 88888888}}}},
 {'column': 'Violation Location',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 72,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 928})}),
   'minmaxValues': {'int': {'minimum': 1, 'maximum': 122}}}},
 {'column': 'Violation Precinct',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 122}}}},
 {'column': 'Issuer Precinct',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 977}}}},
 {'column': 'Issuer Code',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 981230}}}},
 {'column': 'Issuer Command',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 69,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 797, 'int': 134})}),
   'minmaxValues': {'str': {'minimum': '0NIC', 'maximum': 'T803'},
    'int': {'minimum': 0, 'maximum': 977}}}},
 {'column': 'Issuer Squad',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 69,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 779, 'int': 152})}),
   'minmaxValues': {'str': {'minimum': 'A', 'maximum': 'YA'},
    'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'Violation Time',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 1,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 999})}),
   'minmaxValues': {'str': {'minimum': '0014A', 'maximum': '1259P'}}}},
 {'column': 'Time First Observed',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 896,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 104})}),
   'minmaxValues': {'str': {'minimum': '0107P', 'maximum': '1257P'}}}},
 {'column': 'Violation County',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 72,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 928})}),
   'minmaxValues': {'str': {'minimum': 'BX', 'maximum': 'R'}}}},
 {'column': 'Violation In Front Of Or Opposite',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 87,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 913})}),
   'minmaxValues': {'str': {'minimum': 'F', 'maximum': 'X'}}}},
 {'column': 'Number',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 98,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 279, 'int': 623})}),
   'minmaxValues': {'str': {'minimum': '10-16', 'maximum': 'W'},
    'int': {'minimum': 1, 'maximum': 16305}}}},
 {'column': 'Street',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 1,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 999})}),
   'minmaxValues': {'str': {'minimum': '101st St', 'maximum': 'Wythe Ave'}}}},
 {'column': 'Intersecting Street',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 798,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 202})}),
   'minmaxValues': {'str': {'minimum': ')@ALLERTON AVE-XA-2',
     'maximum': 'Y SVC RD @ 72ND RD'}}}},
 {'column': 'Date First Observed',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 20140618}}}},
 {'column': 'Law Section',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 408, 'maximum': 1180}}}},
 {'column': 'Sub Division',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 998, 'int': 2})}),
   'minmaxValues': {'str': {'minimum': 'B', 'maximum': 'm5'},
    'int': {'minimum': 5, 'maximum': 99}}}},
 {'column': 'Violation Legal Code',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 930,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 69, 'int': 1})}),
   'minmaxValues': {'str': {'minimum': 'T', 'maximum': 'T'},
    'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'Days Parking In Effect    ',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 155,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 845})}),
   'minmaxValues': {'str': {'minimum': 'BBBBBBB', 'maximum': 'YYYYYYY'}}}},
 {'column': 'From Hours In Effect',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 366,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 634})}),
   'minmaxValues': {'str': {'minimum': '0  :', 'maximum': 'ALL'}}}},
 {'column': 'To Hours In Effect',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 366,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 634})}),
   'minmaxValues': {'str': {'minimum': '0  :', 'maximum': 'ALL'}}}},
 {'column': 'Vehicle Color',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 11,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 989})}),
   'minmaxValues': {'str': {'minimum': 'BK', 'maximum': 'YW'}}}},
 {'column': 'Unregistered Vehicle?',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 848,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 152})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 0}}}},
 {'column': 'Vehicle Year',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 2015}}}},
 {'column': 'Meter Number',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 751,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 249})}),
   'minmaxValues': {'str': {'minimum': '-', 'maximum': '495-0067'}}}},
 {'column': 'Feet From Curb',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 0,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'int': 1000})}),
   'minmaxValues': {'int': {'minimum': 0, 'maximum': 10}}}},
 {'column': 'Violation Post Code',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 220,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 743, 'int': 37})}),
   'minmaxValues': {'str': {'minimum': '01 -', 'maximum': 'Y 99'},
    'int': {'minimum': 0, 'maximum': 131}}}},
 {'column': 'Violation Description',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 152,
   'datatypes': defaultdict(collections.Counter,
               {'total': Counter({'str': 848})}),
   'minmaxValues': {'str': {'minimum': '09-Blocking the Box',
     'maximum': 'PHTO SCHOOL ZN SPEED VIOLATION'}}}},
 {'column': 'No Standing or Stopping Violation',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 1000,
   'datatypes': defaultdict(collections.Counter, {}),
   'minmaxValues': {}}},
 {'column': 'Hydrant Violation',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 1000,
   'datatypes': defaultdict(collections.Counter, {}),
   'minmaxValues': {}}},
 {'column': 'Double Parking Violation',
  'stats': {'totalValueCount': 1000,
   'emptyValueCount': 1000,
   'datatypes': defaultdict(collections.Counter, {}),
   'minmaxValues': {}}}]
[4]:
# Print number of empty cells for each column

profiles.stats()['empty']
[4]:
Summons Number                          0
Plate ID                                0
Registration State                      0
Plate Type                              0
Issue Date                              0
Violation Code                          0
Vehicle Body Type                       7
Vehicle Make                            9
Issuing Agency                          0
Street Code1                            0
Street Code2                            0
Street Code3                            0
Vehicle Expiration Date                 0
Violation Location                     72
Violation Precinct                      0
Issuer Precinct                         0
Issuer Code                             0
Issuer Command                         69
Issuer Squad                           69
Violation Time                          1
Time First Observed                   896
Violation County                       72
Violation In Front Of Or Opposite      87
Number                                 98
Street                                  1
Intersecting Street                   798
Date First Observed                     0
Law Section                             0
Sub Division                            0
Violation Legal Code                  930
Days Parking In Effect                155
From Hours In Effect                  366
To Hours In Effect                    366
Vehicle Color                          11
Unregistered Vehicle?                 848
Vehicle Year                            0
Meter Number                          751
Feet From Curb                          0
Violation Post Code                   220
Violation Description                 152
No Standing or Stopping Violation    1000
Hydrant Violation                    1000
Double Parking Violation             1000
Name: empty, dtype: int64
[5]:
# Show minimum and maximum value for column 'Meter Number'. We see
# that the column not only contains a lot of emoty values but also
# '-' as an alternative representation for a missing value.

profiles.minmax('Meter Number')
[5]:
min max
str - 495-0067
[6]:
# Get the first 1000 rows. Ignore rows where the meter number is undefined (i.e., either
# an empty string or '-'). Convert the result into a data frame.

from openclean.function.eval.domain import IsNotIn

# We only select a subset of columns for this demo.
columns = [
    'Plate ID',
    'Registration State',
    'Plate Type',
    'Meter Number',
    'Street',
    'Vehicle Body Type',
    'Vehicle Make',
    'Vehicle Color'
]

df = ds\
    .select(columns)\
    .where(IsNotIn('Meter Number', set({'-', ''})), limit=1000)\
    .to_df()

df.head()
[6]:
Plate ID Registration State Plate Type Meter Number Street Vehicle Body Type Vehicle Make Vehicle Color
661 FXY1858 NY PAS 407-3018 QUEENS BLVD SDN NISSA GY
780 89988JX NY COM 3 - FRESH POND TRD VAN FORD WHITE
901 FGX2747 NY PAS 504-3043 SDN HONDA SILVE
2287 23161JR NY COM 144-3942 WEST 42 STREET P-U FORD WHITE
2346 47153MC NY COM 144-3987 W 40TH ST SDN TOYOT SILV
[7]:
# Find violations of the functional dependency Meter Number -> Street.

from openclean.operator.map.violations import fd_violations

groups = fd_violations(df, lhs='Meter Number', rhs='Street')
[8]:
# List meter numbers that have violations and the number of
# violating values.

for key in groups:
    print('{} {}'.format(key, groups.get(key).shape[0]))
144-3942 4
143-5293 4
144-6383 9
144-3937 9
143-3785 12
144-6376 5
144-6001 3
144-6089 3
143-3791 3
114-9979 2
144-3958 4
144-6453 3
144-3955 8
144-5988 2
144-6088 6
143-3786 2
144-6377 5
143-5983 6
140-5816 3
105-8347 2
140-5756 2
143-3793 2
117-5778 3
144-6047 2
140-6386 4
144-3957 2
143-3787 3
144-3959 2
140-5716 2
143-3767 2
140-9944 3
114-9970 2
105-8390 2
119-4780 3
120-8052 4
431-3003 2
143-5694 4
144-6601 2
301-3609 3
105-8346 2
140-9954 2
145-7412 2
103-4489 2
301-3678 2
143-3901 2
407-2167 2
201-3042 3
407-2206 2
201-3012 2
226-2760 2
[9]:
# Show street names that cause violations of the functional dependency.

from openclean.operator.collector.count import distinct

print('Meter Number | Street (Count)')
print('=============|===============')
for key in groups:
    conflicts = distinct(groups.get(key), 'Street').most_common()
    street, count = conflicts[0]
    print('{:<12} | {} x {}'.format(key, count, street))
    for street, count in conflicts[1:]:
        print('             | {} x {}'.format(count, street))
    print('-------------|---------------')
Meter Number | Street (Count)
=============|===============
144-3942     | 1 x WEST 42 STREET
             | 1 x WEST 42 ST
             | 1 x WEST 42ND STREET
             | 1 x W 42 STREET
-------------|---------------
143-5293     | 2 x W 45 ST
             | 1 x Columbus Ave
             | 1 x W 45th St
-------------|---------------
144-6383     | 8 x 9TH AVE
             | 1 x 9TH AVENUE
-------------|---------------
144-3937     | 5 x WEST 42 STREET
             | 1 x WEST 42 ST
             | 1 x W 42ND ST
             | 1 x WEST 42ND
             | 1 x W 42 ST
-------------|---------------
143-3785     | 3 x WEST 43RD ST
             | 3 x W 43 ST
             | 2 x WEST 43 ST
             | 2 x W 43RD ST
             | 1 x WEST 43RD STREET
             | 1 x W 43 CARTER HOTEL
-------------|---------------
144-6376     | 3 x 8TH AVENUE
             | 2 x 8TH AVE
-------------|---------------
144-6001     | 1 x WEST 38 ST
             | 1 x W 38 ST
             | 1 x W 38th St
-------------|---------------
144-6089     | 1 x S/W/C/O W 36 ST
             | 1 x 8TH AVENUE
             | 1 x S/W C/O W 36 ST
-------------|---------------
143-3791     | 2 x WEST 46 ST
             | 1 x W 46 ST
-------------|---------------
114-9979     | 1 x GROVE ST
             | 1 x GROVE STREET
-------------|---------------
144-3958     | 2 x WEST 41ST STREET
             | 1 x 7TH AVENUE
             | 1 x WEST 41 ST
-------------|---------------
144-6453     | 2 x BROADWAY
             | 1 x C/O 41ST STREET
-------------|---------------
144-3955     | 4 x W 41 ST
             | 3 x W 41ST STREET
             | 1 x TIMES SQUARE
-------------|---------------
144-5988     | 1 x W 38
             | 1 x W 38TH ST
-------------|---------------
144-6088     | 4 x WEST 36 STREET
             | 2 x W 36TH ST
-------------|---------------
143-3786     | 1 x WEST 44TH STREET
             | 1 x WEST 44 STREET
-------------|---------------
144-6377     | 2 x 8TH AVENUE
             | 1 x 35 ST
             | 1 x W 35 ST
             | 1 x 8TH AVE
-------------|---------------
143-5983     | 4 x WEST 43RD STREET
             | 2 x W 43RD STREET
-------------|---------------
140-5816     | 1 x 8TH AVE
             | 1 x WEST 45TH STREET
             | 1 x WEST 45 ST
-------------|---------------
105-8347     | 1 x WEST 181 ST
             | 1 x W 181 ST
-------------|---------------
140-5756     | 1 x WEST 50TH STREET
             | 1 x W 50th St
-------------|---------------
143-3793     | 1 x WEST 47TH ST
             | 1 x W 47 STREET
-------------|---------------
117-5778     | 2 x CENTRAL PARK SOUTH
             | 1 x Central Park South
-------------|---------------
144-6047     | 1 x WEST 37TH ST
             | 1 x WEST 37
-------------|---------------
140-6386     | 2 x 8TH AVE
             | 2 x 8TH AVENUE
-------------|---------------
144-3957     | 1 x WEST 41ST STREET
             | 1 x WEST 41 STREET
-------------|---------------
143-3787     | 2 x WEST 44 STREET
             | 1 x W 44TH STREET
-------------|---------------
144-3959     | 1 x S/S CO. 41 ST
             | 1 x WEST 41 ST
-------------|---------------
140-5716     | 1 x C/O 41 ST
             | 1 x W 50th St
-------------|---------------
143-3767     | 1 x S/S E 52 ST
             | 1 x Madison Ave
-------------|---------------
140-9944     | 2 x 8TH AVENUE
             | 1 x 8TH AVE
-------------|---------------
114-9970     | 1 x W 181ST ST
             | 1 x CHRISTOPHER ST
-------------|---------------
105-8390     | 1 x BROADWAY
             | 1 x Broadway
-------------|---------------
119-4780     | 2 x Lexington Ave
             | 1 x LEXINGTON AVE
-------------|---------------
120-8052     | 2 x E 106 ST
             | 2 x E 106 STREET
-------------|---------------
431-3003     | 1 x Steinway St
             | 1 x Jamaica Ave
-------------|---------------
143-5694     | 3 x W 44TH ST
             | 1 x W 44 ST
-------------|---------------
144-6601     | 1 x WEST 32 STREET
             | 1 x W 32 ST
-------------|---------------
301-3609     | 2 x SCHERMERHORN STREET
             | 1 x SCHERMERHORN ST
-------------|---------------
105-8346     | 1 x C/O W 181
             | 1 x W 181ST ST
-------------|---------------
140-9954     | 1 x W 152 ST
             | 1 x W 52nd St
-------------|---------------
145-7412     | 1 x E 19th St
             | 1 x E 18th St
-------------|---------------
103-4489     | 1 x Columbus Ave
             | 1 x 8th Ave
-------------|---------------
301-3678     | 1 x State St
             | 1 x Front St
-------------|---------------
143-3901     | 1 x Madison Ave
             | 1 x E 59th St
-------------|---------------
407-2167     | 1 x 38th St
             | 1 x 35th Ave
-------------|---------------
201-3042     | 1 x Tiebout Ave
             | 1 x Jerome Ave
             | 1 x W 183rd St
-------------|---------------
407-2206     | 1 x 31st Ave
             | 1 x 37th St
-------------|---------------
201-3012     | 1 x Jerome Ave
             | 1 x Grand Ave
-------------|---------------
226-2760     | 1 x E 170th St
             | 1 x Broadway
-------------|---------------
[10]:
# The Plate ID and Registration State should identify a vehicle uniquely. Here
# we focus on the vehicle color.
#
# Find violations of the FD ['Plate ID', 'Registration State'] -> ['Vehicle Color']
groups = fd_violations(df, lhs=['Plate ID', 'Registration State'], rhs='Vehicle Color')
[11]:
# List Plate ID and Registration State for vehicles that have multiple colors in the dataset
# together with the set of different colors.

from collections import Counter

for key in groups:
    conflicts = Counter(groups.get(key)['Vehicle Color'].value_counts().keys()).most_common()
    c_format = ', '.join(['{}: {}'.format(val, cnt) for val, cnt in conflicts])
    print('{} = [{}]'.format(key, c_format))
('63272JM', 'NY') = [BROWN: 1, BWN: 1]
('99308MC', 'NY') = [WHITE: 1, WH: 1]
('DNB3070', 'NY') = [BLK: 1, BLACK: 1]
('95743JM', 'NY') = [BL: 1, BLUE: 1]
('63677JM', 'NY') = [BRN: 1, BROWN: 1]
('87071JS', 'NY') = [WH: 1, WHITE: 1]

Token Signature Outliers for Street Names

Find street names that do not include at least one token from token signature that represents street names in U.S. address columns. Uses the NYC Parking Violations Issued - Fiscal Year 2014 dataset.

[1]:
# Download the full 'DOB Job Application Fiings' dataset.

import gzip
import os

from openclean.data.source.socrata import Socrata

datafile = './jt7v-77mi.tsv.gz'

# Download file only if it does not exist already.
if not os.path.isfile(datafile):
    with gzip.open(datafile, 'wb') as f:
        ds = Socrata().dataset('jt7v-77mi')
        print('Downloading ...\n')
        print(ds.name + '\n')
        print(ds.description)
        ds.write(f)


# As an alternative, you can also use the smaller dataset sample that is
# included in the repository.
#
# datafile = './data/jt7v-77mi.tsv.gz'

# Setup the environment for this demo. All downloaded reference
# data files will be stored in a subfolder refdata_tmp.

from refdata.config import ENV_BASEDIR

os.environ[ENV_BASEDIR] = './refdata_tmp'
[2]:
# Download the street abbreviation reference dataset.

import openclean.data.refdata as refdata

refdata.download('usps:street_abbrev')
[3]:
# Use streaming function to avoid having to load the full dataset
# into memory.

from openclean.pipeline import stream

df = stream(datafile)
[4]:
# Get distinct set of street names. By computing the distinct set of
# street names first we avoid computing keys for each distinct street
# name multiple times.

streets = df.select('Street').distinct()

print('{} distinct street names'.format(len(streets)))
115567 distinct street names
[5]:
# Create a token signature from the street abbreviations.

from openclean.operator.map.groupby import groupby
from openclean.operator.transform.apply import apply
from openclean.profiling.pattern.token_signature import token_signature

# Convert all values to liwer case.
street_abbrev = refdata.load('usps:street_abbrev').df()
street_abbrev = apply(street_abbrev, columns=street_abbrev.columns, func=str.lower)
# Create one signature entry for each unique primary suffix.
groups = groupby(street_abbrev, columns='primary_suffix')
signature = token_signature(groups, columns=list(street_abbrev.columns))
[6]:
# Print the token signature.
signature
[6]:
[{'shl', 'shoal'},
 {'tunel', 'tunl', 'tunls', 'tunnel', 'tunnels', 'tunnl'},
 {'rest', 'rst'},
 {'ports', 'prts'},
 {'extensions', 'exts'},
 {'run'},
 {'clfs', 'cliffs'},
 {'est', 'estate'},
 {'pine', 'pne'},
 {'courts', 'cts'},
 {'cen', 'cent', 'center', 'centr', 'centre', 'cnter', 'cntr', 'ctr'},
 {'heights', 'ht', 'hts'},
 {'lf', 'loaf'},
 {'vill', 'villag', 'village', 'villg', 'villiage', 'vlg'},
 {'ter', 'terr', 'terrace'},
 {'vis', 'vist', 'vista', 'vst', 'vsta'},
 {'motorway', 'mtwy'},
 {'view', 'vw'},
 {'keys', 'kys'},
 {'key', 'ky'},
 {'shoar', 'shore', 'shr'},
 {'crest', 'crst'},
 {'plaza', 'plz', 'plza'},
 {'creek', 'crk'},
 {'hill', 'hl'},
 {'stra', 'strav', 'straven', 'stravenue', 'stravn', 'strvn', 'strvnue'},
 {'anex', 'annex', 'annx', 'anx'},
 {'rdg', 'rdge', 'ridge'},
 {'manors', 'mnrs'},
 {'drives', 'drs'},
 {'jctns', 'jcts', 'junctions'},
 {'forks', 'frks'},
 {'villages', 'vlgs'},
 {'lake', 'lk'},
 {'brks', 'brooks'},
 {'knls', 'knolls'},
 {'smt', 'sumit', 'sumitt', 'summit'},
 {'brdge', 'brg', 'bridge'},
 {'hills', 'hls'},
 {'riv', 'river', 'rivr', 'rvr'},
 {'av', 'ave', 'aven', 'avenu', 'avenue', 'avn', 'avnue'},
 {'ranch', 'ranches', 'rnch', 'rnchs'},
 {'rapid', 'rpd'},
 {'vdct', 'via', 'viadct', 'viaduct'},
 {'course', 'crse'},
 {'curv', 'curve'},
 {'grov', 'grove', 'grv'},
 {'points', 'pts'},
 {'cir', 'circ', 'circl', 'circle', 'crcl', 'crcle'},
 {'crossing', 'crssng', 'xing'},
 {'blf', 'bluf', 'bluff'},
 {'blfs', 'bluffs'},
 {'mnt', 'mount', 'mt'},
 {'rad', 'radial', 'radiel', 'radl'},
 {'field', 'fld'},
 {'shoars', 'shores', 'shrs'},
 {'parkway', 'parkwy', 'pkway', 'pkwy', 'pky'},
 {'valley', 'vally', 'vlly', 'vly'},
 {'forg', 'forge', 'frg'},
 {'camp', 'cmp', 'cp'},
 {'loop', 'loops'},
 {'exp', 'expr', 'express', 'expressway', 'expw', 'expy'},
 {'is', 'island', 'islnd'},
 {'track', 'tracks', 'trak', 'trk', 'trks'},
 {'unions', 'uns'},
 {'ldg', 'ldge', 'lodg', 'lodge'},
 {'manor', 'mnr'},
 {'forges', 'frgs'},
 {'haven', 'hvn'},
 {'mntain', 'mntn', 'mountain', 'mountin', 'mtin', 'mtn'},
 {'blvd', 'boul', 'boulevard', 'boulv'},
 {'lane', 'ln'},
 {'bend', 'bnd'},
 {'mdw', 'mdws', 'meadows', 'medows'},
 {'wells', 'wls'},
 {'underpass', 'upas'},
 {'rue'},
 {'coves', 'cvs'},
 {'cres', 'crescent', 'crsent', 'crsnt'},
 {'trafficway', 'trfy'},
 {'valleys', 'vlys'},
 {'row'},
 {'mews'},
 {'clf', 'cliff'},
 {'rds', 'roads'},
 {'stream', 'streme', 'strm'},
 {'groves', 'grvs'},
 {'mill', 'ml'},
 {'crossroad', 'xrd'},
 {'corners', 'cors'},
 {'lakes', 'lks'},
 {'nck', 'neck'},
 {'streets', 'sts'},
 {'wall'},
 {'orch', 'orchard', 'orchrd'},
 {'knl', 'knol', 'knoll'},
 {'spur'},
 {'sq', 'sqr', 'sqre', 'squ', 'square'},
 {'allee', 'alley', 'ally', 'aly'},
 {'glens', 'glns'},
 {'ville', 'vl'},
 {'st', 'str', 'street', 'strt'},
 {'bgs', 'burgs'},
 {'court', 'ct'},
 {'trailer', 'trlr', 'trlrs'},
 {'mall'},
 {'fall'},
 {'mntns', 'mountains', 'mtns'},
 {'fort', 'frt', 'ft'},
 {'cape', 'cpe'},
 {'ext', 'extension', 'extn', 'extnsn'},
 {'lgt', 'light'},
 {'well', 'wl'},
 {'harb', 'harbor', 'harbr', 'hbr', 'hrbor'},
 {'hllw', 'hollow', 'hollows', 'holw', 'holws'},
 {'centers', 'ctrs'},
 {'bch', 'beach'},
 {'pr', 'prairie', 'prr'},
 {'cor', 'corner'},
 {'un', 'union'},
 {'pass'},
 {'dr', 'driv', 'drive', 'drv'},
 {'point', 'pt'},
 {'pike', 'pikes'},
 {'walk', 'walks'},
 {'brk', 'brook'},
 {'mdw', 'meadow'},
 {'causeway', 'causwa', 'cswy'},
 {'sta', 'station', 'statn', 'stn'},
 {'lck', 'lock'},
 {'canyn', 'canyon', 'cnyn', 'cyn'},
 {'div', 'divide', 'dv', 'dvd'},
 {'port', 'prt'},
 {'harbors', 'hbrs'},
 {'forest', 'forests', 'frst'},
 {'views', 'vws'},
 {'jct', 'jction', 'jctn', 'junction', 'junctn', 'juncton'},
 {'park', 'prk'},
 {'freeway', 'freewy', 'frway', 'frwy', 'fwy'},
 {'dam', 'dm'},
 {'cmn', 'common'},
 {'parkways', 'pkwy', 'pkwys'},
 {'byp', 'bypa', 'bypas', 'bypass', 'byps'},
 {'fork', 'frk'},
 {'trail', 'trails', 'trl', 'trls'},
 {'skwy', 'skyway'},
 {'bayoo', 'bayou', 'byu'},
 {'arc', 'arcade'},
 {'cove', 'cv'},
 {'shls', 'shoals'},
 {'passage', 'psge'},
 {'throughway', 'trwy'},
 {'oval', 'ovl'},
 {'plain', 'pln'},
 {'walk'},
 {'land'},
 {'flats', 'flts'},
 {'estates', 'ests'},
 {'pl', 'place'},
 {'bg', 'burg'},
 {'highway', 'highwy', 'hiway', 'hiwy', 'hway', 'hwy'},
 {'rd', 'road'},
 {'plains', 'plns'},
 {'trace', 'traces', 'trce'},
 {'park', 'parks'},
 {'glen', 'gln'},
 {'green', 'grn'},
 {'inlet', 'inlt'},
 {'spur', 'spurs'},
 {'ferry', 'frry', 'fry'},
 {'pines', 'pnes'},
 {'garden', 'gardn', 'gdn', 'grden', 'grdn'},
 {'clb', 'club'},
 {'islands', 'islnds', 'iss'},
 {'route', 'rte'},
 {'rdgs', 'ridges'},
 {'falls', 'fls'},
 {'spg', 'spng', 'spring', 'sprng'},
 {'gardens', 'gdns', 'grdns'},
 {'isle', 'isles'},
 {'landing', 'lndg', 'lndng'},
 {'cmns', 'commons'},
 {'spgs', 'spngs', 'springs', 'sprngs'},
 {'mission', 'missn', 'msn', 'mssn'},
 {'circles', 'cirs'},
 {'fields', 'flds'},
 {'ramp'},
 {'lcks', 'locks'},
 {'path', 'paths'},
 {'crossroads', 'xrds'},
 {'bot', 'bottm', 'bottom', 'btm'},
 {'way', 'wy'},
 {'greens', 'grns'},
 {'ways'},
 {'fords', 'frds'},
 {'br', 'branch', 'brnch'},
 {'dale', 'dl'},
 {'lgts', 'lights'},
 {'mills', 'mls'},
 {'flat', 'flt'},
 {'sqrs', 'sqs', 'squares'},
 {'rapids', 'rpds'},
 {'opas', 'overpass'},
 {'gateway', 'gatewy', 'gatway', 'gtway', 'gtwy'},
 {'tpke', 'trnpk', 'turnpike', 'turnpk'},
 {'ford', 'frd'}]
[7]:
# Identify outliers in the set of street names that do not match
# at least one entry in the signature.

from openclean.profiling.anomalies.pattern import TokenSignatureOutliers

outliers = TokenSignatureOutliers(signature=signature).process(streets)

print('found {} outliers in list of {} street names'.format(len(outliers), len(streets)))
found 27250 outliers in list of 115567 street names
[8]:
# Print sample of 100 values from discovered outliers.

from random import Random

for val in sorted(Random(41).choices(outliers, k=100)):
    print(val)
100  C/N OF SCHERMER
100FT PARKING LOT OF
137 STRET
15 FEET EAST OF 5TH
2  S/W C/O DAHILL
37 AVENUE+
53STREET
ATLANTIC AVE3
ATLANTICA
B 121
BENTON
BLDG 72 JFK AIRPORT
BRIGHTON 14
BRONX P EAST
C/O 64 CIRLCE
C/O B 60
C/O E 167 T
C/O E 21
C/O HURON
C/O LENEVAR
C/O W 127
C/O W 188ST
C/O WYCOFF
CNETRAL PK WEST
COLUMBUS NYCH
COMMONWEALTH BL
E 108
E 174ST
E/S 32 P
FIB
FLUSHING MUPPY LOT
FORSYTH STQ
GROTE
HANGAR 1 - 16 A
HERRING
HICKS
I/O CARROLL
INSIDE 188 LINCOLN A
INSIDE CONNISNSHON P
INSIDE FMCP INSIDE
IO E 135
LYDIG
MAC KAY
MANHATTAN AVW
MMPW
N 6
N/B FRANCIS LEWIS BL
N/E C/O E 88
N/E C/O FORSYTHE
N/E C/O YORK
N/E CRNR BAYRIDGE PK
N/S C/R OF MILFORD S
N/W C/O E 35
N/W W 239 STRET
N/W/C JAMAICA
NORDSTRAN
ODELL
OPP 104
P K LOT 566 HAMILTON
PARKING LOT #7
PIKTIN
Q 83 BUS OF
Q4 BUS STOP S/S ARCH
R/O 1455 HARROD
R/O 245-10 FRANCIS L
R/O 2946
R/SIDE BUILDING OF 3
REAR OF 131
REAR OF 48 MONUMENT
REAR OF EVANS
REV JMS PLT
S/B WEBSTER 450  FRO
S/E ARCHER 50FT
S/E C/O RIVINGTON
S/E GOUVERNEUR
S/O 81
S/S HAWKIN ATTORNEY
S/S SKILLMAN 2
S/W C/O 124 ST6
SIDE OF 456 E 3 STRE
ST.GEORGE LOT #1
T 5 ARRIVALS JFK
TERMINAL B
TERMINAL B-LGA
TOMPKINS3
VASE
W 170 TH
W 22ST
W 41 S
W 87
W 90TH
W/O DAVISON SOUTH
W/S 2 AVEENUE
W/S EDGECOMBE AEV
WATERS EDGE D
WATT
WAVE
WEST 39TH
WEST 44TH
WILLLIAMSBRIDGE

Standardization of Street Names

Find groups of different street names that might be alternative representations of the same street. This is an example for the key collision clustering supported by openclean. Uses the NYC Parking Violations Issued - Fiscal Year 2014 dataset.

[1]:
# Download the full 'DOB Job Application Fiings' dataset.
# Note that this is a file of ~ GB!

import gzip
import os

from openclean.data.source.socrata import Socrata

datafile = './jt7v-77mi.tsv.gz'

# Download file only if it does not exist already.
if not os.path.isfile(datafile):
    with gzip.open(datafile, 'wb') as f:
        ds = Socrata().dataset('jt7v-77mi')
        print('Downloading ...\n')
        print(ds.name + '\n')
        print(ds.description)
        ds.write(f)


# As an alternative, you can also use the smaller dataset sample that is
# included in the repository.
#
# datafile = './data/jt7v-77mi.tsv.gz'
[2]:
# Use streaming function to avoid having to load the full dataset
# into memory.

from openclean.pipeline import stream

df = stream(datafile)
[3]:
# Get distinct set of street names. By computing the distinct set of
# street names first we avoid computing keys for each distinct street
# name multiple times.

streets = df.select('Street').distinct()

print('{} distinct streets (for {} total values)'.format(len(streets), sum(streets.values())))
115567 distinct streets (for 9100278 total values)
[4]:
# Cluster street names using key collision (with the default key generator).
# Remove clusters that contain less than seven distinct values (for display
# purposes). Use multiple threads (4) to generate value keys in parallel.

from openclean.cluster.key import key_collision

# Minimum cluster size. Use seven as defaultfor the full dataset (to limit
# the number of clusters that are printed in the next cell).
minsize = 7

# Use minimum cluster size of 2 when using the dataset sample
# minsize = 2

clusters = key_collision(values=streets, minsize=minsize, threads=4)

print('{} clusters of size {} or greater'.format(len(clusters), minsize))
13 clusters of size 7 or greater
[5]:
# For each cluster print cluster values, their frequency counts,
# and the suggested common value for the cluster.

def print_cluster(cnumber, cluster):
    print('Cluster {} (of size {})\n'.format(cnumber, len(cluster)))
    for val, count in cluster.items():
        print('{} ({})'.format(val, count))
    print('\nSuggested value: {}\n\n'.format(cluster.suggestion()))

# Sort clusters by decreasing number of distinct values.
clusters.sort(key=lambda c: len(c), reverse=True)

for i in range(len(clusters)):
    print_cluster(i + 1, clusters[i])

Cluster 1 (of size 8)

2ND AVE (4075)
2nd Ave (67751)
2ND  AVE (5)
2ND AVE. (1)
AVE 2ND (1)
2ND      AVE (1)
2ND    AVE (2)
2ND       AVE (1)

Suggested value: 2nd Ave


Cluster 2 (of size 8)

ST NICHOLAS AVE (2451)
ST. NICHOLAS AVE (125)
St Nicholas Ave (23462)
ST, NICHOLAS AVE (1)
ST NICHOLAS  AVE (9)
ST NICHOLAS   AVE (1)
ST  NICHOLAS AVE (4)
ST. NICHOLAS  AVE (1)

Suggested value: St Nicholas Ave


Cluster 3 (of size 8)

LAWRENCE ST (165)
ST LAWRENCE (34)
LAWRENCE  ST (1)
Lawrence St (2368)
ST. LAWRENCE (2)
ST LAWRENCE ST (1)
LAWRENCE ST. (1)
ST. LAWRENCE ST (1)

Suggested value: Lawrence St


Cluster 4 (of size 8)

ST NICHOLAS (847)
ST NICHOLAS ST (31)
NICHOLAS ST (27)
ST. NICHOLAS (27)
ST  NICHOLAS (2)
ST NICHOLAS  ST (1)
Nicholas St (79)
ST. NICHOLAS ST (1)

Suggested value: ST NICHOLAS


Cluster 5 (of size 7)

W 125 ST (3365)
W 125    ST (1)
W. 125 ST. (1)
W .125 ST (5)
W  125 ST (2)
W 125  ST (1)
W. 125 ST (3)

Suggested value: W 125 ST


Cluster 6 (of size 7)

FERRY LOT 2 (743)
FERRY LOT #2 (140)
FERRY  LOT #2 (1)
FERRY LOT  2 (3)
FERRY LOT # 2 (121)
FERRY LOT  # 2 (2)
FERRY LOT  #2 (1)

Suggested value: FERRY LOT 2


Cluster 7 (of size 7)

3RD AVE (11554)
3rd Ave (148186)
3RD  AVE (8)
3RD AVE. (1)
3RD       AVE (1)
3RD     AVE (2)
3RD      AVE (1)

Suggested value: 3rd Ave


Cluster 8 (of size 7)

CONEY ISLAND AVE (3618)
CONEY ISLAND  AVE (9)
CONEY  ISLAND AVE (9)
Coney Island Ave (35776)
CONEY ISLAND   AVE (1)
CONEY ISLAND AVE . (1)
CONEY ISLAND AVE. (1)

Suggested value: Coney Island Ave


Cluster 9 (of size 7)

W TREMONT AVE (110)
W. TREMONT AVE (17)
W W TREMONT AVE (1)
W Tremont Ave (848)
W  TREMONT AVE (1)
W. TREMONT  AVE (1)
W .TREMONT AVE (1)

Suggested value: W Tremont Ave


Cluster 10 (of size 7)

LGA TERMINAL B (26)
LGA, TERMINAL B (1)
LGA/ TERMINAL B (1)
TERMINAL B LGA (20)
TERMINAL B - LGA (2)
TERMINAL B -LGA (1)
LGA TERMINAL B, (1)

Suggested value: LGA TERMINAL B


Cluster 11 (of size 7)

EL GRANT HWY (67)
E.L GRANT HWY (10)
E.L. GRANT HWY (19)
EL GRANT    HWY (1)
EL. GRANT HWY (2)
E/L/ GRANT HWY (1)
E-L GRANT HWY (1)

Suggested value: EL GRANT HWY


Cluster 12 (of size 7)

JOHN ST (186)
ST JOHN (10)
John St (4192)
ST JOHN ST (8)
ST. JOHN ST (1)
ST. JOHN (1)
JOHN ST. (1)

Suggested value: John St


Cluster 13 (of size 7)

ST JOHNS PL (1478)
ST. JOHNS PL (77)
St Johns Pl (4816)
ST JOHNS PL. (1)
ST. JOHNS PL. (1)
ST  JOHNS PL (1)
ST JOHNS  PL (2)

Suggested value: St Johns Pl


User-defined Functions

This is a simple example showing how to register a function with the object library of the openclean engine.

[1]:
# Crete an in-memory instance of the openclean engine.

from openclean.engine.base import DB

db = DB()
[2]:
# Register user-defined function.

from openclean.engine.object.function import Int

@db.register.eval(name='add_number', parameters=[Int('n')])
def add_n(value, n=10):
    return value + n
[3]:
# Get serialized listing of descriptors for all registered functions.

db.register.functions().to_listing()
[3]:
[{'name': 'add_number',
  'namespace': None,
  'columns': 1,
  'columnLabels': ['value'],
  'outputs': 1,
  'parameters': [{'dtype': 'int',
    'name': 'n',
    'index': 0,
    'isRequired': False}]}]
[4]:
# The decorated function is a function handle, but it can be used
# like a regular function.

type(add_n)
[4]:
openclean.engine.object.function.FunctionHandle
[5]:
add_n.__name__
[5]:
'add_n'
[6]:
add_n(3, n=4)
[6]:
7
[7]:
add_n(3)
[7]:
13

Engine - Datastore

This is an example notebook to demonstrate how to update and maintain dataset versions using the openclean engine.

[1]:
# Crete an persistent instance of the openclean engine. All the data
# files will be maintained in a sub-folder of the current working directory.

from openclean.engine.base import DB

db = DB(basedir='./archive', create=True)
[2]:
# Download an test dataset from the Socrata API:
# 'Bidders List Master' from domain data.vermont.gov

from openclean.data.source.socrata import Socrata

df = Socrata().dataset('y343-ur4c').load()
df
[2]:
Date Title or Project Bidders Name City State Location 1
0 07/26/2017 HE - NARCAN 4MG 7.25 Adapt Pharma RADNOR PA RADNOR, PA\n(40.038043, -75.344449)
1 08/22/2017 Lab Bend Fixture NaN NaN NaN NaN
2 09/19/2017 FTA Cards for DPS GE Healthcare Marborough MA Marborough, MA
3 09/26/2017 02140-785 - Rescue Equipment Reynolds & Son Barre VT Barre, VT\n(44.200603, -72.505569)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
... ... ... ... ... ... ...
190 08/09/2017 BGS - AHS Janitorial Services - St Albans, VT Loso's Professional J.S. South Burlington VT South Burlington, VT\n(44.468286, -73.171594)
191 09/06/2017 BGS - A & E Window Restoration - 133 State St VT Architects Collaborative Randolph VT Randolph, VT\n(43.925266, -72.665754)
192 09/07/2017 VDH - Car Seats Even Flo Cullman AL Cullman, AL\n(34.173753, -86.843115)
193 07/24/2017 RFP DMV Registration Renewal Forms RR Donnelley Derry NH Derry, NH\n(42.881978, -71.324171)
194 08/03/2017 02140-331 - Enclosed snowmobile trailers Perfection Motorsports Richmond VT Richmond, VT\n(44.405247, -72.992905)

195 rows × 6 columns

[3]:
# Create a new persistent dataset archive from the downloaded
# data frame in the openclean engine database.

db.create(df, name='bidders', primary_key='Title or Project')
[3]:
<openclean.engine.dataset.FullDataset at 0x7f097e25e7c0>
[4]:
# Delete rows where bidder's name is empty.

from openclean.function.eval.null import IsEmpty
from openclean.operator.transform.filter import delete

db.commit(name='bidders', df=delete(df, IsEmpty('Bidders Name')))
[4]:
Date Title or Project Bidders Name City State Location 1
0 07/26/2017 HE - NARCAN 4MG 7.25 Adapt Pharma RADNOR PA RADNOR, PA\n(40.038043, -75.344449)
1 08/22/2017 Lab Bend Fixture NaN NaN NaN NaN
2 09/19/2017 FTA Cards for DPS GE Healthcare Marborough MA Marborough, MA
3 09/26/2017 02140-785 - Rescue Equipment Reynolds & Son Barre VT Barre, VT\n(44.200603, -72.505569)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
... ... ... ... ... ... ...
190 08/09/2017 BGS - AHS Janitorial Services - St Albans, VT Loso's Professional J.S. South Burlington VT South Burlington, VT\n(44.468286, -73.171594)
191 09/06/2017 BGS - A & E Window Restoration - 133 State St VT Architects Collaborative Randolph VT Randolph, VT\n(43.925266, -72.665754)
192 09/07/2017 VDH - Car Seats Even Flo Cullman AL Cullman, AL\n(34.173753, -86.843115)
193 07/24/2017 RFP DMV Registration Renewal Forms RR Donnelley Derry NH Derry, NH\n(42.881978, -71.324171)
194 08/03/2017 02140-331 - Enclosed snowmobile trailers Perfection Motorsports Richmond VT Richmond, VT\n(44.405247, -72.992905)

195 rows × 6 columns

[5]:
# Register existing string functions as 'user defined functions'.
from openclean.function.value.text import to_lower, to_title, to_upper

db.register.eval(name='lower')(to_lower)
db.register.eval(name='upper')(to_upper)
db.register.eval(name='capitalize')(to_title)

# Print function registry.
db.library.functions().to_listing()
[5]:
[{'name': 'lower',
  'namespace': None,
  'columns': 1,
  'columnLabels': ['value'],
  'outputs': 1,
  'parameters': []},
 {'name': 'upper',
  'namespace': None,
  'columns': 1,
  'columnLabels': ['value'],
  'outputs': 1,
  'parameters': []},
 {'name': 'capitalize',
  'namespace': None,
  'columns': 1,
  'columnLabels': ['value'],
  'outputs': 1,
  'parameters': []}]
[6]:
# Convert values in the 'Bidders Name' column to lower case.

db.dataset(name='bidders').update(columns='Bidders Name', func=db.library.functions().get('lower'))
[6]:
Date Title or Project Bidders Name City State Location 1
0 07/26/2017 HE - NARCAN 4MG 7.25 adapt pharma RADNOR PA RADNOR, PA\n(40.038043, -75.344449)
1 08/22/2017 Lab Bend Fixture NaN NaN NaN NaN
2 09/19/2017 FTA Cards for DPS ge healthcare Marborough MA Marborough, MA
3 09/26/2017 02140-785 - Rescue Equipment reynolds & son Barre VT Barre, VT\n(44.200603, -72.505569)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... s t paving , inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
... ... ... ... ... ... ...
190 08/09/2017 BGS - AHS Janitorial Services - St Albans, VT loso's professional j.s. South Burlington VT South Burlington, VT\n(44.468286, -73.171594)
191 09/06/2017 BGS - A & E Window Restoration - 133 State St vt architects collaborative Randolph VT Randolph, VT\n(43.925266, -72.665754)
192 09/07/2017 VDH - Car Seats even flo Cullman AL Cullman, AL\n(34.173753, -86.843115)
193 07/24/2017 RFP DMV Registration Renewal Forms rr donnelley Derry NH Derry, NH\n(42.881978, -71.324171)
194 08/03/2017 02140-331 - Enclosed snowmobile trailers perfection motorsports Richmond VT Richmond, VT\n(44.405247, -72.992905)

195 rows × 6 columns

[7]:
# Show operations in the current dataset log.

for op in db.dataset('bidders').log():
    print(op.descriptor)
{'optype': 'load', 'columns': None}
{'optype': 'commit', 'columns': None}
{'optype': 'update', 'columns': ['Bidders Name'], 'name': 'lower'}
[8]:
# Add a user-defined function as a simple column-operator.
# register.eval adds a method to the object that is returned
# by db.apply that currently expects a single argument named
# 'columns' which specifies the column(s) on which the registered
# function is applied (evaluated) to create a modified dataset.

@db.register.eval('zigzag')
def zigzag_case(value):
    """Take a given string and return a string where
    upper and lower cases alternate.
    """
    result = ''
    functions = [str.upper, str.lower]
    i = 0
    for c in str(value):
        f = functions[i]
        i = (i + 1) % 2
        result += f(c)
    return result

Notebook Spreadsheet UI

The following steps simulate some of the interactions that a user has with a dataset sample via the spreadsheet UI for Jupyter Notebooks.

[9]:
# Take a dataset sample of 10 rows.

db.sample(name='bidders', n=10, random_state=43)
[9]:
Date Title or Project Bidders Name City State Location 1
110 07/25/2017 HE RESPIRATOR FIT TESTER tsi inc. SHOREVIEW MN SHOREVIEW, MN\n(45.081261, -93.134983)
165 08/23/2017 BGS - BGS Snow Removal - Kengar State Office B... d tatro construction Hyde Park VT Hyde Park, VT\n(44.593002, -72.61145)
10 08/25/2017 Brine Maker gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
144 08/30/2017 BGS - Snow Removal Services for Middlesex Gene... g & n excavation Moretown VT Moretown, VT\n(44.250919, -72.761246)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... s t paving , inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
15 08/14/2017 02140-779 - Firefighter Helmets reynolds & son South Barre VT South Barre, VT\n(44.177155, -72.504898)
25 08/25/2017 Brine Storage Tanks gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
24 08/30/2017 Rolled Steel Plates chillicothe steel Chillicothe OH Chillicothe, OH\n(39.331846, -82.981776)
96 08/04/2017 Ballistic Panels executive wood products Sullivan MO Sullivan, MO\n(38.213599, -91.16411)
111 08/25/2017 MIL - 02 System Design - VT Veteran's Home - B... goldstone architect Bennington VT Bennington, VT\n(42.878372, -73.19709)
[10]:
# Capitalize values in the 'Bidders Name' columns.

db.dataset(name='bidders').update(columns='Bidders Name', func=db.library.functions().get('capitalize'))
[10]:
Date Title or Project Bidders Name City State Location 1
110 07/25/2017 HE RESPIRATOR FIT TESTER Tsi Inc. SHOREVIEW MN SHOREVIEW, MN\n(45.081261, -93.134983)
165 08/23/2017 BGS - BGS Snow Removal - Kengar State Office B... D Tatro Construction Hyde Park VT Hyde Park, VT\n(44.593002, -72.61145)
10 08/25/2017 Brine Maker Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
144 08/30/2017 BGS - Snow Removal Services for Middlesex Gene... G & N Excavation Moretown VT Moretown, VT\n(44.250919, -72.761246)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
15 08/14/2017 02140-779 - Firefighter Helmets Reynolds & Son South Barre VT South Barre, VT\n(44.177155, -72.504898)
25 08/25/2017 Brine Storage Tanks Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
24 08/30/2017 Rolled Steel Plates Chillicothe Steel Chillicothe OH Chillicothe, OH\n(39.331846, -82.981776)
96 08/04/2017 Ballistic Panels Executive Wood Products Sullivan MO Sullivan, MO\n(38.213599, -91.16411)
111 08/25/2017 MIL - 02 System Design - VT Veteran's Home - B... Goldstone Architect Bennington VT Bennington, VT\n(42.878372, -73.19709)
[11]:
# Apply the zig-zag function to column 'City'

db.dataset(name='bidders').update(columns='City', func=zigzag_case)
[11]:
Date Title or Project Bidders Name City State Location 1
110 07/25/2017 HE RESPIRATOR FIT TESTER Tsi Inc. ShOrEvIeW MN SHOREVIEW, MN\n(45.081261, -93.134983)
165 08/23/2017 BGS - BGS Snow Removal - Kengar State Office B... D Tatro Construction HyDe pArK VT Hyde Park, VT\n(44.593002, -72.61145)
10 08/25/2017 Brine Maker Gvm EaSt bErLiN PA East Berlin, PA\n(39.937556, -76.980498)
144 08/30/2017 BGS - Snow Removal Services for Middlesex Gene... G & N Excavation MoReToWn VT Moretown, VT\n(44.250919, -72.761246)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc WaTeRbUrY VT Waterbury, VT\n(44.334602, -72.753189)
15 08/14/2017 02140-779 - Firefighter Helmets Reynolds & Son SoUtH BaRrE VT South Barre, VT\n(44.177155, -72.504898)
25 08/25/2017 Brine Storage Tanks Gvm EaSt bErLiN PA East Berlin, PA\n(39.937556, -76.980498)
24 08/30/2017 Rolled Steel Plates Chillicothe Steel ChIlLiCoThE OH Chillicothe, OH\n(39.331846, -82.981776)
96 08/04/2017 Ballistic Panels Executive Wood Products SuLlIvAn MO Sullivan, MO\n(38.213599, -91.16411)
111 08/25/2017 MIL - 02 System Design - VT Veteran's Home - B... Goldstone Architect BeNnInGtOn VT Bennington, VT\n(42.878372, -73.19709)
[12]:
# Show operations in the current dataset log (recipe). Note that
# each log entry has a unique identifier that is used to reference
# the represented dataset snapshot in checkout() and rollback()
# operations.

snapshots = list()
for op in db.dataset('bidders').log():
    print('{} {}'.format(op.version, op.descriptor))
    snapshots.append(op.version)
0 {'optype': 'sample', 'columns': None, 'arguments': [{'name': 'n', 'value': 10}, {'name': 'randomState', 'value': 43}]}
1 {'optype': 'update', 'columns': ['Bidders Name'], 'name': 'capitalize'}
2 {'optype': 'update', 'columns': ['City'], 'name': 'zigzag'}
[13]:
# Print snapshot that resulted from the second operation
# in the recipe, i.e., the capitalize operation on the
# 'Bidders Name'. City names should not be zig-zag in this
# snapshot.

db.dataset('bidders').checkout(snapshots[1])
[13]:
Date Title or Project Bidders Name City State Location 1
110 07/25/2017 HE RESPIRATOR FIT TESTER Tsi Inc. SHOREVIEW MN SHOREVIEW, MN\n(45.081261, -93.134983)
165 08/23/2017 BGS - BGS Snow Removal - Kengar State Office B... D Tatro Construction Hyde Park VT Hyde Park, VT\n(44.593002, -72.61145)
10 08/25/2017 Brine Maker Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
144 08/30/2017 BGS - Snow Removal Services for Middlesex Gene... G & N Excavation Moretown VT Moretown, VT\n(44.250919, -72.761246)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
15 08/14/2017 02140-779 - Firefighter Helmets Reynolds & Son South Barre VT South Barre, VT\n(44.177155, -72.504898)
25 08/25/2017 Brine Storage Tanks Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
24 08/30/2017 Rolled Steel Plates Chillicothe Steel Chillicothe OH Chillicothe, OH\n(39.331846, -82.981776)
96 08/04/2017 Ballistic Panels Executive Wood Products Sullivan MO Sullivan, MO\n(38.213599, -91.16411)
111 08/25/2017 MIL - 02 System Design - VT Veteran's Home - B... Goldstone Architect Bennington VT Bennington, VT\n(42.878372, -73.19709)
[14]:
# Remove the zig-zag operation from the dataset history
# by rolling back to the previous operation.

db.dataset('bidders').rollback(snapshots[1])
[14]:
Date Title or Project Bidders Name City State Location 1
110 07/25/2017 HE RESPIRATOR FIT TESTER Tsi Inc. SHOREVIEW MN SHOREVIEW, MN\n(45.081261, -93.134983)
165 08/23/2017 BGS - BGS Snow Removal - Kengar State Office B... D Tatro Construction Hyde Park VT Hyde Park, VT\n(44.593002, -72.61145)
10 08/25/2017 Brine Maker Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
144 08/30/2017 BGS - Snow Removal Services for Middlesex Gene... G & N Excavation Moretown VT Moretown, VT\n(44.250919, -72.761246)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
15 08/14/2017 02140-779 - Firefighter Helmets Reynolds & Son South Barre VT South Barre, VT\n(44.177155, -72.504898)
25 08/25/2017 Brine Storage Tanks Gvm East Berlin PA East Berlin, PA\n(39.937556, -76.980498)
24 08/30/2017 Rolled Steel Plates Chillicothe Steel Chillicothe OH Chillicothe, OH\n(39.331846, -82.981776)
96 08/04/2017 Ballistic Panels Executive Wood Products Sullivan MO Sullivan, MO\n(38.213599, -91.16411)
111 08/25/2017 MIL - 02 System Design - VT Veteran's Home - B... Goldstone Architect Bennington VT Bennington, VT\n(42.878372, -73.19709)
[15]:
# Show remaining operations in the current dataset log.

for op in db.dataset('bidders').log():
    print('{} {}'.format(op.version, op.descriptor))
    snapshots.append(op.version)
0 {'optype': 'sample', 'columns': None, 'arguments': [{'name': 'n', 'value': 10}, {'name': 'randomState', 'value': 43}]}
1 {'optype': 'update', 'columns': ['Bidders Name'], 'name': 'capitalize'}
[16]:
# Apply changes to the full dataset.

db.checkout('bidders', commit=True)
[16]:
Date Title or Project Bidders Name City State Location 1
0 07/26/2017 HE - NARCAN 4MG 7.25 Adapt Pharma RADNOR PA RADNOR, PA\n(40.038043, -75.344449)
1 08/22/2017 Lab Bend Fixture NaN NaN NaN NaN
2 09/19/2017 FTA Cards for DPS Ge Healthcare Marborough MA Marborough, MA
3 09/26/2017 02140-785 - Rescue Equipment Reynolds & Son Barre VT Barre, VT\n(44.200603, -72.505569)
4 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... S T Paving , Inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
... ... ... ... ... ... ...
190 08/09/2017 BGS - AHS Janitorial Services - St Albans, VT Loso'S Professional J.S. South Burlington VT South Burlington, VT\n(44.468286, -73.171594)
191 09/06/2017 BGS - A & E Window Restoration - 133 State St Vt Architects Collaborative Randolph VT Randolph, VT\n(43.925266, -72.665754)
192 09/07/2017 VDH - Car Seats Even Flo Cullman AL Cullman, AL\n(34.173753, -86.843115)
193 07/24/2017 RFP DMV Registration Renewal Forms Rr Donnelley Derry NH Derry, NH\n(42.881978, -71.324171)
194 08/03/2017 02140-331 - Enclosed snowmobile trailers Perfection Motorsports Richmond VT Richmond, VT\n(44.405247, -72.992905)

195 rows × 6 columns

[17]:
# Show operations in the resulting dataset log.

for op in db.dataset('bidders').log():
    print(op.version, op.descriptor)
0 {'optype': 'load', 'columns': None}
1 {'optype': 'commit', 'columns': None}
2 {'optype': 'update', 'columns': ['Bidders Name'], 'name': 'lower'}
3 {'optype': 'update', 'columns': ['Bidders Name'], 'name': 'capitalize'}

Rollback Changes in Persistent Archive

[18]:
# Rollback changes in the persistent archive to version 2.

df = db.rollback('bidders', version=2)
df
[18]:
Date Title or Project Bidders Name City State Location 1
143 07/26/2017 HE - NARCAN 4MG 7.25 adapt pharma RADNOR PA RADNOR, PA\n(40.038043, -75.344449)
145 08/22/2017 Lab Bend Fixture None None None None
138 09/19/2017 FTA Cards for DPS ge healthcare Marborough MA Marborough, MA
24 09/26/2017 02140-785 - Rescue Equipment reynolds & son Barre VT Barre, VT\n(44.200603, -72.505569)
59 09/20/2017 BGS - 170078 Trush Parking Lot Paving Repairs ... s t paving , inc Waterbury VT Waterbury, VT\n(44.334602, -72.753189)
... ... ... ... ... ... ...
64 08/09/2017 BGS - AHS Janitorial Services - St Albans, VT loso's professional j.s. South Burlington VT South Burlington, VT\n(44.468286, -73.171594)
62 09/06/2017 BGS - A & E Window Restoration - 133 State St vt architects collaborative Randolph VT Randolph, VT\n(43.925266, -72.665754)
179 09/07/2017 VDH - Car Seats even flo Cullman AL Cullman, AL\n(34.173753, -86.843115)
159 07/24/2017 RFP DMV Registration Renewal Forms rr donnelley Derry NH Derry, NH\n(42.881978, -71.324171)
3 08/03/2017 02140-331 - Enclosed snowmobile trailers perfection motorsports Richmond VT Richmond, VT\n(44.405247, -72.992905)

195 rows × 6 columns

Extensions

openclean-notebook

This extension adds a UI component to Jupyter notebooks and visually presents profiler results as well as lets users create and save recipes of functions applied to datasets. These recipes can be exported and reapplied else where. For more details, visit the official repo.

openclean-pattern

Adds more in-depth syntactic pattern detection to profilers. Users can use their own data to create custom non-basic data types as well as distinguish anomalous values. For more details, visit the official repo

Configuration

openclean defines several environment variables that can be used to configure the behavior of different parts of the package.

Data Storage

Some components of the openclean package store external data files. These files will be stored in sub-folders of a base directory that is specified by the environment variable OPENCLEAN_DATADIR. By default, the folder openclean/data user’s cache directory is used as the base directory.

Multi-Threading

Several tasks in openclean lend themselves well to being run using multiple threads (e.g., key collision clustering using :class:KeyCollision). If the environment variable OPENCLEAN_THREADS is set to a positive integer value, it defies the number of parallel treads that are used by default. If the variable is not set (or set to 1) a single tread is used.

Configuration for Workers for External Processes

openclean integrates data cleaning and data profiling tools that are implemented in programming languages other than Python and that are executed as external processes. For this purpose, openclean depends on the flowServ package that supports execution of sequential workflows (data processing pipelines) in different environments. The environments that are currently supported either use the Python subprocess package of Docker.

Workers for external process are configured using configuration files that define the type of execution engine that is used for different tasks (refer to the flowServ documentation for file formats and configuration options).

Contributing

openclean is a community effort and is continuously growing. All contributions, bug reports, bug fixes, documentation improvements, enhancements, and ideas are welcome.

Code

We encourage developers to contribute!

If you are brand new to openclean or open-source development, we recommend going through the GitHub “issues” tab to find issues that interest you. When you start working on an issue, it’s a good idea to assign the issue to yourself, so nobody else duplicates the work on it. However, GitHub restricts assigning issues to maintainers of the project only. Therefore, contributors are requested to add a comment letting others know they are working on an issue.

If for whatever reason you are not able to continue working with the issue, please try to un-assign it (or comment there), so other people know it’s available again. If you want to work on one that is assigned, feel free to kindly ask the current assignee if you can take it (please allow at least a week of inactivity before considering work in the issue discontinued).

Test Coverage

High-quality unit testing is the mainstay of the openclean development process. For this purpose, we use the pytest package. The tests are functions appropriately named, located in tests subdirectories, that check the validity of the operators and the different options of the code.

Running pytest in a folder will run all the tests of the corresponding subpackages. Please ensure, all submitted pull requests have unit tests accompanying the source code wherever applicable. We expect code coverage of new features to be at least around 90%.

Bug report or feature request

We use GitHub issues to track all bugs and feature requests; feel free to open an issue if you have found a bug or wish to see a feature implemented.

It is recommended to check that your issue complies with the following rules before submitting:

  • Verify that your issue is not being currently addressed by other issues or pull requests.

  • If you are submitting a bug report, we strongly encourage you to follow the guidelines in How to make a good bug report with a reproducible example (if applicable). The ideal bug report contains a short reproducible code snippet, this way anyone can try to reproduce the bug easily and provide good feedback. If your snippet is longer than around 50 lines, please link to a gist or a github repo. If not feasible to include a reproducible snippet, please be specific about what operations and/or functions are involved and the shape of the data.

  • If an exception is raised, please provide the full traceback. Please include your operating system type and version number, as well as your Python, and openclean versions and any other information you deem useful.

Documentation

As developers we understand that sometimes, there are sections of documentations that are worse off explaining stuff to users because they’ve been written by experts. Therefore, we encourage you to help us improve the documentation If something in the docs doesn’t make sense to you, updating the relevant section after you figure it out is a great way to ensure it will help others.

The openclean documentation has been written in reStructuredText and built using sphinx. The complete list of requirements along with how to work with the documentation is described here.

Frequently Asked Questions

Where to report bugs?

We welcome feedback. Please submit any suggestions or bug reports using the GitHub issue tracker (https://github.com/ViDA-NYU/openclean-core/issues)

openclean

openclean package

Subpackages

openclean.cluster package
Submodules
openclean.cluster.base module

Interfaces for clustering. Openclean adopts the same notion of clustering as OpenRefine: […] clustering refers to the operation of ‘finding groups of different values that might be alternative representations of the same thing’*.

class openclean.cluster.base.Cluster(**kwds)

Bases: collections.Counter

Cluster of values. Maintains the frequency count for each value in order to be able to suggest a ‘new values’ as the common value for all values in the cluster.

add(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], count: Optional[int] = 1)openclean.cluster.base.Cluster

Add a value to the cluster. Allows to provide a frequency count for the added value. Returns a reference to itself.

Parameters

value (scalar or tuple) – Value that is added to the cluster.

Returns

Return type

openclean.cluster.base.Cluster

suggestion()Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Suggest a new value as the common value for all values in the cluster. The suggestion is the most frequent value in the cluster. If multiple values have the same frequency the returned value depends on how ties are broken in the super class collections.Counter.

Returns

Return type

scalar or tuple

to_mapping(target: Optional[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = None)Dict

Create a mapping for the values in the cluster to a given target value. This is primarily intended for standardization where all values in this cluster are mapped to a single target value.

If the target value is not specified the suggested value for this cluster is used as the default.

The resulting mapping will not include an entry for the target itself. That is, if the target is a value in the cluster that entry is excluded from the generated mapping.

Parameters

target (scalar or tuple, default=None) – Target value to which all values in this cluster are mapped.

Returns

Return type

dict

class openclean.cluster.base.Clusterer

Bases: openclean.operator.stream.processor.StreamProcessor

The value clusterer mixin class defines a single method clusters() to cluster a given list of values.

abstract clusters(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter])List[openclean.cluster.base.Cluster]

Compute clusters for a given list of values. Each cluster itself is a list of values, i.e., a subset of values from the input list. The cluster method should be capable of taking a list of values or a counter of distinct values.

Parameters

values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

Returns

Return type

list of openclean.cluster.base.Cluster

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer.

Returns an instance of the stream clusterer that will collect the distinct values in the stream and then call the cluster method of this clusterer.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.cluster.base.StreamClusterer

class openclean.cluster.base.ONE

Bases: object

Helper to simulate a counter where each value has a frequency of 1.

class openclean.cluster.base.StreamClusterer(clusterer: openclean.cluster.base.Clusterer)

Bases: openclean.operator.stream.consumer.StreamConsumer

Cluster values in a stream. This implementation will create a set of distinct values in the stream together with their frequency counts. It will then apply a given cluster algorithm on the created value set.

close()List[openclean.cluster.base.Cluster]

Closing the consumer returns the result of applying the associated clusterer on the collected set of distinct values.

Returns

Return type

list of openclean.cluster.base.Cluster

consume(rowid: int, row: List)

Add the values in a given row to the internal counter.

If the row only has one value this value will be used as the key for the counter. For rows with multiple values the values in the row will be concatenated (separated by a blank space) to a single string value.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

openclean.cluster.index module

Index structure for value clusters.

class openclean.cluster.index.ClusterIndex

Bases: object

Index structure to maintain a set of clusters. Implements a prefix tree.

add(cluster: openclean.cluster.base.Cluster)bool

Add the given cluster to the index. Returns True if the cluster was added as a new cluster (i.e., it did not exist in the index before) and False otherwise.

Parameters

cluster (openclean.cluser.base.Cluster) – Cluster of data value.

Returns

Return type

bool

class openclean.cluster.index.Node(key: str, count: int)

Bases: object

Node in the cluster index.

add(values: List[Tuple[str, int]], pos: int)bool

Add the values in the given list starting from pos to the children of this node.

Returns True if at the end the cluster was added as a new cluster to the index.

Parameters
  • values (list of tuples of string and count) – List of values and the frequencies in a cluster that is being added to the cluster index.

  • pos (int) – Index position in the list that points to the child node that is added to this node.

openclean.cluster.key module

Key-based clustering methods. Computes a different representation (key) for each value and clusters values based on these keyes.

class openclean.cluster.key.KeyCollision(func: Union[Callable, openclean.function.value.base.ValueFunction], minsize: Optional[int] = 2, threads: Optional[int] = None)

Bases: openclean.cluster.base.Clusterer

Key collision methods create an alternative representation for each value (i.e., a key), and then group values based on their keys.

Generates clusters that satisfy a given minimum size threshold. Allows to compute keys in parallel using multiple threads.

clusters(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter])List[openclean.cluster.key.KeyCollisionCluster]

Compute clusters for a given list of values. Each cluster itself is a list of values, i.e., a subset of values from the input list.

Parameters

values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

Returns

Return type

list of openclean.cluster.key.KeyCollisionCluster

class openclean.cluster.key.KeyCollisionCluster(key: str)

Bases: openclean.cluster.base.Cluster

Key collision clusters are used to represent results of the key collision clusterer. The key collision cluster extends the super class with a reference to the collision key for all values in the cluster.

class openclean.cluster.key.KeyValueGenerator(func: openclean.function.value.base.ValueFunction)

Bases: object

Key-value pair generator for parallel processing.

openclean.cluster.key.key_collision(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter], func: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, minsize: Optional[int] = 2, threads: Optional[int] = None)List[openclean.cluster.key.KeyCollisionCluster]

Run key collision clustering for a given list of values.

Parameters
  • values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

  • func (callable or ValueFunction, default=None) – Function that is used to generate keys for values. By default the token fingerprint generator is used.

  • minsize (int, default=2) – Minimum number of distinct values that each cluster in the returned result has to have.

  • threads (int, default=None) – Number of parallel threads to use for key generation. If None the value from the environment variable ‘OPENCLEAN_THREADS’ is used as the default.

Returns

Return type

list of openclean.cluster.key.KeyCollisionCluster

openclean.cluster.knn module

Implementation of the Nearest Neighbor clustering (also known as kNN) that use a string similarity function and a threshold (radius).

The kNN clustering brings together strings that have a similarity which is within the given radius constraint. This implementation is based on the hybrid blocking approach that is implemented in OpenRefine: https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth

The algorithm works by performing a first pass over the strings in order to group them into blocks of strings that share at least on n-gram. It then uses a given string similarity function to compute similarity between strings in the created blocks.

class openclean.cluster.knn.kNNClusterer(sim: openclean.function.similarity.base.SimilarityConstraint, tokenizer: Optional[openclean.function.token.base.Tokenizer] = None, minsize: Optional[int] = 2, remove_duplicates: Optional[bool] = True)

Bases: openclean.cluster.base.Clusterer

Nearest Neighbor clustering algorithm that is based on a hybrid clustring approach.

The algorithm works by performing a first pass over the strings in order to group them into blocks of strings that share at least on token (e.g., n-gram). It then uses a given string similarity function to compute similarity between strings in the created blocks.

clusters(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter])List[openclean.cluster.base.Cluster]

Compute clusters for a given list of values. Each cluster itself is a list of values, i.e., a subset of values from the input list.

Parameters

values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

Returns

Return type

list of openclean.cluster.base.Cluster

openclean.cluster.knn.knn_clusters(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter], sim: openclean.function.similarity.base.SimilarityConstraint, tokenizer: Optional[openclean.function.token.base.Tokenizer] = None, minsize: Optional[int] = 2, remove_duplicates: Optional[bool] = True)List[openclean.cluster.base.Cluster]

Run kNN clustering for a given list of values.

Parameters
  • values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

  • sim (openclean.function.similarity.base.SimilarityConstraint) – String similarity constraint for grouping strings in the generated blocks.

  • tokenizer (openclean.function.token.base.Tokenizer, default=None) – Generator for tokens that are used to group string values in the first step of the algorithm. By default, n-grams of length 6 are used as blocking tokens.

  • minsize (int, default=2) – Minimum number of distinct values that each cluster in the returned result has to have.

  • remove_duplicates (bool, default=True) – Remove identical clusters from the result if True.

Returns

Return type

list of openclean.cluster.base.Cluster

openclean.cluster.knn.knn_collision_clusters(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter], sim: openclean.function.similarity.base.SimilarityConstraint, keys: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, tokenizer: Optional[openclean.function.token.base.Tokenizer] = None, minsize: Optional[int] = 2, remove_duplicates: Optional[bool] = True, threads: Optional[int] = None)List[openclean.cluster.base.Cluster]

Run kNN clustering on a set of values that have been grouped using collision clustering.

This algorithm first performs collision key clustering for the given list of values using the key generator. It then uses kNN clustering on the keys for the generated clusters.

Parameters
  • values (iterable of values or collections.Counter) – Iterable of data values or a value counter that maps values to their frequencies.

  • sim (openclean.function.similarity.base.SimilarityConstraint) – String similarity constraint for grouping strings in the generated blocks.

  • keys (callable or ValueFunction, default=None) – Function that is used to generate keys for values. By default the token fingerprint generator is used.

  • tokenizer (openclean.function.token.base.Tokenizer, default=None) – Generator for tokens that are used to group string values in the first step of the algorithm. By default, n-grams of length 6 are used as blocking tokens.

  • minsize (int, default=2) – Minimum number of distinct values that each cluster in the returned result has to have.

  • remove_duplicates (bool, default=True) – Remove identical clusters from the result if True.

  • threads (int, default=None) – Number of parallel threads to use for key generation. If None the value from the environment variable ‘OPENCLEAN_THREADS’ is used as the default.

Returns

Return type

list of openclean.cluster.base.Cluster

openclean.data package
Subpackages
openclean.data.archive package
Submodules
openclean.data.archive.base module

Interfaces and base classes for the data store that is used to maintain all versions of a data frame.

class openclean.data.archive.base.ActionHandle

Bases: object

Interface for action handles. Defines the serializatio method to_dict that is used to get a descriptor for the action that created a dataset snapshot.

abstract to_dict()Dict

Get a dictionary serialization for the action.

Returns

Return type

dict

class openclean.data.archive.base.ArchiveStore

Bases: object

Interface for the data store that is used to maintain the different versions of a dataset that a user creates using the openclean (Jupyter) API.

abstract apply(operators: Union[histore.document.operator.DatasetOperator, List[histore.document.operator.DatasetOperator]], origin: Optional[int] = None, validate: Optional[bool] = None)List[histore.archive.snapshot.Snapshot]

Apply a given operator or a sequence of operators on a snapshot in the archive.

The resulting snapshot(s) will directly be merged into the archive. This method allows to update data in an archive directly without the need to checkout the snapshot first and then commit the modified version(s).

Returns list of handles for the created snapshots.

Note that there are some limitations for this method. Most importantly, the order of rows cannot be modified and neither can it insert new rows at this point. Columns can be added, moved, renamed, and deleted.

Parameters
  • operators (histore.document.operator.DatasetOperator or) – list of histore.document.stream.DatasetOperator Operator(s) that is/are used to update the rows in a dataset snapshot to create new snapshot(s) in this archive.

  • origin (int, default=None) – Unique version identifier for the original snapshot that is being updated. By default the last version is updated.

  • validate (bool, default=False) – Validate that the resulting archive is in proper order before committing the action.

Returns

Return type

histore.archive.snapshot.Snapshot

abstract checkout(version: Optional[int] = None)pandas.core.frame.DataFrame

Get a specific version of the dataset. The dataset snapshot is identified by the unique version identifier.

Returns the data frame and version number for the dataset snapshot.

Raises a ValueError if the given version is unknown.

Parameters

version (int) – Unique dataset version identifier.

Returns

Return type

pd.DataFrame

Raises

ValueError

abstract commit(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], action: Optional[openclean.data.archive.base.ActionHandle] = None, checkout: Optional[bool] = False)Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]

Insert a new dataset snapshot.

Returns the inserted data frame with potentially modified row indexes.

Parameters
  • source (openclean.data.stream.base.Datasource) – Input data frame or stream containing the new dataset version that is being stored.

  • action (openclean.data.archive.base.ActionHandle, default=None) – Optional handle of the action that created the new dataset version.

  • checkout (bool, default=False) – Checkout the commited snapshot and return the result. This option is required only if the row index of the given data frame has been modified by the commit operation, i.e., if the index of the given data frame contained non-integers, negative values, or duplicate values.

Returns

Return type

openclean.data.stream.base.Datasource

abstract last_version()int

Get the version identifier for the last dataset snapshot.

Returns

Return type

int

Raises

ValueError

abstract metadata(version: Optional[int] = None)openclean.data.metadata.base.MetadataStore

Get metadata that is associated with the referenced dataset version. If no version is specified the metadata collection for the latest version is returned.

Raises a ValueError if the specified version is unknown.

Parameters

version (int) – Unique dataset version identifier.

Returns

Return type

openclean_.data.metadata.base.MetadataStore

Raises

ValueError

abstract open(version: Optional[int] = None)histore.archive.reader.SnapshotReader

Get a stream reader for a dataset snapshot.

Parameters

version (int, default=None) – Unique version identifier. By default the last version is used.

Returns

Return type

openclean.data.archive.base.SnapshotReader

abstract rollback(version: int)pandas.core.frame.DataFrame

Rollback the archive history to the snapshot with the given version identifier.

Returns the data frame for the napshot that is now the last snapshot in the modified archive.

Parameters

version (int) – Unique identifier of the rollback version.

Returns

Return type

pd.DataFrame

abstract schema()histore.archive.schema.ArchiveSchema

Get the schema history for the archived dataset.

Returns

Return type

openclean.data.archive.base.ArchiveSchema

abstract snapshots()List[histore.archive.snapshot.Snapshot]

Get list of handles for all versions of the dataset.

Returns

Return type

list of histore.archive.snapshot.Snapshot

Raises

ValueError

openclean.data.archive.base.create(dataset: str, source: Optional[Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]], primary_key: Optional[List[str]], replace: Optional[bool] = False)histore.archive.base.Archive

Create a new archive for a dataset with the given identifier. If an archive with the given identifier exists it will be replaced (if the replace flag is True) or an error is raised.

Parameters
  • dataset (string) – Unique dataset identifier.

  • source (openclean.data.archive.base.Datasource, default=None) – Initial dataset snapshot that is loaded into the created archive.

  • primary_key (list of string) – List of primary key attributes for merging snapshots into the created archive.

  • replace (bool, default=False) – Replace an existing archive with the same name if it exists.

Returns

Return type

histore.archive.base.Archive

Raises

ValueError

openclean.data.archive.base.delete(dataset: str)

Delete the existing archive for a dataset. Raises a ValueError if the dataset is unknown.

Parameters

dataset (string) – Unique dataset identifier.

Raises

ValueError

openclean.data.archive.base.get(dataset: str)histore.archive.base.Archive

Get the existing archive for a dataset. Raises a ValueError if the dataset is unknown.

Parameters

dataset (string) – Unique dataset identifier.

Returns

Return type

histore.archive.base.Archive

Raises

ValueError

openclean.data.archive.base.manager()histore.archive.manager.persist.PersistentArchiveManager

Get instance of the archive manager that is used to maintain master datasets.

Returns

Return type

histore.archive.manager.base.ArchiveManager

openclean.data.archive.cache module

Implementation of the datastore class that caches dataset snapshots in memory.

class openclean.data.archive.cache.CacheEntry(df: Optional[pandas.core.frame.DataFrame] = None, version: Optional[int] = None)

Bases: object

Entry in a datastore cache. Maintains the data frame and version identifier.

df: pandas.core.frame.DataFrame = None
version: int = None
class openclean.data.archive.cache.CachedDatastore(datastore: openclean.data.archive.base.ArchiveStore)

Bases: openclean.data.archive.base.ArchiveStore

Wrapper around a datastore that maintains the last dataset version that was commited or checked out in main memory. This follows the assumption that the spreadsheet view will always display (and modify) this version (and only this version).

apply(operators: Union[histore.document.operator.DatasetOperator, List[histore.document.operator.DatasetOperator]], origin: Optional[int] = None, validate: Optional[bool] = None)List[histore.archive.snapshot.Snapshot]

Apply a given operator or a sequence of operators on a snapshot in the archive.

The resulting snapshot(s) will directly be merged into the archive. This method allows to update data in an archive directly without the need to checkout the snapshot first and then commit the modified version(s).

Returns list of handles for the created snapshots.

Note that there are some limitations for this method. Most importantly, the order of rows cannot be modified and neither can it insert new rows at this point. Columns can be added, moved, renamed, and deleted.

Parameters
  • operators (histore.document.operator.DatasetOperator or) – list of histore.document.stream.DatasetOperator Operator(s) that is/are used to update the rows in a dataset snapshot to create new snapshot(s) in this archive.

  • origin (int, default=None) – Unique version identifier for the original snapshot that is being updated. By default the last version is updated.

  • validate (bool, default=False) – Validate that the resulting archive is in proper order before committing the action.

Returns

Return type

histore.archive.snapshot.Snapshot

checkout(version: Optional[int] = None, no_cache: Optional[bool] = False)pandas.core.frame.DataFrame

Get a specific version of a dataset. The dataset snapshot is identified by the unique version identifier.

Raises a ValueError if the given version is unknown.

Parameters
  • version (int) – Unique dataset version identifier.

  • no_cache (bool, default=None) – If True, ignore cached dataset version and checkout the dataset from the associated data store.

Returns

Return type

pd.DataFrame

Raises

ValueError

commit(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], action: Optional[openclean.data.archive.base.ActionHandle] = None, checkout: Optional[bool] = False)Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]

Insert a new version for a dataset.

Returns the inserted data frame with potentially modified row indexes.

Parameters
  • source (openclean.data.stream.base.Datasource) – Input data frame or stream containing the new dataset version that is being stored.

  • action (openclean.data.archive.base.ActionHandle, default=None) – Optional handle of the action that created the new dataset version.

  • checkout (bool, default=False) – Checkout the commited snapshot and return the result. This option is required only if the row index of the given data frame has been modified by the commit operation, i.e., if the index of the given data frame contained non-integers, negative values, or duplicate values.

Returns

Return type

openclean.data.stream.base.Datasource

last_version()int

Get a identifier for the last version of the dataset.

Returns

Return type

int

Raises

ValueError

metadata(version: Optional[int] = None)openclean.data.metadata.base.MetadataStore

Get metadata that is associated with the referenced dataset version. If no version is specified the metadata collection for the latest version is returned.

Raises a ValueError if the specified version is unknown.

Parameters

version (int) – Unique dataset version identifier.

Returns

Return type

openclean.data.metadata.base.MetadataStore

Raises

ValueError

open(version: Optional[int] = None)histore.archive.reader.SnapshotReader

Get a stream reader for a dataset snapshot.

Parameters

version (int, default=None) – Unique version identifier. By default the last version is used.

Returns

Return type

openclean.data.archive.base.SnapshotReader

rollback(version: int)pandas.core.frame.DataFrame

Rollback the archive history to the snapshot with the given version identifier.

Returns the data frame for the napshot that is now the last snapshot in the modified archive.

Parameters

version (int) – Unique identifier of the rollback version.

Returns

Return type

pd.DataFrame

schema()histore.archive.schema.ArchiveSchema

Get the schema history for the archived dataset.

Returns

Return type

openclean.data.archive.base.ArchiveSchema

snapshots()List[histore.archive.snapshot.Snapshot]

Get list of handles for all versions of a given dataset.

Returns

Return type

list of histore.archive.snapshot.Snapshot

Raises

ValueError

openclean.data.archive.histore module

Implementation of the data store that is based on HISTORE. For each dataset a new HISTORE archive will be maintained. This archive is augmented with storage of dataset metadata.

class openclean.data.archive.histore.HISTOREDatastore(archive: histore.archive.base.Archive, metastore: Optional[openclean.data.metadata.base.MetadataStoreFactory] = None)

Bases: openclean.data.archive.base.ArchiveStore

Data store implementation that is based on HISTORE. This class is a simple wrapper around a HISTORE archive.

apply(operators: Union[histore.document.operator.DatasetOperator, List[histore.document.operator.DatasetOperator]], origin: Optional[int] = None, validate: Optional[bool] = None)List[histore.archive.snapshot.Snapshot]

Apply a given operator or a sequence of operators on a snapshot in the archive.

The resulting snapshot(s) will directly be merged into the archive. This method allows to update data in an archive directly without the need to checkout the snapshot first and then commit the modified version(s).

Returns list of handles for the created snapshots.

Note that there are some limitations for this method. Most importantly, the order of rows cannot be modified and neither can it insert new rows at this point. Columns can be added, moved, renamed, and deleted.

Parameters
  • operators (histore.document.operator.DatasetOperator or) – list of histore.document.stream.DatasetOperator Operator(s) that is/are used to update the rows in a dataset snapshot to create new snapshot(s) in this archive.

  • origin (int, default=None) – Unique version identifier for the original snapshot that is being updated. By default the last version is updated.

  • validate (bool, default=False) – Validate that the resulting archive is in proper order before committing the action.

Returns

Return type

histore.archive.snapshot.Snapshot

checkout(version: Optional[int] = None)pandas.core.frame.DataFrame

Get a specific dataset snapshot. The snapshot is identified by the unique version identifier.

Raises a ValueError if the given version is unknown.

Parameters

version (int) – Unique dataset version identifier.

Returns

Return type

pd.DataFrame

Raises

ValueError

commit(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], action: Optional[openclean.data.archive.base.ActionHandle] = None, checkout: Optional[bool] = False)Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]

Insert a new version for a dataset.

Returns the inserted data frame. If the checkout flag is True the commited dataset is checked out to account for possible changes to the row index. If the flag is set to False the given data frame is returned.

Parameters
  • source (openclean.data.stream.base.Datasource) – Input data frame or stream containing the new dataset version that is being stored.

  • action (openclean.data.archive.base.ActionHandle, default=None) – Optional handle of the action that created the new dataset version.

  • checkout (bool, default=False) – Checkout the commited snapshot and return the result. This option is required only if the row index of the given data frame has been modified by the commit operation, i.e., if the index of the given data frame contained non-integers, negative values, or duplicate values.

Returns

Return type

openclean.data.stream.base.Datasource

last_version()int

Get a identifier for the last version of a dataset.

Returns

Return type

int

metadata(version: Optional[int] = None)openclean.data.metadata.base.MetadataStore

Get metadata that is associated with the referenced dataset version. If no version is specified the metadata collection for the latest version is returned.

Raises a ValueError if the dataset version is unknown.

Parameters

version (int) – Unique dataset version identifier.

Returns

Return type

openclean.data.metadata.base.MetadataStore

Raises

ValueError

open(version: Optional[int] = None)histore.archive.reader.SnapshotReader

Get a stream reader for a dataset snapshot.

Parameters

version (int, default=None) – Unique version identifier. By default the last version is used.

Returns

Return type

openclean.data.archive.base.SnapshotReader

rollback(version: int)pandas.core.frame.DataFrame

Rollback the archive history to the snapshot with the given version identifier.

Returns the data frame for the napshot that is now the last snapshot in the modified archive.

Parameters

version (int) – Unique identifier of the rollback version.

Returns

Return type

pd.DataFrame

schema()histore.archive.schema.ArchiveSchema

Get the schema history for the archived dataset.

Returns

Return type

openclean.data.archive.base.ArchiveSchema

snapshots()List[histore.archive.snapshot.Snapshot]

Get list of handles for all versions of a given dataset.

Returns

Return type

list of histore.archive.snapshot.Snapshot

openclean.data.metadata package
Submodules
openclean.data.metadata.base module

Base classes for metadata stores and store factories.

class openclean.data.metadata.base.MetadataStore

Bases: object

Abstract class for metadata stores that maintain annotations for individual snapshots (datasets) in an archive.

delete_annotation(key: str, column_id: Optional[int] = None, row_id: Optional[int] = None)

Delete annotation with the given key for the object that is identified by the given combination of column and row identfier.

Parameters
  • key (string) – Unique annotation key.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

get_annotation(key: str, column_id: Optional[int] = None, row_id: Optional[int] = None, default_value: Optional[Any] = None)Any

Get annotation with the given key for the identified object. Returns the default vlue if no annotation with the given ey exists for the object.

Parameters
  • key (string) – Unique annotation key.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

  • default_value (any, default=None) – Default value that is returned if no annotation with the given key exists for the identified object.

Returns

Return type

Any

has_annotation(key: str, column_id: Optional[int] = None, row_id: Optional[int] = None)bool

Test if an annotation with the given key exists for the identified object.

Parameters
  • key (string) – Unique annotation key.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

bool

list_annotations(column_id: Optional[int] = None, row_id: Optional[int] = None)Dict

Get all annotations for an identified object as a key,value-pair dictionary.

Parameters
  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

abstract read(column_id: Optional[int] = None, row_id: Optional[int] = None)Dict

Read the annotation dictionary for the specified object.

Parameters
  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

set_annotation(key: str, value: Any, column_id: Optional[int] = None, row_id: Optional[int] = None)

Set annotation value for an identified object.

Parameters
  • key (string) – Unique annotation key.

  • value (any) – Value that will be associated with the given key.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

abstract write(doc: Dict, column_id: Optional[int] = None, row_id: Optional[int] = None)

Write the annotation dictionary for the specified object.

Parameters
  • doc (dict) – Annotation dictionary that is being written to file.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

class openclean.data.metadata.base.MetadataStoreFactory

Bases: object

Factory pattern for metadata stores. Metadata stores are created on a per-version basis. That is, each dataset snapshot has its own idependent metadata store.

abstract get_store(version: int)openclean.data.metadata.base.MetadataStore

Get the metadata store for the dataset snapshot with the given version identifier.

Parameters

version (int) – Unique version identifier

Returns

Return type

openclean.data.metadata.base.MetadataStore

abstract rollback(version: int)

Remove metadata for all dataset versions that are after the given rollback version.

Parameters

version (int) – Unique identifier of the rollback version.

openclean.data.metadata.fs module

Implementation of the metadata store class that maintains metadata information about dataset snapshots in files on the local file system. Metadata for each snapshot is maintained in a separate directory with different json files for each identifiable object.

openclean.data.metadata.fs.FILE(column_id: Optional[int] = None, row_id: Optional[int] = None)str

Get name for metadata file. The file name depends on whether identifier for the column and row are given or not. The following are the file names of metadata files for different types of resources:

  • ds.json: Dataset annotations

  • col_{column_id}.json: Column annotations

  • row_{row_id}.json: Row annotations

  • cell_{column_id}_{row_id}.json: Dataset cell annotations.

Parameters
  • snapshot_id (int) – Unique snapshot version identifier.

  • metadata_id (int) – Unique metadata object identifier.

Returns

Return type

string

class openclean.data.metadata.fs.FileSystemMetadataStore(basedir: str, encoder: Optional[json.encoder.JSONEncoder] = None, decoder: Optional[Callable] = None)

Bases: openclean.data.metadata.base.MetadataStore

Metadata store that maintains annotations for a dataset snapshot in JSON files with a given base directory. The files that maintain annotations are named using the FileSystemMetadataStoreFactory resource identifier. The following are the file names of metadata files for different types of resources:

  • ds.json: Dataset annotations

  • col_{column_id}.json: Column annotations

  • row_{row_id}.json: Row annotations

  • cell_{column_id}_{row_id}.json: Dataset cell annotations.

read(column_id: Optional[int] = None, row_id: Optional[int] = None)Dict

Read the annotation dictionary for the specified object.

Parameters
  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

write(doc: Dict, column_id: Optional[int] = None, row_id: Optional[int] = None)

Write the annotation dictionary for the specified object.

Parameters
  • doc (dict) – Annotation dictionary that is being written to file.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

class openclean.data.metadata.fs.FileSystemMetadataStoreFactory(basedir: str, encoder: Optional[json.encoder.JSONEncoder] = None, decoder: Optional[Callable] = None)

Bases: openclean.data.metadata.base.MetadataStoreFactory

Factory pattern for volatile metadata stores.

get_store(version: int)openclean.data.metadata.fs.FileSystemMetadataStore

Get the metadata store for the dataset snapshot with the given version identifier.

Parameters

version (int) – Unique version identifier

Returns

Return type

openclean.data.metadata.fs.FileSystemMetadataStore

rollback(version: int)

Remove metadata for all dataset versions that are after the given rollback version.

Parameters

version (int) – Unique identifier of the rollback version.

openclean.data.metadata.mem module

Implementation of the metadata store class that maintains metadata information about dataset snapshots in main memory.

openclean.data.metadata.mem.KEY(column_id: Optional[int] = None, row_id: Optional[int] = None)str

Get the unque key for an identifiable object.

Parameters
  • snapshot_id (int) – Unique snapshot version identifier.

  • metadata_id (int) – Unique metadata object identifier.

Returns

Return type

string

class openclean.data.metadata.mem.VolatileMetadataStore

Bases: openclean.data.metadata.base.MetadataStore

Metadata store that maintains annotations for a dataset snapshot in main memory. Metadata is not persistet in any other form and therefore volatile if the metadata store object is destroyed.

read(column_id: Optional[int] = None, row_id: Optional[int] = None)Dict

Read the annotation dictionary for the specified object.

Parameters
  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

write(doc: Dict, column_id: Optional[int] = None, row_id: Optional[int] = None)

Write the annotation dictionary for the specified object.

Parameters
  • doc (dict) – Annotation dictionary that is being written to file.

  • column_id (int, default=None) – Column identifier for the referenced object (None for rows or full datasets).

  • row_id (int, default=None) – Row identifier for the referenced object (None for columns or full datasets).

Returns

Return type

dict

class openclean.data.metadata.mem.VolatileMetadataStoreFactory

Bases: openclean.data.metadata.base.MetadataStoreFactory

Factory pattern for volatile metadata stores. Maintains the created metadata stores for each version in memory.

get_store(version: int)openclean.data.metadata.mem.VolatileMetadataStore

Get the metadata store for the dataset snapshot with the given version identifier.

Parameters

version (int) – Unique version identifier

Returns

Return type

openclean.data.metadata.mem.VolatileMetadataStore

rollback(version: int)

Remove metadata for all dataset versions that are after the given rollback version.

Parameters

version (int) – Unique identifier of the rollback version.

openclean.data.source package
Submodules
openclean.data.source.socrata module

Data repository for accessing datasets via the Socrata Open Data API.

class openclean.data.source.socrata.SODADataset(doc: Dict, app_token: Optional[str] = None)

Bases: refdata.base.DatasetDescriptor

Handle for a SODA dataset.

load()pandas.core.frame.DataFrame

Download the dataset as a pandas data frame.

Returns

Return type

pd.DataFrame

write(file: IO)

Write the dataset to the given file. The output file format is a tab-delimited csv file with the column names as the first line.

Parameters

file (file object) – File-like object that provides a write method.

class openclean.data.source.socrata.Socrata(app_token: Optional[str] = None)

Bases: refdata.base.Descriptor

Repository handle for the Socrata Open Data API.

catalog(domain: Optional[str] = None)Iterable[openclean.data.source.socrata.SODADataset]

Generator for a listing of all datasets that are available from the repository. Provides to option to filter datasets by their domain.

Parameters

domain (string, optional=None) – Optional domain name filter for returned datasets.

Returns

Return type

iterable of openclean.data.source.socrata.SODADataset

dataset(identifier: str)openclean.data.source.socrata.SODADataset

Get the handle for the dataset with the given identifier.

Parameters

identifier (string) – Unique dataset identifier.

Returns

Return type

openclean.data.source.socrata.SODADataset

domains(filter: Optional[str] = None)List[Tuple[str, str]]

Get a list of domain names that are available from the Socrata Open Data API. Returns a list of tuples with catalog Url and the domain name.

If the domain filter is given only the domain that matches the filter will be returned.

Returns

Return type

list of tuples of string and string

openclean.data.store package
Submodules
openclean.data.store.base module

Interface for data stores that maintain serialized objects in a key-value store. Provides a simple abstraction for different types of key-value stores that we may want to connect to in the future.

class openclean.data.store.base.DataStore

Bases: object

Interface for key-value stores that maintain serialized objects.

Each object has a unique identifier that is generated by the store when the object is created.

There are no constraints on the contents of the object serializations defined by this class. However, depending on the implementation, there may be some restrictions on the data that can be stored (e.g., Json serialized).

abstract delete_object(object_id: str)

Remove the object with the given identifier. If not object with the given identifier exist, a KeyError is raised.

Parameters

object_id (string) – Unique object identifier.

Raises

KeyError

abstract read_object(object_id: str)Any

Get the serialized object that is identified by the given object id. Raises a KeyError if the referenced object does not exist.

Parameters

object_id (string) – Unique object identifier.

Returns

Return type

any

Raises

KeyError

abstract write_object(object: Any, object_id: Optional[str] = None)str

Store an object in the repository. Creates a new object identifier if no identifier is given. If an indentifier is given an existing object under this identifier will be replaced.

Returns unique object identifier.

Parameters
  • object (any) – Serialization for an object.

  • object_id (str, default=None) – Optional identifier for the stored object. If not given, a unique identifier will be generated.

Returns

Return type

string

openclean.data.store.fs module

Implementation for the object store interface that maintains all objects as serialized Json documents in files on the file system.

class openclean.data.store.fs.FileSystemJsonStore(basedir: str, encoder: Optional[json.encoder.JSONEncoder] = None, decoder: Optional[Callable] = None)

Bases: openclean.data.store.base.DataStore

Data store that maintains all objects as Json files in a directory on the file system.

delete_object(object_id: str)bool

Remove the file for the object with the given identifier. Raises a KeyError if the object identifier is unknown, i.e., if the object file does not exist.

Parameters

object_id (string) – Unique object identifier.

Raises

KeyError

read_object(object_id: str)Any

Get the serialized object that is identified by the given object id. Raises a KeyError if the referenced object does not exist.

Parameters

object_id (string) – Unique object identifier.

Returns

Return type

any

Raises

KeyError

write_object(object: Any, object_id: Optional[str] = None)str

Store an object in the repository. If the object identifier is given an existing file for that identifier will be overwritten. Returns the unique object identifier.

Parameters
  • object (any) – Serialization for an object.

  • object_id (str, default=None) – Optional identifier for the stored object. If not given, a unique identifier will be generated.

Returns

Return type

string

openclean.data.store.mem module

In-memory implementation for the object store interface.

class openclean.data.store.mem.VolatileDataStore

Bases: openclean.data.store.base.DataStore

The in-memory object store maintains all objects in a dictionary in main memory.

delete_object(object_id: str)bool

Remove the object with the given identifier. Raises a KeyError if the object identifier is unknown.

Parameters

object_id (string) – Unique object identifier.

Raises

KeyError

read_object(object_id: str)Any

Get the serialized object that is identified by the given object id. Raises a KeyError if the referenced object does not exist.

Parameters

object_id (string) – Unique object identifier.

Returns

Return type

any

Raises

KeyError

write_object(object: Any, object_id: Optional[str] = None)str

Store an object in the repository. Replaces an eventually existing object if the object identifier is given. Returns the unique object identifier.

Parameters
  • object (any) – Dictionary serialization for an object.

  • object_id (str, default=None) – Optional identifier for the stored object. If not given, a unique identifier will be generated.

Returns

Return type

string

openclean.data.stream package
Submodules
openclean.data.stream.base module

Base classes for streaming dataset files.

openclean.data.stream.csv module

Collection of helper classes to read data frames from CSV files.

openclean.data.stream.df module

Collection of helper classes to read data frames as data streams.

Submodules
openclean.data.groupby module

Base class for data frame groupings. A data frame grouping splits a data frame into multiple (potentially overlapping) data frames with the same schema.

class openclean.data.groupby.ConflictSummary

Bases: collections.defaultdict

Summarize conflicts in one or more attributes for groups in a data frame grouping.

add(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])

Add a list of conflicting values from a data frame group.

Parameters

values (list of scalar or tuple) – List of conflicting values.

most_common(n: Optional[int] = 10)List[Tuple[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], int]]

Ranking of the n most common values in conflicts.

Parameters

n (int, default=10) – Number of values to include in the ranking.

Returns

Return type

list of value and count pairs

class openclean.data.groupby.DataFrameGrouping(df: pandas.core.frame.DataFrame)

Bases: object

A data frame grouping is a mapping of key values to subsets of rows for a given data frame.

Internally, this class contains a data frame and a mapping of key values to lists of row indices for the rows in each group. There are currently no restrictions on the number of groups that each of the original data frame rows can occur in.

The grouping provides a basic set of methods to access the individual data frames that represent the different groups.

add(key: str, rows: List[int])openclean.data.groupby.DataFrameGrouping

Add a new group to the collection. Raises a ValueError if a group with the given key already exists. Returns a reference to this object instance.

Parameters
  • key (scalar or tuple) – Key value generated by the GroupBy operator for the rows in the data frame.

  • rows (list(int)) – List of indices for rows in the original data frame that are part of the added group. Note that this is not the value for the index of a row in the data frame but the index into the array of rows i.e. the position of the row in the df.

Returns

Return type

openclean.data.groupby.DataFrameGrouping

Raises

ValueError

property columns: List[str]

Get the names of columns in the schema of the grouped data frame.

Returns

Return type

list of string

get(key: str)pandas.core.frame.DataFrame

Get the data frame that is associated with the given key. Returns None if the given key does not exist in the grouping.

Parameters

key (scalar or tuple) – Key value generated by the GroupBy operator for the rows in the data frame.

Returns

Return type

pd.DataFrame

groups()Iterator[Tuple[str, pandas.core.frame.DataFrame]]

Synonym for items(). Allows to iterate over the groups (and thier associated keys) in this grouping.

Returns

Return type

(scalar or tuple, pd.DataFrame)

items()Iterator[Tuple[str, pandas.core.frame.DataFrame]]

Iterate over the groups in this grouping. Returns pairs of group key and the associated data frame containing the rows from the original data frame that are in this group.

Returns

Return type

(scalar or tuple, pd.DataFrame)

keys()Set[str]

Get set of group keys.

Returns

Return type

set

rows(key: str)List[int]

Get the row indices for associated with the given key. Returns None if the key doesn’t exist.

Parameters

key (scalar or tuple) – Key values generated by the GroupBy operator for the rows in the dataframe

Returns

Return type

list

values(key: str, columns: Union[int, str, List[Union[str, int]]])collections.Counter

Get values (and their frequency counts) for columns of rows in the group that is identified by the given key.

Parameters
  • key (scalar or tuple) – Key value generated by the GroupBy operator for the rows in the data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

Returns

Return type

collections.Counter

class openclean.data.groupby.DataFrameViolation(df: pandas.core.frame.DataFrame)

Bases: openclean.data.groupby.DataFrameGrouping

Subclass of DataFrame Grouping which maintains extra meta value information related to a violation.

add(key: str, rows: List[int], meta: Optional[collections.Counter] = None)openclean.data.groupby.DataFrameViolation

Adds key:meta and key:rows to self._meta and self._groups respectively.

Parameters
  • key (str) – key for the group

  • rows (list) – list of indices for the group

  • meta (Counter (Optional)) – meta data counters for the group

Returns

Return type

openclean.data.groupby.DataFrameViolation

conflicts(key: str, columns: Union[int, str, List[Union[str, int]]])collections.Counter

Synonym to get set of values from columns in rows in a group.

Parameters
  • key (scalar or tuple) – Key value generated by the GroupBy operator for the rows in the data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

Returns

Return type

collections.Counter

get_meta(key: str)collections.Counter

Returns the counter for a key

Parameters

key (str) – the key for the dataframe group

Returns

Return type

collections.Counter

summarize_conflicts(columns: Union[int, str, List[Union[str, int]]])openclean.data.groupby.ConflictSummary

Get a summary of conflicting values in one or more attributes within the individual groups in the grouping.

A conflict is defined as a set of multiple values that occur in the specified column(s) within a group in this grouping. For each value that occurs in a conflict the summary maintains (i) the number of groups where the value appeared in a conflict, and (ii) a list of conflicting values with a count for the number of groups that these values conflicted in.

Parameters

columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

Returns

Return type

openclean.data.groupby.ConflictSummary

class openclean.data.groupby.ValueConflicts(count: int = 0, values: collections.Counter = <factory>)

Bases: object

Information about the number of groups and the values that a value occurs in as a conflicting value.

count: int = 0
values: collections.Counter
openclean.data.load module

Collection of helper methods to load a dataset from CSV files.

openclean.data.load.dataset(filename: str, header: Optional[List[Union[str, histore.document.schema.Column]]] = None, delim: Optional[str] = None, compressed: Optional[bool] = None, typecast: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None, none_is: Optional[str] = None, encoding: Optional[str] = None)pandas.core.frame.DataFrame

Read a pandas data frame from a CSV file. This function infers the CSV file delimiter and compression from the file name (if not specified). By now the inference follows a very basic pattern. Files that have ‘.tsv’ (or ‘.tsv.gz’) as their suffix are expected to be tab-delimited. Files that end with ‘.gz’ are expected to be gzip compressed.

Returns a pandas DataFrame where the column names are instances of the identifiable Column class used by openclean.

Parameters
  • filename (string) – Path to the CSV file that is being read.

  • header (list of string, default=None) – Optional header. If no header is given it is assumed that the first row in the CSV file contains the header information.

  • delim (string, default=None) – The column delimiter used in the CSV file.

  • compressed (bool, default=None) – Flag indicating if the file contents have been compressed using gzip.

  • typecast (openclean.profiling.datatype.convert.DatatypeConverter,) – default=None Optional type cnverter that is applied to all data rows.

  • none_is (string, default=None) – String that was used to encode None values in the input file. If given, all cell values that match the given string are substituted by None.

  • encoding (string, default=None) – The csv file encoding e.g. utf-8, utf16 etc

Returns

Return type

pd.DataFrame

openclean.data.mapping module
class openclean.data.mapping.ExactMatch(term: str)

Bases: openclean.data.mapping.StringMatch

Short cut for creating an exact string match result.

score: float
term: str
class openclean.data.mapping.Mapping(values: Optional[Dict[str:Union[str, List[StringMatch]]]] = None)

Bases: collections.defaultdict

The mapping class is a lookup dictionary that is used to maintain a mapping of values (e.g., from a data frame columns) to their nearest match (or list of nearest matches) in a controlled vocabulary.

add(key: str, matches: List[openclean.data.mapping.StringMatch])openclean.data.mapping.Mapping

Add a list of matches to the mapped values for a given term (key). The term that is identified by the key does not have to exist in the current mapping.

Returns a reference to the mapping itself.

Parameters
  • key (string) – Term in the mapped vocabulary or that is added to the mapping.

  • matches (list of openclean.data.mapping.StringMatch) – The list of matches returned from a matcher

Returns

Return type

openclean.data.mapping.Mapping

filter(terms: Iterable[str])openclean.data.mapping.Mapping

Get a mapping for only the terms in a given list

Returns the resulting Mapping.

Parameters

terms (Iterable of strings) – the list of keys to return from the mapper

Returns

Return type

openclean.data.mapping.Mapping

match_counts()collections.Counter

Counts the matches for each key in the map.

Returns the resulting Counter.

Returns

Return type

Counter of # of matches

matched(single_match_only: Optional[bool] = False)openclean.data.mapping.Mapping

Identifies keys with one or more than one matches in the map.

Returns the resulting Mapping.

Parameters

single_match_only (bool) – selects between keys with only one or at least one matches

Returns

Return type

openclean.data.mapping.Mapping

to_lookup(raise_error: bool = False)Dict[str, str]

Convert map into dict of key:match pairs.

Note: in case of multiple matches, it’ll ignore those keys and raise a warning.

Returns

Return type

dict of keys and their matches

Raises

RuntimeError

unmatched()set

Identifies keys that have no matches

Returns the resulting Set.

Returns

Return type

Set of keys with no matches

update(updates: Optional[Dict[str, str]] = None)openclean.data.mapping.Mapping

Lets the user update values in the map with their own values. Raises an error if the provided dictionary contains keys that are not in the current mapping.

The updated values are treated as exact matches (i.e., with a score of 1.) since they are provided by the user.

Returns a self reference.

Parameters

updates (dict) – Dictionary of type {mapping_key: exact_match}

Returns

Return type

openclean.data.mapping.Mapping

Raises

Key Error

class openclean.data.mapping.NoMatch(term: str)

Bases: openclean.data.mapping.StringMatch

Short cut for creating a no-match result for string matcher.

score: float
term: str
class openclean.data.mapping.StringMatch(term: str, score: float)

Bases: object

String matching results that contains te matched term an the match score. A score of 1. indicates a perfect match and a score of 0. a no-match.

score: float
term: str
openclean.data.refdata module

Module that provides access to reference data sets that are downloaded from a reference data repository to the local file system.

class openclean.data.refdata.RefStore(basedir: Optional[str] = None, loader: Optional[refdata.repo.loader.RepositoryIndexLoader] = None, auto_download: Optional[bool] = None, connect_url: Optional[str] = None)

Bases: refdata.store.base.LocalStore

Default local store for the openclean package. Uses the module name and package version to set the respective properties of the created local store instance.

openclean.data.refdata.download(key: str)

Download the file with the given unique identifier to the local reference data store.

Parameters

key (string) – Unique reference data file identifier.

openclean.data.refdata.list()List[refdata.base.DatasetDescriptor]

Get the descriptors for all datasets that have been downloaded and are available from the local dataset store.

Returns

Return type

list of refdata.base.DatasetDescriptor

openclean.data.refdata.load(key: str, auto_download: Optional[bool] = None)refdata.dataset.base.DatasetHandle

Get a handle for the dataset with the given unique identifier.

If the dataset has not been downloaded to the local store yet, it will be downloaded if the auto_download flag is True or if the environment variable REFDATA_AUTODOWNLOAD is set to True. The auto_download parameter for this function will override the value in the environment variable when loading the dataset.

If the dataset is not available in the local store (and is not downloaded automatically) an error is raised.

Parameters
  • key (string) – External unique dataset identifier.

  • auto_download (bool, default=None) – Override the class global auto download flag.

Returns

Return type

refdata.dataset.DatasetHandle

Raises

refdata.error.NotDownloadedError

openclean.data.refdata.open(key: str, auto_download: Optional[bool] = None)IO

Open the data file for the dataset with the given unique identifier.

If the dataset has not been downloaded to the local store yet, it will be downloaded if the auto_download flag is True or if the environment variable REFDATA_AUTODOWNLOAD is set to True. The auto_download parameter for this function will override the value in the environment variable when opening the dataset.

If the dataset is not available in the local store (and is not downloaded automatically) an error is raised.

Parameters
  • key (string) – External unique dataset identifier.

  • auto_download (bool, default=None) – Override the class global auto download flag.

Returns

Return type

file-like object

Raises

refdata.error.NotDownloadedError

openclean.data.refdata.remove(key: str)bool

Remove the dataset with the given unique identifier from the local store. Returns True if the dataset was removed and False if the dataset had not been downloaded before.

Parameters

key (string) – External unique dataset identifier.

Returns

Return type

bool

openclean.data.refdata.repository(filter: Optional[Union[str, List[str], Set[str]]] = None)List[refdata.base.DatasetDescriptor]

Query the repository index that is associated with the local reference data store.

The filter is a single tag or a list of tags. The result will include those datasets that contain all the query tags. The search includes the dataset tags as well a the tags for individual dataset columns.

If no filter is specified the full list of datasets descriptors in the repository is returned.

Parameters

filter (string, list of string, or set of string) – (List of) query tags.

Returns

Return type

list of refdata.base.DatasetDescriptor

openclean.data.refdata.store()openclean.data.refdata.RefStore

Get an instance of the local reference data store.

This function is used by other function sin this module to create the local reference data store. By now we use all the default settings when creating the data store. In the future we may want to use a openclean-specific configuration instead.

Returns

Return type

openclean.data.refdata.RefStore

openclean.data.schema module

Schema helper functions imported from HISTORE.

openclean.data.sequence module

Many operators in openclean operate on a sequence of scalar values or tuples of schalar values. Sequences are it represented by iterators in Python (e.g., list). This module contains a factory pattern for creating iterators over a single column or a set of columns in a pandas data frame.

class openclean.data.sequence.Sequence(df, columns)

Bases: object

Factory pattern for a lists of values from a single data frame column or tuples from a list of columns.

The main reason for having a separate sequence class for pandas data frames is to have a wrapper that supports reference to columns by name or index and that supports iteration over tuples from multiple columns. The sequence class is also capable to handle data frames with duplicate column names.

openclean.data.sequence.multi_column_iterator(df, colidx)

Iterator over values in multiple columns in a data frame.

Parameters
  • df (pandas.DataFrame) – Pandas data frame.

  • colidx – List of indexes for column in the data frame.

Returns

Return type

tuple

openclean.data.sequence.single_column_iterator(df, colidx)

Iterator over values in a single data frame column.

Parameters
  • df (pandas.DataFrame) – Pandas data frame.

  • colidx – Index of the data frame column.

Returns

Return type

scalar

openclean.data.serialize module
openclean.data.types module

Type alias for basic data types.

Columns in openclean data frames have a unique identifier and a column name. The column class extends the Python String class to be able to be used as a column value in a Pandas data frame.

openclean.data.util module

Helper functions to transform data frames into lists or mappings and vice versa.

openclean.data.util.get_value(row: Union[List, Tuple], columns: List[int])Union[int, float, str, datetime.datetime, Tuple]

Helper function to get the value for a single column or multiple columns from a data frame row. If columns contains only a single column index the value at that index position in the given row is returned. If columns contains multiple column indices a tuple with the row values for all the specified columns is returned.

Parameters
  • row (list or tuple of scalar values) – Row in a data frame.

  • columns (list of integer) – List of index positions for extracted column values.

Returns

Return type

scalar or tuple of scalar

openclean.data.util.repair_mapping(df: pandas.core.frame.DataFrame, key: Union[int, str, List[Union[str, int]]], value: Union[int, str, List[Union[str, int]]])Dict

Create a lookup table from the given data frame that represents a repair mapping for a given combination of lookup key and target value. The key columns and value columns represet the columns from which the lookup key and mapping target value are generated.

The resulting mapping is a dictionary that contains entries for all key values that were mapped to target values that are different from the key value.

The function will raise an error if no unique mapping can be defined from the values in the given data frame.

Parameters
  • df (pd.DataFrame) – Pandas data frame.

  • key (Columns) – Single column or list of column names or index positions. The specified column(s) are used to generate the mapping key value.

  • value (Columns) – Single column or list of column names or index positions. The specified column(s) are used to generate the mapping target value.

Returns

Return type

dict

openclean.data.util.to_set(data)

Create a set of distinct values (rows) for a given data frame or data series. For data frames with multiple columns, each row is converted into a tuple that is added to the set.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

sets

Raises

ValueError

openclean.embedding package
Subpackages
openclean.embedding.feature package
Submodules
openclean.embedding.feature.base module

Value embedder for a list of feature functions.

class openclean.embedding.feature.base.FeatureEmbedding(features)

Bases: openclean.embedding.base.ValueEmbedder

Value embedder that uses a list of feature generating functions to create a vector for scalar input values.

embed(value)

Return the embedding vector for a given scalar value.

Parameters

value (scalar) – Scalar value (or tuple) in a data stream.

Returns

Return type

numpy.array

prepare(values)

Passes the list of values to the vector generator pre-compute any statistics (e.g., min-max values) that are required. Returns a (modified) instance of the feature generator.

Parameters

values (list) – List of data values.

openclean.embedding.feature.character module

Collection of functions that compute feature valuezs for scalar cell values base on the character composition of the string representation a value.

openclean.embedding.feature.character.digits_count(value)

Count the number of digits in the string representation of a scalar value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

int

openclean.embedding.feature.character.digits_fraction(value)

Compute the fraction of characters in a string value that are digits.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.character.fraction(count, value)

Divides the given character count by the length of the string representation for the given value.

Parameters
  • count (int) – Character count returned by one of the count functions.

  • value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.character.letters_count(value)

Count the number of letters in the string representation of a scalar value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

int

openclean.embedding.feature.character.letters_fraction(value)

Compute the fraction of characters in a string value that are letters.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.character.spec_char_count(value)

Count the number of characters in the string representation of a scalar value that are not digit, letter, or white space.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

int

openclean.embedding.feature.character.spec_char_fraction(value)

Compute the fraction of characters in a string value that are not digits, letters, or white space characters.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.character.unique_count(value)

Count the number of unique characters in the string representation of a scalar value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

int

openclean.embedding.feature.character.unique_fraction(value)

Compute the uniqueness of characters for a string value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.character.whitespace_count(value)

Count the number of white space characters in the string representation for a scalar value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

int

openclean.embedding.feature.character.whitespace_fraction(value)

Compute the fraction of characters in a string value that are white space characters.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

float

openclean.embedding.feature.default module

Default feature embedding for strings.

class openclean.embedding.feature.default.StandardEmbedding

Bases: openclean.embedding.feature.base.FeatureEmbedding

Instance of the feature embedding function that uses a default set of seven value features to compute feature vectors. The computed features are: - normalized value length - normalized value frequency - uniqueness of characters in the value string - fraction of letter characters in the value string - fraction of digits in the value string - fraction of speical characters in the value string (not digit, letter, or

whitespace)

  • fraction of whitespace characters in the value string

class openclean.embedding.feature.default.UniqueSetEmbedding

Bases: openclean.embedding.feature.base.FeatureEmbedding

Instance of the feature embedding function for nique value stes. This embedding ignores value frequencies. It uses a set of six value features to compute feature vectors. The computed features are: - normalized value length - uniqueness of characters in the value string - fraction of letter characters in the value string - fraction of digits in the value string - fraction of speical characters in the value string (not digit, letter, or

whitespace)

  • fraction of whitespace characters in the value string

openclean.embedding.feature.frequency module

Feature function that computes normalized frequencies for values in a list.

class openclean.embedding.feature.frequency.NormalizedFrequency(normalizer=None, mapping=None)

Bases: openclean.function.value.base.ValueFunction

Value function that computes a normalized frequency for values in a given list of values.

eval(value)

Return the normalized frequency for the given value.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

float

is_prepared()

The object still requires preparation if either of the internal variables is still None.

Returns

Return type

bool

prepare(values)

Compute the frequency for each value to be used as the feature function. Then initialize the normalization function using the list of value frequencies.

Parameters

values (list) – List of value sin the stream.

Returns

Return type

openclean.embedding.feature.frequency.NormalizedFrequency

openclean.embedding.feature.length module

Feature function that computes normalized length for string representations of values in a list.

class openclean.embedding.feature.length.NormalizedLength(normalizer=None)

Bases: openclean.function.value.base.ValueFunction

Value function that computes a normalized length for the string representation of values in a given list.

eval(value)

Return the normalized frequency for the given value.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

float

is_prepared()

The object still requires preparation if the normalization function is still None.

Returns

Return type

bool

prepare(values)

Compute the frequency for each value to be used as the feature function. Then initialize the normalization function using the list of value frequencies.

Parameters

values (list) – List of value sin the stream.

Returns

Return type

openclean.embedding.feature.length.NormalizedLength

Submodules
openclean.embedding.base module

Operator that creates feature vectors (embeddings) for a list of values. Embeddings are generated by a vector generator that is applied to each element in a given stream of scalar values or tuples of scalar values.

class openclean.embedding.base.Embedding(features)

Bases: object

Compute feature vectors for values in a given stream of scalar values or tuples of scalar values.

exec(values)

Return an array that contains a feature vector for each distinct value in the given input data list. The vector is computed using a list of value feature functions. The resulting array has one column per feature function and one entry per distinct value.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

openclean.embedding.base.FeatureVector

class openclean.embedding.base.FeatureVector

Bases: collections.OrderedDict

Maintain a list values (e.g., the distinct values in a data frame column) together with their feature vectors (e.g., word embeddings).

add(value, vec)
property data

Get numpy array containing all feature vectors. The order of vectors is the same as the order in whch they were added.

Returns

Return type

numpy.array

class openclean.embedding.base.ValueEmbedder

Bases: object

Abstract generator class of value (word) embeddings for scalar values. Outputs a feature vector for each value.

abstract embed(value)

Return the embedding vector for a given scalar value.

Parameters

value (scalar) – Scalar value (or tuple) in a data stream.

Returns

Return type

numpy.array

abstract prepare(values)

Passes the list of values to the vector generator pre-compute any statistics (e.g., min-max values) that are required.

Parameters

values (iterable) – List of data values.

Returns

Return type

openclean.embedding.base.ValueEmbedder

openclean.embedding.base.embedding(df, columns, features)

Compute feature vectors (embeddings) for values in a given (list of) data frame column (s). Computes a feature vector for each value using the given vector generator.

Returns an n-dimensional feature vector where n is the number of features. The array has one row per value in the selected data frame column(s).

Parameters
  • df (pandas.DataFrame) – Input data frame

  • columns (int or string or list(int or string)) – List of column index or column name for columns for which distinct value combinations are computed.

  • features (openclean.profiling.embedding.base.ValueEmbedder) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

Returns

Return type

openclean.embedding.base.FeatureVector

openclean.engine package
Subpackages
openclean.engine.object package
Submodules
openclean.engine.object.base module

Base classes for data objects that are maintained by the object library.

The object handle is the base object that maintains metadata about objects in the library. Different object types (e.g., functions, lookup table, controlled vocabularies) implement specific object handles that extend the base class.

FOr each object type an object factory has to be implemented. The factory is responsible for serializing and deserializing object of the specific type for storage in the object store that is associated with the object library.

class openclean.engine.object.base.ObjectFactory

Bases: object

Factory pattern for different types of objects that are maintained by the object library. Each factory is responsible for creating object instances from object serializations and for serializing objects so that they can be stored in the object store that is associated with the object library.

All objects are serialized into two parts: (i) the object descriptor that contains metadata which is included in object listings (e.g., for front-end user interfaces), and (ii) the object data containing the implementation-specific part of the different object types.

abstract deserialize(descriptor: Dict, data: Any)openclean.engine.object.base.ObjectHandle

Create an object instance from a dictionary serialization.

Parameters
  • descriptor (dict) – Dictionary serialization for the object descriptor as created by the serialize method.

  • data (any) – Serialization for the implementation-specific part of the object handle as created by the serialize method.

Returns

Return type

openclean.engine.object.base.ObjectHandle

abstract serialize(object: openclean.engine.object.base.ObjectHandle)Tuple[Dict, Any]

Create dictionary serialization for an object. Each object is serialized into two parts: (i) the object descriptor and the object data. The descriptor contains the metadata for an object while the data contains the implementation-specific part of the object.

Parameters

object (openclean.engine.object.base.ObjectHandle) – Object of factory-specific type that is being serialized.

Returns

Return type

tuple of dict and any

class openclean.engine.object.base.ObjectHandle(name: str, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None)

Bases: object

Handle for objects that are stored in the object library. For each object basic metadata is maintained. Each object has a user-provided name. Objects are grouped into user-defined namespaces. The combination of name and namespace forms a unique identifier for objects of the same type.

In addition, the object descriptor contains a human-readable label and a descriptive help text.

Type-specific sub-classes for the object handle may extend the basic handle with additional metadata. It is the responsibility of the respective factory that is associated with those types to correctly serialize and deseralize the handle.

description: Optional[str] = None
label: Optional[str] = None
name: str
namespace: Optional[str] = None
to_dict()Dict

Get serialization for the basic metadata that is maintained for each object.

Returns

Return type

dict

openclean.engine.object.function module

Handle and factory implementations for function objects that are registered with the object library.

Imports parameter declarations from flowserv. The constructor for each parameter takes at least the following arguments:

name: string

Unique parameter identifier

index: int, default=0

Index position of the parameter (for display purposes).

label: string, default=None

Human-readable parameter name.

help: string, default=None

Descriptive text for the parameter.

default: any, default=None

Optional default value.

required: bool, default=False

Is required flag.

class openclean.engine.object.function.FunctionFactory

Bases: openclean.engine.object.base.ObjectFactory

Factory for function objects. Uses dill to serialize functions.

deserialize(descriptor: Dict, data: str)openclean.engine.object.base.ObjectHandle

Convert an object serialization that was generated by the object serializer into a function handle.

Parameters
  • descriptor (dict) – Dictionary serialization for the object descriptor.

  • data (string) – Serialization for the function declaration.

Returns

Return type

openclean.engine.object.function.FunctionHandle

serialize(object: openclean.engine.object.base.ObjectHandle)Tuple[Dict, str]

Serialize the given function handle. Returns the serialized function descriptor and the serialized function declaration. The function is serialized using dill and the result converted into a string.

Parameters

object (openclean.engine.object.function.FunctionHandle) – Object of type that is supported by the serializer.

Returns

Return type

tuple of dict and string

class openclean.engine.object.function.FunctionHandle(func: Callable, name: Optional[str] = None, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None, columns: Optional[int] = None, collabels: Optional[Union[str, List[str]]] = None, outputs: Optional[int] = None, parameters: Optional[List[flowserv.model.parameter.base.Parameter]] = None)

Bases: openclean.engine.object.base.ObjectHandle

Handle for functions that are registered with the library.

name: str
openclean.engine.object.mapping module

Handle and factory implementations for lookup tables (mappings) that are registered with the object library.

class openclean.engine.object.mapping.MappingFactory

Bases: openclean.engine.object.base.ObjectFactory

Factory for mapping handles.

deserialize(descriptor: Dict, data: List[Dict])openclean.engine.object.base.ObjectHandle

Convert an object serialization that was generated by the object serializer into a mapping handle.

Parameters
  • descriptor (dict) – Dictionary serialization for the mapping descriptor as created by the serialize method.

  • data (list of dict) – Serialization for the mapping table as created by the serialize method.

Returns

Return type

openclean.engine.object.mapping.MappingHandle

serialize(object: openclean.engine.object.mapping.MappingHandle)Tuple[Dict, List[Dict]]

Serialize the given mapping handle. Returns a serialized descriptor and a list of serializations for the mappings of individual terms in the mapping table.

Parameters

object (openclean.engine.object.mapping.MappingHandle) – Object of type that is supported by the serializer.

Returns

Return type

tuple of dict and list

class openclean.engine.object.mapping.MappingHandle(mapping: openclean.data.mapping.Mapping, name: str, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None)

Bases: openclean.engine.object.base.ObjectHandle

Handle for a mapping of matched terms that is registered with the object library. Extends the base handle with the mapping dictionary.

name: str
openclean.engine.object.vocabulary module

Handle and factory implementations for controlled vocabularies that are registered with the object library.

class openclean.engine.object.vocabulary.VocabularyFactory

Bases: openclean.engine.object.base.ObjectFactory

Factory for controlled vocabularies.

deserialize(descriptor: Dict, data: List)openclean.engine.object.base.ObjectHandle

Convert an object serialization that was generated by the object serializer into a vocabulary handle.

Parameters
  • descriptor (dict) – Dictionary serialization for the vocabulary descriptor as created by the serialize method.

  • data (list of dict) – Serialization for the terms in the vocabulary.

Returns

Return type

openclean.engine.object.vocabulary.VocabularyHandle

serialize(object: openclean.engine.object.vocabulary.VocabularyHandle)Tuple[Dict, List]

Serialize the given controlled vocabulary handle.

Parameters

object (openclean.engine.object.vocabulary.VocabularyHandle) – Object of type that is supported by the serializer.

Returns

Return type

tuple of dict and list

class openclean.engine.object.vocabulary.VocabularyHandle(values: Set, name: str, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None)

Bases: openclean.engine.object.base.ObjectHandle

Handle for controlled vocabularies that are registered with the object library. Extends the base handle with a set of values that form the terms in the vocabulary.

name: str
openclean.engine.store package
Submodules
openclean.engine.store.base module

Generic store for objects handles.

class openclean.engine.store.base.ObjectStore

Bases: object

Interface for repositories that manage handles for objects of different types. Objects are stored internally using their respective serialized form. Object serialization and deserialization is the responsibility of an associated object factory.

abstract delete_object(name: str, namespace: Optional[str] = None)

Remove the object that is identified by the given name and namespace from the repository. Raises a KeyError if the referenced object does not exist.

Parameters
  • name (string) – Unique object name.

  • namespace (string, default=None) – Optional identifier for the object namespace.

Raises

KeyError

get(name: str, namespace: Optional[str] = None)openclean.engine.object.base.ObjectHandle

Shortcut to get the deseralized object handle that is identified by the given name and namespace from the repository. Raises a KeyError if the referenced object does not exist.

Parameters
  • name (string) – Unique object name.

  • namespace (string, default=None) – Optional identifier for the object namespace.

Returns

Return type

any

Raises

KeyError

abstract get_object(name: str, namespace: Optional[str] = None)openclean.engine.object.base.ObjectHandle

Get the deseralized object handle that is identified by the given name and namespace from the repository. Raises a KeyError if the referenced object does not exist.

Parameters
  • name (string) – Unique object name.

  • namespace (string, default=None) – Optional identifier for the object namespace.

Returns

Return type

any

Raises

KeyError

abstract insert_object(object: openclean.engine.object.base.ObjectHandle)

Store an object in the repository. If an object with the same identifier (i.e., name and namespace) exists it will be replaced by the given object.

Parameters

object (openclean.engine.object.base.ObjectHandle) – Object that is being inserted into the repository.

abstract to_listing()List[Dict]

Get a list of descriptor serializations for the registered objects.

Returns

Return type

list of dict

openclean.engine.store.default module

Default implementation for the object store. In this implementations all objects are maintained as separate entries in a data store. this way the default implementation is flexible towards the storage backend.

class openclean.engine.store.default.DefaultObjectStore(identifier: str, factory: openclean.engine.object.base.ObjectFactory, store: openclean.data.store.base.DataStore, defaults: Optional[List[openclean.engine.object.base.ObjectHandle]] = None)

Bases: openclean.engine.store.base.ObjectStore

Implementation of the object store interface. Maintains object descriptors and data objects as separate entries in a data store. Keeps descriptors in memory cache for fast access. Information about stored objects is also maintained as a separate object in the data store.

Provides the option to initialize the store with a set of default objects. THese oblects can be overwritten by the user but they are not stored in the associated data store.

delete_object(name: str, namespace: Optional[str] = None)

Remove the object that is identified by the given name and namespace from the repository. Raises a KeyError if the referenced object does not exist.

Parameters
  • name (string) – Unique object name.

  • namespace (string, default=None) – Optional identifier for the object namespace.

Raises

KeyError

get_object(name: str, namespace: Optional[str] = None)openclean.engine.object.base.ObjectHandle

Get the deseralized object handle that is identified by the given name and namespace from the repository. Raises a KeyError if the referenced object does not exist.

Parameters
  • name (string) – Unique object name.

  • namespace (string, default=None) – Optional identifier for the object namespace.

Returns

Return type

any

Raises

KeyError

insert_object(object: openclean.engine.object.base.ObjectHandle)

Store an object in the repository. If an object with the same identifier (i.e., name and namespace) exists it will be replaced by the given object.

Parameters

object (openclean.engine.object.base.ObjectHandle) – Object that is being inserted into the repository.

to_listing()List[Dict]

Get a list of descriptor serializations for the registered objects.

Returns

Return type

list of dict

class openclean.engine.store.default.StoredObject(name: str, descriptor: Dict, object_id: Optional[str] = None, data_id: Optional[str] = None)

Bases: object

Metadata about objects in the store. Maintains the identifier for the descriptor and the data object together with the serialized object descriptor.

data_id: Optional[str] = None
descriptor: Dict
property is_default: bool

Flag indicating whether the object is maintained by the data store or was provided as part of a set of default objects. Only objects in the data store will have an object and data identifier.

Returns

Return type

bool

name: str
object_id: Optional[str] = None
to_dict()Dict

Default serialization of the object for the index store.

Returns

Return type

dict

openclean.engine.store.function module

Persistent repository for library functions. Instantiates the default object store with a persistent data store for registered functions.

class openclean.engine.store.function.FunctionRepository(basedir: Optional[str] = None, defaults: Optional[List[openclean.engine.object.function.FunctionHandle]] = None)

Bases: openclean.engine.store.default.DefaultObjectStore

Object store for library functions. Persists all user-defined functions on disk using a file system data store. The files are stored under the openclean home directory if no base directory is specififed.

Submodules
openclean.engine.action module

Handles for operators that have been applied to a dataset. Handles are stored in a log (provenance record) for the dataset. The operator handles contain all the information that is necessary to reapply the opertor to a dataset version.

class openclean.engine.action.CommitOp

Bases: openclean.engine.action.OpHandle

Handle for a user commit operation.

to_eval()openclean.function.eval.base.EvalFunction

The commit operator cannot be converted to an evaluation function. If an attempt is made to do so a runtime error is raised.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.engine.action.InsertOp(schema: List[Union[str, histore.document.schema.Column]], names: Union[str, List[str]], pos: Optional[int] = None, values: Optional[Union[int, float, str, datetime.datetime, openclean.engine.object.function.FunctionHandle]] = None, args: Optional[Dict] = None, sources: Optional[Union[int, str, List[Union[str, int]]]] = None)

Bases: openclean.engine.action.OpHandle

Handle for an insert operation.

property names: Union[str, List[str]]

Synonym for accessing the columns (which are the names of the inserted columns for an inscol operator).

Returns

Return type

string or list of string

to_dict()Dict

Get a dictionary serialization for the handle.

Returns

Return type

dict

to_eval()openclean.function.eval.base.EvalFunction

Get an evaluation function instance that can be used to re-apply the represented operation on a dataset version.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.engine.action.LoadOp

Bases: openclean.engine.action.OpHandle

Handle for a load operation.

to_eval()openclean.function.eval.base.EvalFunction

The load operator cannot be converted to an evaluation function. If an attempt is made to do so a runtime error is raised.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.engine.action.OpHandle(optype: str, schema: Optional[List[Union[str, histore.document.schema.Column]]] = None, columns: Optional[Union[int, str, List[Union[str, int]]]] = None, func: Optional[Union[int, float, str, datetime.datetime, openclean.engine.object.function.FunctionHandle]] = None, args: Optional[Dict] = None, sources: Optional[Union[int, str, List[Union[str, int]]]] = None)

Bases: openclean.data.archive.base.ActionHandle

The operator handle defines the interface for entries in the provenance log of a dataset. The defined methods are used to store the handle and to re-apply the operation using a evaluation function that is generated from the operator metadata.

property is_insert: bool

True if the operator type is ‘inscol’.

Returns

Return type

bool

property is_update: bool

True if the operator type is ‘update’.

Returns

Return type

bool

to_dict()Dict

Get a dictionary serialization for the handle.

Returns

Return type

dict

abstract to_eval()openclean.function.eval.base.EvalFunction

Get an evaluation function instance that can be used to re-apply the represented operation on a dataset version.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.engine.action.SampleOp(args: Optional[Dict] = None)

Bases: openclean.engine.action.OpHandle

Handle for a dataset sample operation.

to_eval()openclean.function.eval.base.EvalFunction

The sample operator cannot be converted to an evaluation function. If an attempt is made to do so a runtime error is raised.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.engine.action.UpdateOp(schema: List[Union[str, histore.document.schema.Column]], columns: Union[int, str, List[Union[str, int]]], func: openclean.engine.object.function.FunctionHandle, args: Optional[Dict] = None, sources: Optional[Union[int, str, List[Union[str, int]]]] = None)

Bases: openclean.engine.action.OpHandle

Handle for an update operation.

to_eval()openclean.function.eval.base.EvalFunction

Get an evaluation function instance that can be used to re-apply the represented operation on a dataset version.

Returns

Return type

openclean.function.eval.base.EvalFunction

openclean.engine.base module

The openclean engine maintains a collection of datasets. Each dataset is identified by a unique name. Dataset snapshots are maintained by a datastore.

The idea of the engine is to provide a namespace for datasets that are maintained by a datastore which keeps track of changes to the data. The engine is associated with an object registry that maintains user-defined objects such as functions, lookup tables, etc..

openclean.engine.base.DB(basedir: Optional[str] = None, create: Optional[bool] = False, cached: Optional[bool] = True)openclean.engine.base.OpencleanEngine

Create an instance of the openclean engine. Uses a persistent engine if a base directory is given. This test implementation uses HISTORE as the underlying datastore for a persistent engine. If no base directory is given, a volatile archive manager will be used instead of a persistent one.

If the create flag is True all existing files in the base directory (if given) will be removed.

Parameters
  • basedir (string) – Path to directory on disk where archives are maintained.

  • create (bool, default=False) – Create a fresh instance of the archive manager if True. This will delete all files in the base directory.

  • cached (bool, default=True) – Flag indicating whether the all datastores that are created for existing archives are cached datastores or not.

Returns

Return type

openclean.engine.base.OpencleanEngine

class openclean.engine.base.OpencleanEngine(identifier: str, manager: histore.archive.manager.base.ArchiveManager, library: openclean.engine.library.ObjectLibrary, basedir: Optional[str] = None, cached: Optional[bool] = True)

Bases: object

The idea of the engine is to provide a namespace that manages a set of datasets that are identified by unique names. The engine is associated with an object repository that provides additional functionality to register objects like functions, lookup tables, etc..

Datasets that are created from files of data frames are maintained by an archive manager.

Each engine has a unique identifier allowing a user to use multiple engines if necessary.

apply(name: str, operations: Union[openclean.operator.stream.processor.StreamProcessor, openclean.engine.operator.StreamOp, List[Union[openclean.operator.stream.processor.StreamProcessor, openclean.engine.operator.StreamOp]]], validate: Optional[bool] = None)List[histore.archive.snapshot.Snapshot]

Apply a given operator or a sequence of operators on the specified archive.

The resulting snapshot(s) will directly be merged into the archive. This method allows to update data in an archive directly without the need to checkout the snapshot first and then commit the modified version(s).

Returns list of handles for the created snapshots.

Note that there are some limitations for this method. Most importantly, the order of rows cannot be modified and neither can it insert new rows at this point. Columns can be added, moved, renamed, and deleted.

Parameters
  • name (string) – Unique dataset name.

  • operations (openclean.engine.dataset.StreamOpPipeline) – Operator(s) that is/are used to update the rows in a dataset snapshot to create new snapshot(s) in this archive.

  • validate (bool, default=False) – Validate that the resulting archive is in proper order before committing the action.

Returns

Return type

histore.archive.snapshot.Snapshot

checkout(name: str, commit: Optional[bool] = False)pandas.core.frame.DataFrame

Checkout the latest version of a dataset. The dataset is identified by the unique name. If the dataset that is currently associated with the given name is a sample dataset it will be replace by the handle for the original dataset first. If the commit flag is True any uncommited changes for the sample dataset will be commited first.

Raises a KeyError if the given dataset name is unknown.

Parameters
  • name (string) – Unique dataset name.

  • commit (bool, default=False) – Apply all uncommited changes to the original database if True.

Returns

Return type

pd.DataFrame

Raises

KeyError

commit(name: str, source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], action: Optional[openclean.engine.action.OpHandle] = None)Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]

Commit a modified data frame to the dataset archive.

The dataset is identified by its unique name. Raises a KeyError if the given dataset name is unknown.

Parameters
  • name (string) – Unique dataset name.

  • source (openclean.data.stream.base.Datasource) – Input data frame or stream containing the new dataset version that is being stored.

  • action (openclean.engine.action.OpHandle, default=None) – Operator that created the dataset snapshot.

Returns

Return type

openclean.data.stream.base.Datasource

Raises

KeyError

create(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], name: str, primary_key: Optional[Union[str, List[str]]] = None, cached: Optional[bool] = True)openclean.engine.dataset.DatasetHandle

Create an initial dataset archive that is idetified by the given name. The given data represents the first snapshot in the created archive.

Raises a ValueError if an archive with the given name already exists.

Parameters
  • source (pd.DataFrame, CSVFile, or string) – Data frame or file containing the first version of the archived dataset.

  • name (string) – Unique dataset name.

  • primary_key (string or list, default=None) – Column(s) that are used to generate identifier for rows in the archive.

  • cached (bool, default=True) – Flag indicating whether the last accessed dataset snapshot for the created dataset is cached for fast access.

Returns

Return type

openclean.engine.dataset.DatasetHandle

Raises

ValueError

dataset(name: str)openclean.engine.dataset.DatasetHandle

Get handle for a dataset. Depending on the type of the dataset this will either return a :class:FullDataset or :class:DataSample.

Parameters

name (string) – Unique dataset name.

Returns

Return type

openclean.engine.dataset.DatasetHandle

drop(name: str)

Delete the full history for the dataset with the given name. Raises a ValueError if the dataset name is unknonw.

Parameters

name (string) – Unique dataset name.

Raises

ValueError

load_dataset(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], name: str, primary_key: Optional[Union[str, List[str]]] = None, cached: Optional[bool] = True)openclean.engine.dataset.DatasetHandle

Create an initial dataset archive that is idetified by the given name. The given data frame represents the first snapshot in the created archive.

Raises a ValueError if an archive with the given name already exists.

This is a synonym for create() for backward compatibility.

Parameters
  • source (pd.DataFrame or string) – Data frame or file containing the first version of the archived dataset.

  • name (string) – Unique dataset name.

  • primary_key (string or list, default=None) – Column(s) that are used to generate identifier for rows in the archive.

  • cached (bool, default=True) – Flag indicating whether the last accessed dataset snapshot for the created dataset is cached for fast access.

Returns

Return type

openclean.engine.dataset.DatasetHandle

Raises

ValueError

metadata(name: str)openclean.data.metadata.base.MetadataStore

Get metadata that is associated with the current dataset version.

Raises a ValueError if the dataset is unknown.

Parameters

name (string) – Unique dataset name.

Returns

Return type

openclean.data.metadata.base.MetadataStore

property register: openclean.engine.library.ObjectLibrary

Synonym for accessing the library as a function registry.

Returns

Return type

openclean.engine.object.base.ObjectLibrary

rollback(name: str, version: str)pandas.core.frame.DataFrame

Rollback all changes including the given dataset version.

That is, we rollback all changes that occurred at and after the identified snapshot. This will make the respective snapshot of the previous version the new current (head) snapshot for the dataset history.

Returns the dataframe for the dataset snapshot that is at the new head of the dataset history.

Raises a KeyError if the dataset or the given version identifier are unknown.

Parameters
  • name (string) – Unique dataset name.

  • version (string) – Unique log entry version.

Returns

Return type

pd.DataFrame

sample(name: str, n: Optional[int] = None, random_state: Optional[Tuple[int, List]] = None)pandas.core.frame.DataFrame

Display the spreadsheet view for a given dataset. The dataset is identified by its unique name. Raises a ValueError if no dataset with the given name exists.

Creates a new data frame that contains a random sample of the rows in the last snapshot of the identified dataset. This sample is registered as a separate dataset with the engine. If neither n nor frac are specified a random sample of size 100 is generated.

Parameters
  • name (string) – Unique dataset name.

  • n (int, default=None) – Number of rows in the sample dataset.

  • random_state (int or list, default=None) – Seed for random number generator.

Returns

Return type

pd.DataFrame

Raises

KeyError

stream(name: str, version: Optional[int] = None)openclean.pipeline.DataPipeline

Get a data pipeline for a dataset snapshot.

Parameters
  • name (string) – Unique dataset name.

  • version (int, default=None) – Unique version identifier. By default the last version is used.

Returns

Return type

openclean.pipeline.DataPipeline

openclean.engine.dataset module

The data engine is used to manipulate a dataset with insert and update operations that use functions from the command registry.

class openclean.engine.dataset.DataSample(df: pandas.core.frame.DataFrame, original: openclean.engine.dataset.DatasetHandle, n: int, random_state: Optional[Tuple[int, List]] = None)

Bases: openclean.engine.dataset.DatasetHandle

Handle for datasets that are samples of a larger dataset. Samples datasets are entirely maintained in main memory.

This class maintains a reference to the orginal sample and the to the current modified version of the sample. If intermediate versions need to be accessed they will be recreated by re-applying the sequence of operations that generated them.

The class also has a reference to the handle for the full dataset.

apply()

Apply all actions in the current log to the underlying original dataset.

drop()

Delete all resources that are associated with the dataset history.

class openclean.engine.dataset.DatasetHandle(store: openclean.data.archive.base.ArchiveStore, is_sample: bool)

Bases: object

Handle for datasets that are managed by the openclean engine and whose snapshot history is maintained by an archive manager.

checkout(version: Optional[int] = None)pandas.core.frame.DataFrame

Checkout a dataset snapshot.

The optional identifier references a dataset snapshot via an operation log entry. If no identifier is given, the snapshot for the last version of the dataset will be returned.

Parameters

version (int, default=None) – Identifier for the operation log entry that represents the the dataset version that is being checked out.

Returns

Return type

pd.DataFrame

commit(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], action: Optional[openclean.engine.action.OpHandle] = None)Union[pandas.core.frame.DataFrame, str, histore.document.base.Document]

Add a new snapshot to the history of the dataset.

If no action is provided a user commit action operator is used as the default. Returns the data frame for the snapshot.

Parameters
  • source (openclean.data.stream.base.Datasource) – Input data frame or stream containing the new dataset version that is being stored.

  • action (openclean.engine.action.OpHandle, default=None) – Operator that created the dataset snapshot.

Returns

Return type

openclean.data.stream.base.Datasource

abstract drop()

Delete all resources that are associated with the dataset history.

insert(names: Union[str, List[str]], pos: Optional[int] = None, values: Optional[Union[int, float, str, datetime.datetime, openclean.engine.object.function.FunctionHandle]] = None, args: Optional[Dict] = None, sources: Optional[Union[int, str, List[Union[str, int]]]] = None)pandas.core.frame.DataFrame

Insert one or more columns at a given position into the dataset. One column is inserted for each given column name. If the insert position is undefined, columns are appended. If the position does not reference a valid position (i.e., not between 0 and len(df.columns)) a ValueError is raised.

Values for the inserted columns are generated using a given constant value or function. If a function is given, it is expected to return exactly one value (e.g., a tuple of len(names)) for each of the inserted columns.

Parameters
  • names (string, or list(string)) – Names of the inserted columns.

  • pos (int, default=None) – Insert position for the new columns. If None, the columns will be appended.

  • values (scalar or openclean.engine.object.func.FunctionHandle, default=None) – Single value, tuple of values, or library function that is used to generate the values for the inserted column(s). If no default is specified all columns will contain None.

  • args (dict, default=None) – Additional keyword arguments that are passed to the callable together with the column values that are extracted from each row.

  • sources (int, string, or list(int or string), default=None) – List of source columns from which the input values for the callable are extracted.

Returns

Return type

pd.DataFrame

log()List[openclean.engine.log.LogEntry]

Get the list of log entries for all dataset snapshots.

Returns

Return type

list of openclean.engine.log.LogEntry

metadata(version: Optional[int] = None)openclean.data.metadata.base.MetadataStore

Get metadata that is associated with the current dataset version.

Parameters

version (int, default=None) – Identifier for the dataset version for which the metadata is being fetched.

Returns

Return type

openclean.data.metadata.base.MetadataStore

open(version: Optional[int] = None)histore.archive.reader.SnapshotReader

Get a stream reader for a dataset snapshot.

Parameters

version (int, default=None) – Unique version identifier. By default the last version is used.

Returns

Return type

openclean.data.archive.base.SnapshotReader

rollback(version: int)pandas.core.frame.DataFrame

Rollback all changes including the given dataset version.

That is, we rollback all changes that occurred at and after the identified snapshot. This will make the respective snapshot of the previous version the new current (head) snapshot for the dataset history.

Returns the dataframe for the dataset snapshot that is at the new head of the dataset history.

Raises a KeyError if the given log entry identifier is unknown. Raises a ValueError if the log entry references a snapshot that has already been committed.

Parameters

version (int) – Unique log entry version.

Returns

Return type

pd.DataFrame

update(columns: Union[int, str, List[Union[str, int]]], func: openclean.engine.object.function.FunctionHandle, args: Optional[Dict] = None, sources: Optional[Union[int, str, List[Union[str, int]]]] = None)pandas.core.frame.DataFrame

Update a given column (or list of columns) by applying the given function.

Columns defines the dataset column(s) that are being updated. If the given function is an evaluation function, that function will define the columns from which the input values are being retrieved. If the function is not an evaluation function, the input values for the update function will come from the same column(s) that are being modified. This behavior can be changed by specifying a list of source columns. If function is a callable (not an evaluation function) and sources is given, row values from the column(s) that are specified by sounrces are used as the input to the update function.

Parameters
  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • func (openclean.engine.object.func.FunctionHandle) – Library function that is used to generate modified values for the updated column(s).

  • args (dict, default=None) – Additional keyword arguments that are passed to the callable together with the column values that are extracted from each row.

  • sources (int, string, or list(int or string), default=None) – List of source columns from which the input values for the callable are extracted.

  • -------

  • pd.DataFrame

version()int

Get version identifier for the last snapshot of the dataset.

Returns

Return type

int

class openclean.engine.dataset.FullDataset(datastore: openclean.data.archive.base.ArchiveStore, manager: histore.archive.manager.base.ArchiveManager, identifier: str, pk: Optional[Union[str, List[str]]] = None)

Bases: openclean.engine.dataset.DatasetHandle

Handle for datasets that are managed by the openclean engine and that have their history being maintained by an archive manager. All operations are applied directly on the full dataset in the underlying archive.

apply(operations: Union[openclean.operator.stream.processor.StreamProcessor, openclean.engine.operator.StreamOp, List[Union[openclean.operator.stream.processor.StreamProcessor, openclean.engine.operator.StreamOp]]], validate: Optional[bool] = None)List[histore.archive.snapshot.Snapshot]

Apply a given operator or a sequence of operators on a snapshot in the archive.

The resulting snapshot(s) will directly be merged into the archive. This method allows to update data in an archive directly without the need to checkout the snapshot first and then commit the modified version(s).

Returns list of handles for the created snapshots.

Note that there are some limitations for this method. Most importantly, the order of rows cannot be modified and neither can it insert new rows at this point. Columns can be added, moved, renamed, and deleted.

Parameters
  • operations (openclean.engine.base.StreamOpPipeline) – Operator(s) that is/are used to update the rows in a dataset snapshot to create new snapshot(s) in this archive.

  • validate (bool, default=False) – Validate that the resulting archive is in proper order before committing the action.

Returns

Return type

histore.archive.snapshot.Snapshot

drop()

Delete all resources that are associated with the dataset history.

openclean.engine.library module

The object library is a repository for storing objects of different types. These objects include user-defined functions, lookup tables (mappings), and controlled vocabularies.

Objects within each of the supported types are maintained under a unique name and namespace.

The library is merely a wrapper around an object stores that are responsible for maintaining (and potentially persisting) the objects. The library class provides dedicated methods to access the object stores for different types.

class openclean.engine.library.ObjectLibrary(functions: Optional[openclean.engine.store.base.ObjectStore] = None, lookups: Optional[openclean.engine.store.base.ObjectStore] = None, vocabularies: Optional[openclean.engine.store.base.ObjectStore] = None)

Bases: object

The object library provides access to different types of objects that a user can define and register with the library (e.g., user-defined functions, lookup tables, etc.).

The registered objects for each different object type are managed by separate object stores. For now, the library only provides (hard-coded) access to the object stores for different types of objects. All the functionality for creating, retrieving and deleting objects is with the object stores.

In the future we may want to make this class easier to extend for new object types (e.g., create access methods for object stores of known object types automatically).

eval(name: Optional[str] = None, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None, columns: Optional[int] = None, collabels: Optional[Union[str, List[str]]] = None, outputs: Optional[int] = None, parameters: Optional[List[flowserv.model.parameter.base.Parameter]] = None)Callable

Decorator that adds a new function to the registered set of data frame transformers.

Parameters
  • name (string, default=None) – Name of the registered function.

  • namespace (string, default=None) – Name of the namespace that this function belongs to. By default all functions will be placed in a global namespace.

  • label (string, default=None) – Optional human-readable name for display purposes.

  • description (str, default=None) – Descriptive text for the function. This text can for example be displayed as tooltips in a front-end.

  • columns (int, default=None) – Specifies the number of input columns that the registered function operates on. The function will receive exactly one argument for each column plus arguments for any additional parameter. The column values will be the first arguments that are passed to the registered function.

  • collabels (string or list of string, default=None) – Display labels for the nput columns. If given the number of values has to match the columns value.

  • outputs (int, default=None) – Defines the number of scalar output values that the registered function returns. By default it is assumed that the function will return a single scalar value.

  • parameters (list of openclean.engine.object.function.Parameter,) – default=None List of declarations for additional input parameters to the registered function.

Returns

Return type

openclean.engine.object.function.FunctionHandle

functions()openclean.engine.store.base.ObjectStore

Get object store that manages user-defined functions.

Returns

Return type

openclean.engine.store.base.ObjectStore

lookup(mapping: openclean.data.mapping.Mapping, name: str, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None)openclean.engine.object.mapping.MappingHandle

Create a new lookup table object for the given mapping. Returns the handle for the created object.

Parameters
  • mapping (openclean.data.mapping.Mapping) – Mapping (lookup table) of matched terms.

  • name (string) – Name for the mapping.

  • namespace (string, default=None) – Name of the namespace that this mapping belongs to. By default all mappings will be placed in a global namespace (None).

  • label (string, default=None) – Optional human-readable name for display purposes.

  • description (str, default=None) – Descriptive text for the mapping. This text can for example be displayed as a tooltip in a user interface.

Returns

Return type

openclean.engine.object.mapping.MappingHandle

lookups()openclean.engine.store.base.ObjectStore

Get object store that manages lookup tables.

Returns

Return type

openclean.engine.store.base.ObjectStore

vocabularies()openclean.engine.store.base.ObjectStore

Get object store that manages controlled vocabularies.

Returns

Return type

openclean.engine.store.base.ObjectStore

vocabulary(values: Iterable, name: str, namespace: Optional[str] = None, label: Optional[str] = None, description: Optional[str] = None)openclean.engine.object.vocabulary.VocabularyHandle

Register a controlled vocabulary with the library. Returns the handle for the created object.

Parameters
  • values (set) – Terms in the controlled vocabulary.

  • name (string) – Name for the vocabulary.

  • namespace (string, default=None) – Name of the namespace that this vocabulary belongs to. By default all vocabularies will be placed in a global namespace (None).

  • label (string, default=None) – Optional human-readable name for display purposes.

  • description (str, default=None) – Descriptive text for the vocabulary. This text can for example be displayed as a tooltip in a user interface.

Returns

Return type

openclean.engine.object.vocabulary.VocabularyHandle

openclean.engine.library.default_store(factory: openclean.engine.object.base.ObjectFactory)openclean.engine.store.default.DefaultObjectStore

Create an instance of the default object store for the object type that is supported by the given factory.

Parameters

factory (openclean.engine.object.base.ObjectFactory) – Factory for object handles.

Returns

Return type

openclean.engine.store.default.DefaultObjectStore

openclean.engine.log module

Log of actions that defines the history of a dataset.

class openclean.engine.log.LogEntry(descriptor: Dict, action: Optional[openclean.engine.action.OpHandle] = None, version: Optional[int] = None)

Bases: object

Entry in an operation log for a dataset. Each entry maintains information about a committed or uncommitted snapshot of a dataset. Each log entry is associated with a unique UUID identifer and a descriptor for the action that created the snapshot.

For uncommitted snapshots the handle for the action that created the snapshot is maintained together with the version identifier in the data store for the dataset sample.

action: Optional[openclean.engine.action.OpHandle] = None
descriptor: Dict
version: Optional[int] = None
class openclean.engine.log.OperationLog(snapshots: List[histore.archive.snapshot.Snapshot])

Bases: object

The operation log maintains a list of entries containing provenance information for each snapshot of a dataset. Snapshots in a dataset can either be committed, i.e., persisted with the datastore that manages the full dataset, or uncommitted, i.e., committed only with the datastore for a dataset sample but not the full dataset.

add(version: int, action: openclean.engine.action.OpHandle)

Append a record to the log.

Parameters
  • version (int) – Dataset snapshot version identifier.

  • action (openclean.engine.log.OpHandle) – Handle for the operation that created the dataset snapshot.

last_version()int

Get version identifier of the last entry in the log.

Returns

Return type

int

truncate(pos: int)

Remove all log entries starting at the given index.

Parameters

pos (int) – List position from which (including the position) all entries in the log are removed.

openclean.engine.operator module

Stream operators are subclasses or wrappers for StreamProcessor. These operators can directly be applied on archive snapshots.

class openclean.engine.operator.StreamOp(func: openclean.operator.stream.processor.StreamProcessor, description: Optional[str] = None)

Bases: object

Wrapper for a stream processor and an optioanl snapshot description.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.engine.operator.StreamOperator

Factory pattern for stream consumer. Returns an instance of the stream consumer that corresponds to the action that is defined by the stream processor.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.engine.operator.DatasetOperator

class openclean.engine.operator.StreamOperator(func: openclean.operator.stream.consumer.StreamFunctionHandler, description: Optional[str] = None)

Bases: histore.document.operator.DatasetOperator

Operator for processing rows in a data stream from a dataset archive snapshot.

handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Evaluate the operator on the given row.

Returns the processed row. If the result is None this signals that the given row should not be part of the collected result.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

openclean.engine.parallel module

Collection of helper functions for parallel processing.

openclean.engine.parallel.process_list(func: Callable, values: Iterable, processes: int)List

Process a given list of values in parallel. Applies the given function to each value in the list and returnes the processed result.

The current implementation uses a multiprocess pool to process the list with the default map function. In the future we may want to modify this behavior, e.g., use imap to account for large lists.

Parameters
  • func (callable) – Function that is applied to list values.

  • values (iterable) – Iterable of values that are processed by the given function.

  • processes (int) – Number of parallel proceses to use.

Returns

Return type

list

openclean.engine.registry module

Global index for all open instances of the openclean engine.

openclean.function package
Subpackages
openclean.function.eval package
Submodules
openclean.function.eval.aggregate module

Collection of evaluation functions that return a computed statistic over one or more data frame columns for all data frame rows.

class openclean.function.eval.aggregate.Avg(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the mean of values for one or more columns in a data frame.

class openclean.function.eval.aggregate.ColumnAggregator(func: Callable)

Bases: openclean.function.value.base.ValueFunction

Value function that computes an aggregate over a list of values. The aggregated value is computed when the function is prepared. It then returns a constant value function that is initialized with the aggregation result, i.e., that will return the aggregation result for any input value.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])

Raises an error. The column aggregator can only be used to prepare a constant value funciton.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Raises

NotImplementedError

is_prepared()bool

The column aggregator has to be prepared.

Returns

Return type

bool

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ConstantValue

Optional step to prepare the function for a given set of values. This step allows to compute additional statistics over the set of values.

While it is likely that the given set of values represents the values for which the eval() function will be called, this property is not guaranteed.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

openclean.function.value.base.ConstantValue

class openclean.function.eval.aggregate.Count(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], value: Optional[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = True)

Bases: openclean.function.eval.base.Eval

Evaluation function that counts the number of values in one or more columns that match a given value.

class openclean.function.eval.aggregate.Max(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the maximum of values for one or more columns in a data frame.

class openclean.function.eval.aggregate.Min(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the minimum of values for one or more columns in a data frame.

class openclean.function.eval.aggregate.Sum(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the sum over values for one or more columns in a data frame.

openclean.function.eval.base module

Base classes for data frame manipulating functions. Evaluation functions are applied to one or more columns in a data frame. Functions are expected to return either a data series or a list of scalar values.

class openclean.function.eval.base.Add(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘+’ operator.

class openclean.function.eval.base.BinaryOperator(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], op: Callable)

Bases: openclean.function.eval.base.EvalFunction

Generic operator for comparing or transforming two column value expressions (that are represented as evaluation functions).

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Evaluate the binary operator on a given data frame. The result is either as single data series or a list of scalarn values.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

pd.Series or list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Prepare both evaluation functions (lhs and rhs) and return a binary operator stream function.

Parameters

columns (list of string) – Schema for data stream rows.

Returns

Return type

openclean.data.stream.base.StreamFunction

class openclean.function.eval.base.BinaryStreamFunction(lhs: Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], rhs: Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], op: Callable)

Bases: object

Binary operator for data streams. Evaluates a given binary function on the result of two stream functions.

class openclean.function.eval.base.Col(column: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction], colidx: Optional[int] = None)

Bases: openclean.function.eval.base.EvalFunction

Evaluation function that returns the value from a single column in a data frame row. Extends the abstract evaluation function and implements the stream function interface. For a stream function the internal _colidx has to be defined (given at object construction).

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Get the values from the data frame column that is referenced by this function.

Parameters

values (pandas.core.series.Series) – Row in a pandas data frame.

Returns

Return type

pd.Series

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Return a Col function that is prepared, i.e., that has the column index for the column that it operates on initialized.

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

class openclean.function.eval.base.Cols(columns: Union[int, str, List[Union[str, int]]], colidxs: Optional[List[int]] = None)

Bases: openclean.function.eval.base.EvalFunction

Evaluation function that returns a tuple of values from one or more column(s) in the data frame row. Extends the abstract evaluation function and implements the stream function interface. For a stream function the internal _colidxs have to be defined (given at object construction).

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Get the values from the data frame columns that are referenced by this function. Returns a list of tuples with one value for each of the referenced columns.

Parameters

values (pandas.core.series.Series) – Row in a pandas data frame.

Returns

Return type

list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Return a Cols function that is prepared, i.e., that has the column indexes for the columns that it operates on initialized.

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

class openclean.function.eval.base.Const(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])

Bases: openclean.function.eval.base.EvalFunction

Evaluation function that returns a constant value for each data frame row. Extends the abstract evaluation function and implements the stream function interface.

eval(df: pandas.core.frame.DataFrame)List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Execute method for the evaluation function. Returns a list in the length of the data frame (row count) with the defined constant value.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

The prepare method returns a callable that returns the constant value for evary input row.

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

class openclean.function.eval.base.Divide(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘/’ operator.

class openclean.function.eval.base.Eq(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Binary equality comparison predicate.

class openclean.function.eval.base.Eval(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], func: Union[Callable, openclean.function.value.base.ValueFunction], args: Optional[Dict] = None, is_unary: Optional[bool] = None)

Bases: openclean.function.eval.base.EvalFunction

Eval is a factory for evaluation functions that extract values from one or more columns in data frame rows and that evaluate a given function (consumer) on the extracted values.

We distinguish between unary evaluation functions that extract values from a single column and ternary evaluation functions that extract values from two or more columns. For the consumer we also distinguish between unary and ternary functions.

The arity of an evaluation function is detemined by the number of input columns that are specified when calling the Eval factory. The arity of the consumer cannot be determined automatically but has to be specified by the user in the is_unary parameter.

A ternary evaluation function with a unary consumer will pass a tuple with the extracted values to the consumer. A unary evaluation function with a ternary consumer will raise a TypeError error in the constructor.

decorate(func)

Decorate the given function with the optional keyword arguments that were given (if given) in the constructor for the Eval function.

Parameters

func (callable) – Function that is being decorated.

Returns

Return type

callable

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Evaluate the consumer on the lists of values that are generated by the referenced columns.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

pd.Series or list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Create a stream function that applies the consumer on the results from one or more stream functions for the producers.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

openclean.function.eval.base.EvalFunction

class openclean.function.eval.base.EvalFunction

Bases: object

Evaluation functions are used to compute results over rows in a data frame or a data stream. Conceptually, evaluation functions are evaluated over one or more columns for each row in the input data. For each row, the function is expected to generate one (or more) (transformed) value(s) for the column (columns) on which it operates.

Evaluation functions are building blocks for data frame operators as well as data stream pipelines. Each of these two use cases is supported by a different (abstract) method:

  • eval: The eval function is used by data frame operators. The function receives the full data frame as an argument. It returns a data series (or list) of values with one value for each row in the input data frame. Functions that operate over multiple columns will return a list of tuples.

  • prepare: If an evaluation function is used as part of a data stream operator the function needs to be prepared. That is, the function will need to know the schema of the rows in the data frame before streaming starts. The prepare method receives the schema of the data stream as an argument. It returns a callable function that accepts a data stream row as the only argument and that returns a single value or a tuple of values depending on whether the evaluation function operators on one or more columns.

abstract eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Evaluate the function on a given data frame. The result is either a data series or a list of values. The resulting data contains one output value per input row. If the evaluation function operates over multiple columns then the result will be a list of tuples with the size of each tuple matching the number of columns the function operates on.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

pd.Series or list

abstract prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Prepare the evaluation function to be able to process rows in a data stream. This method is called before streaming starts to inform the function about the schema of the rows in the data stream.

Prepare is expected to return a callable that accepts a single data stream row as input and that returns a single value (if the function operates on a single column) or a tuple of values (for functions that operate over multiple columns).

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

class openclean.function.eval.base.FloorDivide(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘//’ operator.

class openclean.function.eval.base.Geq(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Predicate for ‘>=’ comparison.

class openclean.function.eval.base.Gt(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Predicate for ‘>’ comparison.

class openclean.function.eval.base.Leq(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Predicate for ‘<=’ comparison.

class openclean.function.eval.base.Lt(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Predicate for ‘<’ comparison.

class openclean.function.eval.base.Multiply(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘*’ operator.

class openclean.function.eval.base.Neq(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Predicate for ‘!=’ comparison.

class openclean.function.eval.base.Pow(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘**’ operator.

class openclean.function.eval.base.Subtract(lhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction], rhs: Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction])

Bases: openclean.function.eval.base.BinaryOperator

Arithmetic ‘-‘ operator.

class openclean.function.eval.base.TernaryStreamFunction(producers: Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], consumer: Callable, is_unary: Optional[bool] = False)

Bases: object

A ternary stream function extracts values using multiple producers and passes them to a single consumer. The consumer may either be a unary or a ternary function. An unary function will receive a tuple of extracted values as the argument.

class openclean.function.eval.base.UnaryStreamFunction(producer: Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], consumer: Callable)

Bases: object

Unary operator for data streams. Evaluates a given unary function on the result of another stream function.

openclean.function.eval.base.evaluate(df: pandas.core.frame.DataFrame, producers: List[openclean.function.eval.base.EvalFunction])Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Helper method to extract a list of values (i.e., an evaluation result) from a data frame using one or more producers (evaluation functions).

Results are generated by evaluating the given producers individually. If a single producer is given, the result from that producer will be returned. If multiple producers are given, a list of tuples with results from each consumer will be returned.

Parameters
  • df (pd.DataFrame) – Pandas data frame.

  • producers (list of openclean.function.eval.base.EvalFunctions) – List of evaluation functions that are used as data (series) producer.

Returns

Return type

pd.Series or list

openclean.function.eval.base.to_column_eval(value: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction])openclean.function.eval.base.EvalFunction

Convert a value into an evaluation function. If the value s not already an evaluation function, a column evaluation function is returned.

Parameters

values (string, int, or openclean.function.eval.base.EvalFunction) – Value that is converted to an evaluation function.

Returns

Return type

openclean.function.eval.base.EvalFunction

openclean.function.eval.base.to_const_eval(value)

Ensure that the value is an evaluation function. If the given argument is not an evaluation function the value is wrapped as a constant value.

Parameters

value (openclean.function.eval.base.EvalFunction or scalar) – Value that is represented as an evaluation function.

Returns

Return type

openclean.function.eval.base.EvalFunction

openclean.function.eval.base.to_eval(producers: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, float, datetime.datetime, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, float, datetime.datetime]]], factory: Optional[Callable] = <function to_column_eval>)List[openclean.function.eval.base.EvalFunction]

Convert a single input column or a list of input column into a list of evaluation functions. The optional factory function (cls) is used to create instances of an evaluation function for scalar argument values.

Parameters
  • producers (int, string, EvaluationFunction, or list) – Specification of one or more input producers for an evaluation function.

  • factory (callable) – Factory for evaluation functions that can be instantiated using a single scalar argument (e.g., Col or Const).

Returns

Return type

list

openclean.function.eval.datatype module

Predicates that test whether a given value (or list of values) matches a given data type constraint.

class openclean.function.eval.datatype.Bool(columns, default_value=None, raise_error=False)

Bases: openclean.function.eval.base.Eval

Convert a given value to bool.

class openclean.function.eval.datatype.Datetime(columns, default_value=None, raise_error=False)

Bases: openclean.function.eval.base.Eval

Convert a given value to datetime. Raises an error if the given value cannot be converted to datetime and the raise error flag is True. If the flag is False, a given default value will be returned for thoses values that cannot be converted to datetime.

class openclean.function.eval.datatype.Float(columns, default_value=None, raise_error=False)

Bases: openclean.function.eval.base.Eval

Convert a given value to float. Raises an error if the given value cannot be converted to float and the raise error flag is True. If the flag is False, a given default value will be returned for thoses values that cannot be converted to float.

class openclean.function.eval.datatype.Int(columns, default_value=None, raise_error=False)

Bases: openclean.function.eval.base.Eval

Convert a given value to integer. Raises an error if the given value cannot be converted to integer and the raise error flag is True. If the flag is False, a given default value will be returned for thoses values that cannot be converted to integer.

class openclean.function.eval.datatype.IsDatetime(columns, formats=None, typecast=True)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row are of type date or can be converted to a date. For value lists the for all flag determines whether all values have to be dates or at least one.

class openclean.function.eval.datatype.IsFloat(columns, typecast=True)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row are of type float or can be converted to a float value. For value lists the for all flag determines whether all values have to be floats or at least one.

class openclean.function.eval.datatype.IsInt(columns, typecast=True)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row are of type integer or can be converted to an integer. For value lists the for all flag determines whether all values have to be integer or at least one.

class openclean.function.eval.datatype.IsNaN(columns)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row are of the special type NaN (not a number).

class openclean.function.eval.datatype.Str(columns)

Bases: openclean.function.eval.base.Eval

Convert a given value to string.

openclean.function.eval.domain module

Predicates that test for containment of column values in value sets.

class openclean.function.eval.domain.IsIn(columns, domain, ignore_case=False)

Bases: openclean.function.eval.base.Eval

Boolean predicate to tests whether a value (or list of values) belong(s) to a domain of known values.

class openclean.function.eval.domain.IsNotIn(columns, domain, ignore_case=False)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a value (or list of values) dos not belong to a domain of knwon values.

class openclean.function.eval.domain.Lookup(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], mapping: Dict, default: Optional[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]]] = None)

Bases: openclean.function.eval.base.EvalFunction

A Lookup table is a mapping function. For a given lookup value the result is the mapped value from a given dictionary if a mapping exists. Otherwise, the returned value is generated from a default value function. If the default value function is not defined then the input value is returned as the result.

The aim of having default as a evaluation function is to enable lookups of values in one column using an incomplete lookup table but updating the values a separate column (other than the lookup column). In this case, the lookup value is not the default value.

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Evaluate the consumer on the lists of values that are generated by the referenced columns.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

pd.Series or list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Prepare the evaluation function to be able to process rows in a data stream. This method is called before streaming starts to inform the function about the schema of the rows in the data stream.

Prepare is expected to return a callable that accepts a single data stream row as input and that returns a single value (if the function operates on a single column) or a tuple of values (for functions that operate over multiple columns).

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

openclean.function.eval.list module

Base classes for value generating functions. Evaluation functions are applied to tuples (series) in a dataset (data frame). Functions are expected to return either a scalar value or a tuple of scalar values.

class openclean.function.eval.list.Get(columns, pos)

Bases: openclean.function.eval.base.Eval

Get value at a given index position from a list of values.

class openclean.function.eval.list.List(columns, positions)

Bases: openclean.function.eval.base.Eval

Extract list of values at a given index positions from an input list of values.

openclean.function.eval.logic module

Implementation of basic logic operators as evaluation function predicates for data frame rows.

class openclean.function.eval.logic.And(*args)

Bases: openclean.function.eval.base.Eval

Logical conjunction of predicates.

class openclean.function.eval.logic.Not(predicate)

Bases: openclean.function.eval.base.Eval

Logical negation of a predicate(s).

class openclean.function.eval.logic.Or(*args)

Bases: openclean.function.eval.base.Eval

Logical disjunction of predicates.

openclean.function.eval.mapping module

Evaluation functions that wrap mapping functions.

class openclean.function.eval.mapping.Standardize(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], mapping: Dict)

Bases: openclean.function.eval.base.EvalFunction

Use a mapping dictionary to standardize values from one or more input column. For a given value that is extracted from the input column(s), if a mapping is defined in the dictionary the mapped value is returned. For all other values the original value is returned.

openclean.function.eval.normalize module

Normalize values in a data frame column.

class openclean.function.eval.normalize.DivideByTotal(columns, raise_error=True, default_value=<function scalar_pass_through>)

Bases: openclean.function.eval.normalize.Normalize

Divide values in a list by the sum over all values.

class openclean.function.eval.normalize.MaxAbsScale(columns, raise_error=True, default_value=<function scalar_pass_through>)

Bases: openclean.function.eval.normalize.Normalize

Divided values in a list by the absolute maximum over all values.

class openclean.function.eval.normalize.MinMaxScale(columns, raise_error=True, default_value=<function scalar_pass_through>)

Bases: openclean.function.eval.normalize.Normalize

Normalize values in a list using min-max feature scaling.

class openclean.function.eval.normalize.Normalize(columns, normalizer)

Bases: openclean.function.eval.base.Eval

Normalization function for values in a data frame column.

openclean.function.eval.null module

Predicates that test whether a given value (or list of values) is empty. A value is defined as empty if it is None or the empty string.

class openclean.function.eval.null.IsEmpty(columns, ignore_whitespace=False)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values extracted from data frame cplumns is None or the empty string.

For any value that is not a string and not None the result should always be False.

class openclean.function.eval.null.IsNotEmpty(columns, ignore_whitespace=False)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from cells in a data frame row are not None or the empty string.

For any value that is not a string and not None the result should always be True.

openclean.function.eval.random module

Eval function for random number generator.

class openclean.function.eval.random.Rand(seed: Optional[int] = None)

Bases: openclean.function.eval.base.EvalFunction

Evaluation function that returns a random number in the interval [0, 1). This function can for example be used to randomly select rows in a data frame using a probability threshold.

eval(df: pandas.core.frame.DataFrame)List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Return a list of random numbers in the interval [0, 1).

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

The prepare method returns a callable that returns a random number for evary input row.

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

openclean.function.eval.regex module

Predicates that test whether a given value (or list of values) match a regular expression.

class openclean.function.eval.regex.IsMatch(columns, pattern, fullmatch=False, as_string=True, for_all=True)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row match a regular expression. For value lists the for all flag determines whether all values have to match the expression or at least one of them.

class openclean.function.eval.regex.IsNotMatch(columns, pattern, fullmatch=False, as_string=True, for_all=True)

Bases: openclean.function.eval.base.Eval

Boolean predicate that tests whether a given value or list of values from a data frame row don’t match a regular expression. For value lists the for all flag determines whether all values have to match the expression or at least one of them.

openclean.function.eval.row module

Collection of evaluation functions that compute a result over a list of values that are extracted for data frame rows.

class openclean.function.eval.row.Greatest(*args)

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the maximum value for a list of values from different cells in a data frame row.

class openclean.function.eval.row.Least(*args)

Bases: openclean.function.eval.base.Eval

Evaluation function that returns the minimum of values for one or more columns in a data frame as the result value for all columns in the data frame.

openclean.function.eval.text module

Collection of evaluation functions that operate on string values.

class openclean.function.eval.text.Capitalize(columns, as_string=False)

Bases: openclean.function.eval.base.Eval

String function that capitalizes the first letter in argument values.

class openclean.function.eval.text.Concat(columns, delimiter, as_string=False)

Bases: openclean.function.eval.base.Eval

String function that concats a string using a given delimiter.

class openclean.function.eval.text.EndsWith(columns: Union[int, str, List[Union[str, int]]], prefix: str, as_string: Optional[bool] = False)

Bases: openclean.function.eval.base.Eval

String predicate that checks if a column value ends with a given prefix string.

class openclean.function.eval.text.Format(template, *args)

Bases: openclean.function.eval.base.Eval

Function that returns a formated string based on a given format template and a variable list of input values from a data frame row.

class openclean.function.eval.text.Length(columns, as_string=False)

Bases: openclean.function.eval.base.Eval

String function that returns the length (i.e., nunumber of characters) for a given value.

class openclean.function.eval.text.Lower(columns, as_string=False)

Bases: openclean.function.eval.base.Eval

String function that converts argument values to lower case.

class openclean.function.eval.text.StartsWith(columns: Union[int, str, List[Union[str, int]]], prefix: str, as_string: Optional[bool] = False)

Bases: openclean.function.eval.base.Eval

String predicate that checks if a column value starts with a given prefix string.

class openclean.function.eval.text.StringFunction(func, as_string=False, unpack_list=False)

Bases: object

Evaluate a given string function on a given scalar value. This class is a wrapper for common string functions that (i) allows to defined behavior for arguments that are not strings, and (ii) pass the modified value on to a wrapped function to compute the final result.

class openclean.function.eval.text.Upper(columns, as_string=False)

Bases: openclean.function.eval.base.Eval

String function that converts argument values to upper case.

openclean.function.matching package
Submodules
openclean.function.matching.base module

Base classes and types for string matching functions.

class openclean.function.matching.base.DefaultStringMatcher(vocabulary: Iterable[str], similarity: openclean.function.matching.base.StringSimilarity, best_matches_only: Optional[bool] = True, no_match_threshold: Optional[float] = 0.0, cache_results: Optional[bool] = True)

Bases: openclean.function.matching.base.StringMatcher

Default implementation for the string matcher. This is a simple implementation that naively computes the similarity between a query string and every string in the associated vocabulary by letting the string similarity object deal with the vocabulary directly.

The default matcher allows the user to control the list of returned matches via two configuration parameters:

  • best_matches_only: If this flag is True only those matches that have the highest score will be returned in the result. If the flag is True all matches with a score greater than 0 (or the no_match_threshold, see below) are returned.

  • no_match_threshold: Score threshold that controls when a similarity score is considered a non-match.

By default, the vocabulary matcher caches the results for found matches to avoid computing matches for the same query value twice. Caching can be disabled using the cache_results flag.

find_matches(query: str)List[openclean.data.mapping.StringMatch]

Find matches for a given query string in the associated vocabulary. Depending on the implementation the result may contain more than one matched string from the vocabulary. Each match is a pair of matched values and match score.

If no matches are found for a given query string the result is an empty list.

Parameters

query (string) – Query string for which matches are returned.

Returns

Return type

list of openclean.data.mapping.StringMatch

class openclean.function.matching.base.ExactSimilarity(transformer: Optional[Callable] = <function scalar_pass_through>, ignore_case: Optional[bool] = False)

Bases: openclean.function.matching.base.StringSimilarity

Implementation of the string similarity class that performs exact matches for string arguments. Allows to transform values before comparing them using a simple callable function that expects a single argument.

The returned score is one for identical string and 0 for non-identical strings. The ignore_case flag allows to compare two strings ignoring their case.

match(vocabulary: Iterable[str], query: str)List[openclean.data.mapping.StringMatch]

Cross reference query with the vocabulary strings for equality. Returns an exact match if the given arguments are the same and a NoMatch otherwise.

Parameters
  • vocabulary (Iterable[str]) – List of strings to compare with.

  • query (string) – Second argument for similarity score computation - the query term.

Returns

Return type

list of openclean.data.mapping.StringMatch

class openclean.function.matching.base.StringMatcher(terms: Iterable[str])

Bases: object

Abstract base class for functions that find matches for a query string in a given vocabulary (iterable of strings). Instances of this class are associated with a vocabulary. They return one or more matches from that vocabulary for a given query string.

abstract find_matches(query: str)List[openclean.data.mapping.StringMatch]

Find matches for a given query string in the associated vocabulary. Depending on the implementation the result may contain more than one matched string from the vocabulary. Each match is a pair of matched values and match score.

Matches are sorted by decreasing similarity score. If no matches are found for a given query string the result is an empty list.

Parameters

query (string) – Query string for which matches are returned.

Returns

Return type

list of (string, float) pairs

matched_values(query: str)List[str]

Get only a list of matched values for a given query string. Excludes information about the match scores.

Parameters

query (string) – Query string for which matches are returned.

Returns

Return type

list of string

class openclean.function.matching.base.StringSimilarity

Bases: object

Abstract base class for functions that compute similarity scores between a list of terms and a query string and return a list of StringMatch results. String similarity scores should be values in the interval [0-1] where 0 indicates no match and 1 indicates an exact match.

abstract match(vocabulary: Iterable[str], query: str)List[openclean.data.mapping.StringMatch]

Compute a similarity score for a string against items from a vocabulary iterable. A score of 1 indicates an exact match. A score of 0 indicates a no match.

Parameters
  • vocabulary (Iterable[str]) – List of strings to compare with.

  • query (string) – Second argument for similarity score computation - the query term.

Returns

Return type

list of openclean.data.mapping.StringMatch

score(vocabulary: Iterable[str], query: str)List[openclean.data.mapping.StringMatch]

Synonym for the match function. Compute a similarity score for a string against items from a vocabulary iterable. A score of 1 indicates an exact match. A score of 0 indicates a no match.

Parameters
  • vocabulary (Iterable[str]) – List of strings to compare with.

  • query (string) – Second argument for similarity score computation - the query term.

Returns

Return type

list of openclean.data.mapping.StringMatch

openclean.function.matching.base.best_matches(values: Iterable[str], matcher: openclean.function.matching.base.StringMatcher, include_vocab: Optional[bool] = False)openclean.data.mapping.Mapping

Generate a mapping of best matches for a list of values. For each value in the given list the best matches with a given vocabulary are computed and added to the returned mapping.

If the include_vocab flag is False the resulting mapping will contain a mapping only for those values in the input list that do not already occur in the vocabulary, i.e., the unknown values with respect to the known vocabulary.

Parameters
  • values (iterable of strings) – List of terms (e.g., from a data frame column) for which matches are computed for the returned mapping.

  • matcher (openclean.function.matching.base.StringMatcher) – Matcher to compute matches for the terms in a controlled vocabulary.

  • include_vocab (bool, default=False) – If this flag is False the resulting mapping will only contain matches for terms that are not in the vocabulary that is associated with the given similarity.

Returns

Return type

openclean.data.mapping.Mapping

openclean.function.matching.fuzzy module

Fuzzy Approximate String Matching

class openclean.function.matching.fuzzy.FuzzySimilarity(vocabulary: Optional[Iterable[str]] = None, gram_size_lower: Optional[int] = 2, gram_size_upper: Optional[int] = 3, use_levenshtein: Optional[bool] = True, rel_sim_cutoff: Optional[float] = 1.0)

Bases: openclean.function.matching.base.StringSimilarity

FuzzySet implementation for the String Similarity class. This is a simple implementation that uses fuzzy string comparisons to do approximate string matching operations against the provided vocabulary.

Note: it converts everything to lowercase and removes all punctuation except commas and spaces.

add(value: str)

Create ngrams from a vocabulary word, calculate L2 norm and store values in in the internal dictionaries

the steps are as such: - n grams are computed. e.g. tokyo -> -tokyo- (add start+end chars) -> -t, to, ok, ky, yo, o- (2grams) - 2 and 3 gram frequencies counted and norms calculated using it. - the norms along with words are stored in self.items for all words in the vocab - the ngrams along with frequencies are in self.match_dict - exact_set stores the lowercased entry:original in a dict and returns

Parameters

value (str) – The vocabulary word to include

compute(value: str, gram_size: int)List[Tuple[float, str]]

Computes the ngrams from the query string and calculates distances with the vocabulary words to return matches with similarity greater than the threshold.

Parameters
  • value (str) – the query string

  • gram_size (int) – the n in n-gram

Returns

Return type

List[Tuple[float, str]]

match(vocabulary: Iterable[str], query: str)List[openclean.data.mapping.StringMatch]

Compute a fuzzy similarity score for a string against items from a vocabulary iterable.

Parameters
  • vocabulary (Iterable[str]) – List of strings to compare with.

  • query (string) – Second argument for similarity score computation - the query term.

Returns

Return type

list of openclean.data.mapping.StringMatch

search(key: str, default: Union[None, Tuple[float, str]] = None)List[Tuple[float, str]]

searches for the key for matches or returns the default value

Parameters
  • key (str) – the query string

  • default (Optional[None, Tuple[float, str]], default = None) – the default value to return if match not found

openclean.function.matching.fuzzy.gram_counter(value: str, gram_size: int = 2)dict

Counts the ngrams and their frequency from the given value

Parameters
  • value (str) – The string to compute the n-grams from

  • gram_size (int, default= 2) – The n in the n-gram

Returns

Return type

dict

openclean.function.matching.fuzzy.gram_iterator(value: str, gram_size: int = 2)

Iterates and yields all the ngrams from the given value

Parameters
  • value (str) – The string to compute the n-grams from

  • gram_size (int, default= 2) – The n in the n-gram

openclean.function.matching.tests module

Collection of helper classes and functions for unit tests of different matcher classes.

class openclean.function.matching.tests.DummyMatcher(matches: List[openclean.data.mapping.StringMatch])

Bases: openclean.function.matching.base.StringSimilarity

Dummy string similarity that returns a list of matches that is initialized when the object is constructed.

match(vocabulary: Iterable[str], query: str)List[openclean.data.mapping.StringMatch]

Returns the list of matches that was initialized when the object was constructed.

Parameters
  • vocabulary (Iterable[str]) – List of strings to compare with.

  • query (string) – Second argument for similarity score computation - the query term.

Returns

Return type

list of openclean.data.mapping.StringMatch

openclean.function.similarity package
Submodules
openclean.function.similarity.base module

Base classes for similarity functions and similarity constraints.

class openclean.function.similarity.base.SimilarityConstraint(func: openclean.function.similarity.base.SimilarityFunction, pred: Callable)

Bases: object

Function that validates a constraint, e.g., a threshold predicate, on the similarity between two values (scalar or tuples).

This class is a simple wrapper around a similarity function and a predicate that is evaluated on the similarity score for a given pair of values.

is_satisfied(val_1: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], val_2: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Test if a given pair of values satisfies the similarity constraint.

Returns True if the similarity between val_1` and val_2 satisfies the constraint (e.g., a given trheshold).

Parameters
  • val_1 (scalar or tuple) –

  • val_2 (scalar or tuple) –

Returns

Return type

bool

class openclean.function.similarity.base.SimilarityFunction

Bases: object

Mixin class for functions that compute the similarity between two values (scalar or tuples). Primarily useful for string similarity.

Similarity results are float values in the interval [0-1] where 0 is the minimal similarity between two values and 1 is the maximal similarity.

abstract sim(val_1: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], val_2: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])float

Compute similarity between between two values.

The result is in the interval [0-1] where 0 is the minimal similarity between two values and 1 is the maximal similarity.

Parameters
  • val_1 (scalar or tuple) –

  • val_2 (scalar or tuple) –

Returns

Return type

float

openclean.function.similarity.text module

Collection of string similarity functions.

class openclean.function.similarity.text.DamerauLevenshteinDistance

Bases: openclean.function.similarity.text.NormalizedEditDistance

String similarity function that is based on the Damerau-Levenshtein distance between two strings.

class openclean.function.similarity.text.HammingDistance

Bases: openclean.function.similarity.text.NormalizedEditDistance

String similarity function that is based on the Hamming distance between two strings.

class openclean.function.similarity.text.JaroSimilarity

Bases: openclean.function.similarity.text.StringSimilarityFunction

String similarity function that is based on the Jaro similarity between two strings.

class openclean.function.similarity.text.JaroWinklerSimilarity

Bases: openclean.function.similarity.text.StringSimilarityFunction

String similarity function that is based on the Jaro-Winkler distance between two strings.

class openclean.function.similarity.text.LevenshteinDistance

Bases: openclean.function.similarity.text.NormalizedEditDistance

String similarity function that is based on the Levenshtein distance between two strings.

class openclean.function.similarity.text.MatchRatingComparison

Bases: openclean.function.similarity.base.SimilarityFunction

String similarity function that is based on the match rating algorithm that returns True if two strings are considered equivalent and False otherwise.

To return a value in the interval of [0-1] a match rating result of True is translated to 1 and the result False is translated to 0.

sim(val_1: str, val_2: str)float

Use Match rating approach to compare the given strings.

Returns 1 if the match rating algorithm coniders the given strings as equivalent and 0 otherwise.

Parameters
  • val_1 (string) – Value 1

  • val_2 (string) – Value 2

Returns

Return type

float

class openclean.function.similarity.text.NormalizedEditDistance(func: Callable)

Bases: openclean.function.similarity.base.SimilarityFunction

String similarity function that is based on functions that compute an edit distance between a pair of strings.

The similarity for a pair of strings based on edit distance is the defined as (1 - normalized distance).

sim(val_1: str, val_2: str)float

Calculates the edit distance between two strings and returns the similarity between them as (1 - normalized distance). The normalized distance is the edit distance divided by the length of the longer of the two strings.

Parameters
  • val_1 (string) – Value 1

  • val_2 (string) – Value 2

Returns

Return type

float

class openclean.function.similarity.text.StringSimilarityFunction(func: Callable)

Bases: openclean.function.similarity.base.SimilarityFunction

Wrapper for existing string similarity functions that compute the similarity between a pair of strings as a float in the interval [0-1].

sim(val_1: str, val_2: str)float

Calculate the similarity beween the given pair of strings.

Parameters
  • val_1 (string) – Value 1

  • val_2 (string) – Value 2

Returns

Return type

float

openclean.function.token package
Submodules
openclean.function.token.base module

Interfaces for string tokenizer and token set transformers.

class openclean.function.token.base.CapitalizeTokens

Bases: openclean.function.token.base.UpdateTokens

Capitalize all tokens in a given list.

class openclean.function.token.base.LowerTokens

Bases: openclean.function.token.base.UpdateTokens

Convert all tokens in a given list to lower case.

class openclean.function.token.base.ReverseTokens

Bases: openclean.function.token.base.TokenTransformer

Reverse a given list of string tokens.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Return a reversed copy of the token list.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.SortTokens(key: Optional[Callable] = None, reverse: Optional[bool] = False)

Bases: openclean.function.token.base.TokenTransformer

Sort a given token list in ascending or descending order.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns a sorted copy of the tken list.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.StandardizeTokens(mapping: Union[Dict, openclean.function.value.mapping.Standardize])

Bases: openclean.function.token.base.UpdateTokens

Standardize tokens in a given list using a stamdardization mapping.

class openclean.function.token.base.Token(value: str, token_type: Optional[str] = None, rowidx: Optional[int] = None)

Bases: str

Tokens are strings that have an optional (semantic) type label.

The values for type labels are not constraint. It is good practice, to use all upper case values for token types. The default token type is ‘ANY’.

This implementation is based on: https://bytes.com/topic/python/answers/32098-my-experiences-subclassing-string

The order of creation is that the __new__ method is called which returns the object then __init__ is called.

property regex_type: str

Synonym for getting the token type.

Returns

Return type

str

property size: int

Synonym to get the length of the token.

Returns

Return type

int

to_tuple()Tuple[str, str, int]

Returns a tuple of the string, type and value size.

Returns

Return type

tuple of string, string, int

type()str

Get token type value.

This is a wrapper around the token_type property. Returns the default token type ‘ANY’ if no type was given when the object was created.

Returns

Return type

string

property value: str

Get the value for this token.

Returns

Return type

str

class openclean.function.token.base.TokenPrefix(length: int)

Bases: openclean.function.token.base.TokenTransformer

Return a list that is a prefix for a given list. The returned list are a prefix for a given input of maximal length N (where N is a user-defined parameter). Input lists that have fewer elementes than N are returned as is.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Return a list that contains the first N elements of the input list, where N is the length parameter defined during initialization. If the input list does not have more than N elements the input is returned as it is.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.TokenTransformer

Bases: object

The token transformer manipulates a list of string tokens. Manipulations may include removing tokens from an input list, rearranging tokens or even adding new tokens to the list. Defines a single transform method that takes a list of strings as input and returns a (modified) list of strings.

abstract transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Transform a list of string tokens. Returns a modified copy of the input list of tokens.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.TokenTransformerPipeline(transformers: List[openclean.function.token.base.TokenTransformer])

Bases: openclean.function.token.base.TokenTransformer

Sequnce of token transformers that are applied on a given input list of string tokens.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Transform a list of string tokens. Applies the transformers in the pipeline sequentially on the output of the respective successor in the pipeline.

Parameters

tokens (list of string) – List of string openclean.function.token.base.Token.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.Tokenizer

Bases: object

Interface for string tokenizer. A string tokenizer should be able to handle any scalar value (e.g., by first transforming numeric values into a string representation). The tokenizer returns a list of token objects.

encode(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])List[List[openclean.function.token.base.Token]]

Encodes all values in a given column (i.e., list of values) into their type representations and tokenizes each value.

Parameters

values (list of scalar) – List of column values

Returns

Return type

list of list of openclean.function.token.base.Token

abstract tokens(value: Union[int, float, str, datetime.datetime], rowidx: Optional[int] = None)List[openclean.function.token.base.Token]

Convert a given scalar values into a list of string tokens. If a given value cannot be converted into tokens None should be returned.

The order of tokens in the returned list not necissarily corresponds to their order in the original value. This is implementation dependent.

Parameters
  • value (scalar) – Value that is converted into a list of tokens.

  • rowidx (int, default=None) – Optional index of the dataset row that the value originates from.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.Tokens(tokenizer: openclean.function.token.base.Tokenizer, transformer: Optional[Union[List[openclean.function.token.base.TokenTransformer], openclean.function.token.base.TokenTransformer]] = None, delim: Optional[str] = '', sort: Optional[bool] = False, reverse: Optional[bool] = False, unique: Optional[bool] = False)

Bases: openclean.function.value.base.PreparedFunction, openclean.function.token.base.Tokenizer

The default tokenizer is a simple wrapper around a given tokenizer and an (optional) token transformer that is applied on the output of the given tokenizer.

This class provides to functionality to easily add default transformations to the generated token lists.

The default tokenizer also extends the ValueFunction class to provide functionality to concatenate the generated token list to a token key string.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])str

Tokenize a given value and return a concatenated string of the resulting tokens.

Parameters

value (scalar or tuple) – Input value that is tokenized and concatenated.

Returns

Return type

string

tokens(value: Union[int, float, str, datetime.datetime], rowidx: Optional[int] = None)List[openclean.function.token.base.Token]

Tokenize the given value using the associated tokenizer. Then modify the tokens with the optional token transformer.

Parameters
  • value (scalar) – Value that is converted into a list of tokens.

  • rowidx (int, default=None) – Optional index of the dataset row that the value originates from.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.UniqueTokens

Bases: openclean.function.token.base.TokenTransformer

Remove duplicate tokens to return a list of unique tokens.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns a list of unique tokens from the input list.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.UpdateTokens(func: Union[Callable, openclean.function.value.base.ValueFunction])

Bases: openclean.function.token.base.TokenTransformer

Update tokens by applying a value function to each of them.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns the list of tokens that results from applying the associated value function of each of the tokens in the input list.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.base.UpperTokens

Bases: openclean.function.token.base.UpdateTokens

Convert all tokens in a given list to upper case.

openclean.function.token.convert module

Converter for tokens that allows to change the value of a token and/or the token type.

class openclean.function.token.convert.TokenConverter

Bases: openclean.function.token.base.TokenTransformer

Interface for token convertrs that change token values and/or token types. The converter interface consist of two methods: the contains method checks whether the converter accepts a given token for conversion, and the convert method converts the token if it is accepted by he converter.

abstract contains(token: openclean.function.token.base.Token)bool

Test if the converter contains a conversion rule for the given token.

Parameters

token (openclean.function.token.base.Token) – Token that is tested for acceptance by this converter.

Returns

Return type

bool

abstract convert(token: openclean.function.token.base.Token)openclean.function.token.base.Token

Convert the given token according to the conversion ruls that are implemented by the converter.

Returns a modified token.

Parameters

token (openclean.function.token.base.Token) – Token that is converted.

Returns

Return type

openclean.function.token.base.Token

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Convert accpeted token in a given list of tokens.

For each token in the given list, if the converter accepts the token it is transformed. Otherwise, the original token is added to the resulting token list.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.convert.TokenListConverter(converters: List[openclean.function.token.convert.TokenConverter])

Bases: openclean.function.token.base.TokenTransformer

Converter for a list of tokens. Implements the token transformer mixin interface. Uses a list of converters to convert tokens i a given list. The first converter that accepts a token in the list is used to transform the token.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Transform a list of tokens.

For each token in the given list, the initialized converters are used in given order. The first converter that accepts the token is used to convert it. If no converter accepts the token it is added to the result without changes.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.convert.TokenMapper(label: str, lookup: Union[Dict, Set])

Bases: openclean.function.token.convert.TokenConverter

Converter for tokens that uses a lookup table to map a given token to a new token value and a new token type. This class is used for example to standardize tokens for a semantic type.

contains(token: openclean.function.token.base.Token)bool

Test if the given token is contained in the lookup table.

Parameters

token (openclean.function.token.base.Token) – Token that is tested for acceptance by this converter.

Returns

Return type

bool

convert(token: openclean.function.token.base.Token)openclean.function.token.base.Token

Replace the given token with the respective value in the lookup table and the converter token type.

Returns a modified token.

Parameters

token (openclean.function.token.base.Token) – Token that is converted.

Returns

Return type

openclean.function.token.base.Token

openclean.function.token.filter module

Collection of functions to filter (remove) tokens from given token lists.

class openclean.function.token.filter.FirstLastFilter

Bases: openclean.function.token.base.TokenTransformer

Return a list that only contains the first and last element in a token list.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Return a list that contains the first and last element from the input list. If the input is empty the result is empty as well.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.filter.MinMaxFilter

Bases: openclean.function.token.base.TokenTransformerPipeline

Filter that returns the minimum and maximum token in a given list. This filter is implemented as a pipeline that first sorts the tokens and then returns the first and last token from the sorted list.

class openclean.function.token.filter.RepeatedTokenFilter

Bases: openclean.function.token.base.TokenTransformer

Remove consecutive identical tokens in a given sequence.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns a list where no two consecutive tokens are identical.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.filter.TokenFilter(predicate: openclean.function.value.base.ValueFunction)

Bases: openclean.function.token.base.TokenTransformer

Filter tokens based on a given predicate.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns a list that contains only those tokens that satisfy the filter condition defined by the associated predicate.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.filter.TokenTypeFilter(types: Set[str], negated: Optional[bool] = False)

Bases: openclean.function.token.base.TokenTransformer

Filter tokens in a given list by their type.

transform(tokens: List[openclean.function.token.base.Token])List[openclean.function.token.base.Token]

Returns a list that contains only those tokens that satisfy the filter condition defined by the associated predicate.

Parameters

tokens (list of openclean.function.token.base.Token) – List of string tokens.

Returns

Return type

list of openclean.function.token.base.Token

openclean.function.token.ngram module

String tokenizer that returns a list of n-grams. A n-gram in this case is a substring of length n.

class openclean.function.token.ngram.NGrams(n: int, pleft: Optional[str] = None, pright: Optional[str] = None)

Bases: openclean.function.token.base.Tokenizer

Split values into lists of n-grams. n-grams are substrings of length n. Provides the option to pad stings with special characters to the left and right before computing n-grams. That is, if a left (right) padding character is given (e.g. $), a string containing n-1 padding characters will be added to the left (right) of a given string before n-gams are computer.

If no padding is specified (default) the value is split into n-grams as is. If the string does not contain more than n characters the string is returned as is.

tokens(value: Union[int, float, str, datetime.datetime], rowidx: Optional[int] = None)List[openclean.function.token.base.Token]

Convert a given scalar values into a list of n-grams. If the value length is not greater than n and no padding was specified, the returned list will only contain the given value.

Parameters
  • value (scalar) – Value that is converted into a list of n-grams.

  • rowidx (int, default=None) – Optional index of the dataset row that the value originates from.

Returns

Return type

list of openclean.function.token.base.Token

openclean.function.token.split module

String tokenizer that is a wrapper around the string split method.

class openclean.function.token.split.ChartypeSplit(chartypes: Optional[List[Tuple[Callable, str]]] = None)

Bases: openclean.function.token.base.Tokenizer

Split values basesd of a list of character type functions. That is, a value that contains characters of different types, e.g., W35ST, will be split into tokens with homogeneous character type, e.g., [‘W’, ‘35’, ‘ST’].

The type of a character is determined by a classifier that is given as a list of Boolean predicates, i.e., callables that accept a single character and that return True if the charcter belongs to the type that the function represents or False otherwise. With each classifier a token type label is associated that is assigned to the generated token. If a token does not match any of the given classifier the default token type is returned.

get_type(c: str)str

The type of a character is the label that is associated with the first type predicate that returns True.

If no predicate evaluates to True for a given value None is returned.

Parameters

c (string) – Expects a single character string.

Returns

Return type

int

tokens(value: Union[int, float, str, datetime.datetime], rowidx: Optional[int] = None)List[openclean.function.token.base.Token]

Convert a given scalar values into a list of string tokens. If a given value cannot be converted into tokens None should be returned.

The order of tokens in the returned list not necissarily corresponds to their order in the original value. This is implementation dependent.

Parameters
  • value (scalar) – Value that is converted into a list of tokens.

  • rowidx (int, default=None) – Optional index of the dataset row that the value originates from.

Returns

Return type

list of openclean.function.token.base.Token

class openclean.function.token.split.Split(pattern: str, sort: Optional[bool] = False, reverse: Optional[bool] = False, unique: Optional[bool] = False, preproc: Optional[Callable] = None, subtokens: Optional[openclean.function.token.base.Tokenizer] = None)

Bases: openclean.function.token.base.Tokenizer

String tokenizer that is a wrapper around the regular expression split method. Defines a extra parameters to (a) pre-process a given value and (b) modify the generated token lists.

The split operator allows to further split tokens that are generated by the standard split function using a nested string tokenizer.

tokens(value: Union[int, float, str, datetime.datetime], rowidx: Optional[int] = None)List[openclean.function.token.base.Token]

Convert a given scalar values into a list of string tokens. If a given value cannot be converted into tokens None should be returned.

The order of tokens in the returned list not necissarily corresponds to their order in the original value. This is implementation dependent.

Parameters
  • value (scalar) – Value that is converted into a list of tokens.

  • rowidx (int, default=None) – Optional index of the dataset row that the value originates from.

Returns

Return type

list of openclean.function.token.base.Token

openclean.function.value package
Subpackages
openclean.function.value.key package
Submodules
openclean.function.value.key.fingerprint module

Collection of token key functions. These functions are used to generate keys for input values from intermediate token lists. The classes resemble similar functionality as found in OpenRefine:

https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth

class openclean.function.value.key.fingerprint.Fingerprint(tokenizer: Optional[openclean.function.token.base.Tokenizer] = None, normalizer: Optional[Callable] = None)

Bases: openclean.function.value.base.PreparedFunction

Fingerprint key generator that is adopted from OpenRefine: http://github.com/OpenRefine/OpenRefine/blob/master/main/src/com/google/refine/clustering/binning/FingerprintKeyer.java

The main difference here is that we allow the user to provide their custom tokenizer and normalization functions. The steps for creating the key are similar to those explaind in: https://github.com/OpenRefine/OpenRefine/wiki/Clustering-In-Depth

  1. remove leading and trailing whitespace

  2. convert string to lower case

  3. Normalize string by removing punctuation and control characters and replacing non-diacritic characters (if the default normalizer is used).

  4. Tokenize string by splitting on whitespace characters. Then sort the tokens and remove duplicates (if the default tokenizer is used).

  5. Concatenate remaining (sorted) tokens using a single space character as the delimiter.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])str

Tokenize a given value and return a concatenated string of the resulting tokens.

Parameters

value (scalar or tuple) – Input value that is tokenized and concatenated.

Returns

Return type

string

class openclean.function.value.key.fingerprint.NGramFingerprint(n: int, pleft: Optional[str] = None, pright: Optional[str] = None, normalizer: Optional[Callable] = None)

Bases: openclean.function.value.key.fingerprint.Fingerprint

Fingerprint key generator that uses an n-gram tokenizer instead of the default tokenizer. This is a shortcut to instantiate the Fingerprint key generator.

openclean.function.value.normalize package

Import normalization functions. Mainly for backward compatibility.

Submodules
openclean.function.value.normalize.numeric module

Collection of functions to normalize numeric values in a list (e.g., a data frame column).

class openclean.function.value.normalize.numeric.DivideByTotal(raise_error=True, default_value=<function scalar_pass_through>, sum=None)

Bases: openclean.function.value.normalize.numeric.NumericNormalizer

Divide values in a list by the sum over all values.

compute(value)

Divide given value by the pre-computed sum over all values in the list. If the sum was zero the result will be zero.

If the given value is not a numeric value either a ValueError is raised if the respective flag is True or the default value is returned.

Parameters

value (scalar) – Scalar value from the list that was used to prepare the function.

Returns

Return type

float

is_prepared()

The function requires preparation if the sum is not set..

Returns

Return type

bool

prepare(values)

Compute the total sum over all values in the given list.

Parameters

values (list) – List of scalar values or tuples of scalar values.

class openclean.function.value.normalize.numeric.MaxAbsScale(raise_error=True, default_value=<function scalar_pass_through>, maximum=None)

Bases: openclean.function.value.normalize.numeric.NumericNormalizer

Divided values in a list by the absolute maximum over all values.

compute(value)

Divide given value by the pre-computed sum over all values in the list. If the sum was zero the result will be zero.

If the given value is not a numeric value either a ValueError is raised if the respective flag is True or the default value is returned.

Parameters

value (scalar) – Scalar value from the list that was used to prepare the function.

Returns

Return type

float

is_prepared()

The function requires preparation if the sum is not set..

Returns

Return type

bool

prepare(values)

Compute the maximum value over all values in the given list.

Parameters

values (list) – List of scalar values or tuples of scalar values.

class openclean.function.value.normalize.numeric.MinMaxScale(raise_error=True, default_value=<function scalar_pass_through>, minimum=None, maximum=None)

Bases: openclean.function.value.normalize.numeric.NumericNormalizer

Normalize values in a list using min-max feature scaling.

compute(value)

Normalize value using min-max feature scaling. If the pre-computed minimum and maximum for the value list are equal the result will be zero.

Parameters

value (scalar) – Scalar value from the list that was used to prepare the function.

Returns

Return type

float

is_prepared()

The function requires preparation if the sum is not set..

Returns

Return type

bool

prepare(values)

Compute the total sum over all values in the givem list.

Parameters

values (list) – List of scalar values or tuples of scalar values.

class openclean.function.value.normalize.numeric.NumericNormalizer(raise_error=True, default_value=<function scalar_pass_through>)

Bases: openclean.function.value.base.ValueFunction

Abstract base class for numeric normalization functions. Implementing classes need to implement the compute and prepare methods.

abstract compute(value)

Individual normalization function that is dependent on the implementing sub-class. At this point it is assumed that the argument value is numeric.

Parameters

value (scalar) – Scalar value from the list that was used to prepare the function.

Returns

Return type

float

eval(value)

Normalize a given value by calling the compute function of the implementing class.

If the given value is not a numeric value either a ValueError is raised if the respective flag is True or the default value is returned.

Parameters

value (scalar) – Scalar value from the list that was used to prepare the function.

Returns

Return type

float

openclean.function.value.normalize.numeric.divide_by_total(values, raise_error=True, default_value=<function scalar_pass_through>)

Divide values in a list by the sum over all values. Values that are not numeric are either replaced with a given default value or an error is raised if the raise error flag is True.

Parameters
  • values (list) – List of scalar values.

  • raise_error (bool, optional) – Raise ValueError if the list contains values that are not integer or float. If False, non-numeric values are ignored.

  • default_value (scalar, tuple, or callable, default=scalar_pass_through) – Value (or function) that is used (evaluated) as substitute for non-numeric values if no error is raised. By default, a value is returned as is.

openclean.function.value.normalize.numeric.max_abs_scale(values, raise_error=True, default_value=<function scalar_pass_through>)

Divide values in a list by the absolute maximum over all values. Values that are not numeric are either replaced with a given default value or an error is raised if the raise error flag is True.

Parameters
  • values (list) – List of scalar values.

  • raise_error (bool, optional) – Raise ValueError if the list contains values that are not integer or float. If False, non-numeric values are ignored.

  • default_value (scalar, tuple, or callable, default=scalar_pass_through) – Value (or function) that is used (evaluated) as substitute for non-numeric values if no error is raised. By default, a value is returned as is.

openclean.function.value.normalize.numeric.min_max_scale(values, raise_error=True, default_value=<function scalar_pass_through>)

Normalize values in a list using min-max feature scaling. Values that are not numeric are either replaced with a given default value or an error is raised if the raise error flag is True.

Parameters
  • values (list) – List of scalar values.

  • raise_error (bool, optional) – Raise ValueError if the list contains values that are not integer or float. If False, non-numeric values are ignored.

  • default_value (scalar, tuple, or callable, default=scalar_pass_through) – Value (or function) that is used (evaluated) as substitute for non-numeric values if no error is raised. By default, a value is returned as is.

openclean.function.value.normalize.text module

Collection of functions to normalize test values.

openclean.function.value.normalize.text.NONDIACRITICS = {'©': 'c', 'ß': 'ss', 'æ': 'ae', 'ð': 'd', 'ø': 'oe', 'þ': 'th', 'đ': 'd', 'ħ': 'h', 'ı': 'i', 'ĸ': 'k', 'ł': 'l', 'ŋ': 'n', 'œ': 'oe', 'ŧ': 't', 'ſ': 's', 'ƿ': 'w', 'ɖ': 'd'}

First characters of unicode character categories that are removed. Currently we remove control characters ‘C’ and punctuation ‘P’.

class openclean.function.value.normalize.text.TextNormalizer(preproc: Optional[Callable] = None)

Bases: openclean.function.value.base.PreparedFunction

Text normalizer that replaces non-diacritic characters, umlauts, accents, etc. with their equivalent ascii character(s).

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])str

Normalize a given value. Converts the value to string if it is not of type string. Then replaces all non-diacritic characters with their equivalent as defined in NONDIACRITICS. The last step is to use the uncide data normalize and encode function to replace umlauts, accents, etc. into their base character.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

string

openclean.function.value.normalize.text.default_preproc(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])str

Default pre-processing for string normalization. Ensures that the given argument is a string. Removes leading and trailing whitespaces, converts characters to lower case, and replaces all (consecutive) whitespaces with a single blank space character.

Parameters

value (scalar or tuple) – INput value that is being prepared for normalization.

Returns

Return type

string

Submodules
openclean.function.value.aggregate module

Value function that selects a value from a given list based on a given aggregator.

class openclean.function.value.aggregate.Longest(tiebreaker: Optional[openclean.function.value.base.ValueFunction] = None)

Bases: openclean.function.value.aggregate.ValueAggregator

Aggregator that selects the longest value from a given list of values.

class openclean.function.value.aggregate.Max

Bases: openclean.function.value.aggregate.ValueAggregator

Aggregator that selects the maximum value from a given list of values.

class openclean.function.value.aggregate.Min

Bases: openclean.function.value.aggregate.ValueAggregator

Aggregator that selects the minimum value from a given list of values.

class openclean.function.value.aggregate.Shortest(tiebreaker: Optional[openclean.function.value.base.ValueFunction] = None)

Bases: openclean.function.value.aggregate.ValueAggregator

Aggregator that selects the shortest value from a given list of values.

class openclean.function.value.aggregate.ValueAggregator(aggr: Callable, feature: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, tiebreaker: Optional[openclean.function.value.base.ValueFunction] = None)

Bases: openclean.function.value.base.UnpreparedFunction

Value function that can be used to select a value from a list based on a given aggregation function. Passes a list of values to an aggregator and returns a constant value function with teh aggregator result. Allows to apply a feature generator on the given values prior to applying the aggregator. If a feature function is given the value that is associated with the selected feature is returned (and not the feature value itself).

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

Evaluate the aggregation function on the given list of values. Returns a constant function for the selected value.

If the feature generator is set, we first generate a feature for each value in the given list. We maintain the set of original values with each feature value. The aggregator is applied on the list of generated feature values and a constant functions for the original value that is associated with the selected feature is returned.

If there is more than one value associated with a selected feature, the tiebreaker function is evaluated on all associated values. If not tiebraker was specified a ValueError is raised.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

openclean.function.value.base.ConstantValue

openclean.function.value.base module

Base class for value function. Collection of basic helper functions.

class openclean.function.value.base.CallableWrapper(func: Callable)

Bases: openclean.function.value.base.PreparedFunction

Wrapper for callable functions as value functions. This value function does not prepare the wrapped callable.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Evaluate the wrapped function on a given value. The value may either be a scalar or a tuple. The return value of the function is dependent on the wrapped function.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

scalar or tuple

class openclean.function.value.base.ConstantValue(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])

Bases: openclean.function.value.base.PreparedFunction

Value function that returns a given constant value for all inputs.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Return the constant result value.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

any

class openclean.function.value.base.CounterConverter(func: Callable)

Bases: openclean.function.value.base.PreparedFunction

Wrapper for callable functions that are appied on items of a value counter.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Evaluate the wrapped function on a given value.

The value is expected to be a tuple (item from a collection.Counter object) that contains a value and its count. The wrapped callable is applied on the value and a tuple with the modified value and the original count is returned.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

scalar or tuple

class openclean.function.value.base.PreparedFunction

Bases: openclean.function.value.base.ValueFunction

Abstract base class for value functions that do not make use of the prepare method. These functions are considered as initialized and ready to operate without the need for calling the prepare method first.

is_prepared()bool

Instances of this class do not need to be further prepared.

Returns

Return type

bool

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

The prepare step is ignored for a wrapped callable.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

class openclean.function.value.base.UnpreparedFunction

Bases: openclean.function.value.base.ValueFunction

Abstract base class for value functions that make use of the prepare method. These functions are expected to return a new instance of a different value function class as the result of the prepare step.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Raise an error if the eval method is called since this indicates that the function has not been prepared.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

scalar or tuple

is_prepared()bool

Returns False because the function required to be prepared.

Returns

Return type

bool

class openclean.function.value.base.ValueFunction

Bases: object

The abstract class for value functions defines the interface for methods that need to be implemented for preparing and evaluating the function.

apply(values: Union[List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter], threads: Optional[int] = None)Union[List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter]

Apply the function to each value in a given set.

Depending on the type of the input, the result is either a list of values that are the result of the eval method for the respective input values or a new counter object where keys are the modified values.

Calls the prepare method before executing the eval method on each individual value in the given list.

Parameters
  • values (list) – List of scalar values or tuples of scalar values.

  • threads (int, default=None) – Number of parallel threads to use for processing. If None the value from the environment variable ‘OPENCLEAN_THREADS’ is used as the default.

Returns

Return type

list

abstract eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Evaluate the function on a given value. The value may either be a scalar or a tuple. The value will be from the list of values that was passed to the object in the prepare call.

The return value of the function is implementation dependent.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

scalar or tuple

abstract is_prepared()bool

Returns True if the prepare method is ignored by an implementation of this function. Containing classes will only call the prepare method for those value functions that are not prepared.

Returns

Return type

bool

map(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])Dict

The map function takes a list of values and outputs a dictionary. The keys in the returned dictionary are the distinct values in the input list. The values that are associated with the keys are the result of applying the eval function of this class on the key value.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

dict

abstract prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

Optional step to prepare the function for a given set of values. This step allows to compute additional statistics over the set of values.

While it is likely that the given set of values represents the values for which the eval() function will be called, this property is not guaranteed.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

openclean.function.value.base.ValueFunction

openclean.function.value.base.extract(values, label, raise_error=True, default_value=None)

Create a flat dictionary from a nested one. The resulting dictionary contains the same keys as the input dictionary. The associated values are the values from the nested dictionaries under the given label.

If a nested value does not contain the given label as key a KeyError is raised if the raise error flag is True. If the flag is False the given default value is used instead.

Parameters
  • values (dict) – Nested dictionary from which the values with the given label are extracted.

  • label (string) – Label of element for which the metadata array is created.

  • raise_error (bool, default=True) – Raise a KeyError if a nested dictionary value does not contain the given label as a key.

  • default_value (any, default=None) – Default value for values that do not contain the the given label as a key.

Returns

Return type

openclean.data,metadata.Feature

Raises

KeyError

openclean.function.value.base.merge(values_1, values_2, labels, join='inner')

Merge two dictionaries. The resulting dictionary will map key values to dictionaries. Each nested dictionary has two elements, representing the values from the respective merged dictionary. The labels for these elements are defined by the labels argument.

The join method allows for four types of merging:

  • inner: Keep only those keys that are in the intersection of both

    dictionaries.

  • outer: Keep all keys from the union of both dictionaries.

  • left-outer: Keep all keys from the first dictionary.

  • right-outer: Keep all keys from the second dictionary.

Raises a ValueError if the number of given labels is not two or if an invalid join method is specified.

Parameters
  • vaues_1 (dict) – Left side of the join.

  • values_2 (dict) – Right side of the join.

  • join (enum['inner', 'outer', 'left-outer', 'right-outer'], default='inner') – Join method identifier.

Returns

Return type

dict

Raises

ValueError

openclean.function.value.base.normalize(values, normalizer, keep_original=False, labels=None)

Normalize frequency counts in a given dictionary. Expects a dictionary where keys are mapped to numeric values. Applies the given normalization function on all values. Returns a dictionary where keys are mapped to the normalized values.

If the keep_original flag is True, the original values are also included in the result. In this case, the keys in the resulting dictionary are mapped to dictionaries with two values. The default key values for the nested dictionary values are ‘absolute’ for the original value and ‘normalized’ for the normalized value. These names can be overridden by providing a list or tuple of labels with exactly two elements.

Parameters
  • values (dict) – Dictionary that maps arbitrary key values to numeric values.

  • normalizer (callable or openclean.function.value.base.ValueFunction,) – default=None Normalization function that will be used to normalize the numeric values in the given dictionary.

  • keep_original (bool, default=False) – If the keep original value is set to True, the resulting dictionary will map key values to dictionaries. Each nested dictionary will have two elements, the original (‘absolute’) value and the normalized value.

  • labels (list or tuple, default=('absolute', 'normalized')) – List or tuple with exactly two elements. The labels will only be used if the keep_original flag is True. The first element is the label for the original value in the returned nested dictionary and the second element is the label for the normalized value.

Returns

Return type

dict

Raises

ValueError

openclean.function.value.base.to_value_function(arg)

Ensure that a given argument is a ValueFunction. If the arg is callable it will be wrapped. Otherwise, a constant value function is returned.

Parameters

arg (any) – Argument that is tested for being a ValueFunction.

Returns

Return type

openclean.function.value.base.ValueFunction

openclean.function.value.classifier module

Base classes to classify for scalar values and to compute summaries over data frames that have class labels assigned to their data rows.

class openclean.function.value.classifier.ClassLabel(predicate, label, truth_value=True, none_label=None)

Bases: openclean.function.value.base.ValueFunction

Classifier for a single type. Assigns a pre-defined class label to values that belong to the type that is represented by the classifier. Type membership is represented by a given predicate. All values that do not satisfy the predicate are assigned a pre-defined non-label.

eval(value)

Evaluate the function on a given value. The value may either be a scalar or a tuple. The value will be from the list of values that was passed to the object in the prepare call.

The return value of the function is implementation dependent.

Parameters

value (scalar or tuple) – Scalar data value that is being classified.

Returns

Return type

scalar or tuple

is_prepared()

Checks if the wrapped predicate requires preparation.

Returns

Return type

bool

prepare(values)

Call the prepare method of the associated predicate.

Parameters

values (list) – List of scalar values or tuples of scalar values.

class openclean.function.value.classifier.ValueClassifier(*args, **kwargs)

Bases: openclean.function.value.base.ValueFunction

The value classifier evaluates a list of predicates or conditions on a given value (scalar or tuple). Each predicate is associated with a class label. The corresponding class label for the first predicate that is satisfied by the value is returned as the classification result. If no predicate is satisfied by a given value the result is either a default label or a ValueError is raised if the raise error flag is set to True.

eval(value)

Evaluate the classifiers on the given value. The classifier are evaluated in the order of their appearance in the list. Returns the associated label for the first predicate that is satisfied (i.e., the classifier returns a label that is not the none label). If none of the classifier predicates is satisfied the result is the default label. If the raise error flag is True an error is raised instead.

Parameters

value (scalar) – Scalar data value that is being classified.

Returns

Return type

scalar

Raises

ValueError

is_prepared()

Returns False if any of the wrapped classifiers needs preparation.

Returns

Return type

bool

prepare(values)

Call the prepare method of the associated classifiers.

Parameters

values (list) – List of scalar values or tuples of scalar values.

openclean.function.value.cond module

The mapping operator that returns a dictionary that contains a mapping of original values in a data frame column(s) to results of applying a given value function on them.

Lookup functions represent mappings using dictionaries.

class openclean.function.value.cond.ConditionalStatement(predicate, stmt, elsestmt=None)

Bases: openclean.function.value.base.PreparedFunction

Conditional if-then-else statement. Depending on a given predicate either one of two statements is evaluated.

eval(value)

Replace function returns the predefined replacement value if the given value satisfies the predicate. Otherwise, the argument value is returned.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

any

openclean.function.value.datatype module

Collection of unary functions for checking and converting the data type of given scalar values. Includes functions for type case and predicates for type checking.

class openclean.function.value.datatype.Datetime(label: Optional[str] = 'datetime', formats: Optional[Union[str, List[str]]] = None, typecast: Optional[bool] = True)

Bases: openclean.function.value.classifier.ClassLabel

Class label assigner for datetime values.

openclean.function.value.datatype.DefaultDatatypeClassifier()openclean.function.value.classifier.ValueClassifier

Return an instance of the avlue classifier initialized with a default set of class labels.

Returns

Return type

openclean.function.value.classifier.ValueClassifier

class openclean.function.value.datatype.Float(label: Optional[str] = 'float', typecast: Optional[bool] = True)

Bases: openclean.function.value.classifier.ClassLabel

Class label assigner for float values.

class openclean.function.value.datatype.Int(label: Optional[str] = 'int', typecast: Optional[bool] = True)

Bases: openclean.function.value.classifier.ClassLabel

Class label assigner for integer values.

openclean.function.value.datatype.cast(value: Union[int, float, str, datetime.datetime], func: Callable, default_value: Optional[Union[int, float, str, datetime.datetime]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime]

Generic type cast function. Attempts to cast values to a type (by using a provided callable). If type cast fails (i.e., the callable raises a aValueError) (i) an error is raised if the raise error flag is True, or (ii) a given default value is returned.

Parameters
  • value (scalar) – Scalar value that is being converted using the type conversion function.

  • func (callable) – Function that converts the data type of a given scalar value.

  • default_value (scalar, default=None) – Default value that is being returned for values that cannot be casted to the specified type if the raise_error flag is False.

  • raise_error (bool, default=False) – Raise ValueError if the value that is being extracted from a data frame row by the value function cannot be cast to the specified type.

Returns

Return type

scalar

openclean.function.value.datatype.has_two_spec_chars(value: Union[int, float, str, datetime.datetime])bool

Returns True if the given string has at least two non-alphanumeric characters.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

bool

openclean.function.value.datatype.is_datetime(value: Union[int, float, str, datetime.datetime], formats: Optional[Union[str, List[str]]] = None, typecast: Optional[bool] = True)bool

Test if a given string value can be converted into a datetime object for a given data format. The function accepts a single date format or a list of formates. If no format is given, ISO format is assumed as the default.

Parameters
  • value (scalar) – Scalar value that is tested for being a date.

  • formats (string or list(string)) – Date format string using Python strptime() format directives. This can be a list of date formats.

  • typecast (bool, default=True) – Attempt to parse string values as dates if True.

Returns

Return type

bool

openclean.function.value.datatype.is_float(value: Union[int, float, str, datetime.datetime], typecast: Optional[bool] = True)bool

Test if a given value is of type float. If the type cast flag is True, any string value that can successfully be converted to float will also be accepted.

Parameters
  • value (scalar) – Scalar value that is tested for being a float.

  • typecast (bool, default=True) – Cast string values to float if True.

Returns

Return type

bool

openclean.function.value.datatype.is_int(value: Union[int, float, str, datetime.datetime], typecast: Optional[bool] = True)bool

Test if a given value is of type integer. If the type cast flag is True, any string value that can successfully be converted to integer will also be accepted.

Parameters
  • value (scalar) – Scalar value that is tested for being an integer.

  • typecast (bool, default=True) – Cast string values to integer if True.

Returns

Return type

bool

openclean.function.value.datatype.is_nan(value: Union[int, float, str, datetime.datetime])bool

Test if a given value is a number. Returns True if the given value is not a number.

Parameters

value (scalar) – Scalar value that is tested for being a number.

Returns

Return type

bool

openclean.function.value.datatype.is_numeric(value: Union[int, float, str, datetime.datetime], typecast: Optional[bool] = True, ignore_nan: Optional[bool] = True)bool

Test if a given value is of type integer or float. If the type cast flag is True, any string value that can successfully be converted to integer or float will also be accepted.

Parameters
  • value (scalar) – Scalar value that is tested for being a number.

  • typecast (bool, default=True) – Cast string values to integer or float if True.

  • ignore_nan (bool, default=False) – Consider NaN not as numeric if the flag is True

Returns

Return type

bool

openclean.function.value.datatype.is_numeric_type(value: Union[int, float, str, datetime.datetime])bool

Test if a given value is of type integer or float (or the numpy equivalent). Does not attempt to cast string values.

Parameters

value (scalar) – Scalar value that is tested for being a number.

Returns

Return type

bool

openclean.function.value.datatype.to_datetime(value: Union[int, float, str, datetime.datetime], default_value: Optional[Union[int, float, str, datetime.datetime]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime]

Converts a timestamp string in ISO format into a datatime object in UTC timezone.

Parameters
  • value (string) – String value that is being converted to datetime.

  • default_value (scalar, default=None) – Default value that is being returned for values that cannot be converted to datetime if the raise_error flag is False.

  • raise_error (bool, default=False) – Raise ValueError if the value cannot be converted to datetime.

Returns

Return type

scalar

openclean.function.value.datatype.to_datetime_format(value: Union[int, float, str, datetime.datetime], formats: Optional[Union[str, List[str]]] = None)datetime.datetime

Convert a given value to a datetime object for a given date format. If a list of format specifications is given an attempt is made to convert the value for each format (in given order) until the first format for which the conversion succeeds. If none of the formats match the given value None is returned.

Parameters
  • value (scalar) – Scalar value that is converted to a date.

  • formats (string or list(string)) – Date format string using Python strptime() format directives. This can be a list of date formats.

Returns

Return type

datetime.datetime

openclean.function.value.datatype.to_float(value: Union[int, float, str, datetime.datetime], default_value: Optional[Union[int, float, str, datetime.datetime]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime]

Convert a given value to float. Raises an error if the given value cannot be converted to float and the raise error flag is True. If the flag is False, a given default value will be returned for thoses values that cannot be converted to float.

Parameters
  • value (scalar) – Scalar value that is being converted to float.

  • default_value (scalar, default=None) – Default value that is being returned for values that cannot be cast to float if the raise_error flag is False.

  • raise_error (bool, default=False) – Raise ValueError if the value cannot be cast to float.

Returns

Return type

scalar

openclean.function.value.datatype.to_int(value: Union[int, float, str, datetime.datetime], default_value: Optional[Union[int, float, str, datetime.datetime]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime]

Convert a given value to integer. Raises an error if the given value cannot be converted to integer and the raise error flag is True. If the flag is False, a given default value will be returned for thoses values that cannot be converted to integer.

Parameters
  • value (scalar) – Scalar value that is being converted to integer.

  • default_value (scalar, default=None) – Default value that is being returned for values that cannot be cast to integer if the raise_error flag is False.

  • raise_error (bool, default=False) – Raise ValueError if the value cannot be cast to integer.

Returns

Return type

scalar

openclean.function.value.datatype.to_string(value: Union[int, float, str, datetime.datetime])bool

Type cast function that tests if a given value is of type string. Returns the value if it is of type string or None, otherwise.

Parameters

value (scalar) – Scalar value that is tested for being a number.

Returns

Return type

bool

openclean.function.value.domain module

Collection of scalar predicates that test domain membership.

class openclean.function.value.domain.BestMatch(matcher: openclean.function.matching.base.StringMatcher)

Bases: openclean.function.value.base.PreparedFunction

Value function that returns for a given value the best matching similar value in a controlled vocabulary.

eval(value)

Return the base matching value for a given query in the associated vocabulary. If the query term is in the vocabulary it is returned as the result. If the term is not in the vocabulary the best matching values (using the associated vocabulary matcher) are found. If no bast match is found or if multiple best matches are found a ValueError is raised. Otherwise, the best matching value is returned as the function result.

Parameters

value (scalar) – Scalar value for which the best matching value in the associated vocabulary is computed.

Returns

Return type

bool

Raises

ValueError

class openclean.function.value.domain.IsInDomain(domain, ignore_case=False, negated=False)

Bases: openclean.function.value.base.PreparedFunction

Callable function that wrapps a list of values for containment checking. If the ignore case flag is True, all string values in the domain are converted to lower case.

eval(value)

Test if a given value is a member of the domain of known values.

Parameters

value (scalar) – Scalar value that is tested for being a domain member.

Returns

Return type

bool

class openclean.function.value.domain.IsNotInDomain(domain, ignore_case=False)

Bases: openclean.function.value.domain.IsInDomain

Callable that wrapps a list of values that define the domain of valid values. The list is used to identify those values that do not belong to the domain. If the ignore case flag is True, all string values in the domain are converted to lower case.

openclean.function.value.domain.to_lower(value)

Convert a given value to lower case. Handles the case where the value is a list or tuple.

Parameters

value (string, list, or tuple) – Value that is transformed to lower case.

Returns

Return type

string, list, or tuple

openclean.function.value.filter module

Functions that filter values in a given list.

class openclean.function.value.filter.Filter(predicate, truth_value=True)

Bases: object

Filter values in a list based on a given predicate function.

apply(values)

FIlter values in the given list using the associated predicate. Only values for which the predicate is satisfied will be returned in the resulting list.

Calls the prepare method of an associated value function before executing the eval method on each individual value in the given list.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

list

openclean.function.value.filter.filter(values, predicate, truth_value=True)

Filter values in a list based on a given predicate function. Returns a new list containing only those values that satisfy the given predicate.

Parameters
  • values (list) – List of scalar values or tuples of scalar values.

  • predicate (openclean.function.value.base.ValueFunction or callable) – Callable or value function that is used to filter values in a given list.

  • truth_value (scalar, defaut=True) – Return value of the predicate that signals that the predicate is satisfied by an input value.

openclean.function.value.mapping module

The mapping operator that returns a dictionary that contains a mapping of original values in a data frame column(s) to results of applying a given value function on them.

Lookup functions represent mappings using dictionaries.

class openclean.function.value.mapping.Lookup(mapping: Dict, raise_error: Optional[bool] = False, default: Optional[Union[Callable, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = None, as_string: Optional[bool] = False)

Bases: openclean.function.value.base.PreparedFunction

Dictionary lookup function. Uses a mapping dictionary to convert given input values to their pre-defined targets.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Return the defined target value for a given lookup value.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

any

class openclean.function.value.mapping.Standardize(mapping: Dict)

Bases: openclean.function.value.base.PreparedFunction

Use a mapping dictionary to standardize values. For a given value, if a mapping is defined in the dictionary the mapped value is returned. For all other values the original value is returned.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Return the defined target value for a given lookup value. If the given value is not included in the standardization mapping it will be returned as is.

Parameters

value (scalar) – Scalar value in a data stream.

Returns

Return type

any

openclean.function.value.mapping.mapping(df: pandas.core.frame.DataFrame, columns: Union[int, str, List[Union[str, int]]], func: Union[Callable, openclean.function.value.base.ValueFunction])Dict

Get the mapping of values that are modified by a given value function.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string), optional) – Single column or list of column index positions or column names.

  • func (callable or openclean.function.value.base.ValueFunction) – Callable or value function that accepts a single value as the argument.

Returns

Return type

dict

Raises

ValueError

openclean.function.value.mapping.replace(predicate: Callable, value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])openclean.function.value.cond.ConditionalStatement

Return an instance of the Replace class for the given arguments.

Parameters
  • predicate (callable) – Predicate that is evalauated on input values.

  • value (scalar or tuple) – Replacement value for inputs that satisfy the predicate.

Returns

Return type

openclean.function.value.mapping.Replace

openclean.function.value.null module

Collection of scalar predicates that check for empty and null values.

openclean.function.value.null.is_empty(value, ignore_whitespace=False)

Test values for being an empty string or None. If the ignore whitespace flag is True any string that only contains whitespace characters is also considered empty.

Parameters
  • value (scalar) – Scalar value that is tested for being empty.

  • ignore_whitespace (bool, optional) – Trim non-None values if the flag is set to True.

Returns

Return type

bool

openclean.function.value.null.is_none(value)

Test if a given value is None.

Parameters

value (scalar) – Scalar value that is tested for being None.

Returns

Return type

bool

openclean.function.value.null.is_not_empty(value, ignore_whitespace=False)

Test values for being is not empty string or None. If the ignore whitespace flag is True any string that only contains whitespace characters is also considered empty.

Parameters
  • value (scalar) – Scalar value that is tested for being empty.

  • ignore_whitespace (bool, optional) – Trim non-None values if the flag is set to True.

Returns

Return type

bool

openclean.function.value.null.is_not_none(value)

Test if a given value is not None.

Parameters

value (scalar) – Scalar value that is tested for being None.

Returns

Return type

bool

openclean.function.value.phonetic module

String matcher that use phonetic algorithms for transforming the input strings to normalized phonetic encodings before comparing them for being equal using the exact matcher.

class openclean.function.value.phonetic.Metaphone

Bases: openclean.function.value.phonetic.PhoneticMatcher

String matcher using the metaphone algorithm to encode strings. Uses the metaphone algorithm (included in the jellyfish library) to encode each string before comparing the codes.

class openclean.function.value.phonetic.NYSIIS

Bases: openclean.function.value.phonetic.PhoneticMatcher

String matcher using the NYSIIS algorithm to encode strings. Uses the NYSIIS algorithm (developed by the New York State Identification and Intelligence System; included in the jellyfish library) to encode each string before comparing the codes.

class openclean.function.value.phonetic.PhoneticMatcher(encoder: Callable)

Bases: openclean.function.matching.base.ExactSimilarity, openclean.function.value.base.PreparedFunction

String matcher for phonetic algorithms. Extends exact string similarity using a callable that implements a phonetic encoding algorithm.

eval(value: str)str

The evaluation method for a phonetic matcher returns the encoding for a given value depending on the associated encoding algorithm.

Parameters

value (string) – Value that is being encoded.

Returns

Return type

string

class openclean.function.value.phonetic.Soundex

Bases: openclean.function.value.phonetic.PhoneticMatcher

String matcher using soundex encoding for a pair of strings. Uses the soundex function to encode each string to a four digit code before comparing the codes.

openclean.function.value.picker module

Majority picker functions that select a single value from a counter object.

class openclean.function.value.picker.MajorityVote(threshold: Optional[float] = None, normalizer: Optional[Callable] = None, raise_error: Optional[bool] = False)

Bases: openclean.function.value.picker.ValuePicker

Majority picker that select the most frequent value. This picker returns the default value (or raises an error) if the given list of values is empty or there are multiple-most frequent values.

THe picker allows to define an additional threshold (min. frequency) that the most-frequent value has to satisfy.

pick(values: collections.Counter, default: Optional[Union[Callable, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Return the the most frequent value in the counter. If the counter is empty or contains multiple most-frequent values the default value is returned or a ValueError is raised.

Parameters
  • values (collections.Counter) – Frequency counter for values.

  • default (scalar, tuple, or callable, default=None) – Default value that is returned if the counter contains no values or multiple most-frequent values.

  • raise_error (bool, default=False) – Raise a ValueError if the counter contains no values or multiple most-frequent values.

Returns

Return type

scalar, tuple, or callabel

Raises

ValueError

class openclean.function.value.picker.OnlyOneValue(raise_error: Optional[bool] = False)

Bases: openclean.function.value.picker.ValuePicker

Majority picker that only selects a value if the given counter contains exactly one value.

pick(values: collections.Counter, default: Optional[Union[Callable, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = None, raise_error: Optional[bool] = False)Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Return the only value in the given counter. If the counter contains no value or more than one value the default value is returned or a ValueError is raised.

Parameters
  • values (collections.Counter) – Frequency counter for values. The most frequent value from the counter is returned if the counter contains exectly one value.

  • default (scalar, tuple, or callable, default=None) – Default value that is returned if the counter contains no values or multiple values.

  • raise_error (bool, default=False) – Raise a ValueError if the counter contains no values or multiple values.

Returns

Return type

scalar, tuple, or callabel

Raises

ValueError

class openclean.function.value.picker.ValuePicker(raise_error: Optional[bool] = False)

Bases: openclean.function.value.base.ValueFunction

Value function that is used to select a single value, e.g., the most frequent value, from a list of values. The picker acts as a value function that picks a value when the function is prepared and then returns a constant function that returns the picked value for any input value. This type of behavior is for example needed for majority voting where we want to replace all values in a given attribute with a single (most frequent) value.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

The value picker requires to be prepared. It returns a new value function as the preparation result. The eval method of this class therefore raises an error if called.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Raises

NotImplementedError

is_prepared()bool

The value picker needs to be prepared.

Returns

Return type

bool

abstract pick(values: collections.Counter, default: Optional[Union[Callable, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]] = None, raise_error: Optional[bool] = False)Union[Callable, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]

Picker function that returns the most frequent value from the given counter. Different implementations may impose additional constraints on whether a value is selected or not. If no value is selected by the picker, either the default is returned or a ValueError is raised (if the raise_error flag is True).

Parameters
  • values (collections.Counter) – Frequency counter for values. The most frequent value from the counter is returned if it satisfies additional (implementation- specific constraints).

  • default (scalar, tuple, or callable, default=None) – Default value that is returned if the most frequent value does not satisfy the imposed constraints and the raise_error flag is False.

  • raise_error (bool, default=False) – Raise a ValueError if the most frequent value does not satisfy the imposed constraints.

Returns

Return type

scalar, tuple, or callabel

Raises

ValueError

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

Optional step to prepare the function for a given set of values. This step allows to compute additional statistics over the set of values.

While it is likely that the given set of values represents the values for which the eval() function will be called, this property is not guaranteed.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

openclean.function.value.base.ValueFunction

openclean.function.value.random module

Value function that randomly selects a value from a given list.

class openclean.function.value.random.RandomSelect(seed: Optional[int] = None, ignore_freq: Optional[bool] = False)

Bases: openclean.function.value.base.UnpreparedFunction

Value function that implements a random selector. Selects a value from a given list of values during the preparation step. Returns a constant value function for the selected value as the preparation result.

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

Randomly select a value from the givne list. Returns a constant value function with the selected value as the result.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

openclean.function.value.base.ConstantValue

openclean.function.value.regex module

Predicates that test whether a regular expression matches a given input string.

class openclean.function.value.regex.IsMatch(pattern, fullmatch=False, as_string=True, negated=False)

Bases: openclean.function.value.base.PreparedFunction

Match strings against a given regular expression.

eval(value)

Match the regular expression against the given string. If the value is not of type string it is converted to string if the type case flag is True. Otherwise, the result is False.

Parameters

value (string) – Input value that is matched against the regular expression.

Returns

Return type

bool

class openclean.function.value.regex.IsNotMatch(pattern, fullmatch=False, as_string=True)

Bases: openclean.function.value.regex.IsMatch

Match strings against a given regular expression. Returns True if the value does not match the expression.

openclean.function.value.text module

Helper functions for strings.

class openclean.function.value.text.AlphaNumeric

Bases: openclean.function.value.base.PreparedFunction

Predicate to test whether a given string contains only alpha-numeric characters.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Returns True if the string representation of a given value contains only alpha-numeric characters.

Parameters

value (scalar or tuple) – Value from the list that was used to prepare the function.

Returns

Return type

bool

openclean.function.value.text.to_len(value: Any)int

Get the length of a value. The value is converted to string and the number of characters in the resulting string is returned.

Parameters

value (any) – Value whose length is returned.

Returns

Return type

int

openclean.function.value.text.to_lower(value: Any)str

Convert value to lower case stirng. Handles cases where value is not a string.

Parameters

value (any) – Value that is converted to lower case string.

Returns

Return type

string

openclean.function.value.text.to_title(value: Any)str

Convert value to title case stirng. Handles cases where value is not a string.

Parameters

value (any) – Value that is converted to title case string.

Returns

Return type

string

openclean.function.value.text.to_upper(value: Any)str

Convert value to upper case stirng. Handles cases where value is not a string.

Parameters

value (any) – Value that is converted to upper case string.

Returns

Return type

string

openclean.function.value.threshold module

Boolean functions that represent threshold predicates. Threshold predicates compare a given value against a threshold value using a comparison operator (on of <, <=, >, >=).

class openclean.function.value.threshold.GreaterOrEqual(threshold: float)

Bases: openclean.function.value.threshold.ThresholdPredicate

Greater than or equal threshold predicate (value >= threshold).

class openclean.function.value.threshold.GreaterThan(threshold: float)

Bases: openclean.function.value.threshold.ThresholdPredicate

Lower than threshold predicate (value > threshold).

class openclean.function.value.threshold.LowerOrEqual(threshold: float)

Bases: openclean.function.value.threshold.ThresholdPredicate

Lower than or equal threshold predicate (value <= threshold).

class openclean.function.value.threshold.LowerThan(threshold: float)

Bases: openclean.function.value.threshold.ThresholdPredicate

Lower than threshold predicate (value < threshold).

class openclean.function.value.threshold.ThresholdPredicate(threshold: float, op: Callable)

Bases: openclean.function.value.base.PreparedFunction

Base class for threshold constraints. This is a wrapper that maintains the threshold value and the comparison operator.

eval(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Evaluate the threshold predicate on a given value.

Parameters

value (scalar or tuple) – Value that is comared against the treshold.

Returns

Return type

bool

openclean.function.value.vote module

Value function that implements a conflict resolution stategy for majority voting.

class openclean.function.value.vote.MajorityVote(tiebreaker: Optional[openclean.function.value.base.ValueFunction] = None)

Bases: openclean.function.value.base.UnpreparedFunction

Value function that implements a majority voting strategy for conflict resolution. Selects the most frequent value in a given list of values during the preparation step. Returns a constant value function for the selected value as the preparation result.

If there is a tie for the most frequent value the tie is broken using a given tiebreaker function. If no tiebreaker function is specified an error will be raised.

prepare(values: List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]])openclean.function.value.base.ValueFunction

Select the most frequent value in the given list of values. A constant value function is returned as the result.

If there is a tie for the most frequent value the tie is broken using the tiebreaker function. If no tiebreaker function is specified a ValuError will be raised.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

openclean.function.value.base.ConstantValue

Submodules
openclean.function.base module

Collection of basic helper functions and classes.

class openclean.function.base.All(predicate)

Bases: object

Predicate that tests if all values in a given list evaluate to True for a given predicate.

class openclean.function.base.One(predicate)

Bases: object

Predicate that tests if at least one value in a given list evaluates to True for a given predicate.

openclean.operator package
Subpackages
openclean.operator.collector package
Submodules
openclean.operator.collector.aggregate module

Class that implements the DataframeMapper abstract class to perform groupby operations on a pandas dataframe.

class openclean.operator.collector.aggregate.Aggregate(func: Union[Dict[str, Callable], Callable], schema: Optional[List[str]] = None)

Bases: openclean.operator.base.DataGroupReducer

Aggregate class that takes in a DataFrameGrouping and aggregate function(s), aggregates them and returns a dataframe

reduce(groups)

Reduces the groups using the agg functions and returns a dataframe

Parameters

groups (DataFrameGrouping) – grouping object returned by some groupby operation

Returns

Return type

pd.DataFrame

Raises
  • KeyError: – if the input column isn’t found

  • Type Error: – if the provided schema is invalid

openclean.operator.collector.aggregate.aggregate(groups: openclean.data.groupby.DataFrameGrouping, func: Union[Dict[str, Callable], Callable], schema: Optional[List[str]] = None)

Aggregate helper function that takes the DataFrameGouping, a schema and a function(s) and returns a dataframe created from the groupings using the functions following that schema

Parameters
  • groups (DataFrameGrouping) – object returned from a GroupBy operation

  • schema (list of string, optional) – list of column names

  • func

    callable,

    dict of str:callables

    ) If a single callable provided, it must handle the each dataframe group to create an aggregate value If a dict of str:callables provided, the keys are column names and the values are aggregate functions

    for each of those columns

Returns

Return type

pd.DataFrame

openclean.operator.collector.aggregate.get_agg_funcs(func)

Helper method used to create a mapping of the aggregation functions with their columns.

Parameters

functions (dict of str:Callable or Callable) – Single Callable that aggregates on the entire df or a dict of callables where the keys are column names and the values are the functions for the respective column

Returns

Return type

dict

openclean.operator.collector.aggregate.is_single_or_dict(Y)
openclean.operator.collector.count module

Funciton to compute set of distinct values and their frequencies from a list of values.

openclean.operator.collector.count.count(df: pandas.core.frame.DataFrame, predicate: Optional[openclean.function.eval.base.EvalFunction] = None, truth_value: Optional[Union[int, float, str, datetime.datetime]] = True)int

Count the number of rows in a data frame. If the optional predicate is given, the rows that satisy the predicate is counted.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • predicate (openclean.function.eval.base.EvalFunction, default=None) – Predicate that is evaluated over te rows in the data frame.

  • truth_value (scalar, defaut=True) – Count the occurrence of the truth value when evaluating the predicate on a the data frame rows.

Returns

Return type

int

openclean.operator.collector.count.distinct(df: pandas.core.frame.DataFrame, columns: Optional[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]]] = None, normalizer: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, keep_original: Optional[bool] = False, labels: Optional[Union[List[str], Tuple[str, str]]] = None)collections.Counter

Compute the set of distinct value combinations for a single columns, a given list of columns, or the list of values returned by a given evaluation function. Returns a Counter containing the distinct values (tuples in case of multiple input columns) together with their frequency counts.

If the optional normalization function is given, the frequency counts in the returned dictionary will be normalized. If the keep original flag is True, the returned dictionary will map key values to nested dictionaries that contain the original and the normalized value.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, list, or openclean.function.eval.base.EvalFunction,) – default=None Evaluation function to extract values from data frame rows. This can also be a a single column reference or a list of column references. If not given the distinct number of rows is counted.

  • normalizer (callable or openclean.function.value.base.ValueFunction,) – default=None Optional normalization function that will be used to normalize the frequency counts in the returned dictionary.

  • keep_original (bool, default=False) – If the keep original value is set to True, the resulting dictionary will map key values to dictionaries. Each nested dictionary will have two elements, the original (‘absolute’) value and the normalized value.

  • labels (list or tuple, default=('absolute', 'normalized')) – List or tuple with exactly two elements. The labels will only be used if the keep_original flag is True. The first element is the label for the original value in the returned nested dictionary and the second element is the label for the normalized value.

Returns

Return type

dict

openclean.operator.collector.repair module

Repair function for groups of rows that represent constraint violations.

class openclean.operator.collector.repair.ConflictRepair(strategy: Dict[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], openclean.function.value.base.ValueFunction], in_order: Optional[bool] = True)

Bases: openclean.operator.base.DataGroupReducer

The conflict repair function resolves conflicts in data frames (groups) that contain sets of rows that together represent a single violation of a functional dependency constraint. The function resolves conflicts by consolidating values in the (conflicting) data frame columns using a given set of conflict resolution functions (strategy).

reduce(groups: openclean.data.groupby.DataFrameGrouping)pandas.core.frame.DataFrame

The conflict resolution functions are applied on the respective attribute for each data frame (group) that represents a constraint violation. The modified rows are merged with the remainin (non-conflicting) rows in the data frame that was used for voliation detection. The resuling data frame is returned as the result of the the repair function.

The in_order flag determines the algorithm variant that is used to modify the given data frame. If in_order is True the rows in the resulting data frame are in the same order as in the input data frame. This is achieved by creating a copy of the data frame and updating rows in place. If in_order is False, the rows for the updated groups are appened to a data frame that initially contains only the non-conflicting rows.

Parameters

groups (openclean.data.groupby.DataFrameGrouping) – Grouping of pandas data frames.

Returns

Return type

pd.DataFrame

class openclean.operator.collector.repair.ValueExtractor(strategy: Dict[int, openclean.function.value.base.ValueFunction])

Bases: openclean.function.eval.base.EvalFunction

Helper class that extracts and manipulates column values using a list of prepared value functions.

eval(df: pandas.core.frame.DataFrame)Union[pandas.core.series.Series, List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]]

Evaluate the value functions on the values of their respective columns. The column values are extracted from the given data frame. The respective value function is then prepared using the column values (if necessary). At last, the column values are modified using the prepared value function.

Parameters

df (pd.DataFrame) – Pandas data frame.

Returns

Return type

pd.Series or list

prepare(columns: List[Union[str, histore.document.schema.Column]])Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

The function mapping already contains references to columns by their index position. There is nothing to prepare. We raise an error because the ValueExtractor is not intended to be used as a stream function at this point.

Parameters

columns (list of string) – List of column names in the schema of the data stream.

Returns

Return type

openclean.data.stream.base.StreamFunction

openclean.operator.collector.repair.conflict_repair(conflicts: openclean.data.groupby.DataFrameGrouping, strategy: Dict[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], openclean.function.value.base.ValueFunction], in_order: Optional[bool] = True)pandas.core.frame.DataFrame

The conflict repair function resolves conflicts in data frames (groups) that contain sets of rows that together represent a single violation of a functional dependency constraint. The function resolves conflicts by consolidating values in the (conflicting) data frame columns using a given set of conflict resolution functions (strategy).

The idea is that the user specifies a conflict resolution function for each attribute that has multiple values which form a violation of a constraint (e.g., a functional dependency). The conflict resolution strategy is defined as a mapping of column names (or index positions) to value functions for conflict resolution. It is up to the user for which columns they want to provide conflict resolutions functions.

The conflict resolution functions are applied on the respective attribute for each data frame (group) that represents a constraint violation. The modified rows are merged with the remainin (non-conflicting) rows in the data frame that was used for voliation detection. The resuling data frame is returned as the result of the the repair function.

The in_order flag determines the algorithm variant that is used to modify the given data frame. If in_order is True the rows in the resulting data frame are in the same order as in the input data frame. This is achieved by creating a copy of the data frame and updating rows in place. If in_order is False the rows for the updated groups are appened to a data frame that initially contains only the non-conflicting rows. Therefore it is likely that the rows in the resulting data frame are in different order than in the input data frame.

Parameters
  • conflicts (openclean.data.groupby.DataFrameGrouping) – Grouping of rows from a data frame. Each group represents a set of rows that form a violation of a checked integrity constraint.

  • strategy (dict) – Mapping of column names or index positions to conflict resolution functions.

  • in_order (bool, default=True) – Only if the in_order flag is True the resulting data frame is guaranteed to have the rows in the same order as the input data frame.

Returns

Return type

pd.DataFrame

openclean.operator.map package
Submodules
openclean.operator.map.groupby module

Class that implements the DataframeMapper abstract class to perform groupby operations on a pandas dataframe.

class openclean.operator.map.groupby.GroupBy(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], func: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None)

Bases: openclean.operator.base.DataFrameMapper

GroupBy class that takes in the column names to group on and a function (optional), performs the groupby and returns a DataFrameGrouping object.

map(df: pandas.core.frame.DataFrame)openclean.data.groupby.DataFrameGrouping

transforms and maps a pandas DataFrame into a DataFrameGrouping object.

Parameters

df (pandas.DataFrame) – Dataframe to transform using groupby

Returns

Return type

openclean.data.groupby.DataFrameGrouping

static select(group: pandas.core.frame.DataFrame, condition: Union[Callable, int])bool

Given a dataframe and a condition, returns a bool of whether the group should be selected.

Parameters
  • group (pd.DataFrame) – the group/df under consideration

  • condition (int or callable) – if not provided, the group is selected if int, the group’s number of rows is checked against the condition if callable, the group is passed to it. The callable should return a boolean

Returns

Return type

bool

Raises

TypeError

openclean.operator.map.groupby.get_eval_func(columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], func: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None)openclean.function.eval.base.EvalFunction

Helper function used to create an evaluation function from a key generator specification.

Parameters
  • columns (int, string, openclean.function.eval.base.EvalFunction, or list) – Single column or evaluation function or a list of columns or evaluation functions. The column(s)/function(s) are used to genrate group by keys for each row in the input data frame.

  • func

    openclean.function.eval.base.value.ValueFunction,

    callable,

    ), default=None Optional callable or value function that is used to generate a group by key from the values that are generate by the columns clause. This is a short cut to creating an evaluation function with columns as input and func as the evaluated function.

Returns

Return type

openclean.function.eval.base.EvalFunction

openclean.operator.map.groupby.groupby(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], func: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, having: Optional[Union[Callable, int]] = None)openclean.data.groupby.DataFrameGrouping

Groupby function for data frames. Evaluates a new index based on the rows of the dataframe using the input function (optional). The output comprises of a openclean.data.groupby.DataFrameGrouping object.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, openclean.function.eval.base.EvalFunction, or list, default=None) – Single column or evaluation function or a list of columns or evaluation functions. The column(s)/function(s) are used to genrate group by keys for each row in the input data frame.

  • func

    openclean.function.eval.base.value.ValueFunction,

    callable,

    ), default=None Optional callable or value function that is used to generate a group by key from the values that are generate by the columns clause. This is a short cut to creating an evaluation function with columns as input and func as the evaluated function.

  • having (int or callable, default=None) – If given, group by only returns groups that (i) have a number of rows that equals a given int or (ii) (if a callable is given) we pass the group to that callable as an argument and if the returned result is True the group is included in the returned result. The callable should expect a pandas dataframe and return a boolean.

Returns

Return type

openclean.data.groupby.DataFrameGrouping

openclean.operator.map.violations module

Functions that return the Dataframe Violation class with violations of functional dependencies or keys in a pandas dataframe.

class openclean.operator.map.violations.Violations(lhs, rhs=None, func=None, having=None)

Bases: openclean.operator.base.DataFrameMapper

Violations class that: 1) takes the left side and right side column names 2) generates a new key from the values (func callable) 3) identifies any tuples violating specified rules (having callable) 4) and returns them as a DataFrameViolation object.

map(df: pandas.core.frame.DataFrame)openclean.data.groupby.DataFrameViolation

Identifies violations and maps the pandas DataFrame into a DataFrameViolation object.

Parameters

df (pandas.DataFrame) – Dataframe to find violations in

Returns

Return type

openclean.data.groupby.DataFrameViolation

static select(condition: Union[Callable, int], meta: collections.Counter)bool

Given a dataframe and a condition, returns a bool of whether the group should be selected.

Parameters
  • condition (int or callable) – if not provided, the group is selected if int, the group’s number of rows is checked against the condition if callable, the meta is passed to it. The callable should return a boolean

  • meta (Counter) – the meta Counter for the group/df under consideration

Returns

Return type

bool

Raises

TypeError

openclean.operator.map.violations.fd_violations(df: pandas.core.frame.DataFrame, lhs: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], rhs: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])openclean.data.groupby.DataFrameViolation

Checks for violations of a functional dependency in the given data frame.

Parameters
  • df (pd.DataFrame) – the input pandas dataframe

  • lhs (int, string, openclean.function.eval.base.EvalFunction, or list) – Generator that forms the determinant key values.

  • rhs (list or str) – Generator that forms the dependant key values.

Returns

Return type

openclean.data.groupby.DataFrameViolation

openclean.operator.map.violations.key_violations(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], func: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, n: Optional[int] = - 1)openclean.data.groupby.DataFrameViolation

Checks for violations of a key constraint in the given data frame. An optional func can be given to be used as a custom key generator function that operates on the specified columns. The optional parameter n can be used to select groups with the exact number of n violations.

Parameters
  • df (pd.DataFrame) – the input pandas dataframe

  • columns (int, string, openclean.function.eval.base.EvalFunction, or list) – Generator to extract group by keys from data frame rows.

  • func

    openclean.function.eval.base.value.ValueFunction,

    callable,

    ), default=None Optional callable or value function that is used to generate a group by key from the values that are generate by the columns clause. This is a short cut to creating an evaluation function with columns as input and func as the evaluated function.

  • n (int, default=-1) – Option to filter out groups with not exactly n violations.

Returns

Return type

openclean.data.groupby.DataFrameViolation

openclean.operator.split package
Submodules
openclean.operator.split.split module

Functions and classes that implement the split operator in openclean.

class openclean.operator.split.split.Split(predicate: openclean.function.eval.base.EvalFunction)

Bases: openclean.operator.base.DataFrameSplitter

Data frame splitter that evaluates a Boolean predicate on the rows of a data frame. The output has two data frames, one containing the rows for which the predicate was satisfied and one containing the rows for which the predicate was not satisfied.

split(df: pandas.core.frame.DataFrame)Tuple[pandas.core.frame.DataFrame, pandas.core.frame.DataFrame]

Split the data frame into two data frames. The output is a tuple. The first element is the data frame that contains all rows for which the predicate evaluated to True. The second element is a data frame containing the rows for which the predicate was False.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame, pandas.DataFrame

openclean.operator.split.split.split(df: pandas.core.frame.DataFrame, predicate: openclean.function.eval.base.EvalFunction)Tuple[pandas.core.frame.DataFrame, pandas.core.frame.DataFrame]

Split function for data frames. Evaluates a Boolean predicate on the rows of a given data frame. The output comprises two data frames. The first data frame contains the rows for which the predicate was satisfied and the second contains the rows for which the predicate was not satisfied.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • predicate (openclean.function.eval.base.EvalFunction) – Evaluation function that is evaluated on each data frame row. The resulting value determines for each row in which of the two output data frames it will be placed.

Returns

Return type

pandas.DataFrame, pandas.DataFrame

openclean.operator.stream package
Submodules
openclean.operator.stream.collector module

Collectors are data stream consumers that are not connected to a downstream consumer. These consumers collect results until the close method of the data stream is called. At that point, the collector returns a final results.

This module contains implementations of the StreamConsumer and StremProcessor interface for various basic collectors.

class openclean.operator.stream.collector.Collector

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

The collector is intended primarily for test purposes. Simply collects the (rowid, row) pairs that are passed on to it in a list.

close()List

Return the collected row buffer on close.

Returns

Return type

list

consume(rowid: int, row: List)

Add the given (rowid, row)-pair to the internal buffer. Returns the row.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer for the row collector.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

class openclean.operator.stream.collector.DataFrame(columns: Optional[List[Union[str, histore.document.schema.Column]]] = None)

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

Row collector that generates a pandas data frame from the rows in a data stream. This consumer will not accept a downstream consumer as it would never send any rows to such a consumer.

close()pandas.core.frame.DataFrame

Closing the consumer yields the data frame with the collected rows.

Returns

Return type

ps.DataFrame

consume(rowid: int, row: List)

Add the row identifier and row values to the respective lists. Returns None to avoid that the (empty) downstream consumer is called.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer for the data frame generator.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

class openclean.operator.stream.collector.Distinct(columns: Optional[Union[int, str, List[Union[str, int]]]] = None)

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

Consumer that popuates a counter with the frequency counts for distinct values (or value combinations) in the processed rows for the data stream.

close()collections.Counter

Closing the consumer returns the populated Counter object.

Returns

Return type

collections.Counter

consume(rowid: int, row: List)

Add the value combination for a given row to the counter. If the row contains more than one column a tuple of column values will be added to the counter.

If the row only has one value this value will be used as the key for the counter. For rows with multiple values the row will be converted to a tuple that is used as the counter key.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer for the distinct values collector.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

class openclean.operator.stream.collector.RowCount

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

The row counter is a simple counter for the number of (rowid, row) pairs that are passed on to consumer.

close()int

Return the couter value.

Returns

Return type

int

consume(rowid: int, row: List)

Increament the counter value.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer for the row counter.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

class openclean.operator.stream.collector.Write(file: Optional[histore.document.csv.base.CSVFile] = None, writer: Optional[histore.document.csv.writer.CSVWriter] = None)

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

Write data stream rows to an output file. This class either contains a reference to a CSV file (if instantiated as a processor) or a reference to a CSV writer (if instantiated as a consumer).

close()

Close the associated CSV writer when the end of the data stream was reached.

consume(rowid: int, row: List)

Write the row values to the output file.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer with an open CSV writer.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

openclean.operator.stream.consumer module

Abstract classes defining consumers in a data processing pipeline. Consumers operate on the rows in a data stream. A consumer may either collect the rows in a stream (for transformation). Collected rows are then processed or returned when the consumer is closed at the end of the stream. A consumer can also manipulate the rows directly and pass them on to a connected downstream consumer. The latter type of consumer is refered to as a producing consumer. The result of a producing consumer (that is returned when the consumer is closed at the end of the stream) is the result that is returned by the connected downstream consumer.

class openclean.operator.stream.consumer.ProducingConsumer(columns: List[Union[str, histore.document.schema.Column]], consumer: Optional[openclean.operator.stream.consumer.StreamConsumer])

Bases: openclean.operator.stream.consumer.StreamConsumer

A producing consumer passes the processed row on to a downstream consumer. This consumer therefore acts as a consumer and a producer.

close()Any

Return the result of the associated consumer when the end of the data stream was reached.

Returns

Return type

any

consume(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Consume the given row. Passes the processed row on to an associated downstream consumer. Returns the processed row. If the result is None this signals to a collector/iterator that the given row should not be part of the collected/yielded result.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

abstract handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Process a given row. Return a modified row or None. In the latter case it is assumed that the row should not be passed on to any consumer downstream.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

set_consumer(consumer: openclean.operator.stream.consumer.StreamConsumer)openclean.operator.stream.consumer.ProducingConsumer

Set the downstream consumer.

Parameters

consumer (openclean.data.stream.base.StreamConsumer) – Downstream consumer for processed rows.

Returns

Return type

openclean.data.stream.consumer.ProducingConsumer

class openclean.operator.stream.consumer.StreamConsumer(columns: List[Union[str, histore.document.schema.Column]])

Bases: object

Abstract class for consumers in a data stream processing pipeline. A consumer is the instantiation of a StreamProcessor that is prepared to process (consume) rows in a data stream.

Each consumer may be is associated with an (optional) downstream consumer that will received the processed row from this operator. Consumers that are connected to a downstream consumer are also refered to as producers. Consumers that are not connected to a downstream consumer are called collectors. There are separate modules for each type of consumers.

abstract close()Any

Signal that the end of the data stream has reached. The return value is implementation dependent.

Returns

Return type

any

abstract consume(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Consume the given row. Passes the processed row on to an associated downstream consumer. Returns the processed row. If the result is None this signals to a collector/iterator that the given row should not be part of the collected/yielded result.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

process(ds: histore.document.base.Document)Any

Consume a given data stream and return the computed result.

Parameters

ds (openclean.data.stream.base.Document) – Iterable stream of dataset rows.

Returns

Return type

any

class openclean.operator.stream.consumer.StreamFunctionHandler(columns: List[Union[str, histore.document.schema.Column]], func: Callable[[List[Union[int, float, str, datetime.datetime]]], Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], consumer: Optional[openclean.operator.stream.consumer.StreamConsumer] = None)

Bases: openclean.operator.stream.consumer.ProducingConsumer

The stream function handler is a producing consumer that uses an associated stream function to handle rows. A stream function should either return a modified row or None. Modified rows will be streamed to a connected consumer. If None is returned, the row will be ignored.

handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Process a given row using the associated stream function.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

openclean.operator.stream.matching module
class openclean.operator.stream.matching.BestMatches(matcher: openclean.function.matching.base.StringMatcher, include_vocab: Optional[bool] = False, mapping: Optional[openclean.data.mapping.Mapping] = None)

Bases: openclean.operator.stream.consumer.StreamConsumer, openclean.operator.stream.processor.StreamProcessor

close()openclean.data.mapping.Mapping

Return the collected mapping at the end of the stream.

Returns

Return type

openclean.data.mapping.Mapping

consume(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Consume the given row. Assumes that the row contains exactly one column.

Parameters
  • values (iterable of strings) – List of terms (e.g., from a data frame column) for which matches are computed for the returned mapping.

  • matcher (openclean.function.matching.base.VocabularyMatcher) – Matcher to compute matches for the terms in a controlled vocabulary.

  • include_vocab (bool, default=False) – If this flag is False the resulting mapping will only contain matches for terms that are not in the vocabulary that is associated with the given matcher.

Returns

Return type

openclean.data.mapping.Mapping

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the best matches consumer.

Raises a ValueError if the given schema contains more than one column.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

Raises

ValueError

openclean.operator.stream.processor module

Operators in a data stream pipeline represent the actors in the definition of the pipeline. Each operator provides the functionality (factory pattern) to instantiate the operator for a given data stream before a data streaming pipeline is executed.

class openclean.operator.stream.processor.StreamProcessor

Bases: object

Stream processors represent definitions of actors in a data stream processing pipeline. Each operator implements the open method to create a prepared instance (consumer) for the operator that is used in a stream processing pipeline to filter, manipulate or profile data stream rows.

abstract open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer that corresponds to the action that is defined by the stream processor.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

openclean.operator.stream.sample module

Implementation of stream operators that collect a random sampe of rows from a data stream.

class openclean.operator.stream.sample.Sample(n: int, random_state: Optional[int] = None)

Bases: openclean.operator.stream.processor.StreamProcessor

Processor that defines a random sampling operator in a data stream.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the random sample generator in a data pipeline.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

class openclean.operator.stream.sample.SampleCollector(columns: List[Union[str, histore.document.schema.Column]], n: int, random_state: Optional[int] = None, consumer: Optional[openclean.operator.stream.consumer.StreamConsumer] = None)

Bases: openclean.operator.stream.consumer.ProducingConsumer

Collect a random sample of rows from the data stream and pass them to a downstream consumer. Implements random sampling without replacement using the Reservoir Sampling algorithm. See:

Alon N., Matias Y., and Szegedy M. The space complexity of approximating the frequency moments. J. Comput. Syst. Sci., 58(1):137–147, 1999.

and

Lahiri B., Tirthapura S. (2009) Stream Sampling. In: LIU L., ÖZSU M.T. (eds) Encyclopedia of Database Systems. Springer, Boston, MA. https://doi.org/10.1007/978-0-387-39940-9_372

for details.

Maintains a row buffer with n rows. Pushes the final row set to the downstream consumer at the end of the stream.

close()Any

Pass the selected sample to the connected downstream consumer. Returns the consumer result.

Collect a modified list of rows. Returns the result of the downstream consumer or the collected results (if the consumer result is None).

Returns

Return type

any

consume(rowid: int, row: List[Union[int, float, str, datetime.datetime]])

Randomly add the given (rowid, row)-pair to the internal buffer.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])

Add the given row to the buffer if the maximum buffer size has not been reached yet or the row is randomly selected for inclusion in the sample.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

openclean.operator.transform package
Submodules
openclean.operator.transform.apply module

Apply operator for data frames.

class openclean.operator.transform.apply.Apply(columns, func)

Bases: openclean.operator.base.DataFrameTransformer

Apply function for data frames. Returns a modified data frame where values in the specified columns have been modified using the given apply function.

The apply function can be an apply factory. In this case, a separate instance of the function is generated and applied to each column.

transform(df)

Return a data frame where all values in the specified columns have been modified by the apply function.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.apply.apply(df, columns, func)

Apply function for data frames. Returns a modified data frame where values in the specified columns have been modified using the given apply function.

The apply function can be an apply factory. In this case, a separate instance of the function is generated and applied to each column.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string), optional) – Single column or list of column index positions or column names.

  • func (callable or openclean.function.eval.base.ApplyFactory) – Callable that accepts a single value or a fatory that creates such a callable.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.filter module

Functions and classes that implement the filter operators in openclean.

class openclean.operator.transform.filter.Filter(predicate: openclean.function.eval.base.EvalFunction, negated: Optional[bool] = False)

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Data frame transformer that evaluates a Boolean predicate on the rows of a data frame. The transformed output contains only those rows for which the predicate evaluated to True (or Flase if the negated flag is True).

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that filters rows in a data stream using an stream function representing the filter predicate.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

transform(df: pandas.core.frame.DataFrame)pandas.core.frame.DataFrame

Return a data frame that contains only those rows from the given input data frame that satisfy the filter condition.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

pd.DataFrame

openclean.operator.transform.filter.delete(df: pandas.core.frame.DataFrame, predicate: openclean.function.eval.base.EvalFunction)pandas.core.frame.DataFrame

Delete rows in a data frame. The delete operator evaluates a given predicate on all rows in a data frame. It returns a new data frame where those rows that satisfied the predicate are deleted.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • predicate (openclean.function.eval.base.EvalFunction) – Evaluation function that is expected to return a Boolean value when evaluated on a data frame row. All rows in the input data frame that satisfy the predicate will be deleted.

Returns

Return type

pd.DataFrame

openclean.operator.transform.filter.filter(df: pandas.core.frame.DataFrame, predicate: openclean.function.eval.base.EvalFunction, negated: Optional[bool] = False)pandas.core.frame.DataFrame

Filter function for data frames. Returns a data frame that only contains the rows of the input data frame for which the given predicate evaluates to True.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • predicate (openclean.function.eval.base.EvalFunction) – Evaluation function that is expected to return a Boolean value when evaluated on a data frame row. Only those rows in the input data frame that satisfy the predicate will be included in the result.

  • negated (bool, default=False) – Negate the predicate value to get an inverted result.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.insert module

Data frame transformation operator that inserts new columns and rows into a data frame.

class openclean.operator.transform.insert.InsCol(names: Union[str, List[str]], pos: Optional[int] = None, values: Optional[Union[Callable, openclean.function.eval.base.EvalFunction, List, int, float, str, datetime.datetime, Tuple]] = None)

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Data frame transformer that inserts columns into a data frame. Values for the new column(s) are generated using a given value generator function.

inspos(schema: List[Union[str, histore.document.schema.Column]])int

Get the insert position for the new column.

Raises a ValueError if the position is invalid.

Parameters

schema (list of string) – Dataset input schema.

Returns

Return type

int

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that re-orders values in a data stream row.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

transform(df)

Modify rows in the given data frame. Returns a modified data frame where columns have been inserted containing results of evaluating the associated value generator function.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

Raises

ValueError

class openclean.operator.transform.insert.InsRow(pos=None, values=None)

Bases: openclean.operator.base.DataFrameTransformer

Data frame transformer that inserts rows into a data frame. If values is None a single row with all None values will be inserted. Ir values is a list of lists multiple rows will be inserted.

transform(df)

Insert rows in the given data frame. Returns a modified data frame where rows have been added. Raises a ValueError if the specified insert position is invalid or the number of values that are inserted does not match the schema of the given data frame.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.insert.inscol(df: pandas.core.frame.DataFrame, names: Union[str, List[str]], pos: Optional[int] = None, values: Optional[Union[int, float, str, datetime.datetime, openclean.function.eval.base.EvalFunction]] = None)pandas.core.frame.DataFrame

Insert function for data frame columns. Returns a modified data frame where columns have been inserted at a given position. Exactly one column is inserted for each given column name. If the insert position is undefined, columns are appended to the data frame. If the position does not reference a valid position (i.e., not between 0 and len(df.columns)) a ValueError is raised.

Values for the inserted columns are generated using a given constant value or evaluation function. If a function is given, it is expected to return exactly one value (e.g., a tuple of len(names)) for each of the inserted columns.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • names (string, or list(string)) – Names of the inserted columns.

  • pos (int, default=None) – Insert position for the new columns. If None, the columns will be appended.

  • values (scalar, tuple, or openclean.function.eval.base.EvalFunction,) – default=None Single value, tuple of values, or evaluation function that is used to generate the values for the inserted column(s). If no default is specified all columns will contain None.

Returns

Return type

pd.DataFrame

openclean.operator.transform.insert.insrow(df, pos=None, values=None)

Insert a row into a data frame at a specified position. If the list of row values is given there has to be exactly one value per column in the data frame.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • pos (int, optional) – Insert position for the new row(s). If None, the rows will be appended.

  • values (list, optional) – List or values (to insert one row) or list of lists (to insert multiple rows).

Returns

Return type

pandas.DataFrame

openclean.operator.transform.limit module

Data frame transformer (and stream processor) that can be used to limit the number of rows in a data frame. The limit operator is primarily intended for use in streaming settings. The data frame transformer implementation is included for completeness.

class openclean.operator.transform.limit.Limit(rows: int)

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Transformer and stream processor that limits the number of rows in a data frame.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of a stream consumer that limits the number of rows that are passed on to a downstream consumer.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.transformer.limit.LimitConsumer

transform(df: pandas.core.frame.DataFrame)pandas.core.frame.DataFrame

Return a data frame that contains at most n of rows (where n equals the row limit that was set when this object was created).

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

pd.DataFrame

class openclean.operator.transform.limit.LimitConsumer(columns: List[Union[str, histore.document.schema.Column]], limit: int, consumer: Optional[openclean.operator.stream.consumer.StreamConsumer] = None)

Bases: openclean.operator.stream.consumer.ProducingConsumer

Consumer that limits the number of rows that are passed on to a downstream consumer. Raises a StopIteration error when the maximum number of rows is reached.

handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Pass the row on to the downstream consumer if the row limit has not been reached yet. Otherwise, a StopIteration error is raised.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

openclean.operator.transform.limit.limit(df: pandas.core.frame.DataFrame, rows: int)pandas.core.frame.DataFrame

Limit the number of rows in a data frame. Returns a data frame that contains at most the first n (n=rows) rows from the input data frame.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • rows (int) – Limit on number of rows in the result. Rows are included starting from the first row until either the row limit or end of the data frame is reached (whatever comes first).

Returns

Return type

pd.DataFrame

openclean.operator.transform.move module

Data frame transformation operator for sorting by data frame columns.

class openclean.operator.transform.move.MoveCols(columns: Union[int, str, List[Union[str, int]]], pos: int)

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Operator to move one or more columns to a specified index position.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that re-orders values in a data stream row.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

reorder(schema: List[Union[str, histore.document.schema.Column]])List[int]

Get a the order of columns in the modified data schema. The new column order is represented as a list where over the original column index positions.

Parameters

schema (list of string) – Dataset input schema.

Returns

Return type

list of int

transform(df)

Return a data frame that contains all rows but only those columns from the given input data frame that are included in the select clause.

Raises a value error if the list of columns contains an item that cannot be matched to a column in the given data frame.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

class openclean.operator.transform.move.MoveRows(rows, pos)

Bases: openclean.operator.base.DataFrameTransformer

Operator to move one or more rows to a specified index position.

transform(df)

Return a data frame that contains all rows but only those columns from the given input data frame that are included in the select clause.

Raises a value error if the list of columns contains an item that cannot be matched to a column in the given data frame.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.move.move_rows(df: pandas.core.frame.DataFrame, rowids: Union[int, List[int]], pos: int)

Move one or more rows in a data frame to a given position.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • rows (int or list(int)) – Identifier of rows that are being moved.

  • pos (int) – Insert position for the moved columns.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.move.movecols(df: pandas.core.frame.DataFrame, columns: Union[int, str, List[Union[str, int]]], pos: int)

Move one or more columns in a data frame to a given position.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • pos (int) – Insert position for the moved columns.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.rename module

Functions and classes that implement the column renaming operator in openclean.

class openclean.operator.transform.rename.Rename(columns: Union[int, str, List[Union[str, int]]], names: List[Union[str, histore.document.schema.Column]])

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Data frame transformer that renames a selected list of columns in a data frame. The output is a data frame that contains all rows and columns from an input data frame but with thoses columns that are listed in the given column list being renamed with the respective value in the given names list.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that has a schema with renamed columns. The associated stream function does not manipulate any of the rows.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

rename(schema: List[Union[str, histore.document.schema.Column]])List[Union[str, histore.document.schema.Column]]

Create a modified dataset schema with renamed columns.

Parameters

schema (list of string) – Dataset input schema.

Returns

Return type

list of string

transform(df)

Return a data frame that contains all rows and columns from an input data frame but with thoses columns that are listed in the given column list being renamed with the respective value in the given names list.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.rename.rename(df, columns, names)

The column rename operator returns a data frame where a given list of columns has been renamed. The renaming does not have to include all columns in the data frame. However, the given list of columns and new column names have to be of the same length.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • names (string or list(string)) – Single name or list of names for the renamed columns.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.select module

Functions and classes that implement the column selection operator in openclean.

class openclean.operator.transform.select.Select(columns: Union[int, str, List[Union[str, int]]], names: Optional[Union[str, List[str]]] = None)

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Data frame transformer that selects a list of columns from a data frame. The output is a data frame that contains all rows from an input data frame but only those columns that are included in a given select clause.

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that filters columns from data frame rows using the associated list of columns (i.e., the select clause).

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

transform(df: pandas.core.frame.DataFrame)pandas.core.frame.DataFrame

Return a data frame that contains all rows but only those columns from the given input data frame that are included in the select clause.

Raises a value error if the list of columns contains an item that cannot be matched to a column in the given data frame.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.select.select(df: pandas.core.frame.DataFrame, columns: Union[int, str, List[Union[str, int]]], names: Optional[Union[str, List[str]]] = None)pandas.core.frame.DataFrame

Projection operator that selects a list of columns from a data frame. Returns a data frame that contains only thoses columns that are included in the given select clause. The optional list of names allows to rename the columns in the resulting data frame. If the list of names is given, it has to be of the same length as the list of columns.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • names (string or list(string)) – Single name or list of names for the resulting columns.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.sort module

Data frame transformation operator for sorting by data frame columns.

class openclean.operator.transform.sort.Sort(columns, reversed=None)

Bases: openclean.operator.base.DataFrameTransformer

Sort operator for data frames. Allows to sort a data frame by one or more columns. For each column, the sort order can be specified separately.

transform(df)

Return a data frame that contains all rows but only those columns from the given input data frame that are included in the select clause.

Raises a value error if the list of columns contains an item that cannot be matched to a column in the given data frame.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.sort.order_by(df, columns, reversed=None)

Sort operator for data frames. Sort columns are referenced by their name or index position.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • reversed (list(bool), default=None) – Allows to specify for each sort column if sort order is reversed. If given, the length of this list has to match the length of the columns list.

Returns

Return type

pandas.DataFrame

Raises

ValueError

openclean.operator.transform.update module

Data frame transformation operator that updates values in columns of a data frame.

class openclean.operator.transform.update.Update(columns: Union[int, str, List[Union[str, int]]], func: Union[Callable, Dict, openclean.function.eval.base.EvalFunction, int, float, str, datetime.datetime, openclean.function.value.base.ValueFunction])

Bases: openclean.operator.stream.processor.StreamProcessor, openclean.operator.base.DataFrameTransformer

Data frame transformer that updates values in data frame column(s) using a given update function. The function is executed for each row and the resulting values replace the original cell values in the row for all listed columns (in their order of appearance in the columns list).

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamFunctionHandler

Factory pattern for stream consumer. Returns an instance of a stream consumer that updates values in a data stream row.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamFunctionHandler

transform(df: pandas.core.frame.DataFrame)pandas.core.frame.DataFrame

Modify rows in the given data frame. Returns a modified data frame where values have been updated by the results of evaluating the associated row update function.

Parameters

df (pandas.DataFrame) – Input data frame.

Returns

Return type

pandas.DataFrame

openclean.operator.transform.update.get_update_function(func: Union[Callable, Dict, openclean.function.eval.base.EvalFunction, int, float, str, datetime.datetime, openclean.function.value.base.ValueFunction], columns: Union[int, str, List[Union[str, int]]])openclean.function.eval.base.EvalFunction

Helper method to ensure that the function that is passed to an update operator is an evaluation function that was properly initialized.

If the function argument is a dictionary it is converted into a lookup table. if the argument is a scalar value it is converted into a constant evaluation function. Special attention is given to conditional replacement functions that do not have their pass-through function set.

Parameters
  • func (scalar, dict, callable, openclean.function.value.base.ValueFunction,) – or openclean.function.eval.base.EvalFunction Specification of the (resulting) evaluation function that is used to generate the updated values for each row in the data frame.

  • columns (list(int or string)) – List of column index positions or column names.

Returns

Return type

openclean.function.eval.base.EvalFunction

openclean.operator.transform.update.swap(df: pandas.core.frame.DataFrame, col1: Union[int, str], col2: Union[int, str])pandas.core.frame.DataFrame

Swap values in two columns of a data frame. Replaces values in column one with values in column two and vice versa for each row in a data frame.

Raises a ValueError if the column arguments are not of type int or string.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • col1 (int or string) – Single column index or name.

  • col12 (int or string) – Single column index or name.

Returns

Return type

pd.DataFrame

Raises

ValueError

openclean.operator.transform.update.update(df: pandas.core.frame.DataFrame, columns: Union[int, str, List[Union[str, int]]], func: Union[Callable, Dict, openclean.function.eval.base.EvalFunction, int, float, str, datetime.datetime, openclean.function.value.base.ValueFunction])pandas.core.frame.DataFrame

Update function for data frames. Returns a modified data frame where values in the specified columns have been modified using the given update function.

The update function is executed for each data frame row. The number of values returned by the function must match the number of columns that are being modified. Returned values are used to update column values in the same order as columns are specified in the columns list.

The function that is used to generate the update values will be a evaluation function. The user has the option to also provide a constant value, a lookup dictionary, or a callable (or value function) that accepts a single value.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string), optional) – Single column or list of column index positions or column names.

  • func (scalar, dict, callable, openclean.function.value.base.ValueFunction,) – or openclean.function.eval.base.EvalFunction Specification of the (resulting) evaluation function that is used to generate the updated values for each row in the data frame.

Returns

Return type

pd.DataFrame

Submodules
openclean.operator.base module

Abstract classes for openclean pipeline operators. There are four primary types of operators:

  • DataFrameTransformer: The data frame transformer takes a DataFrame as input and generates a DataFrame as output.

  • DataFrameMapper: The group generator takes as input a DataFrame and outputs a GroupBy.

  • DataGroupReducer: The group reducer takes a GroupBy as input and outputs a DataFrame.

  • DataGroupTransformer: The group transformers takes aa GroupBy as

input and outputs a GroupBy.

In addition to the output DatFrame’s or GroupBy object, each operator can output a stage state object.

class openclean.operator.base.DataFrameMapper

Bases: openclean.operator.base.PipelineStage

Abstract class for pipeline components that take a data frame as input and return a data frame grouping as output.

abstract map(df)

This is the main method that each subclass of the mapper has to implement. The input is a pandas data frame. The output is a group of pandas data frames.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

openclean.data.groupby.DataFrameGrouping

class openclean.operator.base.DataFrameSplitter

Bases: openclean.operator.base.PipelineStage

Abstract class for pipeline components that take a data frame as input and returns two data frames as output. This is a special case of the data frame mapper.

abstract split(df)

This is the main method that each subclass of the splitter has to implement. The input is a pandas data frame. The output are two data frames.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

pd.DataFrame, pd.DataFrame

class openclean.operator.base.DataFrameTransformer

Bases: openclean.operator.base.PipelineStage

Abstract class for pipeline components that take a data frame as input and return a transformed data frame as output.

abstract transform(df)

This is the main method that each subclass of the transformer has to implement. The input is a pandas data frame. The output is a modified data frame.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

pd.DataFrame

class openclean.operator.base.DataGroupReducer

Bases: openclean.operator.base.PipelineStage

Abstract class for pipeline components that take a group of data frames as input and return a single data frame as output.

abstract reduce(groups: openclean.data.groupby.DataFrameGrouping)pandas.core.frame.DataFrame

This is the main method that each subclass of the group reducer has to implement. The input is a pandas data frame grouping. The output is a single data frame.

Parameters

groups (openclean.data.groupby.DataFrameGrouping) – Grouping of pandas data frames.

Returns

Return type

pd.DataFrame

class openclean.operator.base.DataGroupTransformer

Bases: openclean.operator.base.PipelineStage

Abstract class for pipeline components that take a data frame grouping as input and return a transformed grouping.

abstract transform(groups)

This is the main method that each subclass of the transformer has to implement. The input is a pandas data frame grouping. The output is a modified data frame grouping.

Parameters

groups (openclean.data.groupby.DataFrameGrouping) – Grouping of pandas data frames.

Returns

Return type

openclean.data.groupby.DataFrameGrouping

class openclean.operator.base.PipelineStage

Bases: object

Generic pipline stage interface.

is_frame_mapper()bool

Test whether a pipeline operator is a (sub-)class of the data frame mapper type.

Returns

Return type

bool

is_frame_splitter()bool

Test whether a pipeline operator is a (sub-)class of the data frame splitter type.

Returns

Return type

bool

is_frame_transformer()bool

Test whether a pipeline operator is a (sub-)class of the data frame transformer type.

Returns

Return type

bool

is_group_reducer()bool

Test whether a pipeline operator is a (sub-)class of the data group reducer type.

Returns

Return type

bool

is_group_transformer()bool

Test whether a pipeline operator is a (sub-)class of the data group transformer type.

Returns

Return type

bool

openclean.profiling package
Subpackages
openclean.profiling.anomalies package
Submodules
openclean.profiling.anomalies.base module

Abstract base class for anomaly and outlier detection operators.

class openclean.profiling.anomalies.base.AnomalyDetector

Bases: openclean.profiling.base.DistinctSetProfiler

Interface for generic anomaly and outlier detectors. Each implementation should take a stream of distinct values (e.g., from a column in a data frame or a metadata object) as input and return a list of values that were identified as outliers.

find(values: Union[Iterable[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]], collections.Counter])List[Union[Dict, int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Identify values in a given set of values that are classified as outliers or anomalities. Returns a list of identified values.

Parameters

values (iterable of values) – List of input values.

Returns

Return type

list

openclean.profiling.anomalies.conditional module

Generic conditional outlier detector. Identify values as outliers if they satisfy a given outlier predicate.

class openclean.profiling.anomalies.conditional.ConditionalOutliers(resultcls: Optional[Type] = <class 'list'>)

Bases: openclean.profiling.anomalies.base.AnomalyDetector

Detect outliers in a given value sequence by testing for each value whether they satisfy an implementation-specific outlier condition.

abstract outlier(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], count: int)Any

Implementation specific outlier condition. If the given value is classified as an outlier, the result is a dictionary object containing the outlier value and additional optional provenance information that was generated by the outlier detector. If the value is not an outlier, the result is None.

Parameters

value (scalar or tuple) – Value that is being classified as an outlier.

Returns

Return type

any

process(values: collections.Counter)List

Identify values in a given set of values that satisfy the outlier condition. This method is called if the outlier detector is part of a data profiler configuration. The result is a list containing either the oulier values or dictionaries containing the outlier value (associated with the key ‘value’) and additional information that the outlier detector provided as supporting evidence (associated with the key ‘metadata’).

Parameters

values (collections.Counter) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

list

openclean.profiling.anomalies.datatype module

Operators for detecting values in a column that do not match the (expected) data type for the column.

class openclean.profiling.anomalies.datatype.DatatypeOutlierResults(iterable=(), /)

Bases: list

Datatype outlier results are a list of dictionaries. Each dictionary contains information about a detected outlier value (‘value’) and additional metadata (‘metadata’: {‘type’}) about the assigned type label for the outlier value.

This class provides some basic functionality to access the individual pieces of information from these dictionaries.

types()Dict

Get a mapping of outlier types to a list of values of that type.

Returns

Return type

dict

Raises

KeyError

values()List

Get only the list of outlier vaues.

Returns

Return type

list

class openclean.profiling.anomalies.datatype.DatatypeOutliers(classifier: Callable, domain: Union[int, float, str, datetime.datetime, List[Union[int, float, str, datetime.datetime]]])

Bases: openclean.profiling.anomalies.conditional.ConditionalOutliers

Identify values that do not match the expected data type for a list of values (e.g., a column in a data frame). The expected data type is defined by a set of data type labels. A classifier is used to identify the type of values. Values that are assigned a type that are not included in the set of expected type labels are considered outliers.

outlier(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])Dict

Use classifier to get the data type for the given value. If the returned type label is not included in the set of valid type labels the value is considered an outlier.

Returns a dictionary for values that are classified as outliers that contains two elements: ‘value’ and ‘metadata’, containing the tested value and the returned type label (in the ‘metadata’ dictionary with key ‘type’), respectively.

Parameters

value (scalar or tuple) – Value that is being tested for the outlier condition.

Returns

Return type

dict

openclean.profiling.anomalies.datatype.datatype_outliers(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], classifier: Callable, domain: Union[int, float, str, datetime.datetime, List[Union[int, float, str, datetime.datetime]]])Dict

Identify values that do not match the expected data type. The expected data type for a (list of) column(s) is defined by the given domain. The classifier is used to identify the type of data values. Values that are assigned a type that does not belong to the defined domain are considered data type outliers.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (int, string, list, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a a single column reference or a list of column references.

  • classifier (callable) – Classifier that assigns data type class labels to column values.

  • domain (scalar or list) – Valid data type value(s). Defines the types that are not considered outliers.

Returns

Return type

dict

openclean.profiling.anomalies.domain module

Domain outlier detector.

class openclean.profiling.anomalies.domain.DomainOutliers(domain: Union[pandas.core.frame.DataFrame, Dict, List, Set], ignore_case: Optional[bool] = False)

Bases: openclean.profiling.anomalies.conditional.ConditionalOutliers

The domain outlier detector returns the list of values from a given data stream that do not occur in a ground truth domain.

outlier(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Test if a given value is in the associated ground truth domain. If the value is not in the domain it is considered an outlier.

Returns a dictionary for values that are classified as outliers that contains one element ‘value’ for the tested value.

Parameters

value (scalar or tuple) – Value that is being tested for the outlier condition.

Returns

Return type

bool

openclean.profiling.anomalies.domain.domain_outliers(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], domain: Union[pandas.core.frame.DataFrame, Dict, List, Set], ignore_case: Optional[bool] = False)List

The domain outlier detector returns the list of values from a given data stream that do not occur in a ground truth domain.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • domain (pandas.DataFrame, pandas.Series, or object) – Data frame or series, or any object that implements the __contains__ method.

  • ignore_case (bool, optional) – Ignore case for domain inclusion checking

Returns

Return type

list

openclean.profiling.anomalies.frequency module

Operators for frequency outlier detection.

class openclean.profiling.anomalies.frequency.FrequencyOutlierResults(iterable=(), /)

Bases: list

Frequency outlier results are a list of dictionaries. Each dictionary contains information about a detected outlier value (‘value’) and additional frequency metadata (‘metadata’: {‘count’, ‘frequency’}).

This class provides some basic functionality to access the individual pieces of information from these dictionaries.

add(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]], count: int, frequency: Optional[float] = None)

Add a new outlier to the list.

Parameters
  • value (scalar or tuple) – The outlier value.

  • count (int) – Value frequency count.

  • frequency (float, default=None) – Normalized value frequency (if a normalizer as used).

counts()collections.Counter

Get a mapping of outlier values to their frequency counts.

Returns

Return type

collections.Counter

frequencies()Dict

Get a mapping of outlier values to their normalized frequencies.

Returns

Return type

dict

Raises

KeyError

values()List

Get only the list of outlier vaues.

Returns

Return type

list

class openclean.profiling.anomalies.frequency.FrequencyOutliers(threshold: Union[Callable, int, float], normalize: Optional[openclean.function.value.normalize.numeric.NumericNormalizer] = <openclean.function.value.normalize.numeric.DivideByTotal object>)

Bases: openclean.profiling.anomalies.base.AnomalyDetector

Detect frequency outliers for values in a given list. A value is considered an outlier if its relative frequency in the list satisfies the given threshold predicate.

process(values: collections.Counter)openclean.profiling.anomalies.frequency.FrequencyOutlierResults

Normalize the frequency counts in the given mapping. Returns all values that satisfy the threshold constraint together with their normalized (and absolute) frequencies.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

openclean.profiling.anomalies.frequency.FrequencyOutlierResults

openclean.profiling.anomalies.frequency.frequency_outliers(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], threshold: Union[Callable, int, float], normalize: Optional[openclean.function.value.normalize.numeric.NumericNormalizer] = <openclean.function.value.normalize.numeric.DivideByTotal object>)openclean.profiling.anomalies.frequency.FrequencyOutlierResults

Detect frequency outliers for values (or value combinations) in one or more columns of a data frame. A value (combination) is considered an outlier if the relative frequency satisfies the given threshold predicate.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • threshold (callable) – Function that accepts a float (i.e., the relative frequency) and that returns a Boolean value. True indicates that the value (frequency) satisfies the value outlier condition.

  • normalize (openclean.function.value.normalize.NumericNormalizer) – Function used to normalize frequency values befor evaluating the threshold constraint.

Returns

Return type

openclean.profiling.anomalies.frequency.FrequencyOutlierResults

openclean.profiling.anomalies.pattern module

Outlier detection algorithms using regular expressions. Pattern outliers in general are considered values that do not match a (list of) pattern(s) that the values in a list (e.g., data frame column) are expected to satisfy.

openclean.profiling.anomalies.pattern.DefaultTokenizer()openclean.function.token.base.Tokenizer

Create an instance of the default tokenizer.

class openclean.profiling.anomalies.pattern.RegExOutliers(patterns: List[str], fullmatch: Optional[bool] = True)

Bases: openclean.profiling.anomalies.conditional.ConditionalOutliers

Identify values in a (list of) data frame columns(s) that do not match any of the given pattern expressions. Patterns are represented as strings in the Python Regular Expression Syntax.

outlier(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Test if a given value is a match for the associated regular expressions. If the value is not a match it is considered an outlier.

Returns a dictionary for values that are classified as outliers that contains one element ‘value’ for the tested value.

Parameters

value (scalar or tuple) – Value that is being tested for the outlier condition.

Returns

Return type

bool

class openclean.profiling.anomalies.pattern.TokenSignatureOutliers(signature: List[Set[str]], tokenizer: Optional[openclean.function.token.base.Tokenizer] = None, exactly_one: Optional[bool] = False)

Bases: openclean.profiling.anomalies.conditional.ConditionalOutliers

Identify values that do not contain at least one token from a given token signature.

Uses a given tokenizer to transform a given value into a set of tokens. Then checks if at least one of the tokens matches one of the entries in a token signature. To match an entry, the token has to be a member of the set of tokens for that entry.

outlier(value: Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]])bool

Test if a given value is a match for the associated regular expressions. If the value is not a match it is considered an outlier.

Returns a dictionary for values that are classified as outliers that contains one element ‘value’ for the tested value.

Parameters

value (scalar or tuple) – Value that is being tested for the outlier condition.

Returns

Return type

bool

openclean.profiling.anomalies.pattern.regex_outliers(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]], patterns: List[str], fullmatch: Optional[bool] = True)List

Identify values in a (list of) data frame columns(s) that do not match any of the given pattern expressions. Patterns are represented as strings in the Python Regular Expression Syntax.

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • patterns (list(string)) – List if regular expression patterns.

  • fullmatch (bool, default=True) – If True, the pattern has to match a given string fully in order to not be considered an outlier.

Returns

Return type

list

openclean.profiling.anomalies.sklearn module

Generic outlier detector that uses scikit-learn outlier detection or clustering algorithms.

class openclean.profiling.anomalies.sklearn.DBSCANOutliers(features=None, eps=0.5, min_samples=5, metric='minkowski', metric_params=None, algorithm='auto', leaf_size=30, p=2, n_jobs=None)

Bases: openclean.profiling.anomalies.sklearn.SklearnOutliers

Perform outlier detection using DBSCAN clustering.

class openclean.profiling.anomalies.sklearn.SklearnOutliers(algorithm: sklearn.base.BaseEstimator, features: Optional[openclean.embedding.base.ValueEmbedder] = None)

Bases: openclean.profiling.anomalies.base.AnomalyDetector

Detect outliers in a given value stream based on a scikit-learn outlier detection or clustering algoritm. Expects a scikit-learn estimator and a value embedding generator. Outlier detection uses the fit_predict method of the scikit-learn estimator to get labels for each value. Values that are assigned a label of -1 are considered outliers.

process(values: collections.Counter)List

Return set of values that are identified as outliers. This anomaly detector does not provide any additional provenance for the detected outlier values (other than the name of the used algorithm).

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

dict

openclean.profiling.anomalies.sklearn.dbscan(df, columns, features=None, eps=0.5, min_samples=5, metric='minkowski', metric_params=None, algorithm='auto', leaf_size=30, p=2, n_jobs=None)

Perform outlier detection using DBSCAN clustering. Returns values as outliers that are not added to any cluster. Supports all parameters of the DBSCAN implementation in scikit-learn (documentation copied below).

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • features (openclean.profiling.embedding.base.ValueEmbedder, optional) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

  • eps (float, default=0.5) – The maximum distance between two samples for one to be considered as in the neighborhood of the other. This is not a maximum bound on the distances of points within a cluster. This is the most important DBSCAN parameter to choose appropriately for your data set and distance function.

  • min_samples (int, default=5) – The number of samples (or total weight) in a neighborhood for a point to be considered as a core point. This includes the point itself.

  • metric (string, or callable) – The metric to use when calculating distance between instances in a feature array. If metric is a string or callable, it must be one of the options allowed by sklearn.metrics.pairwise_distances() for its metric parameter. If metric is “precomputed”, X is assumed to be a distance matrix and must be square during fit. X may be a sparse graph, in which case only “nonzero” elements may be considered neighbors.

  • metric_params (dict, default=None) – Additional keyword arguments for the metric function.

  • algorithm ({'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto') – The algorithm to be used by the NearestNeighbors module to compute pointwise distances and find nearest neighbors. See NearestNeighbors module documentation for details.

  • leaf_size (int, default=30) – Leaf size passed to BallTree or cKDTree. This can affect the speed of the construction and query, as well as the memory required to store the tree. The optimal value depends on the nature of the problem.

  • p (float, default=2) – The power of the Minkowski metric to be used to calculate distance between points.

  • n_jobs (int, default=None) – The number of parallel jobs to run for neighbors search. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details. If precomputed distance are used, parallel execution is not available and thus n_jobs will have no effect.

Returns

Return type

list

openclean.profiling.anomalies.sklearn.isolation_forest(df, columns, features=None, n_estimators=100, max_samples='auto', contamination='auto', max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)

Perform outlier detection using the isolation forest outlier detection. Supports most parameters of the IsolationForest implementation in scikit-learn (documentation copied below).

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • features (openclean.profiling.embedding.base.ValueEmbedder, optional) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

  • n_estimators (int, default=100) – The number of base estimators in the ensemble.

  • max_samples ("auto", int or float, default="auto") –

    The number of samples to draw from X to train each base estimator.
    • If int, then draw max_samples samples.

    • If float, then draw max_samples * X.shape[0] samples.

    • If “auto”, then max_samples=min(256, n_samples).

    If max_samples is larger than the number of samples provided, all samples will be used for all trees (no sampling).

  • contamination ('auto' or float, default='auto') –

    The amount of contamination of the data set, i.e. the proportion of outliers in the data set. Used when fitting to define the threshold on the scores of the samples.

    • If ‘auto’, the threshold is determined as in the original paper.

    • If float, the contamination should be in the range [0, 0.5].

    Changed in version 0.22: The default value of contamination changed from 0.1 to 'auto'.

  • max_features (int or float, default=1.0) –

    The number of features to draw from X to train each base estimator.
    • If int, then draw max_features features.

    • If float, then draw max_features * X.shape[1] features.

  • bootstrap (bool, default=False) – If True, individual trees are fit on random subsets of the training data sampled with replacement. If False, sampling without replacement is performed.

  • n_jobs (int, default=None) – The number of jobs to run in parallel for both fit() and predict(). None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

  • random_state (int or RandomState, default=None) – Controls the pseudo-randomness of the selection of the feature and split values for each branching step and each tree in the forest. Pass an int for reproducible results across multiple function calls. See Glossary.

  • verbose (int, default=0) – Controls the verbosity of the tree building process.

  • warm_start (bool, default=False) – When set to True, reuse the solution of the previous call to fit and add more estimators to the ensemble, otherwise, just fit a whole new forest. See the Glossary.

Returns

Return type

list

openclean.profiling.anomalies.sklearn.local_outlier_factor(df, columns, features=None, n_neighbors=20, algorithm='auto', leaf_size=30, metric='minkowski', p=2, metric_params=None, contamination='auto', novelty=False, n_jobs=None)

Perform outlier detection using Local Outlier Factor (LOF). Supports all parameters of the LocalOutlierFactor implementation in scikit-learn (documentation copied below).

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • features (openclean.profiling.embedding.base.ValueEmbedder) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

  • n_neighbors (int, default=20) – Number of neighbors to use by default for kneighbors() queries. If n_neighbors is larger than the number of samples provided, all samples will be used.

  • algorithm ({'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto') –

    Algorithm used to compute the nearest neighbors: - ‘ball_tree’ will use BallTree - ‘kd_tree’ will use KDTree - ‘brute’ will use a brute-force search. - ‘auto’ will attempt to decide the most appropriate algorithm

    based on the values passed to fit() method.

    Note: fitting on sparse input will override the setting of this parameter, using brute force.

  • leaf_size (int, default=30) – Leaf size passed to BallTree or KDTree. This can affect the speed of the construction and query, as well as the memory required to store the tree. The optimal value depends on the nature of the problem.

  • metric (str or callable, default='minkowski') –

    metric used for the distance computation. Any metric from scikit-learn or scipy.spatial.distance can be used. If metric is “precomputed”, X is assumed to be a distance matrix and must be square. X may be a sparse matrix, in which case only “nonzero” elements may be considered neighbors. If metric is a callable function, it is called on each pair of instances (rows) and the resulting value recorded. The callable should take two arrays as input and return one value indicating the distance between them. This works for Scipy’s metrics, but is less efficient than passing the metric name as a string. Valid values for metric are: - from scikit-learn: [‘cityblock’, ‘cosine’, ‘euclidean’, ‘l1’, ‘l2’,

    ’manhattan’]

    • from scipy.spatial.distance: [‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘correlation’, ‘dice’, ‘hamming’, ‘jaccard’, ‘kulsinski’, ‘mahalanobis’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’]

    See the documentation for scipy.spatial.distance for details on these metrics: https://docs.scipy.org/doc/scipy/reference/spatial.distance.html

  • p (int, default=2) – Parameter for the Minkowski metric from sklearn.metrics.pairwise.pairwise_distances(). When p = 1, this is equivalent to using manhattan_distance (l1), and euclidean_distance (l2) for p = 2. For arbitrary p, minkowski_distance (l_p) is used.

  • metric_params (dict, default=None) – Additional keyword arguments for the metric function.

  • contamination ('auto' or float, default='auto') –

    The amount of contamination of the data set, i.e. the proportion of outliers in the data set. When fitting this is used to define the threshold on the scores of the samples. - if ‘auto’, the threshold is determined as in the

    original paper,

    • if a float, the contamination should be in the range [0, 0.5].

  • novelty (bool, default=False) – By default, LocalOutlierFactor is only meant to be used for outlier detection (novelty=False). Set novelty to True if you want to use LocalOutlierFactor for novelty detection. In this case be aware that that you should only use predict, decision_function and score_samples on new unseen data and not on the training set.

  • n_jobs (int, default=None) – The number of parallel jobs to run for neighbors search. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.

Returns

Return type

list

openclean.profiling.anomalies.sklearn.one_class_svm(df, columns, features=None, kernel='rbf', degree=3, gamma='scale', coef0=0.0, tol=0.001, nu=0.5, shrinking=True, cache_size=200, verbose=False, max_iter=- 1)

Perform outlier detection using Unsupervised Outlier Detection. Supports all parameters of the OneClassSVM implementation in scikit-learn (documentation copied below).

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • features (openclean.profiling.embedding.base.ValueEmbedder) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

  • kernel ({'linear', 'poly', 'rbf', 'sigmoid', 'precomputed'}, default='rbf') – Specifies the kernel type to be used in the algorithm. It must be one of ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ or a callable. If none is given, ‘rbf’ will be used. If a callable is given it is used to precompute the kernel matrix.

  • degree (int, default=3) – Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels.

  • gamma ({'scale', 'auto'} or float, default='scale') –

    Kernel coefficient for ‘rbf’, ‘poly’ and ‘sigmoid’. - if gamma='scale' (default) is passed then it uses

    1 / (n_features * X.var()) as value of gamma,

    • if ‘auto’, uses 1 / n_features.

    Changed in version 0.22: The default value of gamma changed from ‘auto’ to ‘scale’.

  • coef0 (float, default=0.0) – Independent term in kernel function. It is only significant in ‘poly’ and ‘sigmoid’.

  • tol (float, default=1e-3) – Tolerance for stopping criterion.

  • nu (float, default=0.5) – An upper bound on the fraction of training errors and a lower bound of the fraction of support vectors. Should be in the interval (0, 1]. By default 0.5 will be taken.

  • shrinking (bool, default=True) – Whether to use the shrinking heuristic. See the User Guide.

  • cache_size (float, default=200) – Specify the size of the kernel cache (in MB).

  • verbose (bool, default=False) – Enable verbose output. Note that this setting takes advantage of a per-process runtime setting in libsvm that, if enabled, may not work properly in a multithreaded context.

  • max_iter (int, default=-1) – Hard limit on iterations within solver, or -1 for no limit.

Returns

Return type

list

openclean.profiling.anomalies.sklearn.robust_covariance(df, columns, features=None, store_precision=True, assume_centered=False, support_fraction=None, contamination=0.1, random_state=None)

Perform outlier detection using EllipticEnvelope for detecting outliers in a Gaussian distributed dataset. Supports all parameters of the EllipticEnvelope implementation in scikit-learn (documentation copied below).

Parameters
  • df (pandas.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • features (openclean.profiling.embedding.base.ValueEmbedder) – Generator for feature vectors that computes a vector of numeric values for a given scalar value (or tuple).

  • store_precision (bool, default=True) – Specify if the estimated precision is stored.

  • assume_centered (bool, default=False) – If True, the support of robust location and covariance estimates is computed, and a covariance estimate is recomputed from it, without centering the data. Useful to work with data whose mean is significantly equal to zero but is not exactly zero. If False, the robust location and covariance are directly computed with the FastMCD algorithm without additional treatment.

  • support_fraction (float, default=None) – The proportion of points to be included in the support of the raw MCD estimate. If None, the minimum value of support_fraction will be used within the algorithm: [n_sample + n_features + 1] / 2. Range is (0, 1).

  • contamination (float, default=0.1) – The amount of contamination of the data set, i.e. the proportion of outliers in the data set. Range is (0, 0.5).

  • random_state (int or RandomState instance, default=None) – Determines the pseudo random number generator for shuffling the data. Pass an int for reproducible results across multiple function calls. See :term: Glossary <random_state>.

Returns

Return type

list

openclean.profiling.classifier package
Submodules
openclean.profiling.classifier.base module

Generic classifier that can be used as a profiling function.

class openclean.profiling.classifier.base.Classifier(classifier: openclean.function.value.classifier.ValueClassifier, normalizer: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, features: Optional[openclean.profiling.classifier.base.ResultFeatures] = None, labels: Optional[Union[List[str], Tuple[str, str]]] = None)

Bases: openclean.profiling.base.DataStreamProfiler

The classifier wraps a ValueClassifier with functionality that allows it to be used as a profiling function.

close()Dict

Convert the total and distinct counts for class labels into the requested format. The result is a dictionary. The elements in the dictionary depend on the features that were requested (at object construction) and whether a normaizer was given or not.

Returns

Return type

dict

consume(value: Union[int, float, str, datetime.datetime], count: int)

Consume a pair of (value, count) in the data stream. Collects all values in a counter dictionary.

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

open()

Initialize the counter for class label frequencies at the beginning of the stream.

class openclean.profiling.classifier.base.ResultFeatures(value)

Bases: enum.Enum

Enumarate accepted values for the datatype features argument.

BOTH = 2
DISTINCT = 0
TOTAL = 1
openclean.profiling.classifier.datatype module

Profiling operator that computes data type statistics and raw type domain assignments for columns in a data frame.

class openclean.profiling.classifier.datatype.Datatypes(classifier: Optional[openclean.function.value.classifier.ValueClassifier] = None, normalizer: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, features: Optional[openclean.profiling.classifier.base.ResultFeatures] = None, labels: Optional[Union[List[str], Tuple[str, str]]] = None)

Bases: openclean.profiling.classifier.base.Classifier

Compute data type frequency counts for values in a given list.

openclean.profiling.classifier.datatype.datatypes(df: pandas.core.frame.DataFrame, columns: Optional[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]]] = None, classifier: Optional[openclean.function.value.classifier.ValueClassifier] = None, normalizer: Optional[Union[Callable, openclean.function.value.base.ValueFunction]] = None, features: Optional[openclean.profiling.classifier.base.ResultFeatures] = None, labels: Optional[Union[List[str], Tuple[str, str]]] = None)

Compute list of raw data types and their counts for each distinct value (pair) in the specified column(s). Type labels are assigned by the given classifier.

The result is a dictionary that maps the detected type labels to frequency counts. The resulting dictionary may contain a single value only or a pair of values. The format is determined by the features argument that accepts three different values:

  • distinct: Count the number of distinct values of a given type

  • total: Count the number of total values of a given type

  • both: Return a nested dictionary that contains both, the distinct count

    and the total count. The element names in the nested dictionary are given by the values in labels argument.

If a normalizer is given, the values in the resulting dictionary are normalized.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (int, string, list, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a a single column reference or a list of column references.

  • classifier (openclean.function.value.classifier.ValueClassifier,) – default=None Classifier that assigns data type class labels for scalar column values. Uses the standard classifier if not specified.

  • normalizer (callable or openclean.function.value.base.ValueFunction,) – default=None Optional normalization function that will be used to normalize the frequency counts in the returned dictionary.

  • features (enum=['distinct', 'total', 'both'], default='distinct') – Determines the values in the resulting dictionary.

  • labels (list or tuple, default=('distinct', 'total')) – List or tuple with exactly two elements. The labels will only be used if the features argument is ‘both’. The first element is the label for the distinct countsin the returned nested dictionary and the second element is the label for the total counts.

Returns

Return type

dict

openclean.profiling.classifier.typepicker module

Type picker select one or more class labels based on statistics about the frequency of occurrence for each label in a set of data values.

The classes in this module implement different strategies for assigning a datatype to a list of values (e.g., a column in a data frame).

class openclean.profiling.classifier.typepicker.MajorityTypePicker(classifier=None, threshold=0, use_total_counts=False, at_most_one=False)

Bases: openclean.profiling.base.DistinctSetProfiler

Pick the most frequent type assigned by a given classifier to the values in a given list. Generates a dictionary containing the most frequent type(s) as key(s) and their normalized frequency as the associated value.

The majority of a type may be defined based on the distinct values in the given list or the absolute value counts. Allows to further restrict the choice by requiring the frequency of the selected type to be above a given threshold.

process(values)

Select one or more type labels based on data type statistics that are computed over the given list of values using the associated classifier.

Returns a dictionary where the key(s) are the selected type(s) and the values are normalized type frequencies (using divide_by_total). If no type satisfies the associated threshold or more than one type does but the ensure single type flag is True, the result is an empty dictionary.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

list

class openclean.profiling.classifier.typepicker.ThresholdTypePicker(classifier=None, threshold=0, use_total_counts=False)

Bases: openclean.profiling.base.DistinctSetProfiler

Identify all types assigned by a given classifier to the values in a list having a frequency that exceeds a specified threshold. Generates a dictionary containing the types as keys and their normalized frequency as the associated value.

The frequency of a type may be computed based on the distinct values in the given list or the absolute value counts.

process(values)

Select one or more type labels based on data type statistics that are computed over the given list of values using the associated classifier.

Returns a dictionary where the key(s) are the selected type(s) and the values are normalized type frequencies (using divide_by_total). If no type satisfies the associated threshold or more than one type does but the ensure single type flag is True, the result is an empty dictionary.

Parameters

values (dict) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

list

openclean.profiling.classifier.typepicker.majority_typepicker(df, columns=None, classifier=None, threshold=0, use_total_counts=False, at_most_one=False)

Pick the most frequent type assigned by a given classifier to the values in a given list. Generates a dictionary containing the most frequent type(s) as key(s) and their normalized frequency as the associated value.

The majority of a type may be defined based on the distinct values in the given list or the absolute value counts. Allows to further restrict the choice by requiring the frequency of the selected type to be above a given threshold.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • classifier (openclean.function.value.classifier.ValueClassifier) – , default=None Classifier that assigns data type class labels for scalar column values.

  • threshold (callable or int or float, default=0) – Callable predicate or numeric value that is used to constrain the possible candidates based on their normalized frequency.

  • use_total_counts (bool, default=False) – Use total value counst instead of distinct counts to compute type frequencies.

  • at_most_one (bool, default=False) – Ensure that at most one data type is returned in the result. If the flag is True and multiple types have the maximum frequency, an empty dictionary will be returned.

Returns

Return type

dict

openclean.profiling.classifier.typepicker.threshold_typepicker(df, columns=None, classifier=None, threshold=0, use_total_counts=False)

Identify all types assigned by a given classifier to the values in a list having a frequency that exceeds a specified threshold. Generates a dictionary containing the types as keys and their normalized frequency as the associated value.

The frequency of a type may be computed based on the distinct values in the given list or the absolute value counts.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (list, tuple, or openclean.function.eval.base.EvalFunction) – Evaluation function to extract values from data frame rows. This can also be a list or tuple of evaluation functions or a list of column names or index positions.

  • classifier (openclean.function.value.classifier.ValueClassifier) – , default=None Classifier that assigns data type class labels for scalar column values.

  • threshold (callable or int or float, default=0) – Callable predicate or numeric value that is used to constrain the possible candidates based on their normalized frequency.

  • use_total_counts (bool, default=False) – Use total value counst instead of distinct counts to compute type frequencies.

openclean.profiling.constraints package
Submodules
openclean.profiling.constraints.fd module

Base classes for functional dependency (FD) discovery. FDs express relationships between attributes of a dataset. FDs were originally used in database design, especially schema normalization. FDs can also be used for data cleaning purposes to identfy sets of rows (tuples) that violate a given constraint and are therefore candidates for data repair.

class openclean.profiling.constraints.fd.FunctionalDependency(lhs: Union[int, str, List[Union[str, int]]], rhs: Union[int, str, List[Union[str, int]]])

Bases: object

Functional dependencies describe a relationship between two sets of attributes. These sets are referred to as the determinant (left-hand-size) and dependant (right-hand-size).

property dependant: Union[int, str, List[Union[str, int]]]

Get the dependant (right-hand-side) of the functional dependency.

Returns

Return type

int, string, or list of int or string of Column

property determinant: Union[int, str, List[Union[str, int]]]

Get the determinant (left-hand-side) of the functional dependency.

Returns

Return type

int, string, or list of int or string of Column

class openclean.profiling.constraints.fd.FunctionalDependencyFinder

Bases: object

Interface for operators that discover functional dependencies in a given data frame.

abstract run(df: pandas.core.frame.DataFrame)List[openclean.profiling.constraints.fd.FunctionalDependency]

Run the implemented functional dependency discovery algorithm on the given data frame. Returns a list of all discovered functional dependencies.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

list of FunctionalDependency

openclean.profiling.constraints.ucc module

Base classes for unique column combination (UCC) discovery. UCCs are a prerequisite for unique constraints and keys.

class openclean.profiling.constraints.ucc.UniqueColumnCombinationFinder

Bases: object

Interface for operators that discover combinations of unique columns in a given data frame.

abstract run(df: pandas.core.frame.DataFrame)List[Union[int, str, List[Union[str, int]]]]

Run the implemented unique column combination discovery algorithm on the given data frame. Returns a list of all discovered unique column sets.

Parameters

df (pd.DataFrame) – Input data frame.

Returns

Return type

list

openclean.profiling.datatype package
Submodules
openclean.profiling.datatype.convert module

Datatype converter for profiling purposes. The converter returns a converted value together with the type label for datatype counting and (min,max) computations.

class openclean.profiling.datatype.convert.DatatypeConverter(datatypes: List[Tuple[Type, str, Callable]], default_label: str)

Bases: object

Converter for scalar values that is used for profiling purposes. The converter maintains a list of datatype converters (callables) each of which is assigned to a raw type and a type label.

Converters and their associated label are used to represent the associated raw data types. That is, converters are expected to return None for values that cannot be converted to the respective raw data type.

The datatype converter returns the converted value and type label for the first converter that represents a raw data type to wich the given value could be converted, i.e., that accepted the given value. If a value has a raw type that matches the raw type of one of the converters the value itself and the label for that respective converter is returned (Issue #45).

Note that the raw type for a given converter can be None. In this case we ignore this converter when checking whether the raw type of an input value matches the represented type of the converter, The converter may still be used in case the raw type of an input value does not match the raw types of any of the other converters and we attempt to cast the value.

If no converter accepted the original value and a default type label is returned.

cast(value: Union[int, float, str, datetime.datetime])Union[int, float, str, datetime.datetime]

Convert a given value. Returns the resulting value without the type label.

Parameters

value (scalar) – Value that is converted for data type detection.

Returns

Return type

scalar

convert(value: Union[int, float, str, datetime.datetime])Tuple[Union[int, float, str, datetime.datetime], str]

Convert a given value. Returns a tuple of converted value and type label.

Parameters

value (scalar) – Value that is converted for data type detection.

Returns

Return type

tuple of scalar and string (type label)

openclean.profiling.datatype.convert.DefaultConverter()openclean.profiling.datatype.convert.DatatypeConverter

Get an instance of the default data type converter for data profiling. the default converter distinguishes between integer, float, datetime, and text.

Returns

Return type

openclean.profiling.datatype.convert.DatatypeConverter

openclean.profiling.datatype.operator module

Datatype conversion consumer and processor for data pipelines.

class openclean.profiling.datatype.operator.Typecast(converter: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None, columns: Optional[List[Union[str, histore.document.schema.Column]]] = None, consumer: Optional[openclean.operator.stream.consumer.StreamConsumer] = None)

Bases: openclean.operator.stream.consumer.ProducingConsumer, openclean.operator.stream.processor.StreamProcessor

Consumer for rows that casts all values in a row using a given type converter.

handle(rowid: int, row: List[Union[int, float, str, datetime.datetime]])List[Union[int, float, str, datetime.datetime]]

Convert all values in the given row to a datatype that is defined by the associated converter.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

Returns

Return type

list

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream consumer. Returns an instance of the stream consumer that does the type casting for all data frame rows.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.operator.stream.consumer.StreamConsumer

openclean.profiling.pattern package
Submodules
openclean.profiling.pattern.base module

Abstract base class for pattern discovery operators.

class openclean.profiling.pattern.base.Pattern

Bases: object

Interface for objects representing patterns, e.g., a regular expression, that was discovered by a pattern finder. Implementations maintain a representation of the pattern itself as well as any additional metadata that was generated during the discovery process.

abstract compile(negate=False, generator=None)

Get an instance of a value function that is predicate which can be used to test whether an given value is accepted by the pattern or not.

Parameters
  • negate (bool, default=False) – If the negate flag is True, the returned predicate should return True for values that are not accepeted by the pattern and False for those that are accepeted.

  • generator (PatternFinder (optional)) – The patternfinder used to generate the original pattern. required to recreate the tokenization and type detection on the new values

Returns

Return type

openclean.function.value.base.ValueFunction

abstract metadata()

Return a dictionary containing optional metadata associated with the pattern. This can for example be statistics generated by the pattern discovery algorithm providing additional information or evidence for the confidence that the algorithm has in the pattern or the relevance of the pattern.

The structure of the dictionary is implementation-dependent. If no additional metadata was generated an empty dictionary should be returned.

Returns

Return type

dict

abstract pattern()

Get a string representation of the pattern for display purposes.

Returns

Return type

string

abstract to_dict()

Returns a dictionary serialization of the pattern. This is an external representation that is used when the results of a pattern finder are included in the result generated by a data profiler.

Returns

Return type

dict

class openclean.profiling.pattern.base.PatternFinder

Bases: openclean.profiling.base.DistinctSetProfiler

Interface for generic regular expression discovery. Each implementation should take an interable of (distinct) values (e.g., from a column in a data frame) as their input. The result is a (list of) string(s) that each represent a regular expression.

exec(values)

This method is executed when the pattern finder is used as part of a data profiler. It returns a list with dictionary serializations for the patterns that are discovered by the find method.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

list

abstract find(values)

Discover patterns like regular expressions in a given sequence of (distinct) values. Returns a list of objects representing the discovered patterns.

Parameters

values (list) – List of scalar values or tuples of scalar values.

Returns

Return type

list(openclean.profiling.pattern.base.Pattern)

openclean.profiling.pattern.token_signature module

Token signatures for column type classification and anomaly detection.

Token signatures are sets of tokens that are representative for values in a semantic type. A common example are street addresses. In the U.S., for example, the values in dataset columns that contain street addresses are likely to contain tokens like ‘AVENUE’, ‘ROAD’, ‘STREET’, etc. In many cases alternative abbreviations are possible for these tokens, e.g., ‘STREET’, ‘STRT’, ‘STR’, etc.

A token signature is a list of sets, where each set contains the different possible abbreviations for a token that is part of a representative signature for a semantic type.

When used for column type classification, for example, one would expect that values in a column of the classified type are likely to contain exactly one representation for one of the tokens in the type signature.

openclean.profiling.pattern.token_signature.token_signature(grouping: openclean.data.groupby.DataFrameGrouping, columns: Union[int, str, List[Union[str, int]]], include_key: Optional[bool] = True)List[Set[str]]

Create a token signature from the specified columns in a data frame grouping.

Each group represents an entry in the returned signature. The set of distinct values from all columns over the rows in the group represent the signature entry with the different token representations.

Parameters
  • grouping (openclean.data.groupby.DataFrameGrouping) – Grouping of data frame rows.

  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • include_key (bool, default=True) – Include the key value for each group in the signature entry that is being created for the group.

Returns

Return type

openclean.profiling.pattern.token_signature.TokenSignature

Submodules
openclean.profiling.base module

Abstract base class for operators that perform data profiling on a sequence of data values.

Profilers can perform a wide range of tasks on a given sequence of values. Some profiling operators compute one or more features for all values in the sequence (e.g., frequency). Other examples of profilers detect outliers in a sequence of values. That is, they filter values based on some condition computed over the value features. Profilers can also compute new ‘value’, for example, when discovering patterns in the data.

class openclean.profiling.base.DataProfiler

Bases: object

Profiler for a stream of (scalar) values. A data profiler computes statistics (informative summaries) over all values in a data stream, i.e., values from a single column or multiple columns in a dataset.

Data profiler are stream-aware so that an implementation of a profiler can be used on data frames as well as with streams over rows in a dataset.

Data is passed to the profiler either as pairs of (value, count) where count is a frequency count (using the methods open, consume, close) or as a Counter with distinct values and their absolute counts (using the process method). In the case of a stream of (value, count)-pairs, the values in the stream are not guaranteed to be unique, i.e., the same value may be passed to the profiler multiple times (with potentially different counts).

The profiler returns a dictionary or a list with the profiling results. The elements and structure of the result are implementation dependent.

abstract close()Union[Dict, List]

Signal the end of the data stream. Returns the profiling result. The type of the result is a dictionary. The elements and structure in the dictionary are implementation dependent.

Returns

Return type

dict or list

abstract consume(value: Union[int, float, str, datetime.datetime], count: int)

Consume a pair of (value, count) in the data stream. Values in the stream are not guaranteed to be unique and may be passed to this consumer multiple times (with multiple counts).

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

abstract open()

Singnal the start of the data stream. This method can be used by implementations of the scalar profiler to initialize internal variables.

abstract process(values: collections.Counter)Union[Dict, List]

Compute one or more features over a set of distinct values. This is the main profiling function that computes statistics or informative summaries over the given data values. It operates on a compact form of a value list that only contains the distinct values and their frequency counts.

The return type of this function is a dictionary. The elements and structure in the dictionary are implementation dependent.

Parameters

values (collections.Counter) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

dict or list

run(df: pandas.core.frame.DataFrame, columns: Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction, List[Union[int, str, histore.document.schema.Column, openclean.function.eval.base.EvalFunction]]])Union[Dict, List]

Run the profiler using values that are generated from one or more columns (producers) for a given data frame. Evaluates the producers and creates a value count that is passed on to the process method for profiling.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (int, string, list, or) – openclean.function.eval.base.EvalFunction Evaluation function to extract values from data frame rows. This can also be a a single column reference or a list of column references.

Returns

Return type

dict or list

class openclean.profiling.base.DataStreamProfiler

Bases: openclean.profiling.base.DataProfiler

Data stream profiler that implements the process method of the profiler function using the stream methods consume and close.

process(values: collections.Counter)Union[Dict, List]

Compute one or more features over a set of distinct values. Streams the elements in the given counter to the consume method.

Parameters

values (collections.Counter) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

dict or list

class openclean.profiling.base.DistinctSetProfiler

Bases: openclean.profiling.base.DataProfiler

Profiling function that collects all elements in the stream and then uses the process method to compute the profiling result.

close()Union[Dict, List]

Signal the end of the data stream. Returns the profiling result. The type of the result is a dictionary. The elements and structure in the dictionary are implementation dependent.

Returns

Return type

dict or list

consume(value: Union[int, float, str, datetime.datetime], count: int)

Consume a pair of (value, count) in the data stream. Collects all values in a counter dictionary.

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

open()

Initialize the counter at the beginning of the stream.

openclean.profiling.column module

Default profiler for columns i a dataset. Defines a profiler for columns in a in-memory dataset as well as for dataset streams.

The information that is collected by these profilers differs. The in-memory profiler is able to collect additiona information (e.g., top-k values) that the stream profiler cannot collect.

class openclean.profiling.column.ColumnProfile(converter: openclean.profiling.datatype.convert.DatatypeConverter, values: Optional[collections.Counter] = None, top_k: Optional[int] = None)

Bases: dict

Dictionary of profiling results for the openclean column profiler.

consume(value: Union[int, float, str, datetime.datetime], count: int, distinct: Optional[bool] = False)Union[int, float, str, datetime.datetime]

Consume a pair of (value, count) in the data stream. Values in the stream are not guaranteed to be unique and may be passed to this consumer multiple times (with multiple counts).

Returns the given value if it is not an empty value. Otherwise, the returned result in None.

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

  • distinct (bool, default=False) – Count distinct and total values for data types if this flag is True.

Returns

Return type

scalar

distinct(top_k: Optional[int] = None)collections.Counter

Get Counter object containing the list most frequent values and their counts that was generated by the profiler.

Parameters

top_k (int, default=None) – Limit the number of elements in the returned Counter to the k most common values (if given). If None, the full set of values is returned.

Returns

Return type

collections.Counter

class openclean.profiling.column.DefaultColumnProfiler(top_k: Optional[int] = 10, converter: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None)

Bases: openclean.profiling.base.DistinctSetProfiler

Default profiler for columns in a data frame. This profiler does maintain a set of distinct values and includes the most frequent values in the returned result dictionary. Also extends the basic column profiler with data types for all values in the column.

The result schema for the returned dictionary is:

{
“minmaxValues”: smallest and largest not-None value for each data type

in the stream,

“emptyValueCount”: number of empty values in the column, “totalValueCount”: number of total values (including empty ones), “distinctValueCount”: number of distinct values in the column, “entropy”: entropy for distinct values in the column, “topValues”: List of most frequent values in the column, “datatypes”: Counter of type labels for all non-empty values

}

process(values: collections.Counter)openclean.profiling.column.ColumnProfile

Compute profile for given counter of values in the column.

Parameters

values (collections.Counter) – Set of distinct scalar values or tuples of scalar values that are mapped to their respective frequency count.

Returns

Return type

dict

class openclean.profiling.column.DefaultStreamProfiler(converter: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None)

Bases: openclean.profiling.base.DataStreamProfiler

Default profiler for columns in a data stream. This profiler does not maintain a set of distinct values due to the unkown size of the stream and the amount of memory that is required to maintain all values in the stream in an internal counter.

Extends the basic column profiler with data types that are computed for each value in the stream as they arrive via the consumer method.

The result schema for the returned dictionary is:

{
“minmaxValues”: smallest and largest not-None value for each data type

in the stream,

“emptyValueCount”: number of empty values in the stream, “totalValueCount”: number of total values (including empty ones), “datatypes”: Counter of type labels for all non-empty values

}

close()openclean.profiling.column.ColumnProfile

Return the dictionary with collected statistics at the end of the data stream.

Returns

Return type

dict

consume(value: Union[int, float, str, datetime.datetime], count: int)

Consume a pair of (value, count) in the data stream. Values in the stream are not guaranteed to be unique and may be passed to this consumer multiple times (with multiple counts).

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

open()

Initialize the internal variables that maintain different parts of the generated profiling result.

class openclean.profiling.column.DistinctValueProfiler(converter: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None)

Bases: openclean.profiling.column.DefaultColumnProfiler

Column profiler that maintains the full list of distinct values in a column. This class is a simple wrapper for the openclean.profiling.column.DefaultColumnProfiler that sets top_k=None.

openclean.profiling.dataset module

Helper class that provides added functionality of top of a list of column profiling results.

class openclean.profiling.dataset.DatasetProfile

Bases: list

THe dataset profiler provides functionality to access and transform the list of profiling results for columns in a dataset. Expects a list of dictionaries, each dictionary contaiing at least the following information about each column:

  • minimum value

  • maximum value

  • total number of values

  • total number of non-empty values

  • datatypes

Additional information includes the distinct number of values with their respective frequency counts.

add(name: str, stats: Dict)

Add profiler results for a given column to the list.

Parameters
  • name (string) – Column name

  • stats (dict) – Profiling results for the column.

column(name: Union[int, str])Dict

Get the profiling results for a given column.

Parameters

name (int or string) – Name or index position of the referenced column.

Returns

Return type

dict

minmax(column: Union[int, str])pandas.core.frame.DataFrame

Get data frame with (min, max)-values for all data types in a given column.

Raises a ValueError if the specified column is unknown.

Parameters

column (int or string) – Column index of column name.

Returns

Return type

pd.DataFrame

multitype_columns()openclean.profiling.dataset.DatasetProfile

Get a dataset profiler that only contains information for those columns that have values of more than one raw data type.

Returns

Return type

openclean.profiling.dataset.DatasetProfiler

profiles()List[Tuple[str, Dict]]

Get a list of (column name, profiling result) tuples for all columns in the dataset.

Returns

Return type

list

stats()pandas.core.frame.DataFrame

Get a data frame containing the basic statistics for each columns. This includes the column name, the minimum and maximum value, the number of total values, empty values, and (if present) the number of distinct values per column.

Returns

Return type

pd.DataFrame

types(distinct: Optional[bool] = False)pandas.core.frame.DataFrame

Get a data frame containing type information for all columns that are included in the profiling results. For each column the number of total values for each each datatype that occurs in the dataset is included.

If datatype information is divided into total and distinct counts the user has the option to get the cont of distinct values for each type instead of the total counts by setting the distinct flag to True.

Parameters

distinct (bool, default=False) – Return type counts for distinct values instead of total counts.

Returns

Return type

pd.DataFrame

unique_columns()openclean.profiling.dataset.DatasetProfile

Get a dataset profiler that only contains information for those columns that have a uniqueness of 1, i.e., where all values are unique.

Returns

Return type

openclean.profiling.dataset.DatasetProfiler

class openclean.profiling.dataset.ProfileConsumer(profilers: List[Tuple[int, str, openclean.profiling.base.DataProfiler]])

Bases: openclean.operator.stream.consumer.StreamConsumer

close()List[Dict]

Return a list containing the results from each of the profilers.

Returns

Return type

list

consume(rowid: int, row: List)List

CDispatch extracted columns values to each consumer.

Parameters
  • rowid (int) – Unique row identifier

  • row (list) – List of values in the row.

class openclean.profiling.dataset.ProfileOperator(profilers: Optional[Union[int, str, Tuple[Union[int, str], openclean.profiling.base.DataProfiler]]] = None, default_profiler: Optional[Type] = None)

Bases: openclean.operator.stream.processor.StreamProcessor

open(schema: List[Union[str, histore.document.schema.Column]])openclean.operator.stream.consumer.StreamConsumer

Factory pattern for stream profiling consumers. Creates an instance of a stream profiler for each column that was selected for profiling. If no profilers were specified at object instantiation all columns will be profiled.

Parameters

schema (list of string) – List of column names in the data stream schema.

Returns

Return type

openclean.profiling.dataset.ProfileConsumer

class openclean.profiling.dataset.Profiler

Bases: object

Interface for data profiler that generate metadata for a given data frame.

abstract profile(df: pandas.core.frame.DataFrame, columns: Optional[Union[int, str, List[Union[str, int]]]] = None)Dict

Run profiler on a given data frame. The structure of the resulting dictionary is implementatin dependent.

TODO: define required components in the result of a data profier.

Parameters
  • df (pd.DataFrame) – Input data frame.

  • columns (int, string, or list(int or string), default=None) – Single column or list of column index positions or column names for those columns that are being profiled. Profile the full dataset if None.

Returns

Return type

dict

openclean.profiling.dataset.dataset_profile(df: pandas.core.frame.DataFrame, profilers: Optional[Union[int, str, Tuple[Union[int, str], openclean.profiling.base.DataProfiler]]] = None, default_profiler: Optional[Type] = None)openclean.profiling.dataset.DatasetProfile

Profiling operator for profiling one or more columns in a data frame. By default all columns in the data stream are profiled independently using the default column profiler. The optional list of profilers allows to override the default behavior by providing a list of column references and (optional) profiler functions.

Parameters
  • profilers (list of tuples of column reference and) – openclean.profiling.base.ProfilingFunction, default=None Specify the list of columns that are profiled and the profiling function. If only a column reference is given (not a tuple) the default profiler is used for profiling the column.

  • default_profiler (class, default=None) – Class object that is instanciated as the profiler for columns that do not have a profiler instance speicified for them.

openclean.profiling.stats module

Collection of statistics helper functions anc classes for profiling.

class openclean.profiling.stats.MinMaxCollector(first_value: Optional[Union[int, float, str, datetime.datetime]] = None, minmax: Optional[Tuple[Union[int, float, str, datetime.datetime], Union[int, float, str, datetime.datetime]]] = None)

Bases: dict

Consumer that identifies the minimum and maximum value over a stream of data. The class extends a dictionary for integration into profiling result dictionaries.

consume(value: Union[int, float, str, datetime.datetime])

Consume a value in the data stream and adjust the minimum and maximum if necessary.

Parameters

value (scalar) – Value in the data stream.

property maximum

Get the current maximum over all consumed values.

Returns

Return type

scalar

property minimum

Get the current minimum over all consumed values.

Returns

Return type

scalar

openclean.profiling.stats.entropy(values: collections.Counter, default: Optional[float] = None)float

Compute the entropy for a given set of distinct values and their frequency counts.

Returns the default value if the given counter is empty.

Parameters

values (collections.Counter) – Counter with frequencies for a set of distinct values.

Returns

Return type

float

openclean.profiling.tests module

Helper class for testing profiling functionality.

class openclean.profiling.tests.ValueCounter

Bases: openclean.profiling.base.DataStreamProfiler

Test profiler that collects the values and counts that are passed to it in a Counter.

close()collections.Counter

Return the counter at the end of the stream.

Returns

Return type

collections.Counter

consume(value: Union[int, float, str, datetime.datetime], count: int)

Add value and count to the internal counter.

Parameters
  • value (scalar) – Scalar column value from a dataset that is part of the data stream that is being profiled.

  • count (int) – Frequency of the value. Note that this count only relates to the given value and does not necessarily represent the total number of occurrences of the value in the stream.

open()

Initialize an empty counter at the beginning of the stream.

openclean.util package
Submodules
openclean.util.core module

Collection of helper functions for various purpoeses.

openclean.util.core.always_false(*args)

Predicate that always evaluates to False.

Parameters

args (any) – Variable list of arguments.

Returns

Return type

bool

openclean.util.core.always_true(*args)

Predicate that always evaluates to True.

Parameters

args (any) – Variable list of arguments.

Returns

Return type

bool

openclean.util.core.ensure_callable(func)

Helper method to test whether a given argument is a callable function or not. Raises a ValueError if the argument is not a callable.

Parameters

func (any) – Object that is tested for being a callable.

Returns

Return type

callable

Raises

ValueError

class openclean.util.core.eval_all(predicates, truth_value=True)

Bases: object

Logic operator that evaluates a list of predicates and returns True only if all predicates return a defined result value.

openclean.util.core.funcname(f)

Get the name of a function or class object.

Parameters

f (callable) – Function or class object

Returns

Return type

string

openclean.util.core.get_indexes(x, items)

Searches a list for items and returns the indices

Parameters
  • x (str or int) – value to search

  • items (list) –

Returns

Return type

list

openclean.util.core.is_list_or_tuple(value)

Test if a given value is a list or tuple that can be converted into multiple arguments.

Parameters

value (any) – Any object that is tested for being a list or tuple.

Returns

Return type

bool

openclean.util.core.scalar_pass_through(value)

Pass-through method for single scalar values.

Parameters

value (scalar) – Scalar cell value from a data frame row.

Returns

Return type

scalar

openclean.util.core.tenary_pass_through(*args)

Pass-through method for a list of argument values.

Parameters

args (list of scalar) – List of argument values.

Returns

Return type

scalar

openclean.util.core.unique_identifier(length: Optional[int] = None)str

Get an identifier string of given length. Uses UUID to generate a unique string and return the requested number of characters from that string.

Parameters

length (int, default=None) – Number of characters in the returned string.

Returns

Return type

string

openclean.util.threshold module

Helper functions that allow to specify different types of thresholds, e.g., lt, le, ge, gt. Instead of specifying thresholds as a single scalar value we specify them as callables. This makes it easier to run the same function with different thresholds like x > threshold, x >= threshold, etc..

class openclean.util.threshold.Threshold(op: Callable, threshold: float)

Bases: object

Generic thrshold class that evaluates a binary operator on a given value and a pre-defined threshold. The operator is called as op(value, threshold).

openclean.util.threshold.ge(threshold: float)openclean.util.threshold.Threshold

Get an instance for a greater or equal than threshold.

Parameters

threshold (float) – Threshold value.

Returns

Return type

openclean.util.threshold.Threshold

openclean.util.threshold.gt(threshold: float)openclean.util.threshold.Threshold

Get an instance for a greater than threshold.

Parameters

threshold (float) – Threshold value.

Returns

Return type

openclean.util.threshold.Threshold

openclean.util.threshold.le(threshold: float)openclean.util.threshold.Threshold

Get an instance for a lower or equal than threshold.

Parameters

threshold (float) – Threshold value.

Returns

Return type

openclean.util.threshold.Threshold

openclean.util.threshold.lt(threshold: float)openclean.util.threshold.Threshold

Get an instance for a lower than threshold.

Parameters

threshold (float) – Threshold value.

Returns

Return type

openclean.util.threshold.Threshold

openclean.util.threshold.to_threshold(threshold: Union[Callable, int, float])Callable

Helper class to ensure that a given argument is a callable. If a scalar value is given the gt threshold will be returned by default if the value is lower than one. The ge threshold will be returned for scalar values that are one or greater.

Parameters
  • threshold (callable, int or float) – Expects a callable or a numeric value that will be wrapped in a comparison operator.

  • Retuns

  • ------

  • callable

Raises

ValueError

Submodules

openclean.config module

Helper functions for accessing configuration parameters for openclean that are maintained in environment variables.

openclean.config.DATADIR()str

Get directory where raw data files are maintained.

Returns

Return type

string

openclean.config.THREADS()int

Get number of parallel threads. BY default a value of 1 is used. The default value is returned if the environment variable ‘OPENCLEAN_THREADS’ is not set or contains an invalid value (i.e., non-numeric or smaller than one).

Returns

Return type

string

openclean.pipeline module

Data pipeline for processing datasets as streams of rows.

class openclean.pipeline.DataPipeline(source: Union[pandas.core.frame.DataFrame, str, histore.document.base.Document], columns: Optional[List[Union[str, histore.document.schema.Column]]] = None, pipeline: Optional[openclean.operator.stream.processor.StreamProcessor] = None)

Bases: histore.document.base.DefaultDocument

The data pipeline allows to iterate over the rows that are the result of streaming an input data set through a pipeline of stream operators.

The class implements the context manager interface.

append(op: openclean.operator.stream.processor.StreamProcessor, columns: Optional[List[Union[str, histore.document.schema.Column]]] = None)openclean.pipeline.DataPipeline

Return a modified stream processer with the given operator appended to the stream pipeline.

Parameters
  • op (openclean.operator.stream.processor.StreamProcessor) – Stream operator that is appended to the pipeline of the returned stream processor.

  • columns (list of string, default=None) – Optional (modified) list of column names for the schema of the data stream rows.

Returns

Return type

openclean.pipeline.DataPipeline

close()

Close the associated document.

cluster(clusterer: openclean.cluster.base.Clusterer)List[openclean.cluster.base.Cluster]

Cluster values in a data stream.

This operator will create a distinct set of values in the data stream rows. The collected values are then passed on to the given cluster algorithm.

Parameters

clusterer (openclean.cluster.base.Clusterer) – Cluster algorithm for distinct values in the data stream.

Returns

Return type

list of openclean.cluster.base.Cluster

count()int

Count the number of rows in a data stream.

Returns

Return type

int

delete(predicate: openclean.function.eval.base.EvalFunction)openclean.pipeline.DataPipeline

Remove rows from the data stream that satisfy a given condition.

Parameters

predicate (opencelan.function.eval.base.EvalFunction) – Evaluation function used to delete rows.

Returns

Return type

openclean.pipeline.DataPipeline

distinct(columns: Optional[Union[int, str, List[Union[str, int]]]] = None)collections.Counter

Get counts for all distinct values over all columns in the associated data stream. Allows the user to specify the list of columns for which they want to count values.

Parameters

columns (int, str, or list of int or string, default=None) – References to the column(s) for which unique values are counted.

Returns

Return type

collections.Counter

distinct_values(columns: Optional[Union[int, str, List[Union[str, int]]]] = None)List[Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime]]]]

Get list all distinct values over all columns in the associated data stream.

Provides the option to the user to specify the list of columns for which they want to count values.

Parameters

columns (int, str, or list of int or string, default=None) – References to the column(s) for which unique values are counted.

Returns

Return type

collections.Counter

filter(predicate: openclean.function.eval.base.EvalFunction, limit: Optional[int] = None)openclean.pipeline.DataPipeline

Filter rows in the data stream that satisfy a given condition. Allows to limit the number of rows in the returned data stream.

Parameters
  • predicate (opencelan.function.eval.base.EvalFunction) – Evaluation function used to filter rows.

  • limit (int, default=None) – Limit the number of rows in the filtered data stream.

Returns

Return type

openclean.pipeline.DataPipeline

head(count: Optional[int] = 10)pandas.core.frame.DataFrame

Return the first n rows in the data stream as a pandas data frame. This is a short-cut for using a pipeline of .limit() and .to_df().

Parameters

count (int, default=10) – Defines the maximum number of rows in the returned data frame.

Returns

Return type

pd.DataFrame

insert(names: List[Union[str, histore.document.schema.Column]], pos: Optional[int] = None, values: Optional[Union[Callable, openclean.function.eval.base.EvalFunction, List, int, float, str, datetime.datetime, Tuple]] = None)openclean.pipeline.DataPipeline

Insert one or more columns into the rows in the data stream.

Parameters
  • names (string, or list(string)) – Names of the inserted columns.

  • pos (int, optional) – Insert position for the new columns. If None the columns will be appended.

  • values (scalar,) –

    list,

    callable, or openclean.function.eval.base.EvalFunction, optional

    Single value, list of constant values, callable that accepts a data frame row as the only argument and returns a (list of) value(s) matching the number of columns inserted or an evaluation function that returns a matchin number of values.

iterrows()

Simulate the iterrows() function of a pandas DataFrame as it is used in openclean. Returns an iterator that yields pairs of row identifier and value list for each row in the streamed data frame.

limit(count: int)openclean.pipeline.DataPipeline

Return a data stream for the data frame that will yield at most the first n rows passed to it from an associated producer.

Parameters

count (int) – Maximum number of rows in the returned data frame.

Returns

Return type

openclean.pipeline.DataPipeline

match(matcher: openclean.function.matching.base.StringMatcher, include_vocab: Optional[bool] = False)openclean.data.mapping.Mapping

Generate a mapping of best matches between a given vocabulary and the values in one (or more) column(s) of the data stream. For each row (i.e., single value) the best matches with a given vocabulary is computed and added to the returned mapping.

For rows that contain multiple columns an error will be raised.

If the include_vocab flag is False the resulting mapping will contain a mapping only for those values that do not occur in the vocabulary, i.e., the unknown values with respect to the vocabulary.

Parameters
  • matcher (openclean.function.matching.base.VocabularyMatcher) – Matcher to compute matches for the terms in a controlled vocabulary.

  • include_vocab (bool, default=False) – If this flag is False the resulting mapping will only contain matches for terms that are not in the vocabulary that is associated with the given matcher.

Returns

Return type

openclean.data.mapping.Mapping

move(columns: Union[int, str, List[Union[str, int]]], pos: int)openclean.pipeline.DataPipeline

Move one or more columns in a data stream schema.

Parameters
  • columns (int, string, or list(int or string)) – Single column or list of column index positions or column names.

  • pos (int) – Insert position for the moved columns.

Returns

Return type

openclean.pipeline.DataPipeline

open()openclean.pipeline.DataPipeline

Return reference to self when the pipeline is opened.

Returns

Return type

openclean.pipeline.DataPipeline

persist(filename: Optional[str] = None)openclean.pipeline.DataPipeline

Persist the results of the current stream for future processing. The data can either be written to disk or persitet in a in-memory data frame (depending on whether a filename is specified).

The persist operator is currently not lazzily evaluated.

Parameters

filename (string, default=None) – Path to file on disk for storing the pipeline result. If None, the data is persistet in-memory as a pandas data frame.

Returns

Return type

openclean.pipeline.DataPipeline

profile(profilers: Optional[Union[int, str, Tuple[Union[int, str], openclean.profiling.base.DataProfiler]]] = None, default_profiler: Optional[Type] = None)List[Dict]

Profile one or more columns in the data stream. Returns a list of profiler results for each profiled column.

By default each column in the data stream is profiled independently using the default stream profiler. The optional list of profilers allows to override the default behavior by providing a list of column references (with optional profiler function). If only a column reference is given the default stream profiler is used for the referenced column.

Parameters
  • profilers (int, string, tuple, or list of tuples of column reference) – and openclean.profiling.base.DataProfiler, default=None Specify the list of columns that are profiled and the profiling function. If only a column reference is given (not a tuple) the default stream profiler is used for profiling the column.

  • default_profiler (class, default=None) – Class object that is instanciated as the profiler for columns that do not have a profiler instance speicified for them.

Returns

Return type

list

rename(columns: Union[int, str, List[Union[str, int]]], names: List[Union[str, histore.document.schema.Column]])openclean.pipeline.DataPipeline

Rename selected columns in a the schema data of data stream rows.

Parameters
  • columns (int, str, or list of int or string) – References to renamed columns.

  • names (int, str, or list of int or string, default=None) – New names for the selected columns.

Returns

Return type

openclean.pipeline.DataPipeline

run()

Stream all rows from the associated data file to the data pipeline that is associated with this processor. If an optional operator is given, that operator will be appended to the current pipeline before execution.

The returned value is the result that is returned when the consumer is generated for the pipeline is closed after processing the data stream.

Returns

Return type

any

sample(n: int, random_state: Optional[int] = None)openclean.pipeline.DataPipeline

Add operator for a random sample generator to the data stream.

n: int

Size of the collected random sample.

random_state: int, default=None

Seed value for the random number generator (for reproducibility purposes).

select(columns: Optional[Union[int, str, List[Union[str, int]]]] = None, names: Optional[List[Union[str, histore.document.schema.Column]]] = None)openclean.pipeline.DataPipeline

Select a given list of columns from the streamed data frame. Columns in the resulting data stream may also be renamed using the optional list of new column names.

Returns a new data stream with the column filter set to the columns that were in the argument list.

Parameters
  • columns (int, str, or list of int or string, default=None) – References to the selected columns.

  • names (int, str, or list of int or string, default=None) – Optional renaming for selected columns.

Returns

Return type

openclean.pipeline.DataPipeline

stream(op: openclean.operator.stream.processor.StreamProcessor)

Stream all rows from the associated data file to the data pipeline that is associated with this processor. The given operator is appended to the current pipeline before execution.

The returned value is the result that is returned when the consumer is generated for the pipeline is closed after processing the data stream.

Parameters

op (openclean.operator.stream.processor.StreamProcessor) – Stream operator that is appended to the current pipeline for execution.

Returns

Return type

any

to_df()pandas.core.frame.DataFrame

Collect all rows in the stream that are yielded by the associated consumer into a pandas data frame. :returns: :rtype: pd.DataFrame

typecast(converter: Optional[openclean.profiling.datatype.convert.DatatypeConverter] = None)openclean.pipeline.DataPipeline

Typecast operator that converts cell values in data stream rows to different raw types that are represented by the given type converter.

Parameters

converter (openclean.profiling.datatype.convert.DatatypeConverter,) – default=None Datatype converter for values data stream. Uses the default converter if no converter is given.

Returns

Return type

openclean.pipeline.processor.DataPipeline

update(columns: Union[int, str, List[Union[str, int]]], func: Union[Callable, Dict, openclean.function.eval.base.EvalFunction, int, float, str, datetime.datetime, openclean.function.value.base.ValueFunction])openclean.pipeline.DataPipeline

Update rows in a data frame.

Raises a Value error if not enough arguments (at least two) are given.

Parameters
  • columns (int, str, or list of int or string, default=None) – References to the selected columns.

  • func (scalar, dict, callable, openclean.function.value.base.ValueFunction,) – or openclean.function.eval.base.EvalFunction Specification of the (resulting) evaluation function that is used to generate the updated values for each row in the data frame.

Returns

Return type

openclean.data.stream.processor.StreamProcessor

where(predicate: openclean.function.eval.base.EvalFunction, limit: Optional[int] = None)openclean.pipeline.DataPipeline

Filter rows in the data stream that match a given condition. Returns a new data stream with a consumer that filters the rows. Currently expects an evaluation function as the row predicate.

Allows to limit the number of rows in the returned data stream.

This is a synonym for the filter() method.

Parameters
  • predicate (opencelan.function.eval.base.EvalFunction) – Evaluation function used to filter rows.

  • limit (int, default=None) – Limit the number of rows in the filtered data stream.

Returns

Return type

openclean.pipeline.DataPipeline

write(filename: str, delim: Optional[str] = None, compressed: Optional[bool] = None, none_as: Optional[str] = None, encoding: Optional[str] = None)

Write the rows in the data stream to a given CSV file.

Parameters
  • filename (string) – Path to a CSV file output file on the local file system.

  • delim (string, default=None) – The column delimiter used for the written CSV file.

  • compressed (bool, default=None) – Flag indicating if the file contents of the created file are to be compressed using gzip.

  • none_as (string, default=None) – String that is used to encode None values in the output file. If given, all cell values that are None are substituted by the string.

  • encoding (string, default=None) – The csv file encoding e.g. utf-8, utf-16 etc.

class openclean.pipeline.PipelineIterator(stream: histore.document.base.DocumentIterator, consumer: Optional[openclean.operator.stream.consumer.StreamConsumer] = None)

Bases: histore.document.base.DocumentIterator

Iterator over rows in a data processing pipeline. Iterates over the rows in an input stream. Each row is processed by a stream consumer. If the consumer returns a value this value is returned as the next row. For consumers that only return a result at the end of the stream this iterator iterates over the rows that are returned when the consumer is closed.

close()

Release all resources that are held by the associated input stream and output consumer.

next()Tuple[int, Union[int, float, str, datetime.datetime, Tuple[Union[int, float, str, datetime.datetime], ...]], List[Union[int, float, str, datetime.datetime]]]

Read the next row in the pipeline.

The row is processed by the associated consumer. If the consumer returns an non-None result this row is returned as the next row. If the consumer returns None the next input row is processed. If the consumer returns a non-empty result when it is closed we assume that this is a list of rows and iterate over them as well.

Returns

Return type

tuple of int, histore.document.base.RowIndex, histore.document.base.DataRow

openclean.pipeline.stream(filename: Union[str, pandas.core.frame.DataFrame], header: Optional[List[Union[str, histore.document.schema.Column]]] = None, delim: Optional[str] = None, compressed: Optional[bool] = None, none_is: Optional[str] = None, encoding: Optional[str] = None)openclean.pipeline.DataPipeline

Read a CSV file as a data stream. This is a helper method that is intended to read and filter large CSV files.

Parameters
  • filename (string) – Path to CSV file on the local file system.

  • header (list of string, default=None) – Optional header. If no header is given it is assumed that the first row in the CSV file contains the header information.

  • delim (string, default=None) – The column delimiter used in the CSV file.

  • compressed (bool, default=None) – Flag indicating if the file contents have been compressed using gzip.

  • none_is (string, default=None) – String that was used to encode None values in the input file. If given, all cell values that match the given string are substituted by None.

  • encoding (string, default=None) – The csv file encoding e.g. utf-8, utf16 etc

Returns

Return type

openclean.pipeline.DataPipeline

openclean.version module

Version information for the openclean package.