
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:

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:

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.
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'>

[ ]:
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.
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¶
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
- 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
- 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.
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.
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
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¶
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
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
- 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 –
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
- 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
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
- 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.
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
- 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.
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
- 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.
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
- 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
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
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
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
Submodules¶
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
- 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
- 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
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
- 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
- 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
- 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
- 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
- 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¶
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
Schema helper functions imported from HISTORE.
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
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.
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¶
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.
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
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
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
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
Submodules¶
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
- 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.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.engine package¶
Subpackages¶
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
- 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
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
- 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¶
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
- 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¶
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
- 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¶
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
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
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¶
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
- 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
- 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
- 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
- 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
- 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
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
- 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
- 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
- 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
- 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
- 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
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
- 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.
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
- functions() → openclean.engine.store.base.ObjectStore¶
Get object store that manages user-defined functions.
- Returns
- Return type
- 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
- lookups() → openclean.engine.store.base.ObjectStore¶
Get object store that manages lookup tables.
- Returns
- Return type
- vocabularies() → openclean.engine.store.base.ObjectStore¶
Get object store that manages controlled vocabularies.
- Returns
- Return type
- 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.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
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.
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
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
Global index for all open instances of the openclean engine.
openclean.function package¶
Subpackages¶
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
- 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.
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
- 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.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.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
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.
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
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
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
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`
andval_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
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
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.
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 theconvert
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
- 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
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
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
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
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
remove leading and trailing whitespace
convert string to lower case
Normalize string by removing punctuation and control characters and replacing non-diacritic characters (if the default normalizer is used).
Tokenize string by splitting on whitespace characters. Then sort the tokens and remove duplicates (if the default tokenizer is used).
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.
Import normalization functions. Mainly for backward compatibility.
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.
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
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
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.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
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.
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
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
- 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
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
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.
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
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
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.
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
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
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.
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
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
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
Submodules¶
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¶
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)¶
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
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
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
- 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.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
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
- 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.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
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
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
- 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
- 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
- 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
- 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
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
- 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
- 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
- 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
- Raises
ValueError –
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
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
- 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
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
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
- 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 –
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
- 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
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
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
- 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 –
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
- 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 –
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
- 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 –
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 –
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
- 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.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¶
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
- 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
- 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¶
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
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
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
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
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
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
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 ajoblib.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()
andpredict()
.None
means 1 unless in ajoblib.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 useKDTree
- ‘brute’ will use a brute-force search. - ‘auto’ will attempt to decide the most appropriate algorithmbased 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
orKDTree
. 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 ajoblib.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 uses1 / (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
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.
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
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.
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
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
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
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
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
- 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
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¶
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.
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 setstop_k=None
.
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
- 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.
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
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¶
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
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.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.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.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.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
- 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
- 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
- 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
- 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
- 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
- open() → openclean.pipeline.DataPipeline¶
Return reference to self when the pipeline is opened.
- Returns
- Return type
- 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
- 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
- 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
- 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
- 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.version module¶
Version information for the openclean package.